diff --git a/addons/account/account.py b/addons/account/account.py
index bf072507aa0..ab3d065421f 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -155,6 +155,7 @@ class account_account_type(osv.osv):
return res
def _save_report_type(self, cr, uid, account_type_id, field_name, field_value, arg, context=None):
+ field_value = field_value or 'none'
obj_data = self.pool.get('ir.model.data')
obj_financial_report = self.pool.get('account.financial.report')
#unlink if it exists somewhere in the financial reports related to BS or PL
@@ -596,10 +597,7 @@ class account_account(osv.osv):
return res
def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False):
- if default is None:
- default = {}
- else:
- default = default.copy()
+ default = {} if default is None else default.copy()
if done_list is None:
done_list = []
account = self.browse(cr, uid, id, context=context)
@@ -781,10 +779,7 @@ class account_journal(osv.osv):
]
def copy(self, cr, uid, id, default=None, context=None, done_list=None, local=False):
- if default is None:
- default = {}
- else:
- default = default.copy()
+ default = {} if default is None else default.copy()
if done_list is None:
done_list = []
journal = self.browse(cr, uid, id, context=context)
@@ -1185,6 +1180,7 @@ class account_fiscalyear(osv.osv):
}
def copy(self, cr, uid, id, default=None, context=None):
+ default = {} if default is None else default.copy()
default.update({
'period_ids': [],
'end_journal_period_id': False
@@ -1444,14 +1440,8 @@ class account_move(osv.osv):
return result
def copy(self, cr, uid, id, default=None, context=None):
- if context is None:
- default = {}
- else:
- default = default.copy()
- if context is None:
- context = {}
- else:
- context = context.copy()
+ default = {} if default is None else default.copy()
+ context = {} if context is None else context.copy()
default.update({
'state':'draft',
'name':'/',
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 8b2a9aff257..549363ce269 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -461,9 +461,10 @@ class account_bank_statement(osv.osv):
return {}
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
- journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['company_id'], context=context)
+ journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['company_id', 'currency'], context=context)
company_id = journal_data['company_id']
- return {'value': {'balance_start': balance_start, 'company_id': company_id}}
+ currency_id = journal_data['currency'] or self.pool.get('res.company').browse(cr, uid, company_id[0], context=context).currency_id.id
+ return {'value': {'balance_start': balance_start, 'company_id': company_id, 'currency': currency_id}}
def unlink(self, cr, uid, ids, context=None):
stat = self.read(cr, uid, ids, ['state'], context=context)
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index c543b493831..57f16473b82 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -1360,6 +1360,7 @@ class account_invoice_line(osv.osv):
_columns = {
'name': fields.text('Description', required=True),
'origin': fields.char('Source', size=256, help="Reference of the document that produced this invoice."),
+ 'sequence': fields.integer('Sequence', help="Gives the sequence of this line when displaying the invoice."),
'invoice_id': fields.many2one('account.invoice', 'Invoice Reference', ondelete='cascade', select=True),
'uos_id': fields.many2one('product.uom', 'Unit of Measure', ondelete='set null'),
'product_id': fields.many2one('product.product', 'Product', ondelete='set null'),
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 26e18271dc2..8516fcd96ae 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -211,17 +211,17 @@
@@ -322,7 +322,7 @@
+ options='{"always_reload": True}'/>
@@ -368,16 +368,16 @@
@@ -458,7 +458,6 @@
-
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 1c40bebba52..d98b53ebbbd 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -633,13 +633,10 @@
+
-
-
-
-
-
-
+
+
@@ -1130,8 +1127,8 @@
-
-
+
+
@@ -1177,8 +1174,8 @@
-
-
+
+
@@ -2567,7 +2564,7 @@ action = pool.get('res.config').next(cr, uid, [], context)
-
+
@@ -2629,12 +2626,12 @@ action = pool.get('res.config').next(cr, uid, [], context)
-
-
-
+
+
+
-
+
diff --git a/addons/account_analytic_default/i18n/hu.po b/addons/account_analytic_default/i18n/hu.po
index 557aa2e66f5..8b863f51679 100644
--- a/addons/account_analytic_default/i18n/hu.po
+++ b/addons/account_analytic_default/i18n/hu.po
@@ -7,15 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-02-01 18:11+0000\n"
-"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) "
-"\n"
+"PO-Revision-Date: 2012-10-09 13:58+0000\n"
+"Last-Translator: krnkris \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-08-28 06:22+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_analytic_default
#: help:account.analytic.default,partner_id:0
@@ -134,12 +133,14 @@ msgstr "Gyűjtőkód alapértelmezések"
#. module: account_analytic_default
#: sql_constraint:stock.picking:0
msgid "Reference must be unique per Company!"
-msgstr ""
+msgstr "Minden vállalkozáshoz egyedi hivatkozás kell!"
#. module: account_analytic_default
#: view:account.analytic.default:0
msgid "Analytical defaults whose end date is greater than today or None"
msgstr ""
+"A mai napnál későbbi lejáratú vagy nem létező dátumú elemzések "
+"alapértelmezései"
#. module: account_analytic_default
#: help:account.analytic.default,product_id:0
diff --git a/addons/account_asset/account_asset_view.xml b/addons/account_asset/account_asset_view.xml
index 3fab306863c..520ee733e73 100644
--- a/addons/account_asset/account_asset_view.xml
+++ b/addons/account_asset/account_asset_view.xml
@@ -106,27 +106,27 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/addons/account_budget/i18n/hu.po b/addons/account_budget/i18n/hu.po
index c48392c7c8a..35df6ac7dc9 100644
--- a/addons/account_budget/i18n/hu.po
+++ b/addons/account_budget/i18n/hu.po
@@ -7,15 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-01-30 16:38+0000\n"
-"Last-Translator: NOVOTRADE RENDSZERHÁZ ( novotrade.hu ) "
-"\n"
+"PO-Revision-Date: 2012-10-09 13:49+0000\n"
+"Last-Translator: krnkris \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-08-28 06:27+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_budget
#: field:crossovered.budget,creating_user_id:0
@@ -105,6 +104,7 @@ msgid "Percentage"
msgstr "Százalék"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "to"
msgstr "-"
@@ -138,21 +138,24 @@ msgstr ""
#: code:addons/account_budget/account_budget.py:119
#, python-format
msgid "The Budget '%s' has no accounts!"
-msgstr ""
+msgstr "A '%s' költségvetésnek nincs számlaszáma!"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "%"
msgstr "%"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Description"
msgstr "Leírás"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "Currency"
msgstr "Pénznem"
@@ -187,6 +190,7 @@ msgid "Planned Amount"
msgstr "Tervezett összeg"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Perc(%)"
@@ -199,6 +203,7 @@ msgid "Done"
msgstr "Kész"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Practical Amt"
@@ -259,7 +264,7 @@ msgstr "Üzleti terv"
#. module: account_budget
#: view:crossovered.budget:0
msgid "To Approve Budgets"
-msgstr ""
+msgstr "Költségvetés jóváhagyása"
#. module: account_budget
#: code:addons/account_budget/account_budget.py:119
@@ -333,6 +338,7 @@ msgid "Account Budget crossvered summary report"
msgstr "Üzleti terv összesítő kimutatás"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Theoretical Amt"
@@ -359,9 +365,10 @@ msgstr "Nyomtatás"
#: view:crossovered.budget:0
#: field:crossovered.budget.lines,theoritical_amount:0
msgid "Theoretical Amount"
-msgstr ""
+msgstr "Elméleti mennyiség"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: field:crossovered.budget.lines,analytic_account_id:0
#: model:ir.model,name:account_budget.model_account_analytic_account
msgid "Analytic Account"
@@ -373,6 +380,7 @@ msgid "Budget :"
msgstr "Üzleti terv :"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Planned Amt"
@@ -413,6 +421,7 @@ msgid "Error! You can not create recursive analytic accounts."
msgstr "Hiba! Nem hozhat létre rekurzív gyűjtőkódokat."
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Analysis from"
@@ -421,7 +430,7 @@ msgstr "Elemzési időszak"
#. module: account_budget
#: view:crossovered.budget:0
msgid "Draft Budgets"
-msgstr ""
+msgstr "Előzetes, tervezett költségvetés"
#, python-format
#~ msgid "The General Budget '%s' has no Accounts!"
diff --git a/addons/account_budget/i18n/lo.po b/addons/account_budget/i18n/lo.po
index daa39b8a6e6..cbc81b84000 100644
--- a/addons/account_budget/i18n/lo.po
+++ b/addons/account_budget/i18n/lo.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2011-01-19 15:50+0000\n"
+"PO-Revision-Date: 2012-10-09 16:05+0000\n"
"Last-Translator: Brice Muangkhot ສຸພາ ເມືອງໂຄຕ \n"
"Language-Team: Lao \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:27+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_budget
#: field:crossovered.budget,creating_user_id:0
@@ -31,7 +31,7 @@ msgstr "ຮັບຮູ້ເເລັວ"
#: model:ir.actions.act_window,name:account_budget.open_budget_post_form
#: model:ir.ui.menu,name:account_budget.menu_budget_post_form
msgid "Budgetary Positions"
-msgstr "ຈຸດງົບປະມານ"
+msgstr "ຕໍາແຫນ່ງງົບປະມານ"
#. module: account_budget
#: report:account.budget:0
@@ -105,6 +105,7 @@ msgid "Percentage"
msgstr "ເປີເຊັນ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "to"
msgstr "ຫາ"
@@ -126,6 +127,14 @@ msgid ""
"revenue per analytic account and monitor its evolution based on the actuals "
"realised during that period."
msgstr ""
+"ງົບປະມານແມ່ນຄາດຄະເນລາຍໄດ້ຂອງບໍລິສັດຂອງທ່ານແລະຄ່າໃຊ້ຈ່າຍຄາດວ່າຈະສໍາລັບໄລຍະເວລາ"
+"ໃນອະນາຄົດໄດ້. ມີງົບປະມານ, "
+"ບໍລິສັດສາມາດລະມັດລະວັງເບິ່ງວິທີການເງິນຫຼາຍປານເຂົາເຈົ້າໄດ້ຖືກກິນໃນໄລຍະເວລາໃນໄລ"
+"ຍະໃດຫນຶ່ງ, ແລະສະວິທີທີ່ດີທີ່ສຸດເພື່ອແບ່ງມັນໃນບັນດາປະເພດຂອງລາຍການຕ່າງໆ. "
+"ໂດຍການຮັກສາຕິດຕາມບ່ອນທີ່ເງິນຂອງທ່ານດີ, ທ່ານອາດຈະມີຫນ້ອຍອາດຈະ overspend, "
+"ແລະອື່ນໆທີ່ອາດຈະຕອບສະຫນອງໄດ້ຕາມເປົ້າຫມາຍທາງດ້ານການເງິນຂອງທ່ານ. "
+"ຄາດງົບປະມານໂດຍ detailing ລາຍຮັບຄາດວ່າຈະຕໍ່ບັນຊີແຍກທາດແລະຕິດຕາມກວດກາຂອງຕົນ "
+"evolution ອີງຕາມຕົວຈິງໃນ realized ໃນໄລຍະນັ້ນ."
#. module: account_budget
#: code:addons/account_budget/account_budget.py:119
@@ -134,18 +143,21 @@ msgid "The Budget '%s' has no accounts!"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "%"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Description"
msgstr "ຄຳອະທິບາຍ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:crossovered.budget.report:0
msgid "Currency"
msgstr "ເງິນຕາ"
@@ -170,7 +182,7 @@ msgstr "ເພື່ອຮັບຮູ້"
#. module: account_budget
#: view:crossovered.budget:0
msgid "Reset to Draft"
-msgstr ""
+msgstr "ປັບກັບຮ່າງ"
#. module: account_budget
#: view:account.budget.post:0
@@ -180,6 +192,7 @@ msgid "Planned Amount"
msgstr "ຈໍານວນຄາດໝາຍມ້ຽນ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Perc(%)"
@@ -192,6 +205,7 @@ msgid "Done"
msgstr "ຈົບເເລັວ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Practical Amt"
@@ -203,7 +217,7 @@ msgstr ""
#: view:crossovered.budget:0
#: field:crossovered.budget.lines,practical_amount:0
msgid "Practical Amount"
-msgstr ""
+msgstr "ຈໍານວນເງິນປະຕິບັດໄດ້"
#. module: account_budget
#: field:crossovered.budget,date_to:0
@@ -292,7 +306,7 @@ msgstr ""
#. module: account_budget
#: selection:crossovered.budget,state:0
msgid "Cancelled"
-msgstr ""
+msgstr "ຍົກເລີກ"
#. module: account_budget
#: view:crossovered.budget:0
@@ -326,6 +340,7 @@ msgid "Account Budget crossvered summary report"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Theoretical Amt"
@@ -355,6 +370,7 @@ msgid "Theoretical Amount"
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: field:crossovered.budget.lines,analytic_account_id:0
#: model:ir.model,name:account_budget.model_account_analytic_account
msgid "Analytic Account"
@@ -366,6 +382,7 @@ msgid "Budget :"
msgstr "ງົບປະມານ"
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Planned Amt"
@@ -406,6 +423,7 @@ msgid "Error! You can not create recursive analytic accounts."
msgstr ""
#. module: account_budget
+#: report:account.analytic.account.budget:0
#: report:account.budget:0
#: report:crossovered.budget.report:0
msgid "Analysis from"
diff --git a/addons/account_followup/i18n/ar.po b/addons/account_followup/i18n/ar.po
index 567253c4c02..bf1fde2db25 100644
--- a/addons/account_followup/i18n/ar.po
+++ b/addons/account_followup/i18n/ar.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:35+0000\n"
-"PO-Revision-Date: 2009-02-03 06:24+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2012-10-08 15:59+0000\n"
+"Last-Translator: waleed bazaza \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-08-28 06:07+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: account_followup
#: view:account_followup.followup:0
@@ -42,7 +42,7 @@ msgstr "متابعة"
#: help:account.followup.print.all,test_print:0
msgid ""
"Check if you want to print followups without changing followups level."
-msgstr ""
+msgstr "اختر هذه الخانة إذا أردت طباعة المتابعات بدون تغيير متوى المتابعات."
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
@@ -101,7 +101,7 @@ msgstr "الدليل"
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow up Entries with period in current year"
-msgstr ""
+msgstr "مدخلات المتابعات بفترات في السنة الحالية"
#. module: account_followup
#: view:account.followup.print.all:0
@@ -314,6 +314,9 @@ msgid ""
"\n"
"%s"
msgstr ""
+"جميع رسائل البريد الالكتروني قد أرسلت بنجاح للشركاء:.\n"
+"\n"
+"%s"
#. module: account_followup
#: constraint:account_followup.followup.line:0
@@ -362,6 +365,11 @@ msgid ""
"\n"
"%s"
msgstr ""
+"\n"
+"\n"
+"رسالة البريد الالكتروني قد أرسلت للشركاء التاليين.!\n"
+"\n"
+"%s"
#. module: account_followup
#: help:account.followup.print,date:0
@@ -503,7 +511,7 @@ msgstr "تقرير المتابعة"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-Up Steps"
-msgstr ""
+msgstr "خطوات المتابعة"
#. module: account_followup
#: field:account_followup.stat,period_id:0
@@ -514,7 +522,7 @@ msgstr "فترة"
#: code:addons/account_followup/wizard/account_followup_print.py:307
#, python-format
msgid "Followup Summary"
-msgstr ""
+msgstr "خلاصة المتابعة"
#. module: account_followup
#: view:account.followup.print:0
@@ -535,7 +543,7 @@ msgstr "مستوى اعلى متابعة"
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_view_account_followup_followup_form
msgid "Review Invoicing Follow-Ups"
-msgstr ""
+msgstr "استعراض متابعة الفوترة"
#. module: account_followup
#: constraint:account.move.line:0
@@ -595,7 +603,7 @@ msgstr "الوصف"
#. module: account_followup
#: constraint:account_followup.followup:0
msgid "Only One Followup by Company."
-msgstr ""
+msgstr "متابعة واحدة غقط من الشركة."
#. module: account_followup
#: view:account_followup.stat:0
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index 423026251c2..f97f3f6af3c 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -1070,7 +1070,8 @@ class account_voucher(osv.osv):
if line.amount == line.amount_unreconciled:
if not line.move_line_id.amount_residual:
raise osv.except_osv(_('Wrong bank statement line'),_("You have to delete the bank statement line which the payment was reconciled to manually. Please check the payment of the partner %s by the amount of %s.")%(line.voucher_id.partner_id.name, line.voucher_id.amount))
- currency_rate_difference = line.move_line_id.amount_residual - amount
+ sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1
+ currency_rate_difference = sign * (line.move_line_id.amount_residual - amount)
else:
currency_rate_difference = 0.0
move_line = {
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 78b76e5c9b7..e1a48c6c535 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -136,11 +136,8 @@
-
-
-
-
-
+
+
-
+
-
-
-
-
-
+
+
-
+
-
+
-
-
-
-
-
-
+
+
-
+
-
+
-
+
diff --git a/addons/auth_oauth/auth_oauth_data.xml b/addons/auth_oauth/auth_oauth_data.xml
index 83e9df2e44d..c07359a062c 100644
--- a/addons/auth_oauth/auth_oauth_data.xml
+++ b/addons/auth_oauth/auth_oauth_data.xml
@@ -1,6 +1,6 @@
-
+
OpenERP Accounts
diff --git a/addons/auth_oauth/controllers/main.py b/addons/auth_oauth/controllers/main.py
index ae01df5f6f7..26016f3f0a1 100644
--- a/addons/auth_oauth/controllers/main.py
+++ b/addons/auth_oauth/controllers/main.py
@@ -4,28 +4,25 @@ import simplejson
import werkzeug.urls
import werkzeug.utils
-import openerp.modules.registry
-import openerp.addons.web.controllers.main
-import openerp.addons.web.common.http as openerpweb
-from openerp import SUPERUSER_ID
+import openerp
_logger = logging.getLogger(__name__)
-class OAuthController(openerpweb.Controller):
+class OAuthController(openerp.addons.web.http.Controller):
_cp_path = '/auth_oauth'
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def list_providers(self, req, dbname):
try:
registry = openerp.modules.registry.RegistryManager.get(dbname)
with registry.cursor() as cr:
providers = registry.get('auth.oauth.provider')
- l = providers.read(cr, SUPERUSER_ID, providers.search(cr, SUPERUSER_ID, [('enabled','=',True)]))
+ l = providers.read(cr, openerp.SUPERUSER_ID, providers.search(cr, openerp.SUPERUSER_ID, [('enabled','=',True)]))
except Exception:
l = []
return l
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def signin(self, req, **kw):
state = simplejson.loads(kw['state'])
dbname = state['d']
@@ -34,7 +31,7 @@ class OAuthController(openerpweb.Controller):
with registry.cursor() as cr:
try:
u = registry.get('res.users')
- credentials = u.auth_oauth(cr, SUPERUSER_ID, provider, kw)
+ credentials = u.auth_oauth(cr, openerp.SUPERUSER_ID, provider, kw)
cr.commit()
return openerp.addons.web.controllers.main.login_and_redirect(req, *credentials)
except AttributeError:
@@ -43,7 +40,7 @@ class OAuthController(openerpweb.Controller):
url = "/#action=login&oauth_error=1"
except Exception,e:
# signup error
- _logger.exception('oops')
+ _logger.exception("OAuth2: %s" % str(e))
url = "/#action=login&oauth_error=2"
return openerp.addons.web.controllers.main.set_cookie_and_redirect(req, url)
diff --git a/addons/auth_oauth/res_users.py b/addons/auth_oauth/res_users.py
index fd26e89c2e3..9c1f88bd7f4 100644
--- a/addons/auth_oauth/res_users.py
+++ b/addons/auth_oauth/res_users.py
@@ -15,13 +15,17 @@ class res_users(osv.Model):
_inherit = 'res.users'
_columns = {
- 'oauth_provider_id': fields.many2one('auth.oauth.provider','OAuth Provider'),
+ 'oauth_provider_id': fields.many2one('auth.oauth.provider', 'OAuth Provider'),
'oauth_uid': fields.char('OAuth User ID', help="Oauth Provider user_id"),
- 'oauth_access_token': fields.char('OAuth Token', readonly=True),
+ 'oauth_access_token': fields.char('OAuth Access Token', readonly=True),
}
+ _sql_constraints = [
+ ('uniq_users_oauth_provider_oauht_uid', 'unique(auth_provider_id, auth_uid)', 'OAuth UID must be unique per provider'),
+ ]
+
def auth_oauth_rpc(self, cr, uid, endpoint, access_token, context=None):
- params = urllib.urlencode({ 'access_token': access_token })
+ params = urllib.urlencode({'access_token': access_token})
if urlparse.urlparse(endpoint)[4]:
url = endpoint + '&' + params
else:
@@ -41,22 +45,26 @@ class res_users(osv.Model):
validation = self.auth_oauth_rpc(cr, uid, p.validation_endpoint, access_token)
if validation.get("error"):
- raise openerp.exceptions.AccessDenied
+ raise Exception(validation['error'])
if p.data_endpoint:
data = self.auth_oauth_rpc(cr, uid, p.data_endpoint, access_token)
validation.update(data)
# required
oauth_uid = validation['user_id']
if not oauth_uid:
- raise openerp.exceptions.AccessDenied
+ raise openerp.exceptions.AccessDenied()
email = validation.get('email', 'provider_%d_user_%d' % (p.id, oauth_uid))
# optional
name = validation.get('name', email)
- res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid)])
+ res = self.search(cr, uid, [("oauth_uid", "=", oauth_uid), ('oauth_provider_id', '=', provider)])
if res:
- self.write(cr, uid, res[0], { 'oauth_access_token': access_token })
+ assert len(res) == 1
+ self.write(cr, uid, res[0], {'oauth_access_token': access_token})
else:
- # New user
+ # New user if signup module available
+ if not hasattr(self, '_signup_create_user'):
+ raise openerp.exceptions.AccessDenied()
+
new_user = {
'name': name,
'login': email,
@@ -66,7 +74,9 @@ class res_users(osv.Model):
'oauth_access_token': access_token,
'active': True,
}
- self.auth_signup_create(cr, uid, new_user)
+ # TODO pass signup token to allow attach new user to right partner
+ self._signup_create_user(cr, uid, new_user)
+
credentials = (cr.dbname, email, access_token)
return credentials
@@ -74,7 +84,7 @@ class res_users(osv.Model):
try:
return super(res_users, self).check_credentials(cr, uid, password)
except openerp.exceptions.AccessDenied:
- res = self.search(cr, SUPERUSER_ID, [('id','=',uid),('oauth_access_token','=',password)])
+ res = self.search(cr, SUPERUSER_ID, [('id', '=', uid), ('oauth_access_token', '=', password)])
if not res:
raise
diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py
index ebcaab4bf25..7ee562d4d29 100644
--- a/addons/auth_openid/controllers/main.py
+++ b/addons/auth_openid/controllers/main.py
@@ -23,24 +23,21 @@ import logging
import os
import tempfile
import urllib
-from openerp import SUPERUSER_ID
import werkzeug.urls
import werkzeug.exceptions
-from openerp.modules.registry import RegistryManager
-from openerp.addons.web.controllers.main import login_and_redirect, set_cookie_and_redirect
-try:
- import openerp.addons.web.common.http as openerpweb
-except ImportError:
- import web.common.http as openerpweb # noqa
-
from openid import oidutil
from openid.store import filestore
from openid.consumer import consumer
from openid.cryptutil import randomString
from openid.extensions import ax, sreg
+import openerp
+from openerp import SUPERUSER_ID
+from openerp.modules.registry import RegistryManager
+from openerp.addons.web.controllers.main import login_and_redirect, set_cookie_and_redirect
+
from .. import utils
_logger = logging.getLogger(__name__)
@@ -70,7 +67,7 @@ class GoogleAppsAwareConsumer(consumer.GenericConsumer):
return super(GoogleAppsAwareConsumer, self).complete(message, endpoint, return_to)
-class OpenIDController(openerpweb.Controller):
+class OpenIDController(openerp.addons.web.http.Controller):
_cp_path = '/auth_openid/login'
_store = filestore.FileOpenIDStore(_storedir)
@@ -118,7 +115,7 @@ class OpenIDController(openerpweb.Controller):
def _get_realm(self, req):
return req.httprequest.host_url
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def verify_direct(self, req, db, url):
result = self._verify(req, db, url)
if 'error' in result:
@@ -127,7 +124,7 @@ class OpenIDController(openerpweb.Controller):
return werkzeug.utils.redirect(result['value'])
return result['value']
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def verify(self, req, db, url):
return self._verify(req, db, url)
@@ -157,7 +154,7 @@ class OpenIDController(openerpweb.Controller):
form_html = request.htmlMarkup(realm, redirect_to)
return {'action': 'post', 'value': form_html, 'session_id': req.session_id}
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def process(self, req, **kw):
session = getattr(req.session, 'openid_session', None)
if not session:
@@ -225,7 +222,7 @@ class OpenIDController(openerpweb.Controller):
return set_cookie_and_redirect(req, '/#action=login&loginerror=1')
- @openerpweb.jsonrequest
+ @openerp.addons.web.http.jsonrequest
def status(self, req):
session = getattr(req.session, 'openid_session', {})
return {'status': session.get('status'), 'message': session.get('message')}
diff --git a/addons/auth_reset_password/__init__.py b/addons/auth_reset_password/__init__.py
index 28bbdd18161..8341ccd60c7 100644
--- a/addons/auth_reset_password/__init__.py
+++ b/addons/auth_reset_password/__init__.py
@@ -1 +1,23 @@
-import auth_reset_password
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+
+import controllers
+import res_users
diff --git a/addons/auth_reset_password/__openerp__.py b/addons/auth_reset_password/__openerp__.py
index ccf5ca53a21..e620d515fa1 100644
--- a/addons/auth_reset_password/__openerp__.py
+++ b/addons/auth_reset_password/__openerp__.py
@@ -1,3 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+
{
'name': 'Reset Password',
'description': """
@@ -9,9 +30,11 @@ Allow users to reset their password from the login page.
'category': 'Authentication',
'website': 'http://www.openerp.com',
'installable': True,
- 'depends': ['auth_anonymous', 'email_template'],
- 'data': ['auth_reset_password.xml'],
+ 'depends': ['auth_signup', 'email_template'],
+ 'data': [
+ 'auth_reset_password.xml',
+ 'res_users_view.xml',
+ ],
'js': ['static/src/js/reset_password.js'],
- 'css': ['static/src/css/reset_password.css'],
'qweb': ['static/src/xml/reset_password.xml'],
}
diff --git a/addons/auth_reset_password/auth_reset_password.py b/addons/auth_reset_password/auth_reset_password.py
deleted file mode 100644
index cef7bc9c212..00000000000
--- a/addons/auth_reset_password/auth_reset_password.py
+++ /dev/null
@@ -1,130 +0,0 @@
-import base64
-import hashlib
-import simplejson
-import time
-import urlparse
-
-from openerp.tools import config
-from openerp.osv import osv, fields
-from openerp import SUPERUSER_ID
-
-TWENTY_FOUR_HOURS = 24 * 60 * 60
-
-def message_sign(data, secret):
- src = simplejson.dumps([data, secret], indent=None, separators=(',', ':'), sort_keys=True)
- sign = hashlib.sha1(src).hexdigest()
- msg = simplejson.dumps([data, sign], indent=None, separators=(',', ':'), sort_keys=True)
- # pad message to avoid '='
- pad = (3 - len(msg) % 3) % 3
- msg = msg + " " * pad
- msg = base64.urlsafe_b64encode(msg)
- return msg, sign
-
-def message_check(msg, secret):
- msg = base64.urlsafe_b64decode(msg)
- l = simplejson.loads(msg)
- msg_data = l[0]
- msg_sign = l[1]
- tmp, sign = message_sign(msg_data, secret)
- if msg_sign == sign:
- return msg_data
-
-class res_users(osv.osv):
- _inherit = 'res.users'
-
- def _auth_reset_password_secret(self, cr, uid, context=None):
- uuid = self.pool.get('ir.config_parameter').get_param(cr, uid, 'database.uuid')
- res = {
- 'dbname': cr.dbname,
- 'uuid': uuid,
- 'admin_passwd': config['admin_passwd']
- }
- return res
-
- def _auth_reset_password_host(self, cr, uid, context=None):
- return self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', '')
-
- def _auth_reset_password_link(self, cr, uid, ids, context=None):
- assert len(ids) == 1
- host = self._auth_reset_password_host(cr, uid, context)
- secret = self._auth_reset_password_secret(cr, uid, context)
- msg_src = {
- 'time': time.time(),
- 'uid': ids[0],
- }
- msg, sign = message_sign(msg_src, secret)
- link = urlparse.urljoin(host, '/login?db=%s&login=anonymous&key=anonymous#action=reset_password&token=%s' % (cr.dbname, msg))
- return link
-
- def _auth_reset_password_check_token(self, cr, uid, token, context=None):
- secret = self._auth_reset_password_secret(cr, uid, context)
- data = message_check(token, secret)
- if data and (time.time() - data['time'] < TWENTY_FOUR_HOURS):
- return data
- return None
-
- def _auth_reset_password_send_email(self, cr, uid, email_to, tpl_name, res_id, context=None):
- model, tpl_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'auth_reset_password', tpl_name)
- assert model == 'email.template'
-
- msg_id = self.pool.get(model).send_mail(cr, uid, tpl_id, res_id, force_send=False, context=context)
- MailMessage = self.pool.get('mail.message')
- MailMessage.write(cr, uid, [msg_id], {'email_to': email_to}, context=context)
- MailMessage.send(cr, uid, [msg_id], context=context)
-
- def send_reset_password_request(self, cr, uid, email, context=None):
- # TODO reseting a password knowing only an email is not good enough (email can be shared between multiple logins).
- ids = self.pool.get('res.users').search(cr, SUPERUSER_ID, [('user_email', '=', email)], context=context)
- if ids:
- self._auth_reset_password_send_email(cr, SUPERUSER_ID, email, 'reset_password_email', ids[0], context=context)
- return True
- #else:
- # _m, company_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', 'main_company')
- # self._auth_reset_password_send_email(cr, uid, email, 'email_no_user', company_id, context=context)
- return False
-
-class auth_reset_password(osv.TransientModel):
- _name = 'auth.reset_password'
- _rec_name = 'password'
- _columns = {
- 'password': fields.char('Password', size=64),
- 'password_confirmation': fields.char('Confirm Password', size=64),
- 'token': fields.char('Token', size=128),
- 'state': fields.selection([(x, x) for x in 'draft done missmatch error'.split()], required=True),
- }
- _defaults = {
- 'state': 'draft',
- }
-
- def create(self, cr, uid, values, context=None):
- # NOTE here, invalid values raises exceptions to avoid storing
- # sensitive data into the database (which then are available to anyone)
-
- pw = values.get('password')
- if not pw or pw != values.get('password_confirmation'):
- raise osv.except_osv('Error', 'Passwords missmatch')
-
- Users = self.pool.get('res.users')
- data = Users._auth_reset_password_check_token(cr, uid, values.get('token', ''))
- if data:
- Users.write(cr, SUPERUSER_ID, data['uid'], {'password': pw}, context=context)
- else:
- raise osv.except_osv('Error', 'Invalid token')
-
- # Dont store password
- values = {'state': 'done'}
- return super(auth_reset_password, self).create(cr, uid, values, context)
-
- def change(self, cr, uid, ids, context=None):
- return True
-
- def onchange_pw(self, cr, uid, ids, password, password_confirmation, context=None):
- if password != password_confirmation:
- return {'value': {'state': 'missmatch'}}
- return {'value': {'state': 'draft'}}
-
- def onchange_token(self, cr, uid, ids, token, context=None):
- Users = self.pool.get('res.users')
- if not Users._auth_reset_password_check_token(cr, uid, token, context=context):
- return {'value': {'state': 'error'}}
- return {}
diff --git a/addons/auth_reset_password/auth_reset_password.xml b/addons/auth_reset_password/auth_reset_password.xml
index bb75da34ce8..90f08a25899 100644
--- a/addons/auth_reset_password/auth_reset_password.xml
+++ b/addons/auth_reset_password/auth_reset_password.xml
@@ -7,56 +7,15 @@
Reset Password
]]>
-
+ ${object.email}
Password reset
A password reset was requested the OpenERP account linked to this email on ${object._auth_reset_password_host()}
+A password reset was requested for the OpenERP account linked to this email.
-You may change your password following this link ,
-or by copy-pasting the following URL in your browser: ${object._auth_reset_password_link()}
+You may change your password following this link .
Note: If you did not ask for a password reset, you can safely ignore this email.
]]>
-
-
- auth.reset_password.form
- auth.reset_password
-
-
-
-
-
-
- Reset Password
- ir.actions.act_window
- auth.reset_password
- form
- form
- new
-
-
-
diff --git a/addons/auth_reset_password/controllers/__init__.py b/addons/auth_reset_password/controllers/__init__.py
new file mode 100644
index 00000000000..f40f0ee976e
--- /dev/null
+++ b/addons/auth_reset_password/controllers/__init__.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+
+import main
+
+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_reset_password/controllers/main.py b/addons/auth_reset_password/controllers/main.py
new file mode 100644
index 00000000000..639945cfc09
--- /dev/null
+++ b/addons/auth_reset_password/controllers/main.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+import logging
+
+import werkzeug
+
+import openerp
+from openerp import SUPERUSER_ID
+from openerp.modules.registry import RegistryManager
+
+_logger = logging.getLogger(__name__)
+
+class Controller(openerp.addons.web.http.Controller):
+ _cp_path = '/auth_reset_password'
+
+ @openerp.addons.web.http.httprequest
+ def reset_password(self, req, dbname, login):
+ """ retrieve user, and perform reset password """
+ url = '/'
+ registry = RegistryManager.get(dbname)
+ with registry.cursor() as cr:
+ try:
+ res_users = registry.get('res.users')
+ res_users.reset_password(cr, SUPERUSER_ID, login)
+ cr.commit()
+ message = 'An email has been sent with credentials to reset your password'
+ except Exception as e:
+ # signup error
+ _logger.exception('error when resetting password')
+ message = e.message
+ url = "/#action=login&error_message=%s" % werkzeug.urls.url_quote(message)
+ return werkzeug.utils.redirect(url)
+
+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_reset_password/res_users.py b/addons/auth_reset_password/res_users.py
new file mode 100644
index 00000000000..b1039031812
--- /dev/null
+++ b/addons/auth_reset_password/res_users.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+
+from openerp.osv import osv, fields
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+
+from datetime import datetime, timedelta
+
+def now(**kwargs):
+ dt = datetime.now() + timedelta(**kwargs)
+ return dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
+
+class res_users(osv.osv):
+ _inherit = 'res.users'
+
+ def reset_password(self, cr, uid, login, context=None):
+ """ retrieve the user corresponding to login (login or email),
+ and reset their password
+ """
+ user_ids = self.search(cr, uid, [('login', '=', login)], context=context)
+ if not user_ids:
+ user_ids = self.search(cr, uid, [('email', '=', login)], context=context)
+ if len(user_ids) != 1:
+ raise Exception('Reset password: invalid username or email')
+ return self.action_reset_password(cr, uid, user_ids, context=context)
+
+ def action_reset_password(self, cr, uid, ids, context=None):
+ """ create signup token for each user, and send their signup url by email """
+ # prepare reset password signup
+ res_partner = self.pool.get('res.partner')
+ partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context)]
+ res_partner.signup_prepare(cr, uid, partner_ids, expiration=now(days=+1), context=context)
+
+ # send email to users with their signup url
+ template = self.pool.get('ir.model.data').get_object(cr, uid, 'auth_reset_password', 'reset_password_email')
+ assert template._name == 'email.template'
+ for user in self.browse(cr, uid, ids, context):
+ self.pool.get('email.template').send_mail(cr, uid, template.id, user.id, context=context)
+
+ return True
diff --git a/addons/auth_reset_password/res_users_view.xml b/addons/auth_reset_password/res_users_view.xml
new file mode 100644
index 00000000000..9952162ae65
--- /dev/null
+++ b/addons/auth_reset_password/res_users_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ user.form.reset_password
+ res.users
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/auth_reset_password/static/src/css/reset_password.css b/addons/auth_reset_password/static/src/css/reset_password.css
deleted file mode 100644
index dd590365918..00000000000
--- a/addons/auth_reset_password/static/src/css/reset_password.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.openerp .oe_login .oe_login_pane {
- height: 152px;
-}
-.openerp .oe_login .oe_login_pane ul.oe_login_switch a {
- color: #eeeeee;
- margin: 0 8px;
-}
-.openerp .oe_login .oe_login_pane ul.oe_login_switch a:hover {
- text-decoration: underline;
-}
-
-
diff --git a/addons/auth_reset_password/static/src/js/reset_password.js b/addons/auth_reset_password/static/src/js/reset_password.js
index 4e09b5c5318..13fe2a39ce5 100644
--- a/addons/auth_reset_password/static/src/js/reset_password.js
+++ b/addons/auth_reset_password/static/src/js/reset_password.js
@@ -1,72 +1,30 @@
openerp.auth_reset_password = function(instance) {
var _t = instance.web._t;
+
instance.web.Login.include({
start: function() {
- var $e = this.$el;
- $e.find('a.oe_login_switch').click(function() {
- $e.find('ul.oe_login_switch').toggle();
- var $m = $e.find('form input[name=is_reset_pw]');
- $m.attr('checked', !$m.is(':checked'));
- });
+ this.$('a.oe_reset_password').click(this.do_reset_password);
return this._super();
},
- on_submit: function(ev) {
- if(ev) {
+ do_reset_password: function(ev) {
+ if (ev) {
ev.preventDefault();
}
-
- var $e = this.$el;
- var db = $e.find("form [name=db]").val();
+ var db = this.$("form [name=db]").val();
+ var login = this.$("form input[name=login]").val();
if (!db) {
- this.do_warn(_t("Login"), _t("No database selected !"));
+ this.do_warn("Login", "No database selected !");
+ return false;
+ } else if (!login) {
+ this.do_warn("Login", "Please enter a username or email address.")
return false;
}
- var $m = $e.find('form input[name=is_reset_pw]');
- if ($m.is(':checked')) {
- var email = $e.find('form input[name=email]').val();
- return this.do_reset_password(db, email);
- } else {
- return this._super(ev);
- }
- },
- do_reset_password: function(db, email) {
- var self = this;
- instance.session.session_authenticate(db, 'anonymous', 'anonymous', true).pipe(function () {
- var func = new instance.web.Model("res.users").get_func("send_reset_password_request");
- return func(email).then(function(res) {
- // show message
- self.do_notify(_t('Reset Password'), _.str.sprintf(_t('We have sent an email to %s with further instructions'), email), true);
- }, function(error, event) {
- // no traceback please
- event.preventDefault();
- });
- }).fail(function(error, event) {
- // cannot log as anonymous or reset_password not installed
- self.do_warn(_t('Reset Password'), _.str.sprintf(_t('Reset Password functionnality is not available for database %s'), db), true);
- });
+ var params = {
+ dbname : db,
+ login: login,
+ };
+ var url = "/auth_reset_password/reset_password?" + $.param(params);
+ window.location = url;
}
});
-
- instance.reset_password = {};
- instance.reset_password.ResetPassword = instance.web.Widget.extend({
- init: function(parent, params) {
- this._super(parent);
- this.token = (params && params.token) || false;
- },
- start: function() {
- this.do_action({
- name: 'Reset Password',
- type: 'ir.actions.act_window',
- context: {default_token: this.token},
- res_model: 'auth.reset_password',
- target: 'new',
- views: [[false, 'form']]
- });
- }
- });
-
-
- instance.web.client_actions.add("reset_password", "instance.reset_password.ResetPassword");
-
-
};
diff --git a/addons/auth_reset_password/static/src/xml/reset_password.xml b/addons/auth_reset_password/static/src/xml/reset_password.xml
index e57334b9c15..841f3906622 100644
--- a/addons/auth_reset_password/static/src/xml/reset_password.xml
+++ b/addons/auth_reset_password/static/src/xml/reset_password.xml
@@ -1,26 +1,11 @@
-
+
-
- // addClass does not work :(
- this.attr('class', (this.attr('class') || '') + ' oe_login_switch');
-
-
- Forgot your password?
-
-
-
-
+ Reset password
+
diff --git a/addons/auth_signup/__openerp__.py b/addons/auth_signup/__openerp__.py
index 9cfe89cdc1c..9cbeb60638f 100644
--- a/addons/auth_signup/__openerp__.py
+++ b/addons/auth_signup/__openerp__.py
@@ -34,7 +34,9 @@ Allow users to sign up.
'data': [
'auth_signup_data.xml',
'res_config.xml',
+ 'res_users_view.xml',
],
'js': ['static/src/js/auth_signup.js'],
+ 'css' : ['static/src/css/base.css'],
'qweb': ['static/src/xml/auth_signup.xml'],
}
diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py
index 821ef44f459..54dcc5b4362 100644
--- a/addons/auth_signup/controllers/main.py
+++ b/addons/auth_signup/controllers/main.py
@@ -1,35 +1,62 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
import logging
-import werkzeug.urls
+import werkzeug
+import openerp
from openerp.modules.registry import RegistryManager
from openerp.addons.web.controllers.main import login_and_redirect
-import openerp.addons.web.common.http as openerpweb
-from openerp import SUPERUSER_ID
_logger = logging.getLogger(__name__)
-class OpenIDController(openerpweb.Controller):
+class Controller(openerp.addons.web.http.Controller):
_cp_path = '/auth_signup'
- @openerpweb.httprequest
- def signup(self, req, dbname, name, login, password):
+ @openerp.addons.web.http.jsonrequest
+ def retrieve(self, req, dbname, token):
+ """ retrieve the user info (name, login or email) corresponding to a signup token """
+ registry = RegistryManager.get(dbname)
+ user_info = None
+ with registry.cursor() as cr:
+ res_partner = registry.get('res.partner')
+ user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token)
+ return user_info
+
+ @openerp.addons.web.http.httprequest
+ def signup(self, req, dbname, token, name, login, password, state=''):
+ """ sign up a user (new or existing), and log it in """
url = '/'
registry = RegistryManager.get(dbname)
with registry.cursor() as cr:
try:
- Users = registry.get('res.users')
- credentials = Users.auth_signup(cr, SUPERUSER_ID, name, login, password)
+ res_users = registry.get('res.users')
+ values = {'name': name, 'login': login, 'password': password}
+ credentials = res_users.signup(cr, openerp.SUPERUSER_ID, values, token)
cr.commit()
- return login_and_redirect(req, *credentials)
- except AttributeError:
- # auth_signup is not installed
- _logger.exception('attribute error when signup')
- url = "/#action=auth_signup&error=NA" # Not Available
- except Exception:
+ return login_and_redirect(req, *credentials, redirect_url='/#%s'%state)
+ except Exception as e:
# signup error
_logger.exception('error when signup')
- url = "/#action=auth_signup&error=UE" # Unexcpected Error
+ url = "/#action=login&error_message=%s" % werkzeug.urls.url_quote(e.message)
return werkzeug.utils.redirect(url)
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/auth_signup/res_config.py b/addons/auth_signup/res_config.py
index 8bfe1fc3ddb..21fce19745c 100644
--- a/addons/auth_signup/res_config.py
+++ b/addons/auth_signup/res_config.py
@@ -20,22 +20,27 @@
##############################################################################
from openerp.osv import osv, fields
+from openerp.tools.safe_eval import safe_eval
class base_config_settings(osv.TransientModel):
_inherit = 'base.config.settings'
_columns = {
- 'auth_signup_uninvited': fields.boolean('Allow public users to sign up', help="If unchecked only invited users may sign up"),
+ 'auth_signup_uninvited': fields.boolean('Allow external users to sign up', help="If unchecked, only invited users may sign up"),
'auth_signup_template_user_id': fields.many2one('res.users', 'Template user for new users created through signup'),
}
def get_default_auth_signup_template_user_id(self, cr, uid, fields, context=None):
icp = self.pool.get('ir.config_parameter')
+ # we use safe_eval on the result, since the value of the parameter is a nonempty string
return {
- 'auth_signup_template_user_id': icp.get_param(cr, uid, 'auth_signup.template_user_id', 0) or False
+ 'auth_signup_uninvited': safe_eval(icp.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')),
+ 'auth_signup_template_user_id': safe_eval(icp.get_param(cr, uid, 'auth_signup.template_user_id', 'False')),
}
def set_auth_signup_template_user_id(self, cr, uid, ids, context=None):
config = self.browse(cr, uid, ids[0], context=context)
icp = self.pool.get('ir.config_parameter')
- icp.set_param(cr, uid, 'auth_signup.template_user_id', config.auth_signup_template_user_id.id)
+ # we store the repr of the values, since the value of the parameter is a required string
+ icp.set_param(cr, uid, 'auth_signup.allow_uninvited', repr(config.auth_signup_uninvited))
+ icp.set_param(cr, uid, 'auth_signup.template_user_id', repr(config.auth_signup_template_user_id.id))
diff --git a/addons/auth_signup/res_config.xml b/addons/auth_signup/res_config.xml
index c17634ececb..9d3eb4eaa5a 100644
--- a/addons/auth_signup/res_config.xml
+++ b/addons/auth_signup/res_config.xml
@@ -14,7 +14,9 @@
-
+
diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py
index 5f6463508b6..59196c4da87 100644
--- a/addons/auth_signup/res_users.py
+++ b/addons/auth_signup/res_users.py
@@ -1,47 +1,201 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2012-today OpenERP SA ()
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
+#
+##############################################################################
+import random
+import time
+import urllib
+import urlparse
+
import openerp
-from openerp.osv import osv
+from openerp.osv import osv, fields
from openerp import SUPERUSER_ID
+from openerp.tools.misc import DEFAULT_SERVER_DATETIME_FORMAT
+from openerp.tools.safe_eval import safe_eval
+
+def random_token():
+ # the token has an entropy of about 120 bits (6 bits/char * 20 chars)
+ chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+ return ''.join(random.choice(chars) for i in xrange(20))
+
+def now():
+ return time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
+
+class res_partner(osv.Model):
+ _inherit = 'res.partner'
+
+ def _get_signup_valid(self, cr, uid, ids, name, arg, context=None):
+ dt = now()
+ res = {}
+ for partner in self.browse(cr, uid, ids, context):
+ res[partner.id] = bool(partner.signup_token) and \
+ (not partner.signup_expiration or dt <= partner.signup_expiration)
+ return res
+
+ def _get_signup_url(self, cr, uid, ids, name, arg, context=None):
+ """ determine a signup url for a given partner """
+ base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url')
+
+ # if required, make sure that every partner without user has a valid signup token
+ if context and context.get('signup_valid'):
+ unsigned_ids = [p.id for p in self.browse(cr, uid, ids, context) if not p.user_ids]
+ self.signup_prepare(cr, uid, unsigned_ids, context=context)
+
+ res = dict.fromkeys(ids, False)
+ for partner in self.browse(cr, uid, ids, context):
+ if partner.signup_token:
+ params = (urllib.quote(cr.dbname), urllib.quote(partner.signup_token))
+ res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&token=%s" % params)
+ elif partner.user_ids:
+ user = partner.user_ids[0]
+ params = (urllib.quote(cr.dbname), urllib.quote(user.login))
+ res[partner.id] = urlparse.urljoin(base_url, "#action=login&db=%s&login=%s" % params)
+ return res
+
+ _columns = {
+ 'signup_token': fields.char(size=24, string='Signup Token'),
+ 'signup_expiration': fields.datetime(string='Signup Expiration'),
+ 'signup_valid': fields.function(_get_signup_valid, type='boolean', string='Signup Token is Valid'),
+ 'signup_url': fields.function(_get_signup_url, type='char', string='Signup URL'),
+ }
+
+ def action_signup_prepare(self, cr, uid, ids, context=None):
+ return self.signup_prepare(cr, uid, ids, context=context)
+
+ def signup_prepare(self, cr, uid, ids, expiration=False, context=None):
+ """ generate a new token for the partners with the given validity, if necessary
+ :param expiration: the expiration datetime of the token (string, optional)
+ """
+ for partner in self.browse(cr, uid, ids, context):
+ if expiration or not partner.signup_valid:
+ token = random_token()
+ while self._signup_retrieve_partner(cr, uid, token, context=context):
+ token = random_token()
+ partner.write({'signup_token': token, 'signup_expiration': expiration})
+ return True
+
+ def _signup_retrieve_partner(self, cr, uid, token,
+ check_validity=False, raise_exception=False, context=None):
+ """ find the partner corresponding to a token, and possibly check its validity
+ :param token: the token to resolve
+ :param check_validity: if True, also check validity
+ :param raise_exception: if True, raise exception instead of returning False
+ :return: partner (browse record) or False (if raise_exception is False)
+ """
+ partner_ids = self.search(cr, uid, [('signup_token', '=', token)], context=context)
+ if not partner_ids:
+ if raise_exception:
+ raise Exception("Signup token '%s' is not valid" % token)
+ return False
+ partner = self.browse(cr, uid, partner_ids[0], context)
+ if check_validity and not partner.signup_valid:
+ if raise_exception:
+ raise Exception("Signup token '%s' is no longer valid" % token)
+ return False
+ return partner
+
+ def signup_retrieve_info(self, cr, uid, token, context=None):
+ """ retrieve the user info about the token
+ :return: a dictionary with the user information:
+ - 'db': the name of the database
+ - 'token': the token, if token is valid
+ - 'name': the name of the partner, if token is valid
+ - 'login': the user login, if the user already exists
+ - 'email': the partner email, if the user does not exist
+ """
+ partner = self._signup_retrieve_partner(cr, uid, token, raise_exception=True, context=None)
+ res = {'db': cr.dbname}
+ if partner.signup_valid:
+ res['token'] = token
+ res['name'] = partner.name
+ if partner.user_ids:
+ res['login'] = partner.user_ids[0].login
+ else:
+ res['email'] = partner.email or ''
+ return res
class res_users(osv.Model):
_inherit = 'res.users'
- def auth_signup_create(self, cr, uid, new_user, context=None):
- # new_user:
- # login
- # email
- # name (optional)
- # partner_id (optional)
- # groups (optional)
- # sign (for partner_id and groups)
- #
- user_template_id = self.pool.get('ir.config_parameter').get_param(cr, uid, 'auth.signup_template_user_id', 0)
- if user_template_id:
- self.pool.get('res.users').copy(cr, SUPERUSER_ID, user_template_id, new_user, context=context)
- else:
- self.pool.get('res.users').create(cr, SUPERUSER_ID, new_user, context=context)
+ def _get_state(self, cr, uid, ids, name, arg, context=None):
+ return dict((user.id, 'new' if not user.login_date else 'reset' if user.signup_token else 'active')
+ for user in self.browse(cr, uid, ids, context))
- def auth_signup(self, cr, uid, name, login, password, context=None):
- r = (cr.dbname, login, password)
- res = self.search(cr, uid, [("login", "=", login)])
- if res:
- # Existing user
- user_id = res[0]
- try:
- self.check(cr.dbname, user_id, password)
- # Same password
- except openerp.exceptions.AccessDenied:
- # Different password
- raise
- else:
- # New user
- new_user = {
- 'name': name,
- 'login': login,
- 'user_email': login,
- 'password': password,
- 'active': True,
- }
- self.auth_signup_create(cr, uid, new_user)
- return r
+ _columns = {
+ 'state': fields.function(_get_state, string='State', type='selection',
+ selection=[('new', 'New'), ('active', 'Active'), ('reset', 'Resetting Password')]),
+ }
-#
+ def signup(self, cr, uid, values, token=None, context=None):
+ """ signup a user, to either:
+ - create a new user (no token), or
+ - create a user for a partner (with token, but no user for partner), or
+ - change the password of a user (with token, and existing user).
+ :param values: a dictionary with field values
+ :param token: signup token (optional)
+ :return: (dbname, login, password) for the signed up user
+ """
+ assert values.get('login') and values.get('password')
+ result = (cr.dbname, values['login'], values['password'])
+
+ if token:
+ # signup with a token: find the corresponding partner id
+ res_partner = self.pool.get('res.partner')
+ partner = res_partner._signup_retrieve_partner(cr, uid, token,
+ check_validity=True, raise_exception=True, context=None)
+ # invalidate signup token
+ partner.write({'signup_token': False, 'signup_expiration': False})
+ if partner.user_ids:
+ # user exists, modify its password
+ partner.user_ids[0].write({'password': values['password']})
+ else:
+ # user does not exist: sign up invited user
+ self._signup_create_user(cr, uid, {
+ 'name': partner.name,
+ 'login': values['login'],
+ 'password': values['password'],
+ 'email': values['login'],
+ 'partner_id': partner.id,
+ }, context=context)
+ return result
+
+ # sign up an external user
+ assert values.get('name'), 'Signup: no name given for new user'
+ self._signup_create_user(cr, uid, {
+ 'name': values['name'],
+ 'login': values['login'],
+ 'password': values['password'],
+ 'email': values['login'],
+ }, context=context)
+ return result
+
+ def _signup_create_user(self, cr, uid, values, context=None):
+ """ create a new user from the template user """
+ ir_config_parameter = self.pool.get('ir.config_parameter')
+ template_user_id = safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.template_user_id', 'False'))
+ assert template_user_id and self.exists(cr, uid, template_user_id, context=context), 'Signup: invalid template user'
+
+ # check that uninvited users may sign up
+ if 'partner_id' not in values:
+ if not safe_eval(ir_config_parameter.get_param(cr, uid, 'auth_signup.allow_uninvited', 'False')):
+ raise Exception('Signup is not allowed for uninvited users')
+
+ # create a copy of the template user (attached to a specific partner_id if given)
+ values['active'] = True
+ return self.copy(cr, uid, template_user_id, values, context=context)
diff --git a/addons/auth_signup/res_users_view.xml b/addons/auth_signup/res_users_view.xml
new file mode 100644
index 00000000000..c42e1ab5f41
--- /dev/null
+++ b/addons/auth_signup/res_users_view.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ user.form.state
+ res.users
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/auth_signup/static/src/css/Makefile b/addons/auth_signup/static/src/css/Makefile
new file mode 100644
index 00000000000..d6b4f4b2fc8
--- /dev/null
+++ b/addons/auth_signup/static/src/css/Makefile
@@ -0,0 +1,3 @@
+base.css: base.sass
+ sass --trace -t expanded base.sass base.css
+
diff --git a/addons/auth_signup/static/src/css/base.css b/addons/auth_signup/static/src/css/base.css
new file mode 100644
index 00000000000..3f97e7a9301
--- /dev/null
+++ b/addons/auth_signup/static/src/css/base.css
@@ -0,0 +1,10 @@
+@charset "utf-8";
+.openerp .oe_login .oe_signup_show {
+ display: none;
+}
+.openerp .oe_login_signup .oe_signup_show {
+ display: block !important;
+}
+.openerp .oe_login_signup .oe_signup_hide {
+ display: none;
+}
diff --git a/addons/auth_signup/static/src/css/base.sass b/addons/auth_signup/static/src/css/base.sass
new file mode 100644
index 00000000000..f97665d192c
--- /dev/null
+++ b/addons/auth_signup/static/src/css/base.sass
@@ -0,0 +1,13 @@
+@charset "utf-8"
+
+.openerp
+ // Regular login form
+ .oe_login
+ .oe_signup_show
+ display: none
+ // Signup form
+ .oe_login_signup
+ .oe_signup_show
+ display: block !important
+ .oe_signup_hide
+ display: none
diff --git a/addons/auth_signup/static/src/js/auth_signup.js b/addons/auth_signup/static/src/js/auth_signup.js
index 2ab13aa7598..0974b73292d 100644
--- a/addons/auth_signup/static/src/js/auth_signup.js
+++ b/addons/auth_signup/static/src/js/auth_signup.js
@@ -5,56 +5,100 @@ openerp.auth_signup = function(instance) {
instance.web.Login.include({
start: function() {
var self = this;
- this.$('a.oe_signup').click(function() {
- var dbname = self.$("form [name=db]").val();
- self.do_action({
- type: 'ir.actions.client',
- tag: 'auth_signup.signup',
- params: {'dbname': dbname},
- target: 'new',
- name: 'Sign up'
- });
- return true;
+ var d = this._super();
+
+ // to switch between the signup and regular login form
+ this.$('a.oe_signup_signup').click(function() {
+ self.$el.addClass("oe_login_signup");
+ });
+ this.$('a.oe_signup_back').click(function() {
+ self.$el.removeClass("oe_login_signup");
+ delete self.params.token;
});
- return this._super();
- },
- });
+ // if there is an error message in params, show it then forget it
+ if (self.params.error_message) {
+ this.show_error(self.params.error_message);
+ delete self.params.error_message;
+ }
- instance.auth_signup.Signup = instance.web.Widget.extend({
- template: 'auth_signup.signup',
- init: function(parent, params) {
- this.params = params;
- return this._super();
+ // in case of a signup, retrieve the user information from the token
+ if (self.params.db && self.params.token) {
+ d = self.rpc("/auth_signup/retrieve", {dbname: self.params.db, token: self.params.token})
+ .done(self.on_token_loaded)
+ .fail(self.on_token_failed);
+ }
+ return d;
},
- start: function() {
- var self = this;
- this.$('input[name=password_confirmation]').keyup(function() {
- var v = $(this).val();
- var $b = self.$('button');
- if (_.isEmpty(v) || self.$('input[name=password]').val() === v) {
- $b.removeAttr('disabled');
+ on_token_loaded: function(result) {
+ // select the right the database
+ this.selected_db = result.db;
+ this.on_db_loaded({db_list: [result.db]});
+ if (result.token) {
+ // switch to signup mode, set user name and login
+ this.$el.addClass("oe_login_signup");
+ this.$("form input[name=name]").val(result.name).attr("readonly", "readonly");
+ if (result.login) {
+ this.$("form input[name=login]").val(result.login).attr("readonly", "readonly");
} else {
- $b.attr('disabled', 'disabled');
+ this.$("form input[name=login]").val(result.email);
}
- });
-
- this.$('form').submit(function(ev) {
- if(ev) {
- ev.preventDefault();
+ } else {
+ // remain in login mode, set login if present
+ delete this.params.token;
+ this.$("form input[name=login]").val(result.login || "");
+ }
+ },
+ on_token_failed: function(result, ev) {
+ if (ev) {
+ ev.preventDefault();
+ }
+ this.show_error("Invalid signup token");
+ delete this.params.db;
+ delete this.params.token;
+ },
+ on_submit: function(ev) {
+ if (ev) {
+ ev.preventDefault();
+ }
+ if (this.$el.hasClass("oe_login_signup")) {
+ // signup user (or reset password)
+ var db = this.$("form [name=db]").val();
+ var name = this.$("form input[name=name]").val();
+ var login = this.$("form input[name=login]").val();
+ var password = this.$("form input[name=password]").val();
+ var confirm_password = this.$("form input[name=confirm_password]").val();
+ if (!db) {
+ this.do_warn("Login", "No database selected !");
+ return false;
+ } else if (!name) {
+ this.do_warn("Login", "Please enter a name.")
+ return false;
+ } else if (!login) {
+ this.do_warn("Login", "Please enter a username.")
+ return false;
+ } else if (!password || !confirm_password) {
+ this.do_warn("Login", "Please enter a password and confirm it.")
+ return false;
+ } else if (password !== confirm_password) {
+ this.do_warn("Login", "Passwords do not match; please retype them.")
+ return false;
}
var params = {
- dbname : self.params.dbname,
- name: self.$('input[name=name]').val(),
- login: self.$('input[name=email]').val(),
- password: self.$('input[name=password]').val(),
+ dbname : db,
+ token: this.params.token || "",
+ name: name,
+ login: login,
+ password: password,
+ state: $.param(this.params)
};
var url = "/auth_signup/signup?" + $.param(params);
window.location = url;
- });
- return this._super();
- }
+ } else {
+ // regular login
+ this._super(ev);
+ }
+ },
});
- instance.web.client_actions.add("auth_signup.signup", "instance.auth_signup.Signup");
};
diff --git a/addons/auth_signup/static/src/xml/auth_signup.xml b/addons/auth_signup/static/src/xml/auth_signup.xml
index c2eec846d15..e63bd5863b0 100644
--- a/addons/auth_signup/static/src/xml/auth_signup.xml
+++ b/addons/auth_signup/static/src/xml/auth_signup.xml
@@ -1,28 +1,28 @@
-
+
-
-
-
- Sign Up
-
+
+
+ Name
+
+
+
+ Username
+ Username (Email)
+
+
+ Confirm Password
+
+
+
+ Log in
+ Sign in
+
+
+ Sign Up
+ Back to Login
+
-
-
-
-
-
-
-
-
-
diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml
index 37797a012aa..4df0a8a22b2 100644
--- a/addons/base_calendar/crm_meeting_view.xml
+++ b/addons/base_calendar/crm_meeting_view.xml
@@ -280,7 +280,7 @@
-
+
diff --git a/addons/base_import/__openerp__.py b/addons/base_import/__openerp__.py
index eff20bc90ab..f5a707650d8 100644
--- a/addons/base_import/__openerp__.py
+++ b/addons/base_import/__openerp__.py
@@ -26,13 +26,14 @@ Re-implement openerp's file import system:
'author': 'OpenERP SA',
'depends': ['base'],
'installable': True,
- 'auto_install': False, # set to true and allow uninstall?
+ 'auto_install': True,
'css': [
'static/lib/select2/select2.css',
'static/src/css/import.css',
],
'js': [
'static/lib/select2/select2.js',
+ 'static/lib/javascript-state-machine/state-machine.js',
'static/src/js/import.js',
],
'qweb': ['static/src/xml/import.xml'],
diff --git a/addons/base_import/controllers.py b/addons/base_import/controllers.py
index 85ff993e92e..c831ffd229d 100644
--- a/addons/base_import/controllers.py
+++ b/addons/base_import/controllers.py
@@ -1,15 +1,12 @@
# -*- coding: utf-8 -*-
import simplejson
-try:
- import openerp.addons.web.common.http as openerpweb
-except ImportError:
- import web.common.http as openerpweb
+import openerp
-class ImportController(openerpweb.Controller):
+class ImportController(openerp.addons.web.http.Controller):
_cp_path = '/base_import'
- @openerpweb.httprequest
+ @openerp.addons.web.http.httprequest
def set_file(self, req, file, import_id, jsonp='callback'):
import_id = int(import_id)
diff --git a/addons/base_import/models.py b/addons/base_import/models.py
index 1e5ad002b84..996dbf7964d 100644
--- a/addons/base_import/models.py
+++ b/addons/base_import/models.py
@@ -83,6 +83,10 @@ class ir_import(orm.TransientModel):
}]
fields_got = self.pool[model].fields_get(cr, uid, context=context)
for name, field in fields_got.iteritems():
+ # an empty string means the field is deprecated, @deprecated must
+ # be absent or False to mean not-deprecated
+ if field.get('deprecated', False) is not False:
+ continue
if field.get('readonly'):
states = field.get('states')
if not states:
@@ -97,7 +101,7 @@ class ir_import(orm.TransientModel):
'id': name,
'name': name,
'string': field['string'],
- # Y U NO ALWAYS HAVE REQUIRED
+ # Y U NO ALWAYS HAS REQUIRED
'required': bool(field.get('required')),
'fields': [],
}
@@ -124,8 +128,8 @@ class ir_import(orm.TransientModel):
"""
csv_iterator = csv.reader(
StringIO(record.file),
- quotechar=options['quoting'],
- delimiter=options['separator'])
+ quotechar=str(options['quoting']),
+ delimiter=str(options['separator']))
csv_nonempty = itertools.ifilter(None, csv_iterator)
# TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet
encoding = options.get('encoding', 'utf-8')
@@ -307,22 +311,14 @@ class ir_import(orm.TransientModel):
except ValueError, e:
return [{
'type': 'error',
- 'message': str(e),
+ 'message': unicode(e),
'record': False,
}]
- try:
- _logger.info('importing %d rows...', len(data))
- (code, record, message, _wat) = self.pool[record.res_model].import_data(
- cr, uid, import_fields, data, context=context)
- _logger.info('done')
-
- except Exception, e:
- _logger.exception("Import failed")
- # TODO: remove when exceptions stop being an "expected"
- # behavior of import_data on some (most) invalid
- # input.
- code, record, message = -1, None, str(e)
+ _logger.info('importing %d rows...', len(data))
+ import_result = self.pool[record.res_model].load(
+ cr, uid, import_fields, data, context=context)
+ _logger.info('done')
# If transaction aborted, RELEASE SAVEPOINT is going to raise
# an InternalError (ROLLBACK should work, maybe). Ignore that.
@@ -339,14 +335,4 @@ class ir_import(orm.TransientModel):
except psycopg2.InternalError:
pass
- if code != -1:
- return []
-
- # TODO: add key for error location?
- # TODO: error not within normal preview, how to display? Re-preview
- # with higher ``count``?
- return [{
- 'type': 'error',
- 'message': message,
- 'record': record or False
- }]
+ return import_result['messages']
diff --git a/addons/base_import/static/lib/javascript-state-machine/LICENSE b/addons/base_import/static/lib/javascript-state-machine/LICENSE
new file mode 100644
index 00000000000..8ad703ca4ef
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2012 Jake Gordon and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/README.md b/addons/base_import/static/lib/javascript-state-machine/README.md
new file mode 100644
index 00000000000..64c045e69d7
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/README.md
@@ -0,0 +1,327 @@
+Javascript Finite State Machine (v2.1.0)
+========================================
+
+This standalone javascript micro-framework provides a finite state machine for your pleasure.
+
+ * You can find the [code here](https://github.com/jakesgordon/javascript-state-machine)
+ * You can find a [description here](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+ * You can find a [working demo here](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/example/)
+
+Download
+========
+
+You can download [state-machine.js](https://github.com/jakesgordon/javascript-state-machine/raw/master/state-machine.js),
+or the [minified version](https://github.com/jakesgordon/javascript-state-machine/raw/master/state-machine.min.js)
+
+Alternatively:
+
+ git clone git@github.com:jakesgordon/javascript-state-machine
+
+
+ * All code is in state-machine.js
+ * Minified version provided in state-machine.min.js
+ * No 3rd party library is required
+ * Demo can be found in /index.html
+ * QUnit tests can be found in /test/index.html
+
+Usage
+=====
+
+Include `state-machine.min.js` in your application.
+
+In its simplest form, create a standalone state machine using:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ]});
+
+... will create an object with a method for each event:
+
+ * fsm.warn() - transition from 'green' to 'yellow'
+ * fsm.panic() - transition from 'yellow' to 'red'
+ * fsm.calm() - transition from 'red' to 'yellow'
+ * fsm.clear() - transition from 'yellow' to 'green'
+
+along with the following members:
+
+ * fsm.current - contains the current state
+ * fsm.is(s) - return true if state `s` is the current state
+ * fsm.can(e) - return true if event `e` can be fired in the current state
+ * fsm.cannot(e) - return true if event `e` cannot be fired in the current state
+
+Multiple 'from' and 'to' states for a single event
+==================================================
+
+If an event is allowed **from** multiple states, and always transitions to the same
+state, then simply provide an array of states in the `from` attribute of an event. However,
+if an event is allowed from multiple states, but should transition **to** a different
+state depending on the current state, then provide multiple event entries with
+the same name:
+
+ var fsm = StateMachine.create({
+ initial: 'hungry',
+ events: [
+ { name: 'eat', from: 'hungry', to: 'satisfied' },
+ { name: 'eat', from: 'satisfied', to: 'full' },
+ { name: 'eat', from: 'full', to: 'sick' },
+ { name: 'rest', from: ['hungry', 'satisfied', 'full', 'sick'], to: 'hungry' },
+ ]});
+
+This example will create an object with 2 event methods:
+
+ * fsm.eat()
+ * fsm.rest()
+
+The `rest` event will always transition to the `hungry` state, while the `eat` event
+will transition to a state that is dependent on the current state.
+
+>> NOTE: The `rest` event could use a wildcard '*' for the 'from' state if it should be
+allowed from any current state.
+
+>> NOTE: The `rest` event in the above example can also be specified as multiple events with
+the same name if you prefer the verbose approach.
+
+Callbacks
+=========
+
+4 callbacks are available if your state machine has methods using the following naming conventions:
+
+ * onbefore**event** - fired before the event
+ * onleave**state** - fired when leaving the old state
+ * onenter**state** - fired when entering the new state
+ * onafter**event** - fired after the event
+
+You can affect the event in 3 ways:
+
+ * return `false` from an `onbeforeevent` handler to cancel the event.
+ * return `false` from an `onleavestate` handler to cancel the event.
+ * return `ASYNC` from an `onleavestate` handler to perform an asynchronous state transition (see next section)
+
+For convenience, the 2 most useful callbacks can be shortened:
+
+ * on**event** - convenience shorthand for onafter**event**
+ * on**state** - convenience shorthand for onenter**state**
+
+In addition, a generic `onchangestate()` callback can be used to call a single function for _all_ state changes:
+
+All callbacks will be passed the same arguments:
+
+ * **event** name
+ * **from** state
+ * **to** state
+ * _(followed by any arguments you passed into the original event method)_
+
+Callbacks can be specified when the state machine is first created:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ],
+ callbacks: {
+ onpanic: function(event, from, to, msg) { alert('panic! ' + msg); },
+ onclear: function(event, from, to, msg) { alert('thanks to ' + msg); },
+ ongreen: function(event, from, to) { document.body.className = 'green'; },
+ onyellow: function(event, from, to) { document.body.className = 'yellow'; },
+ onred: function(event, from, to) { document.body.className = 'red'; },
+ }
+ });
+
+ fsm.panic('killer bees');
+ fsm.clear('sedatives in the honey pots');
+ ...
+
+Additionally, they can be added and removed from the state machine at any time:
+
+ fsm.ongreen = null;
+ fsm.onyellow = null;
+ fsm.onred = null;
+ fsm.onchangestate = function(event, from, to) { document.body.className = to; };
+
+Asynchronous State Transitions
+==============================
+
+Sometimes, you need to execute some asynchronous code during a state transition and ensure the
+new state is not entered until your code has completed.
+
+A good example of this is when you transition out of a `menu` state, perhaps you want to gradually
+fade the menu away, or slide it off the screen and don't want to transition to your `game` state
+until after that animation has been performed.
+
+You can now return `StateMachine.ASYNC` from your `onleavestate` handler and the state machine
+will be _'put on hold'_ until you are ready to trigger the transition using the new `transition()`
+method.
+
+For example, using jQuery effects:
+
+ var fsm = StateMachine.create({
+
+ initial: 'menu',
+
+ events: [
+ { name: 'play', from: 'menu', to: 'game' },
+ { name: 'quit', from: 'game', to: 'menu' }
+ ],
+
+ callbacks: {
+
+ onentermenu: function() { $('#menu').show(); },
+ onentergame: function() { $('#game').show(); },
+
+ onleavemenu: function() {
+ $('#menu').fadeOut('fast', function() {
+ fsm.transition();
+ });
+ return StateMachine.ASYNC; // tell StateMachine to defer next state until we call transition (in fadeOut callback above)
+ },
+
+ onleavegame: function() {
+ $('#game').slideDown('slow', function() {
+ fsm.transition();
+ };
+ return StateMachine.ASYNC; // tell StateMachine to defer next state until we call transition (in slideDown callback above)
+ }
+
+ }
+ });
+
+
+State Machine Classes
+=====================
+
+You can also turn all instances of a _class_ into an FSM by applying
+the state machine functionality to the prototype, including your callbacks
+in your prototype, and providing a `startup` event for use when constructing
+instances:
+
+ MyFSM = function() { // my constructor function
+ this.startup();
+ };
+
+ MyFSM.prototype = {
+
+ onpanic: function(event, from, to) { alert('panic'); },
+ onclear: function(event, from, to) { alert('all is clear'); },
+
+ // my other prototype methods
+
+ };
+
+ StateMachine.create({
+ target: MyFSM.prototype,
+ events: [
+ { name: 'startup', from: 'none', to: 'green' },
+ { name: 'warn', from: 'green', to: 'yellow' },
+ { name: 'panic', from: 'yellow', to: 'red' },
+ { name: 'calm', from: 'red', to: 'yellow' },
+ { name: 'clear', from: 'yellow', to: 'green' }
+ ]});
+
+
+This should be easy to adjust to fit your appropriate mechanism for object construction.
+
+Initialization Options
+======================
+
+How the state machine should initialize can depend on your application requirements, so
+the library provides a number of simple options.
+
+By default, if you dont specify any initial state, the state machine will be in the `'none'`
+state and you would need to provide an event to take it out of this state:
+
+ var fsm = StateMachine.create({
+ events: [
+ { name: 'startup', from: 'none', to: 'green' },
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "none"
+ fsm.startup();
+ alert(fsm.current); // "green"
+
+If you specify the name of your initial event (as in all the earlier examples), then an
+implicit `startup` event will be created for you and fired when the state machine is constructed.
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "green"
+
+If your object already has a `startup` method you can use a different name for the initial event
+
+ var fsm = StateMachine.create({
+ initial: { state: 'green', event: 'init' },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "green"
+
+Finally, if you want to wait to call the initial state transition event until a later date you
+can `defer` it:
+
+ var fsm = StateMachine.create({
+ initial: { state: 'green', event: 'init', defer: true },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.current); // "none"
+ fsm.init();
+ alert(fsm.current); // "green"
+
+Of course, we have now come full circle, this last example is pretty much functionally the
+same as the first example in this section where you simply define your own startup event.
+
+So you have a number of choices available to you when initializing your state machine.
+
+Handling Failures
+======================
+
+By default, if you try to call an event method that is not allowed in the current state, the
+state machine will throw an exception. If you prefer to handle the problem yourself, you can
+define a custom `error` handler:
+
+ var fsm = StateMachine.create({
+ initial: 'green',
+ error: function(eventName, from, to, args, errorCode, errorMessage) {
+ return 'event ' + eventName + ' was naughty :- ' + errorMessage;
+ },
+ events: [
+ { name: 'panic', from: 'green', to: 'red' },
+ { name: 'calm', from: 'red', to: 'green' },
+ ]});
+ alert(fsm.calm()); // "event calm was naughty :- event not allowed in current state green"
+
+Release Notes
+=============
+
+See [RELEASE NOTES](https://github.com/jakesgordon/javascript-state-machine/blob/master/RELEASE_NOTES.md) file.
+
+License
+=======
+
+See [LICENSE](https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE) file.
+
+Contact
+=======
+
+If you have any ideas, feedback, requests or bug reports, you can reach me at
+[jake@codeincomplete.com](mailto:jake@codeincomplete.com), or via
+my website: [Code inComplete](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+
+
+
+
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md b/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md
new file mode 100644
index 00000000000..06abf402d38
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/RELEASE_NOTES.md
@@ -0,0 +1,32 @@
+Version 2.1.0 (January 7th 2012)
+--------------------------------
+
+ * Wrapped in self executing function to be more easily used with loaders like `require.js` or `curl.js` (issue #15)
+ * Allow event to be cancelled by returning `false` from `onleavestate` handler (issue #13) - WARNING: this breaks backward compatibility for async transitions (you now need to return `StateMachine.ASYNC` instead of `false`)
+ * Added explicit return values for event methods (issue #12)
+ * Added support for wildcard events that can be fired 'from' any state (issue #11)
+ * Added support for no-op events that transition 'to' the same state (issue #5)
+ * extended custom error callback to handle any exceptions caused by caller provided callbacks
+ * added custom error callback to override exception when an illegal state transition is attempted (thanks to cboone)
+ * fixed typos (thanks to cboone)
+ * fixed issue #4 - ensure before/after event hooks are called even if the event doesn't result in a state change
+
+Version 2.0.0 (August 19th 2011)
+--------------------------------
+
+ * adding support for asynchronous state transitions (see README) - with lots of qunit tests (see test/async.js).
+ * consistent arguments for ALL callbacks, first 3 args are ALWAYS event name, from state and to state, followed by whatever arguments the user passed to the original event method.
+ * added a generic `onchangestate(event,from,to)` callback to detect all state changes with a single function.
+ * allow callbacks to be declared at creation time (instead of having to attach them afterwards)
+ * renamed 'hooks' => 'callbacks'
+ * [read more...](http://codeincomplete.com/posts/2011/8/19/javascript_state_machine_v2/)
+
+Version 1.2.0 (June 21st 2011)
+------------------------------
+ * allows the same event to transition to different states, depending on the current state (see 'Multiple...' section in README.md)
+ * [read more...](http://codeincomplete.com/posts/2011/6/21/javascript_state_machine_v1_2_0/)
+
+Version 1.0.0 (June 1st 2011)
+-----------------------------
+ * initial version
+ * [read more...](http://codeincomplete.com/posts/2011/6/1/javascript_state_machine/)
diff --git a/addons/base_import/static/lib/javascript-state-machine/Rakefile b/addons/base_import/static/lib/javascript-state-machine/Rakefile
new file mode 100644
index 00000000000..beb8702a7f0
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/Rakefile
@@ -0,0 +1,8 @@
+
+desc "create minified version of state-machine.js"
+task :minify do
+ require File.expand_path(File.join(File.dirname(__FILE__), 'minifier/minifier'))
+ Minifier.enabled = true
+ Minifier.minify('state-machine.js')
+end
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/index.html b/addons/base_import/static/lib/javascript-state-machine/index.html
new file mode 100644
index 00000000000..2d6cb62617b
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/index.html
@@ -0,0 +1,39 @@
+
+
+
+ Javascript Finite State Machine
+
+
+
+
+
+
+
+
+
Finite State Machine
+
+
+ clear
+ calm
+ warn
+ panic!
+
+
+
+
+
+
+ dashed lines are asynchronous state transitions (3 seconds)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/base_import/static/lib/javascript-state-machine/state-machine.js b/addons/base_import/static/lib/javascript-state-machine/state-machine.js
new file mode 100644
index 00000000000..0d503ee7bdb
--- /dev/null
+++ b/addons/base_import/static/lib/javascript-state-machine/state-machine.js
@@ -0,0 +1,155 @@
+(function (window) {
+
+ StateMachine = {
+
+ //---------------------------------------------------------------------------
+
+ VERSION: "2.1.0",
+
+ //---------------------------------------------------------------------------
+
+ Result: {
+ SUCCEEDED: 1, // the event transitioned successfully from one state to another
+ NOTRANSITION: 2, // the event was successfull but no state transition was necessary
+ CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback
+ ASYNC: 4, // the event is asynchronous and the caller is in control of when the transition occurs
+ },
+
+ Error: {
+ INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state
+ PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending
+ INVALID_CALLBACK: 300, // caller provided callback function threw an exception
+ },
+
+ WILDCARD: '*',
+ ASYNC: 'async',
+
+ //---------------------------------------------------------------------------
+
+ create: function(cfg, target) {
+
+ var initial = (typeof cfg.initial == 'string') ? { state: cfg.initial } : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false }
+ var fsm = target || cfg.target || {};
+ var events = cfg.events || [];
+ var callbacks = cfg.callbacks || {};
+ var map = {};
+
+ var add = function(e) {
+ var from = (e.from instanceof Array) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified
+ map[e.name] = map[e.name] || {};
+ for (var n = 0 ; n < from.length ; n++)
+ map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified
+ };
+
+ if (initial) {
+ initial.event = initial.event || 'startup';
+ add({ name: initial.event, from: 'none', to: initial.state });
+ }
+
+ for(var n = 0 ; n < events.length ; n++)
+ add(events[n]);
+
+ for(var name in map) {
+ if (map.hasOwnProperty(name))
+ fsm[name] = StateMachine.buildEvent(name, map[name]);
+ }
+
+ for(var name in callbacks) {
+ if (callbacks.hasOwnProperty(name))
+ fsm[name] = callbacks[name]
+ }
+
+ fsm.current = 'none';
+ fsm.is = function(state) { return this.current == state; };
+ fsm.can = function(event) { return !this.transition && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); }
+ fsm.cannot = function(event) { return !this.can(event); };
+ fsm.error = cfg.error || function(name, from, to, args, error, msg) { throw msg; }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3)
+
+ if (initial && !initial.defer)
+ fsm[initial.event]();
+
+ return fsm;
+
+ },
+
+ //===========================================================================
+
+ doCallback: function(fsm, func, name, from, to, args) {
+ if (func) {
+ try {
+ return func.apply(fsm, [name, from, to].concat(args));
+ }
+ catch(e) {
+ return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, "an exception occurred in a caller-provided callback function");
+ }
+ }
+ },
+
+ beforeEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); },
+ afterEvent: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); },
+ leaveState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); },
+ enterState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); },
+ changeState: function(fsm, name, from, to, args) { return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); },
+
+
+ buildEvent: function(name, map) {
+ return function() {
+
+ var from = this.current;
+ var to = map[from] || map[StateMachine.WILDCARD] || from;
+ var args = Array.prototype.slice.call(arguments); // turn arguments into pure array
+
+ if (this.transition)
+ return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, "event " + name + " inappropriate because previous transition did not complete");
+
+ if (this.cannot(name))
+ return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, "event " + name + " inappropriate in current state " + this.current);
+
+ if (false === StateMachine.beforeEvent(this, name, from, to, args))
+ return StateMachine.CANCELLED;
+
+ if (from === to) {
+ StateMachine.afterEvent(this, name, from, to, args);
+ return StateMachine.NOTRANSITION;
+ }
+
+ // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState)
+ var fsm = this;
+ this.transition = function() {
+ fsm.transition = null; // this method should only ever be called once
+ fsm.current = to;
+ StateMachine.enterState( fsm, name, from, to, args);
+ StateMachine.changeState(fsm, name, from, to, args);
+ StateMachine.afterEvent( fsm, name, from, to, args);
+ };
+
+ var leave = StateMachine.leaveState(this, name, from, to, args);
+ if (false === leave) {
+ this.transition = null;
+ return StateMachine.CANCELLED;
+ }
+ else if ("async" === leave) {
+ return StateMachine.ASYNC;
+ }
+ else {
+ if (this.transition)
+ this.transition(); // in case user manually called transition() but forgot to return ASYNC
+ return StateMachine.SUCCEEDED;
+ }
+
+ };
+ }
+
+ }; // StateMachine
+
+ //===========================================================================
+
+ if ("function" === typeof define) {
+ define("statemachine", [], function() { return StateMachine; });
+ }
+ else {
+ window.StateMachine = StateMachine;
+ }
+
+}(this));
+
diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css
index f6258f5aa50..21e598ff707 100644
--- a/addons/base_import/static/src/css/import.css
+++ b/addons/base_import/static/src/css/import.css
@@ -10,7 +10,8 @@
.oe_import .oe_import_grid,
.oe_import .oe_import_error_report,
.oe_import .oe_import_with_file,
-.oe_import .oe_import_noheaders {
+.oe_import .oe_import_noheaders,
+.oe_import .oe_import_report_more {
display: none;
}
@@ -19,7 +20,8 @@
}
.oe_import.oe_import_error .oe_import_error_report,
.oe_import.oe_import_with_file .oe_import_with_file,
-.oe_import.oe_import_noheaders .oe_import_noheaders {
+.oe_import.oe_import_noheaders .oe_import_noheaders,
+.oe_import .oe_import_report_showmore .oe_import_report_more {
display: block;
}
@@ -29,6 +31,9 @@
.oe_import .oe_import_error_report ul .oe_import_report_warning {
background-color: #FEFFD9;
}
+.oe_import .oe_import_error_report ul .oe_import_report_info {
+ background-color: #d3ffd3;
+}
.oe_import .oe_import_noheaders {
color: #888;
@@ -47,7 +52,7 @@
}
.oe_import .oe_import_options label {
display: inline-block;
- width: 10em;
+ width: 8em;
text-align: right;
}
diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js
index c2deb660ff2..0a60fe18ffb 100644
--- a/addons/base_import/static/src/js/import.js
+++ b/addons/base_import/static/src/js/import.js
@@ -47,31 +47,35 @@ openerp.base_import = function (instance) {
this._super.apply(this, arguments);
if(add_button) {
this.$buttons.on('click', '.oe_list_button_import', function() {
- new instance.web.DataImport(self, self.dataset).open();
+ self.do_action({
+ type: 'ir.actions.client',
+ tag: 'import',
+ params: {
+ model: self.dataset.model
+ }
+ }, void 0, void 0, function () {
+ self.reload();
+ });
return false;
});
}
}
});
- instance.web.DataImport = instance.web.Dialog.extend({
+ instance.web.client_actions.add(
+ 'import', 'instance.web.DataImport');
+ instance.web.DataImport = instance.web.Widget.extend({
template: 'ImportView',
- dialog_title: _lt("Import Data"),
opts: [
{name: 'encoding', label: _lt("Encoding:"), value: 'utf-8'},
{name: 'separator', label: _lt("Separator:"), value: ','},
{name: 'quoting', label: _lt("Quoting:"), value: '"'}
],
events: {
- 'change .oe_import_grid input': 'import_dryrun',
- 'change input.oe_import_file': 'file_update',
- 'change input.oe_import_has_header, .oe_import_options input': 'settings_updated',
- 'click a.oe_import_csv': function (e) {
- e.preventDefault();
- },
- 'click a.oe_import_export': function (e) {
- e.preventDefault();
- },
+ // 'change .oe_import_grid input': 'import_dryrun',
+ 'change .oe_import_file': 'loaded_file',
+ 'click .oe_import_file_reload': 'loaded_file',
+ 'change input.oe_import_has_header, .oe_import_options input': 'settings_changed',
'click a.oe_import_toggle': function (e) {
e.preventDefault();
var $el = $(e.target);
@@ -79,30 +83,84 @@ openerp.base_import = function (instance) {
? $el.next()
: $el.parent().next())
.toggle();
+ },
+ 'click .oe_import_report a.oe_import_report_count': function (e) {
+ e.preventDefault();
+ $(e.target).parent().toggleClass('oe_import_report_showmore');
+ },
+ 'click .oe_import_moreinfo_action a': function (e) {
+ e.preventDefault();
+ // #data will parse the attribute on its own, we don't like
+ // that sort of things
+ var action = JSON.parse($(e.target).attr('data-action'));
+ // FIXME: when JS-side clean_action
+ action.views = _(action.views).map(function (view) {
+ var id = view[0], type = view[1];
+ return [
+ id,
+ type !== 'tree' ? type
+ : action.view_type === 'form' ? 'list'
+ : 'tree'
+ ];
+ });
+ this.do_action(_.extend(action, {
+ target: 'new',
+ flags: {
+ search_view: true,
+ display_title: true,
+ pager: true,
+ list: {selectable: false}
+ }
+ }));
+ },
+ // buttons
+ 'click .oe_import_validate': 'validate',
+ 'click .oe_import_import': 'import',
+ 'click .oe_import_cancel': function (e) {
+ e.preventDefault();
+ this.exit();
}
},
- init: function (parent, dataset) {
+ init: function (parent, params) {
var self = this;
- this._super(parent, {
- buttons: [
- {text: _t("Import File"), click: function () {
- self.do_import();
- }, 'class': 'oe_import_dialog_button'}
- ]
- });
- this.res_model = parent.model;
+ this._super.apply(this, arguments);
+ this.res_model = params.model;
// import object id
this.id = null;
this.Import = new instance.web.Model('base_import.import');
},
start: function () {
var self = this;
- return this.Import.call('create', [{
- 'res_model': this.res_model
- }]).then(function (id) {
- self.id = id;
- self.$('input[name=import_id]').val(id);
- });
+ this.setup_encoding_picker();
+
+ return $.when(
+ this._super(),
+ this.Import.call('create', [{
+ 'res_model': this.res_model
+ }]).then(function (id) {
+ self.id = id;
+ self.$('input[name=import_id]').val(id);
+ })
+ )
+ },
+ setup_encoding_picker: function () {
+ this.$('input.oe_import_encoding').select2({
+ width: '160px',
+ query: function (q) {
+ var make = function (term) { return {id: term, text: term}; };
+ var suggestions = _.map(
+ ('utf-8 utf-16 windows-1252 latin1 latin2 big5 ' +
+ 'gb18030 shift_jis windows-1251 koir8_r').split(/\s+/),
+ make);
+ if (q.term) {
+ suggestions.unshift(make(q.term));
+ }
+ q.callback({results: suggestions});
+ },
+ initSelection: function (e, c) {
+ return c({id: 'utf-8', text: 'utf-8'});
+ }
+ }).select2('val', 'utf-8');
},
import_options: function () {
@@ -118,34 +176,52 @@ openerp.base_import = function (instance) {
},
//- File & settings change section
- file_update: function (e) {
+ onfile_loaded: function () {
+ this.$('.oe_import_button').prop('disabled', true);
if (!this.$('input.oe_import_file').val()) { return; }
this.$el.removeClass('oe_import_preview oe_import_error');
jsonp(this.$el, {
url: '/base_import/set_file'
- }, this.proxy('settings_updated'));
+ }, this.proxy('settings_changed'));
},
- settings_updated: function () {
+ onpreviewing: function () {
+ var self = this;
+ this.$('.oe_import_button').prop('disabled', true);
this.$el.addClass('oe_import_with_file');
// TODO: test that write // succeeded?
- this.Import.call(
- 'parse_preview', [this.id, this.import_options()])
- .then(this.proxy('preview'));
- },
- preview: function (result) {
+ this.$el.removeClass('oe_import_preview_error oe_import_error');
this.$el.toggleClass(
'oe_import_noheaders',
!this.$('input.oe_import_has_header').prop('checked'));
- if (result.error) {
- this.$el.addClass('oe_import_error');
- this.$('.oe_import_error_report').html(
+ this.Import.call(
+ 'parse_preview', [this.id, this.import_options()])
+ .then(function (result) {
+ var signal = result.error ? 'preview_failed' : 'preview_succeeded';
+ self[signal](result);
+ });
+ },
+ onpreview_error: function (event, from, to, result) {
+ this.$('.oe_import_options').show();
+ this.$el.addClass('oe_import_preview_error oe_import_error');
+ this.$('.oe_import_error_report').html(
QWeb.render('ImportView.preview.error', result));
- return;
- }
+ },
+ onpreview_success: function (event, from, to, result) {
+ this.$('.oe_import_import').removeClass('oe_highlight');
+ this.$('.oe_import_validate').addClass('oe_highlight');
+ this.$('.oe_import_button').prop('disabled', false);
this.$el.addClass('oe_import_preview');
this.$('table').html(QWeb.render('ImportView.preview', result));
+ if (result.headers.length === 1) {
+ this.$('.oe_import_options').show();
+ this.onresults(null, null, null, [{
+ type: 'warning',
+ message: _t("A single column was found in the file, this often means the file separator is incorrect")
+ }]);
+ }
+
var $fields = this.$('.oe_import_fields input');
this.render_fields_matches(result, $fields);
var data = this.generate_fields_completion(result);
@@ -180,7 +256,6 @@ openerp.base_import = function (instance) {
width: 'resolve',
dropdownCssClass: 'oe_import_selector'
});
- this.import_dryrun();
},
generate_fields_completion: function (root) {
var basic = [];
@@ -252,40 +327,116 @@ openerp.base_import = function (instance) {
//- import itself
call_import: function (options) {
- var self = this;
var fields = this.$('.oe_import_fields input.oe_import_match_field').map(function (index, el) {
return $(el).select2('val') || false;
}).get();
return this.Import.call(
'do', [this.id, fields, this.import_options()], options);
},
- import_dryrun: function () {
-// this.call_import({ dryrun: true })
-// .then(this.proxy('render_import_errors'));
+ onvalidate: function () {
+ return this.call_import({ dryrun: true })
+ .then(this.proxy('validated'));
},
- do_import: function () {
+ onimport: function () {
var self = this;
- this.call_import({ dryrun: false }).then(function (errors) {
- if (_.isEmpty(errors)) {
- if (self.getParent().reload_content) {
- self.getParent().reload_content();
- }
- self.close();
+ return this.call_import({ dryrun: false }).then(function (message) {
+ if (!_.any(message, function (message) {
+ return message.type === 'error' })) {
+ self['import_succeeded']();
return;
}
- self.render_import_errors(errors);
+ self['import_failed'](message);
});
},
- render_import_errors: function (errors) {
- if (_.isEmpty(errors)) {
- this.$el.removeClass('oe_import_error');
- return;
+ onimported: function () {
+ this.exit();
+ },
+ exit: function () {
+ this.do_action({
+ type: 'ir.actions.client',
+ tag: 'history_back'
+ });
+ },
+ onresults: function (event, from, to, message) {
+ var no_messages = _.isEmpty(message);
+ this.$('.oe_import_import').toggleClass('oe_highlight', no_messages);
+ this.$('.oe_import_validate').toggleClass('oe_highlight', !no_messages);
+ if (no_messages) {
+ message.push({
+ type: 'info',
+ message: _t("Everything seems valid.")
+ });
}
- // import failed (or maybe just warnings, if we ever get
- // warnings?)
+ // row indexes come back 0-indexed, spreadsheets
+ // display 1-indexed.
+ var offset = 1;
+ // offset more if header
+ if (this.import_options().headers) { offset += 1; }
+
this.$el.addClass('oe_import_error');
this.$('.oe_import_error_report').html(
- QWeb.render('ImportView.error', {errors: errors}));
+ QWeb.render('ImportView.error', {
+ errors: _(message).groupBy('message'),
+ at: function (rows) {
+ var from = rows.from + offset;
+ var to = rows.to + offset;
+ if (from === to) {
+ return _.str.sprintf(_t("at row %d"), from);
+ }
+ return _.str.sprintf(_t("between rows %d and %d"),
+ from, to);
+ },
+ more: function (n) {
+ return _.str.sprintf(_t("(%d more)"), n);
+ },
+ info: function (msg) {
+ if (typeof msg === 'string') {
+ return _.str.sprintf(
+ '%s
',
+ _.str.escapeHTML(msg));
+ }
+ if (msg instanceof Array) {
+ return _.str.sprintf(
+ '',
+ _.str.escapeHTML(_t("Here are the possible values:")),
+ _(msg).map(function (msg) {
+ return ''
+ + _.str.escapeHTML(msg)
+ + ' ';
+ }).join(''));
+ }
+ // Final should be object, action descriptor
+ return [
+ ''
+ ].join('')
+ },
+ })).get(0).scrollIntoView();
},
});
+ // FSM-ize DataImport
+ StateMachine.create({
+ target: instance.web.DataImport.prototype,
+ events: [
+ { name: 'loaded_file',
+ from: ['none', 'file_loaded', 'preview_error', 'preview_success', 'results'],
+ to: 'file_loaded' },
+ { name: 'settings_changed',
+ from: ['file_loaded', 'preview_error', 'preview_success', 'results'],
+ to: 'previewing' },
+ { name: 'preview_failed', from: 'previewing', to: 'preview_error' },
+ { name: 'preview_succeeded', from: 'previewing', to: 'preview_success' },
+ { name: 'validate', from: 'preview_success', to: 'validating' },
+ { name: 'validate', from: 'results', to: 'validating' },
+ { name: 'validated', from: 'validating', to: 'results' },
+ { name: 'import', from: ['preview_success', 'results'], to: 'importing' },
+ { name: 'import_succeeded', from: 'importing', to: 'imported'},
+ { name: 'import_failed', from: 'importing', to: 'results' }
+ ]
+ })
};
diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml
index 386348bea4b..1c57c40c9db 100644
--- a/addons/base_import/static/src/xml/import.xml
+++ b/addons/base_import/static/src/xml/import.xml
@@ -2,17 +2,45 @@
,
-
+
@@ -356,10 +356,10 @@
-
+
-
+
@@ -477,10 +477,10 @@
-
+
-
+
@@ -488,7 +488,7 @@
-
+
@@ -569,10 +569,10 @@
-
+
-
+
@@ -580,9 +580,8 @@
domain="['|', ('section_id.user_id','=',uid), ('section_id.member_ids', 'in', [uid])]" context="{'invisible_section': False}"
help="Opportunities that are assigned to either me or one of the sale teams I manage" />
-
-
+
diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml
index 84a0bd4cf49..b7aa334a9c3 100644
--- a/addons/crm/res_partner_view.xml
+++ b/addons/crm/res_partner_view.xml
@@ -15,31 +15,12 @@
-
- view.res.partner.tree.crm.inherited2
- res.partner
-
-
-
-
-
-
-
-
-
view.res.partner.search.crm.inherited3
res.partner
-
-
-
-
-
-
-
diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py
index cbf3ec9f13a..c88b2fe26af 100644
--- a/addons/crm_claim/crm_claim.py
+++ b/addons/crm_claim/crm_claim.py
@@ -26,6 +26,7 @@ from osv import fields, osv
import time
import tools
from tools.translate import _
+from tools import html2plaintext
CRM_CLAIM_PENDING_STATES = (
crm.AVAILABLE_STATES[2][0], # Cancelled
@@ -192,9 +193,10 @@ class crm_claim(base_stage, osv.osv):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
})
diff --git a/addons/crm_helpdesk/crm_helpdesk.py b/addons/crm_helpdesk/crm_helpdesk.py
index f36a3b72640..ceffd282aa8 100644
--- a/addons/crm_helpdesk/crm_helpdesk.py
+++ b/addons/crm_helpdesk/crm_helpdesk.py
@@ -25,6 +25,7 @@ from crm import crm
from osv import fields, osv
import tools
from tools.translate import _
+from tools import html2plaintext
CRM_HELPDESK_STATES = (
crm.AVAILABLE_STATES[2][0], # Cancelled
@@ -104,9 +105,10 @@ class crm_helpdesk(base_state, base_stage, osv.osv):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
diff --git a/addons/crm_partner_assign/crm_lead_view.xml b/addons/crm_partner_assign/crm_lead_view.xml
index cd2e3f08c9a..2cffb6fb899 100644
--- a/addons/crm_partner_assign/crm_lead_view.xml
+++ b/addons/crm_partner_assign/crm_lead_view.xml
@@ -56,7 +56,7 @@
-
+
diff --git a/addons/document_page/document_page_view.xml b/addons/document_page/document_page_view.xml
index 63f208c08a7..d8daaada967 100644
--- a/addons/document_page/document_page_view.xml
+++ b/addons/document_page/document_page_view.xml
@@ -55,7 +55,7 @@
-
+
diff --git a/addons/document_page/wizard/document_page_show_diff_view.xml b/addons/document_page/wizard/document_page_show_diff_view.xml
index b1dfb536853..e2d5ef1af4b 100644
--- a/addons/document_page/wizard/document_page_show_diff_view.xml
+++ b/addons/document_page/wizard/document_page_show_diff_view.xml
@@ -8,7 +8,7 @@
wizard.document.page.history.show_diff
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index b46fafe270f..ecd40e05531 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -126,10 +126,10 @@
-
+
-
+
@@ -339,7 +339,7 @@
-
+
@@ -529,7 +529,7 @@
-
+
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 69567902763..b8020d0b2df 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -42,14 +42,14 @@
-
+
-
+
@@ -57,14 +57,14 @@
-
+
-
+
@@ -112,8 +112,6 @@
-
-
diff --git a/addons/hr_contract/i18n/mk.po b/addons/hr_contract/i18n/mk.po
new file mode 100644
index 00000000000..2a4011c9e0d
--- /dev/null
+++ b/addons/hr_contract/i18n/mk.po
@@ -0,0 +1,271 @@
+# Macedonian 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 , 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-02-08 00:36+0000\n"
+"PO-Revision-Date: 2012-10-09 08:00+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Macedonian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
+
+#. module: hr_contract
+#: field:hr.contract,wage:0
+msgid "Wage"
+msgstr "Плата"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Information"
+msgstr "Информации"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Trial Period"
+msgstr "Пробен Период"
+
+#. module: hr_contract
+#: field:hr.contract,trial_date_start:0
+msgid "Trial Start Date"
+msgstr "Пробен Почетен Датум"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Medical Examination"
+msgstr "Систематски Преглед"
+
+#. module: hr_contract
+#: field:hr.employee,vehicle:0
+msgid "Company Vehicle"
+msgstr "Службено Возило"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Miscellaneous"
+msgstr "Разно"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Current"
+msgstr "Тековен"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Group By..."
+msgstr "Групирај По..."
+
+#. module: hr_contract
+#: field:hr.contract,department_id:0
+msgid "Department"
+msgstr "Сектор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Overpassed"
+msgstr "Изминат"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,employee_id:0
+#: model:ir.model,name:hr_contract.model_hr_employee
+msgid "Employee"
+msgstr "Вработен"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Search Contract"
+msgstr "Пребарај Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Contracts in progress"
+msgstr "Договори во тек"
+
+#. module: hr_contract
+#: field:hr.employee,vehicle_distance:0
+msgid "Home-Work Distance"
+msgstr "Дома-Работа Одалеченост"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.employee,contract_ids:0
+#: model:ir.actions.act_window,name:hr_contract.act_hr_employee_2_hr_contract
+#: model:ir.actions.act_window,name:hr_contract.action_hr_contract
+#: model:ir.ui.menu,name:hr_contract.hr_menu_contract
+msgid "Contracts"
+msgstr "Договори"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Personal Info"
+msgstr "Лични информации"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Contracts whose end date already passed"
+msgstr "Договори чии што краен рок е веќе поминат"
+
+#. module: hr_contract
+#: help:hr.employee,contract_id:0
+msgid "Latest contract of the employee"
+msgstr "Последен договор на вработениот"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Job"
+msgstr "Работно Место"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,advantages:0
+msgid "Advantages"
+msgstr "Придобивки"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Valid for"
+msgstr "Валиден за"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Work Permit"
+msgstr "Дозвола за Работа"
+
+#. module: hr_contract
+#: field:hr.employee,children:0
+msgid "Number of Children"
+msgstr "Број на Деца"
+
+#. module: hr_contract
+#: model:ir.actions.act_window,name:hr_contract.action_hr_contract_type
+#: model:ir.ui.menu,name:hr_contract.hr_menu_contract_type
+msgid "Contract Types"
+msgstr "Типови на Договор"
+
+#. module: hr_contract
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr "Грешка! Не можете да креирате рекурзивна хиерархија на вработените."
+
+#. module: hr_contract
+#: field:hr.contract,date_end:0
+msgid "End Date"
+msgstr "Краен датум"
+
+#. module: hr_contract
+#: help:hr.contract,wage:0
+msgid "Basic Salary of the employee"
+msgstr "Основна Плата на вработениот"
+
+#. module: hr_contract
+#: field:hr.contract,name:0
+msgid "Contract Reference"
+msgstr "Референца"
+
+#. module: hr_contract
+#: help:hr.employee,vehicle_distance:0
+msgid "In kilometers"
+msgstr "во километри"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,notes:0
+msgid "Notes"
+msgstr "Забелешки"
+
+#. module: hr_contract
+#: field:hr.contract,permit_no:0
+msgid "Work Permit No"
+msgstr "Број на Дозвола за Работа"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.employee,contract_id:0
+#: model:ir.model,name:hr_contract.model_hr_contract
+#: model:ir.ui.menu,name:hr_contract.next_id_56
+msgid "Contract"
+msgstr "Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,type_id:0
+#: view:hr.contract.type:0
+#: field:hr.contract.type,name:0
+#: model:ir.model,name:hr_contract.model_hr_contract_type
+msgid "Contract Type"
+msgstr "Тип на Договор"
+
+#. module: hr_contract
+#: view:hr.contract:0
+#: field:hr.contract,working_hours:0
+msgid "Working Schedule"
+msgstr "Распоред за Работа"
+
+#. module: hr_contract
+#: view:hr.employee:0
+msgid "Job Info"
+msgstr "Информации за Работата"
+
+#. module: hr_contract
+#: field:hr.contract,visa_expire:0
+msgid "Visa Expire Date"
+msgstr "Виза Датум на Истекување"
+
+#. module: hr_contract
+#: field:hr.contract,job_id:0
+msgid "Job Title"
+msgstr "Звање"
+
+#. module: hr_contract
+#: field:hr.employee,manager:0
+msgid "Is a Manager"
+msgstr "Менаџер"
+
+#. module: hr_contract
+#: field:hr.contract,date_start:0
+msgid "Start Date"
+msgstr "Почетен датум"
+
+#. module: hr_contract
+#: constraint:hr.contract:0
+msgid "Error! contract start-date must be lower then contract end-date."
+msgstr ""
+"Грешка! Почетниот датум на договорот мора да биде помал од крајниот датум."
+
+#. module: hr_contract
+#: field:hr.contract,visa_no:0
+msgid "Visa No"
+msgstr "Број на Виза"
+
+#. module: hr_contract
+#: field:hr.employee,place_of_birth:0
+msgid "Place of Birth"
+msgstr "Место на раѓање"
+
+#. module: hr_contract
+#: view:hr.contract:0
+msgid "Duration"
+msgstr "Траење"
+
+#. module: hr_contract
+#: field:hr.employee,medic_exam:0
+msgid "Medical Examination Date"
+msgstr "Датум за Систематски Преглед"
+
+#. module: hr_contract
+#: field:hr.contract,trial_date_end:0
+msgid "Trial End Date"
+msgstr "Пробен Краен Датум"
+
+#. module: hr_contract
+#: view:hr.contract.type:0
+msgid "Search Contract Type"
+msgstr "Пребарај Тип на Договор"
diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml
index 388e5262f6e..44853cee4f0 100644
--- a/addons/hr_expense/hr_expense_view.xml
+++ b/addons/hr_expense/hr_expense_view.xml
@@ -124,7 +124,7 @@
@@ -155,11 +155,12 @@
-
+
+
+
-
diff --git a/addons/hr_holidays/i18n/mk.po b/addons/hr_holidays/i18n/mk.po
new file mode 100644
index 00000000000..2694317ebe9
--- /dev/null
+++ b/addons/hr_holidays/i18n/mk.po
@@ -0,0 +1,864 @@
+# Macedonian 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 , 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME \n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-10-09 08:43+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Macedonian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-10 04:44+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Blue"
+msgstr "Сина"
+
+#. module: hr_holidays
+#: field:hr.holidays,holiday_type:0
+msgid "Allocation Type"
+msgstr "Тип на Алокација"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Waiting Second Approval"
+msgstr "Се чека на второ одобрување"
+
+#. module: hr_holidays
+#: help:hr.holidays.status,remaining_leaves:0
+msgid "Maximum Leaves Allowed - Leaves Already Taken"
+msgstr "Мкасимален број на дозволени отсуства - Отсуствата се веќе земени"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Leaves Management"
+msgstr "Менаџирање на Отсуства"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Group By..."
+msgstr "Групирај По..."
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Allocation Mode"
+msgstr "Мод на Алокација"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,department_id:0
+msgid "Department"
+msgstr "Сектор"
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.request_approve_holidays
+msgid "Requests Approve"
+msgstr "Одобри Барања"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Refused"
+msgstr "Одбиени"
+
+#. module: hr_holidays
+#: help:hr.holidays,category_id:0
+msgid "Category of Employee"
+msgstr "Категорија на Вработен"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid " Month-1"
+msgstr " Месец-1"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Brown"
+msgstr "Кафена"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Remaining Days"
+msgstr "Останати Денови"
+
+#. module: hr_holidays
+#: selection:hr.holidays,holiday_type:0
+msgid "By Employee"
+msgstr "По Вработен"
+
+#. module: hr_holidays
+#: help:hr.holidays,employee_id:0
+msgid ""
+"Leave Manager can let this field empty if this leave request/allocation is "
+"for every employee"
+msgstr ""
+"Менаџерот за отсуства може да го остави ова поле празно ако барањето за "
+"отсуство/преместување е за секој вработен"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Set to Draft"
+msgstr "Подеси на нацрт"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Cyan"
+msgstr "Светла Цијан"
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Green"
+msgstr "Светло зелено"
+
+#. module: hr_holidays
+#: field:hr.employee,current_leave_id:0
+msgid "Current Leave Type"
+msgstr "Тековен Тип на Отсуство"
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,help:hr_holidays.open_ask_holidays
+msgid ""
+"Leave requests can be recorded by employees and validated by their managers. "
+"Once a leave request is validated, it appears automatically in the agenda of "
+"the employee. You can define several allowance types (paid holidays, "
+"sickness, etc.) and manage allowances per type."
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.report.xml,name:hr_holidays.report_holidays_summary
+msgid "Summary Of Leaves"
+msgstr "Збир на Отсуства"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: view:hr.holidays:0
+#: selection:hr.holidays,state:0
+msgid "Approved"
+msgstr "Одобрено"
+
+#. module: hr_holidays
+#: field:hr.employee,last_login:0
+msgid "Latest Connection"
+msgstr "Последна Конекција"
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Refuse"
+msgstr "Одбиј"
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:344
+#, python-format
+msgid ""
+"You cannot validate leaves for employee %s: too few remaining days (%s)."
+msgstr ""
+"Не можете да валидирате отсуства за вработениот %s: премалку преостанати "
+"денови (%s)."
+
+#. module: hr_holidays
+#: help:hr.holidays,state:0
+msgid ""
+"The state is set to 'Draft', when a holiday request is created. \n"
+"The state is 'Waiting Approval', when holiday request is confirmed by user. "
+" \n"
+"The state is 'Refused', when holiday request is refused by manager. "
+" \n"
+"The state is 'Approved', when holiday request is approved by manager."
+msgstr ""
+
+#. module: hr_holidays
+#: view:board.board:0
+#: model:ir.actions.act_window,name:hr_holidays.act_hr_employee_holiday_request
+#: model:ir.ui.menu,name:hr_holidays.menu_hr_reporting_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays
+msgid "Leaves"
+msgstr "Отсуства"
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays
+msgid "Leave"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_request_approve_holidays
+msgid "Leave Requests to Approve"
+msgstr "Барања за отсуства за одобрување"
+
+#. module: hr_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_account_central_journal
+msgid "Leaves by Department"
+msgstr "Отсуства по Сектор"
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Cancelled"
+msgstr "Откажано"
+
+#. module: hr_holidays
+#: help:hr.holidays,type:0
+msgid ""
+"Choose 'Leave Request' if someone wants to take an off-day. \n"
+"Choose 'Allocation Request' if you want to increase the number of leaves "
+"available for someone"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.employee,remaining_leaves:0
+msgid ""
+"Total number of legal leaves allocated to this employee, change this value "
+"to create allocation/leave requests."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Validation"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:377
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,color_name:0
+msgid "Color in Report"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_employee
+msgid "HR Holidays Summary Report By Employee"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,manager_id:0
+msgid "This area is automatically filled by the user who validate the leave"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,holiday_status_id:0
+#: field:hr.holidays.remaining.leaves.user,leave_type:0
+#: view:hr.holidays.status:0
+#: field:hr.holidays.status,name:0
+#: field:hr.holidays.summary.dept,holiday_type:0
+#: model:ir.actions.act_window,name:hr_holidays.open_view_holiday_status
+#: model:ir.model,name:hr_holidays.model_hr_holidays_status
+#: model:ir.ui.menu,name:hr_holidays.menu_open_view_holiday_status
+msgid "Leave Type"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:199
+#: code:addons/hr_holidays/hr_holidays.py:344
+#, python-format
+msgid "Warning!"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Magenta"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
+#, python-format
+msgid "You have to select at least 1 Department. And try again"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Confirmed"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.dept,date_from:0
+#: field:hr.holidays.summary.employee,date_from:0
+msgid "From"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Confirm"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:384
+#, python-format
+msgid "Leave Request for %s"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,remaining_leaves:0
+msgid "Remaining Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,state:0
+msgid "State"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_remaining_leaves_user
+msgid "Total holidays by type"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+#: view:hr.holidays:0
+#: field:hr.holidays,employee_id:0
+#: field:hr.holidays.remaining.leaves.user,name:0
+#: model:ir.model,name:hr_holidays.model_hr_employee
+msgid "Employee"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "New"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Type"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Red"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.remaining.leaves.user:0
+msgid "Leaves by Type"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Salmon"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Wheat"
+msgstr ""
+
+#. module: hr_holidays
+#: constraint:resource.calendar.leaves:0
+msgid "Error! leave start-date must be lower then leave end-date."
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:382
+#, python-format
+msgid "Allocation for %s"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,number_of_days:0
+#: field:hr.holidays,number_of_days_temp:0
+msgid "Number of Days"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:377
+#, python-format
+msgid ""
+"The feature behind the field 'Remaining Legal Leaves' can only be used when "
+"there is only one leave type with the option 'Allow to Override Limit' "
+"unchecked. (%s Found). Otherwise, the update is ambiguous as we cannot "
+"decide on which leave type the update has to be done. \n"
+"You may prefer to use the classic menus 'Leave Requests' and 'Allocation "
+"Requests' located in 'Human Resources \\ Leaves' to manage the leave days of "
+"the employees if the configuration does not allow to use this field."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Search Leave Type"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "You have to select an employee or a category"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,double_validation:0
+msgid ""
+"When selected, the Allocation/Leave Requests for this type require a second "
+"validation to be approved."
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.employee,current_leave_state:0
+#: selection:hr.holidays,state:0
+msgid "Waiting Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.employee,emp:0
+msgid "Employee(s)"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,categ_id:0
+msgid ""
+"If you set a meeting type, OpenERP will create a meeting in the calendar "
+"once a leave is validated."
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,linked_request_ids:0
+msgid "Linked Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,parent_id:0
+msgid "Parent"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Lavender"
+msgstr ""
+
+#. module: hr_holidays
+#: xsl:holidays.summary:0
+#: view:hr.holidays:0
+msgid "Month"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_ask_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_ask_holidays_new
+msgid "Leave Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,limit:0
+msgid "Allow to Override Limit"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.employee:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_employee
+msgid "Employee's Holidays"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,category_id:0
+msgid "Category"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,max_leaves:0
+msgid ""
+"This value is given by the sum of all holidays requests with a positive "
+"value."
+msgstr ""
+
+#. module: hr_holidays
+#: view:board.board:0
+msgid "All Employee Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Coral"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_summary_dept
+msgid "Holidays by Department"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Black"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.hr_holidays_leaves_assign_legal
+msgid "Allocate Leaves for Employees"
+msgstr ""
+
+#. module: hr_holidays
+#: field:resource.calendar.leaves,holiday_id:0
+msgid "Holiday"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,case_id:0
+#: field:hr.holidays.status,categ_id:0
+msgid "Meeting"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Ivory"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Both Validated and Confirmed"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,leaves_taken:0
+msgid "Leaves Already Taken"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,user_id:0
+#: field:hr.holidays.remaining.leaves.user,user_id:0
+msgid "User"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "The start date must be before the end date !"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,active:0
+msgid "Active"
+msgstr ""
+
+#. module: hr_holidays
+#: constraint:hr.employee:0
+msgid "Error ! You cannot create recursive Hierarchy of Employees."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+#: field:hr.employee,remaining_leaves:0
+msgid "Remaining Legal Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,manager_id:0
+msgid "First Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_unpaid
+msgid "Unpaid"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_company_allocation
+#: model:ir.ui.menu,name:hr_holidays.menu_open_company_allocation
+msgid "Leaves Summary"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Holidays during last month"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/wizard/hr_holidays_summary_department.py:44
+#, python-format
+msgid "Error"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.employee:0
+msgid "Assign Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Blue"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "My Department Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.employee,current_leave_state:0
+msgid "Current Leave Status"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,type:0
+msgid "Request Type"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,active:0
+msgid ""
+"If the active field is set to false, it will allow you to hide the leave "
+"type without removing it."
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Misc"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "General"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_comp
+msgid "Compensatory Days"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,notes:0
+msgid "Reasons"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_available_holidays_report
+#: model:ir.ui.menu,name:hr_holidays.menu_hr_available_holidays_report_tree
+msgid "Leaves Analysis"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: view:hr.holidays.summary.employee:0
+msgid "Cancel"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,color_name:0
+msgid ""
+"This color will be used in the leaves summary located in Reporting\\Leaves "
+"by Departement"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays.summary.dept,holiday_type:0
+#: selection:hr.holidays.summary.employee,holiday_type:0
+msgid "Validated"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays,type:0
+msgid "Allocation Request"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_resource_calendar_leaves
+msgid "Leave Detail"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,double_validation:0
+#: field:hr.holidays.status,double_validation:0
+msgid "Apply Double Validation"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.summary.dept:0
+#: view:hr.holidays.summary.employee:0
+msgid "Print"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays.status:0
+msgid "Details"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.action_hr_holidays_leaves_by_month
+msgid "My Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays,holiday_type:0
+msgid "By Employee Category"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: selection:hr.holidays,type:0
+msgid "Leave Request"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,name:0
+msgid "Description"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_cl
+msgid "Legal Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: sql_constraint:hr.holidays:0
+msgid "The number of days must be greater than 0 !"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,holiday_type:0
+msgid ""
+"By Employee: Allocation/Request for individual Employee, By Employee "
+"Category: Allocation/Request for group of employees in category"
+msgstr ""
+
+#. module: hr_holidays
+#: code:addons/hr_holidays/hr_holidays.py:199
+#, python-format
+msgid "You cannot delete a leave which is not in draft state !"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Search Leave"
+msgstr "Пребарај Отсуство"
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.employee,holiday_type:0
+msgid "Select Holiday Type"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.remaining.leaves.user,no_of_leaves:0
+msgid "Remaining leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.summary.dept,depts:0
+msgid "Department(s)"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,manager_id2:0
+msgid "Second Approval"
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays,date_to:0
+msgid "End Date"
+msgstr ""
+
+#. module: hr_holidays
+#: model:hr.holidays.status,name:hr_holidays.holiday_status_sl
+msgid "Sick Leaves"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,limit:0
+msgid ""
+"If you select this checkbox, the system allows the employees to take more "
+"leaves than the available ones for this type."
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays.status,leaves_taken:0
+msgid ""
+"This value is given by the sum of all holidays requests with a negative "
+"value."
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Violet"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.actions.act_window,help:hr_holidays.hr_holidays_leaves_assign_legal
+msgid ""
+"You can assign remaining Legal Leaves for each employee, OpenERP will "
+"automatically create and validate allocation requests."
+msgstr ""
+
+#. module: hr_holidays
+#: field:hr.holidays.status,max_leaves:0
+msgid "Maximum Allowed"
+msgstr ""
+
+#. module: hr_holidays
+#: help:hr.holidays,manager_id2:0
+msgid ""
+"This area is automaticly filled by the user who validate the leave with "
+"second level (If Leave type need second validation)"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Mode"
+msgstr ""
+
+#. module: hr_holidays
+#: model:ir.model,name:hr_holidays.model_hr_holidays_summary_dept
+msgid "HR Holidays Summary Report By Department"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Approve"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: field:hr.holidays,date_from:0
+msgid "Start Date"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+#: model:ir.actions.act_window,name:hr_holidays.open_allocation_holidays
+#: model:ir.ui.menu,name:hr_holidays.menu_open_allocation_holidays
+msgid "Allocation Requests"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Yellow"
+msgstr ""
+
+#. module: hr_holidays
+#: selection:hr.holidays.status,color_name:0
+msgid "Light Pink"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Manager"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "To Confirm"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "Year"
+msgstr ""
+
+#. module: hr_holidays
+#: view:hr.holidays:0
+msgid "To Approve"
+msgstr ""
diff --git a/addons/hr_payroll/i18n/es_MX.po b/addons/hr_payroll/i18n/es_MX.po
index a0f4837d947..24b8d615a63 100644
--- a/addons/hr_payroll/i18n/es_MX.po
+++ b/addons/hr_payroll/i18n/es_MX.po
@@ -1,1759 +1,1119 @@
-# Spanish translation for openobject-addons
-# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
+# Spanish (Mexico) 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 , 2010.
+# FIRST AUTHOR , 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
-"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2011-01-18 11:08+0000\n"
-"Last-Translator: Jordi Esteve (www.zikzakmedia.com) "
-"\n"
-"Language-Team: Spanish \n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-10-10 21:29+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Spanish (Mexico) \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2011-09-05 05:46+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "E-mail Address"
-msgstr "Dirección de correo electrónico"
+#: field:hr.payslip.line,condition_select:0
+#: field:hr.salary.rule,condition_select:0
+msgid "Condition Based on"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-msgid "Based"
-msgstr "Basado"
+#: selection:hr.contract,schedule_pay:0
+msgid "Monthly"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,net:0
-#: field:hr.employee,net:0
-#: field:hr.payroll.register,net:0
-#: field:hr.payslip,net:0
-#: report:salary.structure:0
-msgid "Net Salary"
-msgstr "Salario neto"
+#: view:hr.payslip:0 field:hr.payslip,line_ids:0
+#: model:ir.actions.act_window,name:hr_payroll.act_contribution_reg_payslip_lines
+msgid "Payslip Lines"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.line:0
+#: model:ir.model,name:hr_payroll.model_hr_salary_rule_category
+#: report:paylip.details:0
+msgid "Salary Rule Category"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.salary.rule.category,parent_id:0
+msgid ""
+"Linking a salary category to its parent is used only for the reporting "
+"purpose."
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 view:hr.payslip.line:0 view:hr.salary.rule:0
+msgid "Group By..."
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "Recompute Sheet"
-msgstr "Recalcular plantilla"
+msgid "States"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Employees Salary Details"
-msgstr "Detalles salario de los empleados"
+#: field:hr.payslip.line,input_ids:0 view:hr.salary.rule:0
+#: field:hr.salary.rule,input_ids:0
+msgid "Inputs"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Allowances with Basic:"
-msgstr "Primas con base:"
+#: field:hr.payslip.line,parent_rule_id:0
+#: field:hr.salary.rule,parent_rule_id:0
+msgid "Parent Salary Rule"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Department"
-msgstr "Departamento"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Deductions:"
-msgstr "Deducciones:"
-
-#. module: hr_payroll
-#: field:company.contribution,gratuity:0
-msgid "Use for Gratuity ?"
-msgstr "¿Uso de propina?"
-
-#. module: hr_payroll
-#: field:hr.contract,working_days_per_week:0
-#: field:hr.payslip,working_days:0
-#: report:payslip.pdf:0
-msgid "Working Days"
-msgstr "Días de trabajo"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Loan"
-msgstr "Préstamo"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Salary Payment Register"
-msgstr "Registro de pago de nómina"
-
-#. module: hr_payroll
-#: field:hr.employee,slip_ids:0
-#: view:hr.payroll.register:0
-#: field:hr.payroll.register,line_ids:0
+#: field:hr.employee,slip_ids:0 view:hr.payslip:0 view:hr.payslip.run:0
+#: field:hr.payslip.run,slip_ids:0
#: model:ir.actions.act_window,name:hr_payroll.act_hr_employee_payslip_list
msgid "Payslips"
-msgstr "Nóminas"
-
-#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_salary_report
-msgid "Year Salary Report"
-msgstr "Informe anual de salarios"
-
-#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Paid Salary"
-msgstr "Nómina pagada"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "("
-msgstr "("
-
-#. module: hr_payroll
-#: field:company.contribution,company_id:0
-#: field:hr.allounce.deduction.categoty,company_id:0
-#: field:hr.contibution.register,company_id:0
-#: field:hr.holidays.status,company_id:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.register,company_id:0
-#: field:hr.payroll.structure,company_id:0
-#: field:hr.payslip,company_id:0
-msgid "Company"
-msgstr "Compañía"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr "El responsable"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr "Detalles de la carta"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payslip.pdf:0
-msgid ","
-msgstr ","
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
-msgid "Set to Draft"
-msgstr "Cambiar a borrador"
-
-#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:180
-#: code:addons/hr_payroll/hr_payroll.py:195
-#: code:addons/hr_payroll/hr_payroll.py:285
-#: code:addons/hr_payroll/hr_payroll.py:835
-#: code:addons/hr_payroll/hr_payroll.py:1111
-#: code:addons/hr_payroll/hr_payroll.py:1126
-#: code:addons/hr_payroll/hr_payroll.py:1410
-#, python-format
-msgid "Variable Error: %s "
-msgstr "Error variable: %s "
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Expire"
-msgstr "Vencimiento"
-
-#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Half-Pay Holiday"
-msgstr "Vacaciones con media paga"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: field:hr.payslip,other_pay:0
-msgid "Others"
-msgstr "Otros"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,slip_id:0
-#: model:ir.model,name:hr_payroll.model_hr_payslip
-#: report:payslip.pdf:0
-msgid "Pay Slip"
-msgstr "Nómina"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Contract Detail:"
-msgstr "Detalles del contrato:"
-
-#. module: hr_payroll
-#: field:hr.payslip,igross:0
-#: field:hr.payslip,inet:0
-msgid "Calculaton Field"
-msgstr "Campo de cálculo"
-
-#. module: hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-#: help:hr.payroll.register,bank_id:0
-msgid "Select the Bank Address from whcih the salary is going to be paid"
-msgstr "Seleccione la dirección del banco de donde se pagará la nómina."
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-msgid "Bank Advice"
-msgstr "Aviso bancario"
-
-#. module: hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Reject"
-msgstr "Rechazado"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Leaves"
-msgstr "Ausencias"
-
-#. module: hr_payroll
-#: field:hr.contibution.register.line,register_id:0
-#: view:hr.payslip:0
-#: field:hr.payslip,register_id:0
-#: report:payslip.pdf:0
-msgid "Register"
-msgstr "Registro"
-
-#. module: hr_payroll
-#: constraint:hr.employee:0
-msgid ""
-"Error ! You cannot select a department for which the employee is the manager."
msgstr ""
-"¡Error! No puede seleccionar un departamento que tenga el empleado como "
-"responsable."
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Total Deductions"
-msgstr "Total deducciones"
+#: field:hr.payroll.structure,parent_id:0
+#: field:hr.salary.rule.category,parent_id:0
+msgid "Parent"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution.line,value:0
-#: field:hr.payslip.line.line,value:0
-msgid "Value"
-msgstr "Valor"
+#: report:paylip.details:0 report:payslip:0
+msgid "("
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employee"
-msgstr "Nombre del empleado"
+#: field:hr.contribution.register,company_id:0
+#: field:hr.payroll.structure,company_id:0 field:hr.payslip,company_id:0
+#: field:hr.payslip.line,company_id:0 field:hr.salary.rule,company_id:0
+#: field:hr.salary.rule.category,company_id:0
+msgid "Company"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Register Lines"
-msgstr "Líneas de registro"
+#: view:hr.payslip:0
+msgid "Done Slip"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0 report:payslip:0
+msgid ","
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 view:hr.payslip.run:0
+msgid "Set to Draft"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_salary_rule
+msgid "hr.salary.rule"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip,payslip_run_id:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_run
+msgid "Payslip Batches"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.employees:0
+msgid ""
+"This wizard will generate payslips for all selected employee(s) based on the "
+"dates and credit note specified on Payslips Run."
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0 report:paylip.details:0
+#: report:payslip:0
+msgid "Quantity/Rate"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.input,payslip_id:0 field:hr.payslip.line,slip_id:0
+#: field:hr.payslip.worked_days,payslip_id:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip report:payslip:0
+msgid "Pay Slip"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.employees:0
+msgid "Generate"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,amount_percentage_base:0
+#: help:hr.salary.rule,amount_percentage_base:0
+msgid "result will be affected to a variable"
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0
+msgid "Total:"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.act_children_salary_rules
+msgid "All Children Rules"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 view:hr.salary.rule:0
+msgid "Input Data"
+msgstr ""
+
+#. module: hr_payroll
+#: constraint:hr.payslip:0
+msgid "Payslip 'Date From' must be before 'Date To'."
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 view:hr.salary.rule.category:0
+msgid "Notes"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Salary Computation"
-msgstr "Cálculo de la nómina"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice.line,amount:0
-#: report:payroll.advice:0
-#: report:salary.structure:0
-msgid "Amount"
-msgstr "Importe"
-
-#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:1225
-#, python-format
-msgid "Please check configuration of %s, payroll head is missing"
msgstr ""
-"Por favor, compruebe la configuración de %s, falta la cabecera de la nómina"
#. module: hr_payroll
-#: selection:company.contribution,amount_type:0
-msgid "Percentage"
-msgstr "Porcentaje"
+#: report:contribution.register.lines:0 field:hr.payslip.input,amount:0
+#: field:hr.payslip.line,amount:0 report:paylip.details:0 report:payslip:0
+msgid "Amount"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-msgid "Other Information"
-msgstr "Otra información"
-
-#. module: hr_payroll
-#: field:hr.passport,country_id:0
-msgid "Country of Issue"
-msgstr "País de emisión"
-
-#. module: hr_payroll
-#: field:hr.contibution.register.line,emp_deduction:0
-msgid "Employee Deduction"
-msgstr "Deducción del empleado"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Other Deduction"
-msgstr "Otras deducciones"
-
-#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Paid Holiday"
-msgstr "Vacaciones pagada"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.passport:0
-#: view:hr.payslip:0
-msgid "Group By..."
-msgstr "Agrupar por..."
-
-#. module: hr_payroll
-#: field:hr.passport,date_expire:0
-msgid "Passport Expire Date"
-msgstr "Fecha expiración pasaporte"
-
-#. module: hr_payroll
-#: selection:hr.holidays.status,type:0
-msgid "Un-Paid Holiday"
-msgstr "Vacaciones no pagadas"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Valid From"
-msgstr "Válido desde"
-
-#. module: hr_payroll
-#: help:hr.payslip,igross:0
-#: help:hr.payslip,inet:0
-msgid ""
-"Calculation field used for internal calculation, do not place this on form"
-msgstr "Campo usado en cálculos internos, no lo coloque en un formulario."
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Amount (in words) :"
-msgstr "Importe (en palabras):"
-
-#. module: hr_payroll
-#: field:hr.holidays.status,type:0
-msgid "Payment"
-msgstr "Pago"
-
-#. module: hr_payroll
-#: view:hr.payroll.structure:0
-#: view:hr.payslip:0
-#: field:hr.payslip,line_ids:0
-#: view:hr.payslip.line:0
+#: view:hr.payslip:0 view:hr.payslip.line:0
#: model:ir.model,name:hr_payroll.model_hr_payslip_line
msgid "Payslip Line"
-msgstr "Línea de nómina"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Identification No"
-msgstr "Nº identificación"
-
-#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,base:0
-msgid "Based on"
-msgstr "Basado en"
-
-#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Wating for Verification"
-msgstr "Esperando verificación"
-
-#. module: hr_payroll
-#: model:ir.module.module,shortdesc:hr_payroll.module_meta_information
-msgid "Human Resource Payroll"
-msgstr "Nóminas de recursos humanos"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Total:"
-msgstr "Total:"
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Posted"
-msgstr "Fijado"
-
-#. module: hr_payroll
-#: model:ir.module.module,description:hr_payroll.module_meta_information
-msgid ""
-"Generic Payroll system\n"
-" * Employee Details\n"
-" * Employee Contracts\n"
-" * Passport based Contract\n"
-" * Allowances / Deductions\n"
-" * Allow to configure Basic / Grows / Net Salary\n"
-" * Employee Payslip\n"
-" * Monthly Payroll Register\n"
-" * Integrated with Holiday Management\n"
-" "
msgstr ""
-"Sistema de nóminas genérico\n"
-" * Detalles de empleado\n"
-" * Contratos de empleado\n"
-" * Contratos basados en pasaportes\n"
-" * Complementos/deducciones\n"
-" * Permite configurar salario base/bruto/neto\n"
-" * Nómina de empleado\n"
-" * Registro mensual de nóminas\n"
-" * Integrado con la gestión de vacaciones\n"
-" "
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_holidays_status
-msgid "Leave Type"
-msgstr "Tipo de ausencia"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Date :"
-msgstr "Fecha :"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,total:0
-msgid "Sub Total"
-msgstr "Subtotal"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Payments -"
-msgstr "Pagos -"
-
-#. module: hr_payroll
-#: field:hr.contract,visa_no:0
-msgid "Visa No"
-msgstr "Número de Visa"
-
-#. module: hr_payroll
-#: field:company.contribution.line,from_val:0
-#: report:employees.salary:0
-#: field:hr.payslip.line.line,from_val:0
-#: report:year.salary:0
-msgid "From"
-msgstr "Desde"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr "Por salario"
-
-#. module: hr_payroll
-#: field:hr.payroll.employees.detail,date_to:0
-#: field:hr.payroll.year.salary,date_to:0
-#: report:salary.structure:0
-msgid "End Date"
-msgstr "Fecha final"
-
-#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.salary_payslip
-msgid "Employee PaySlip"
-msgstr "Nómina del empleado"
-
-#. module: hr_payroll
-#: field:hr.payslip,leaves:0
-msgid "Leave Deductions"
-msgstr "Deducciones por ausencia"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payroll.advice:0
-msgid "Authorised Signature"
-msgstr "Firma autorizada"
-
-#. module: hr_payroll
-#: selection:hr.payslip.line,amount_type:0
-msgid "Function Value"
-msgstr "Valor de función"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_contibution_register_line
-msgid "Contribution Register Line"
-msgstr "Línea de registro de contribución"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Notes:"
-msgstr "Notas:"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:hr.payroll.register,state:0
-#: field:hr.payslip,state:0
-msgid "State"
-msgstr "Estado"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Paymeny Lines"
-msgstr "Líneas de pago"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Other Lines"
-msgstr "Otras líneas"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.payroll.structure:0
#: view:hr.payslip:0
-#: view:hr.payslip.line:0
-msgid "Function Arguments"
-msgstr "Argumentos de la función"
+msgid "Other Information"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_company_contribution_tree
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_company_contribution_tree
-msgid "Company Contributions"
-msgstr "Contribuciones de la compañía"
+#: help:hr.payslip.line,amount_select:0 help:hr.salary.rule,amount_select:0
+msgid "The computation method for the rule amount."
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,employee_id:0
-#: field:hr.passport,employee_id:0
-#: field:hr.payroll.advice.line,employee_id:0
-#: field:hr.payslip,employee_id:0
-#: field:hr.payslip.line,employee_id:0
+#: view:payslip.lines.contribution.register:0
+msgid "Contribution Register's Payslip Lines"
+msgstr ""
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52
+#, python-format
+msgid "Warning !"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0
+msgid "Details by Salary Rule Category:"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0 report:payslip:0
+msgid "Note"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payroll.structure,code:0 field:hr.payslip,number:0
+#: report:paylip.details:0 report:payslip:0
+msgid "Reference"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Draft Slip"
+msgstr ""
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:422
+#, python-format
+msgid "Normal Working Days paid at 100%"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,condition_range_max:0
+#: field:hr.salary.rule,condition_range_max:0
+msgid "Maximum Range"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0 report:payslip:0
+msgid "Identification No"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip,struct_id:0
+msgid "Structure"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.employee,total_wage:0
+msgid "Sum of all current contract's wage of employee."
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Total Working Days"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,code:0 help:hr.salary.rule,code:0
+msgid ""
+"The code of salary rules can be used as reference in computation of other "
+"rules. In that case, it is case sensitive."
+msgstr ""
+
+#. module: hr_payroll
+#: selection:hr.contract,schedule_pay:0
+msgid "Weekly"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,rate:0
+msgid "Rate (%)"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0
+msgid "Confirm"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.actions.report.xml,name:hr_payroll.payslip_report
+msgid "Employee PaySlip"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,condition_range_max:0
+#: help:hr.salary.rule,condition_range_max:0
+msgid "The maximum amount, applied for this rule."
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,condition_python:0
+#: help:hr.salary.rule,condition_python:0
+msgid ""
+"Applied this rule for calculation if condition is true. You can specify "
+"condition like basic > 1000."
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.employees:0
+msgid "Payslips by Employees"
+msgstr ""
+
+#. module: hr_payroll
+#: selection:hr.contract,schedule_pay:0
+msgid "Quarterly"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip,state:0 field:hr.payslip.run,state:0
+msgid "State"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.salary.rule,quantity:0
+msgid ""
+"It is used in computation for percentage and fixed amount.For e.g. A rule "
+"for Meal Voucher having fixed amount of 1€ per worked day can have its "
+"quantity defined in expression like worked_days.WORK100.number_of_days."
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.salary.rule:0
+msgid "Search Salary Rule"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip,employee_id:0 field:hr.payslip.line,employee_id:0
#: model:ir.model,name:hr_payroll.model_hr_employee
msgid "Employee"
-msgstr "Empleado"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip.line,base:0
-msgid "Formula"
-msgstr "Fórmula"
+#: selection:hr.contract,schedule_pay:0
+msgid "Semi-annually"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr "Líneas de notificación bancaria"
+#: view:hr.salary.rule:0
+msgid "Children Definition"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,type:0
-#: field:hr.payslip.line,type:0
-#: report:salary.structure:0
-msgid "Type"
-msgstr "Tipo"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid "Email"
-msgstr "Correo electrónico"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "#"
-msgstr "#"
+#: view:hr.payslip.run:0
+msgid "Search Payslip Batches"
+msgstr ""
#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:469
-#: code:addons/hr_payroll/hr_payroll.py:1225
-#, python-format
-msgid "Error !"
-msgstr "¡ Error !"
+#: field:hr.payslip.line,amount_percentage_base:0
+#: field:hr.salary.rule,amount_percentage_base:0
+msgid "Percentage based on"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
-msgid "Verify Sheet"
-msgstr "Comprobar hoja"
+#: help:hr.payslip.line,amount_percentage:0
+#: help:hr.salary.rule,amount_percentage:0
+msgid "For example, enter 50.0 to apply a percentage of 50%"
+msgstr ""
#. module: hr_payroll
-#: help:hr.contract,working_days_per_week:0
-msgid "No of Working days / week for an employee"
-msgstr "Número de días/semanas trabajados para un empleado."
+#: field:hr.payslip,paid:0
+msgid "Made Payment Order ? "
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0
+msgid "PaySlip Lines by Contribution Register"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip,state:0
+msgid ""
+"* When the payslip is created the state is 'Draft'. \n"
+"* If the payslip is under verification, the state is 'Waiting'. "
+"\n"
+"* If the payslip is confirmed then state is set to 'Done'. \n"
+"* When user cancel payslip the state is 'Rejected'."
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.worked_days,number_of_days:0
+msgid "Number of Days"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
#: selection:hr.payslip,state:0
-msgid "New Slip"
-msgstr "Nuevo justificante"
+msgid "Rejected"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,basic:0
-msgid "Net Basic"
-msgstr "Base neta"
+#: view:hr.payroll.structure:0 field:hr.payroll.structure,rule_ids:0
+#: view:hr.salary.rule:0
+#: model:ir.actions.act_window,name:hr_payroll.action_salary_rule_form
+#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_salary_rule_form
+msgid "Salary Rules"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,gross:0
-#: field:hr.employee,gross:0
-#: field:hr.payroll.register,grows:0
-#: field:hr.payslip,grows:0
-#: report:salary.structure:0
-msgid "Gross Salary"
-msgstr "Salario bruto"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Total Earnings"
-msgstr "Ingresos totales"
-
-#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_employees_detail
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_employees_detail
-msgid "Employee Salary Statement"
-msgstr "Declaración salario del empleado"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Other Payment"
-msgstr "Otros pagos"
-
-#. module: hr_payroll
-#: field:hr.employee,advantages_net:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
-msgid "Deductions"
-msgstr "Deducciones"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr "C/D"
-
-#. module: hr_payroll
-#: field:hr.contract,permit_no:0
-msgid "Work Permit No"
-msgstr "Nº permiso trabajo"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr "Salario empleado"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-msgid "Chaque Nos"
-msgstr "Cada uno de nuestros"
-
-#. module: hr_payroll
-#: field:hr.contibution.register,monthly_total_by_emp:0
-msgid "Total By Employee"
-msgstr "Total por empleado"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: selection:company.contribution,amount_type:0
-#: selection:company.contribution.line,amount_type:0
-#: selection:hr.payslip.line,amount_type:0
-#: selection:hr.payslip.line.line,amount_type:0
-msgid "Fixed Amount"
-msgstr "Importe fijo"
-
-#. module: hr_payroll
-#: field:company.contribution.line,to_val:0
-#: report:employees.salary:0
-#: field:hr.payslip.line.line,to_val:0
-#: report:year.salary:0
-msgid "To"
-msgstr "Para"
-
-#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:180
-#: code:addons/hr_payroll/hr_payroll.py:195
-#: code:addons/hr_payroll/hr_payroll.py:285
-#: code:addons/hr_payroll/hr_payroll.py:835
-#: code:addons/hr_payroll/hr_payroll.py:1111
-#: code:addons/hr_payroll/hr_payroll.py:1126
-#: code:addons/hr_payroll/hr_payroll.py:1410
+#: code:addons/hr_payroll/hr_payroll.py:337
#, python-format
-msgid "Variable Error !"
-msgstr "¡Error de variable!"
+msgid "Refund: "
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_employees_detail
-msgid "hr.payroll.employees.detail"
-msgstr "rrhh.nomina.empleados.detalle"
+#: model:ir.model,name:hr_payroll.model_payslip_lines_contribution_register
+msgid "PaySlip Lines by Contribution Registers"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0
+msgid "Done"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,appears_on_payslip:0
+#: field:hr.salary.rule,appears_on_payslip:0
+msgid "Appears on Payslip"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,amount_fix:0
+#: selection:hr.payslip.line,amount_select:0 field:hr.salary.rule,amount_fix:0
+#: selection:hr.salary.rule,amount_select:0
+msgid "Fixed Amount"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,active:0 help:hr.salary.rule,active:0
+msgid ""
+"If the active field is set to false, it will allow you to hide the salary "
+"rule without removing it."
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
#: view:hr.payslip:0
-msgid "Pay Salary"
-msgstr "Pagar nómina"
+msgid "Worked Days & Inputs"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice.line,name:0
-msgid "Bank Account A/C"
-msgstr "Cuenta bancaria"
+#: field:hr.payslip,details_by_salary_rule_category:0
+msgid "Details by Salary Rule Category"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Contribution Lines"
-msgstr "Líneas de contribución"
+#: model:ir.actions.act_window,name:hr_payroll.action_payslip_lines_contribution_register
+msgid "PaySlip Lines"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "For the month of"
-msgstr "Para el mes de"
+#: help:hr.payslip.line,register_id:0 help:hr.salary.rule,register_id:0
+msgid "Eventual third party involved in the salary payment of the employees."
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: selection:hr.allounce.deduction.categoty,type:0
-#: field:hr.payroll.register,deduction:0
-#: report:hr.payroll.register.sheet:0
-#: field:hr.payslip,deduction:0
-#: selection:hr.payslip.line,type:0
-msgid "Deduction"
-msgstr "Deducción"
+#: field:hr.payslip.worked_days,number_of_hours:0
+msgid "Number of Hours"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice Note"
-msgstr "Observación aviso bancario"
+#: view:hr.payslip:0
+msgid "PaySlip Batch"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,condition_range_min:0
+#: field:hr.salary.rule,condition_range_min:0
+msgid "Minimum Range"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,child_ids:0 field:hr.salary.rule,child_ids:0
+msgid "Child Salary Rule"
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0 field:hr.payslip,date_to:0
+#: field:hr.payslip.run,date_end:0 report:paylip.details:0 report:payslip:0
+#: field:payslip.lines.contribution.register,date_to:0
+msgid "Date To"
+msgstr ""
+
+#. module: hr_payroll
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Range"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_tree
+msgid "Salary Structures Hierarchy"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
#: view:hr.payslip:0
msgid "Payslip"
-msgstr "Nómina"
+msgstr ""
#. module: hr_payroll
#: constraint:hr.contract:0
msgid "Error! contract start-date must be lower then contract end-date."
msgstr ""
-"¡Error! La fecha de inicio de contrato debe ser menor que la fecha de "
-"finalización."
#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Loan Installment"
-msgstr "Entrega anticipo"
+#: view:hr.contract:0
+msgid "Payslip Info"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Complete HR Checking"
-msgstr "Comprobación RH completa"
+#: model:ir.actions.act_window,name:hr_payroll.act_payslip_lines
+msgid "Payslip Computation Details"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr "Atentamente"
+#: code:addons/hr_payroll/hr_payroll.py:872
+#, python-format
+msgid "Wrong python code defined for salary rule %s (%s) "
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr "Nº SS"
+#: model:ir.model,name:hr_payroll.model_hr_payslip_input
+msgid "Payslip Input"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Net Amount"
-msgstr "Importe neto"
+#: view:hr.salary.rule.category:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category
+msgid "Salary Rule Categories"
+msgstr ""
#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Salary Structure:"
-msgstr "Estructura salarial:"
+#: help:hr.payslip.input,contract_id:0
+#: help:hr.payslip.worked_days,contract_id:0
+msgid "The contract for which applied this input"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_employees_detail
-msgid "Employees Salary Detail"
-msgstr "Detalle salario empleado"
+#: view:hr.salary.rule:0
+msgid "Computation"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payslip_line_line
-msgid "Function Line"
-msgstr "Línea de función"
+#: help:hr.payslip.input,amount:0
+msgid ""
+"It is used in computation. For e.g. A rule for sales having 1% commission of "
+"basic salary for per product can defined in expression like result = "
+"inputs.SALEURO.amount * contract.wage*0.01."
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Confirm Sheet"
-msgstr "Hoja de confirmación"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Others:"
-msgstr "Otros:"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: selection:company.contribution,amount_type:0
-msgid "Function Calculation"
-msgstr "Función de cálculo"
-
-#. module: hr_payroll
-#: field:hr.payslip,worked_days:0
-#: report:payslip.pdf:0
-msgid "Worked Day"
-msgstr "Días trabajados"
-
-#. module: hr_payroll
-#: field:hr.contibution.register,monthly_total_by_comp:0
-msgid "Total By Company"
-msgstr "Total por compañía"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice.line,flag:0
-msgid "D/C"
-msgstr "D/C"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Country & Address"
-msgstr "País y Dirección"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Employee Code"
-msgstr "Código de empleado"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Basic Salary – Leaves"
-msgstr "Salario base - Ausencias"
-
-#. module: hr_payroll
-#: field:company.contribution,amount_type:0
-#: field:company.contribution.line,amount_type:0
-#: field:hr.payslip.line,amount_type:0
-#: field:hr.payslip.line.line,amount_type:0
-#: report:salary.structure:0
+#: view:hr.payslip.line:0 field:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_select:0
msgid "Amount Type"
-msgstr "Tipo de importe"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: field:hr.payslip.line,category_id:0
+#: field:hr.payslip.line,category_id:0 view:hr.salary.rule:0
+#: field:hr.salary.rule,category_id:0
msgid "Category"
-msgstr "Categoría"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.payslip.line,company_contrib:0
-#: model:ir.model,name:hr_payroll.model_company_contribution
-msgid "Company Contribution"
-msgstr "Contribución compañía"
+#: help:hr.payslip.run,credit_note:0
+msgid ""
+"If its checked, indicates that all payslips generated from here are refund "
+"payslips."
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,category_id:0
-msgid "Heads"
-msgstr "Cabeceras"
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_structure_list_form
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_structure_view
+msgid "Salary Structures"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.year_payroll_register
-msgid "Print Statement"
-msgstr "Imprimir declaración"
+#: view:hr.payslip.run:0
+msgid "Draft Payslip Batches"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip:0 selection:hr.payslip,state:0 view:hr.payslip.run:0
+#: selection:hr.payslip.run,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0 field:hr.payslip,date_from:0
+#: field:hr.payslip.run,date_start:0 report:paylip.details:0 report:payslip:0
+#: field:payslip.lines.contribution.register,date_from:0
+msgid "Date From"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.run:0
+msgid "Done Payslip Batches"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0
+msgid "Payslip Lines by Contribution Register:"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.salary.rule:0
+msgid "Conditions"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,amount_percentage:0
+#: selection:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_percentage:0
+#: selection:hr.salary.rule,amount_select:0
+msgid "Percentage (%)"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "Draft"
-msgstr "Borrador"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Earnings"
-msgstr "Ingresos"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:salary.structure:0
-msgid "Basic"
-msgstr "Básico"
-
-#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_passport_tree
-msgid "All Passports"
-msgstr "Todos los pasaportes"
-
-#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_hr_payroll_year_salary
-#: model:ir.ui.menu,name:hr_payroll.menu_wizard_print_year_salary
-msgid "Salary Register"
-msgstr "Registro salarial"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: report:hr.payroll.register.sheet:0
-msgid "Employee Name"
-msgstr "Nombre del empleado"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_passport
-msgid "Passport Detail"
-msgstr "Detalle pasaporte"
-
-#. module: hr_payroll
-#: selection:hr.payslip.line,amount_type:0
-msgid "Percentage (%)"
-msgstr "Porcentaje (%)"
-
-#. module: hr_payroll
-#: field:hr.payroll.advice,register_id:0
-#: view:hr.payroll.register:0
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payroll_register_form
-#: model:ir.model,name:hr_payroll.model_hr_payroll_register
-#: model:ir.ui.menu,name:hr_payroll.hr_menu_payroll_register
-msgid "Payroll Register"
-msgstr "Registro de nóminas"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-#: report:payroll.advice:0
-msgid "For"
-msgstr "Para"
-
-#. module: hr_payroll
-#: field:hr.passport,contracts_ids:0
-msgid "Contracts"
-msgstr "Contratos"
+msgid "Worked Day"
+msgstr ""
#. module: hr_payroll
#: view:hr.payroll.structure:0
msgid "Employee Function"
-msgstr "Función del empleado"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Paid"
-msgstr "Pagado"
-
-#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Approve Sheet"
-msgstr "Aprobar hoja"
-
-#. module: hr_payroll
-#: field:hr.payslip,paid:0
-msgid "Paid ? "
-msgstr "¿Pagado? "
-
-#. module: hr_payroll
-#: view:hr.holidays.status:0
-msgid "Validation"
-msgstr "Validación"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-msgid "Title"
-msgstr "Título"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-msgid "Search Company Contribution"
-msgstr "Buscar contribución de la compañía"
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,user_id:0
-msgid "User"
-msgstr "Usuario"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr "Líneas de pago"
+#: field:hr.payslip,credit_note:0 field:hr.payslip.run,credit_note:0
+msgid "Credit Note"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Compute Sheet"
-msgstr "Calcular hoja"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution,active:0
-#: field:hr.payroll.register,active:0
+#: field:hr.payslip.line,active:0 field:hr.salary.rule,active:0
msgid "Active"
-msgstr "Activo"
+msgstr ""
#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,condition:0
-msgid "Applied this head for calculation if condition is true"
-msgstr "Aplicar este encabezado en el cálculo si la condición es verdadera"
-
-#. module: hr_payroll
-#: report:year.salary:0
-msgid "Yearly Salary Details"
-msgstr "Detalles del salario anual"
+#: view:hr.salary.rule:0
+msgid "Child Rules"
+msgstr ""
#. module: hr_payroll
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
-msgstr "¡Error! No se puede crear una jerarquía recursiva de empleados."
+msgstr ""
#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,condition:0
-msgid "Condition"
-msgstr "Condición"
+#: model:ir.actions.report.xml,name:hr_payroll.payslip_details_report
+msgid "PaySlip Details"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
-#: selection:hr.payslip,state:0
-msgid "Wating for HR Verification"
-msgstr "Esperando verificación de RRHH"
+#: help:hr.payslip.line,condition_range_min:0
+#: help:hr.salary.rule,condition_range_min:0
+msgid "The minimum amount, applied for this rule."
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice:"
-msgstr "Aviso de pago:"
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Python Expression"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Compute"
-msgstr "Calcular"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.payslip,deg_id:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
+#: report:paylip.details:0 report:payslip:0
msgid "Designation"
-msgstr "Designación"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "HR Manager"
-msgstr "Responsable de RRHH"
+#: code:addons/hr_payroll/wizard/hr_payroll_payslips_by_employees.py:52
+#, python-format
+msgid "You must select employee(s) to generate payslip(s)"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,basic:0
-#: field:hr.employee,basic:0
-#: field:hr.payslip,basic_before_leaves:0
-#: report:payslip.pdf:0
-msgid "Basic Salary"
-msgstr "Salario base"
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,code:0
-msgid "Category Code"
-msgstr "Código categoría"
-
-#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Salary Information"
-msgstr "Información del salario"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty_line
-msgid "Allowance Deduction Categoty"
-msgstr "Categoría prima/deducción"
+#: code:addons/hr_payroll/hr_payroll.py:861
+#, python-format
+msgid "Wrong quantity defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
msgid "Companies"
-msgstr "Compañías"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid "Authorized Signature"
-msgstr "Firma autorizada"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,contract_id:0
+#: field:hr.payslip,contract_id:0 field:hr.payslip.input,contract_id:0
+#: field:hr.payslip.line,contract_id:0
+#: field:hr.payslip.worked_days,contract_id:0
#: model:ir.model,name:hr_payroll.model_hr_contract
msgid "Contract"
-msgstr "Contrato"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.advice,state:0
-msgid "Draft Sheet"
-msgstr "Hoja borrador"
+#: report:paylip.details:0 report:payslip:0
+msgid "Credit"
+msgstr ""
#. module: hr_payroll
-#: selection:hr.payroll.year.salary,salary_on:0
-msgid "Next Month Date"
-msgstr "Fecha próximo mes"
+#: field:hr.contract,schedule_pay:0
+msgid "Scheduled Pay"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,date:0
-#: field:hr.payroll.advice,date:0
-#: field:hr.payroll.register,date:0
-#: field:hr.payslip,date:0
-msgid "Date"
-msgstr "Fecha"
+#: code:addons/hr_payroll/hr_payroll.py:861
+#: code:addons/hr_payroll/hr_payroll.py:866
+#: code:addons/hr_payroll/hr_payroll.py:872
+#: code:addons/hr_payroll/hr_payroll.py:889
+#: code:addons/hr_payroll/hr_payroll.py:895
+#, python-format
+msgid "Error"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,visa_expire:0
-msgid "Visa Expire Date"
-msgstr "Fecha expiración visado"
+#: field:hr.payslip.line,condition_python:0
+#: field:hr.salary.rule,condition_python:0
+msgid "Python Condition"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Search Passport"
-msgstr "Buscar pasaporte"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Phone No."
-msgstr "Nº Teléfono"
-
-#. module: hr_payroll
-#: field:company.contribution,contribute_per:0
-#: field:company.contribution.line,contribution_id:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.contibution.register:0
-#: view:hr.contibution.register.line:0
+#: view:hr.contribution.register:0
msgid "Contribution"
-msgstr "Contribución"
+msgstr ""
#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,state:0
-msgid "Label"
-msgstr "Etiqueta"
+#: code:addons/hr_payroll/hr_payroll.py:347
+#, python-format
+msgid "Refund Payslip"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.rule.input,input_id:0
+#: model:ir.model,name:hr_payroll.model_hr_rule_input
+msgid "Salary Rule Input"
+msgstr ""
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:895
+#, python-format
+msgid "Wrong python condition defined for salary rule %s (%s)"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.payslip.line,quantity:0 field:hr.salary.rule,quantity:0
+msgid "Quantity"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.structure:0
#: view:hr.payslip:0
-#: view:hr.payslip.line:0
+msgid "Refund"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.salary.rule:0
msgid "Company Contribution"
-msgstr "Contribución compañía"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: report:salary.structure:0
-msgid "Other No."
-msgstr "Otro Nº"
-
-#. module: hr_payroll
-#: field:company.contribution,code:0
-#: field:hr.contibution.register.line,code:0
-#: field:hr.holidays.status,code:0
-#: field:hr.payroll.structure,code:0
-#: field:hr.payslip.line,code:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
+#: report:contribution.register.lines:0 field:hr.payslip.input,code:0
+#: field:hr.payslip.line,code:0 field:hr.payslip.worked_days,code:0
+#: field:hr.rule.input,code:0 field:hr.salary.rule,code:0
+#: field:hr.salary.rule.category,code:0 report:paylip.details:0
+#: report:payslip:0
msgid "Code"
-msgstr "Código"
-
-#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:hr_payroll.hr_menu_payment_advice
-msgid "Payment Advice"
-msgstr "Aviso de pago"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Number :"
-msgstr "Número :"
-
-#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,base:0
-msgid ""
-"This will use to computer the % fields values, in general its on basic, but "
-"You can use all heads code field in small letter as a variable name i.e. "
-"hra, ma, lta, etc...., also you can use, static varible basic"
msgstr ""
-"Esto se utiliza para calcular los valores de los campos %, en general en su "
-"base, pero puede utilizar todas las cabeceras de los campos de código en "
-"letra pequeña como un nombre de variable, por ejemplo hra, ma, lta, etc., "
-"también puede utilizar variable estática básica."
#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Computation Overview"
-msgstr "Resumen del cálculo"
+#: field:hr.payslip.line,amount_python_compute:0
+#: selection:hr.payslip.line,amount_select:0
+#: field:hr.salary.rule,amount_python_compute:0
+#: selection:hr.salary.rule,amount_select:0
+msgid "Python Code"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.year.salary,salary_on:0
-msgid "Salary On"
-msgstr "Salario sobre"
+#: field:hr.payslip.input,sequence:0 field:hr.payslip.line,sequence:0
+#: field:hr.payslip.worked_days,sequence:0 field:hr.salary.rule,sequence:0
+msgid "Sequence"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.advice,number:0
-#: field:hr.payroll.register,number:0
-#: field:hr.payslip,number:0
-msgid "Number"
-msgstr "Número"
+#: report:contribution.register.lines:0 report:paylip.details:0
+msgid "Register Name"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contract,struct_id:0
-#: field:hr.employee,line_ids:0
-#: view:hr.payroll.structure:0
-#: field:hr.payroll.structure,line_ids:0
-#: view:hr.payslip:0
+#: view:hr.salary.rule:0
+msgid "General"
+msgstr ""
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:664
+#, python-format
+msgid "Salary Slip of %s for %s"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.model,name:hr_payroll.model_hr_payslip_employees
+msgid "Generate payslips for all selected employees"
+msgstr ""
+
+#. module: hr_payroll
+#: field:hr.contract,struct_id:0 view:hr.payroll.structure:0 view:hr.payslip:0
#: view:hr.payslip.line:0
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_employee_grade_form
-#: model:ir.actions.report.xml,name:hr_payroll.salary_structure_register
#: model:ir.model,name:hr_payroll.model_hr_payroll_structure
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_employee_function
msgid "Salary Structure"
-msgstr "Estructura salarial"
-
-#. module: hr_payroll
-#: field:hr.contibution.register,register_line_ids:0
-msgid "Register Line"
-msgstr "Línea registro"
-
-#. module: hr_payroll
-#: view:hr.payroll.register:0
-#: view:hr.payslip:0
-msgid "Cancel"
-msgstr "Cancelar"
-
-#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
-msgid "Close"
-msgstr "Cerrar"
-
-#. module: hr_payroll
-#: field:hr.payslip.line,amount:0
-msgid "Amount / Percentage"
-msgstr "Importe / Porcentaje"
-
-#. module: hr_payroll
-#: field:hr.employee,advantages_gross:0
-#: report:hr.payroll.register.sheet:0
-#: report:salary.structure:0
-msgid "Allowances"
-msgstr "Primas"
-
-#. module: hr_payroll
-#: selection:hr.payroll.year.salary,salary_on:0
-msgid "Current Month Date"
-msgstr "Fecha mes actual"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Salary"
-msgstr "Salario"
-
-#. module: hr_payroll
-#: field:hr.contract,passport_id:0
-#: field:hr.passport,name:0
-msgid "Passport No"
-msgstr "Número de pasaporte"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Passport"
-msgstr "Pasaporte"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Total Salary"
-msgstr "Salario total"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "for period"
-msgstr "por periodo"
-
-#. module: hr_payroll
-#: field:hr.holidays.status,head_id:0
-msgid "Payroll Head"
-msgstr "Cabecera nómina"
-
-#. module: hr_payroll
-#: field:company.contribution,register_id:0
-#: model:ir.actions.act_window,name:hr_payroll.action_contibution_register_form
-#: model:ir.model,name:hr_payroll.model_hr_contibution_register
-#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contibution_register_form
-msgid "Contribution Register"
-msgstr "Registro de contribución"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "E-mail"
-msgstr "Correo electrónico"
-
-#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: model:ir.actions.act_window,name:hr_payroll.hr_allounce_deduction_tree
-#: model:ir.ui.menu,name:hr_payroll.menu_hr_allounce_deduction_tree
-msgid "Salary Heads"
-msgstr "Cabeceras salario"
-
-#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
-msgid "Print Report"
-msgstr "Imprimir informe"
-
-#. module: hr_payroll
-#: field:company.contribution,line_ids:0
-#: view:hr.payroll.structure:0
-#: view:hr.payslip:0
-#: view:hr.payslip.line:0
-#: field:hr.payslip.line,line_ids:0
-msgid "Calculations"
-msgstr "Cálculos"
-
-#. module: hr_payroll
-#: help:company.contribution,contribute_per:0
-msgid ""
-"Define Company contribution ratio 1.00=100% contribution, If Employee "
-"Contribute 5% then company will and here 0.50 defined then company will "
-"contribute 50% on employee 5% contribution"
msgstr ""
-"Define el ratio de contribución de la compañía 1,00=100% de la contribución. "
-"Si el empleado contribuye con el 5%, entonces si aquí la compañía tiene un "
-"ratio de 0.50, la compañía contribuirá con el 50% del 5% de la contribución "
-"del empleado."
#. module: hr_payroll
-#: view:hr.payslip:0
-msgid "Other Informations"
-msgstr "Otra información"
+#: field:hr.contribution.register,register_line_ids:0
+msgid "Register Line"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
-msgid "Month"
-msgstr "Mes"
+#: view:hr.payslip:0 view:hr.payslip.employees:0
+#: view:payslip.lines.contribution.register:0
+msgid "Cancel"
+msgstr ""
#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Issue"
-msgstr "Incidencia"
+#: view:hr.payslip.run:0 selection:hr.payslip.run,state:0
+msgid "Close"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-msgid "Dynamic Computation"
-msgstr "Cálculo Dinámico"
+#: help:hr.payslip,struct_id:0
+msgid ""
+"Defines the rules that have to be applied to this payslip, accordingly to "
+"the contract chosen. If you let empty the field contract, this field isn't "
+"mandatory anymore and thus the rules applied will be all the rules set on "
+"the structure of all contracts of the employee valid for the chosen period"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Basic Salary without Leave:"
-msgstr "Salario base sin ausencias:"
+#: field:hr.payroll.structure,children_ids:0
+#: field:hr.salary.rule.category,children_ids:0
+msgid "Children"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip,credit_note:0
+msgid "Indicates this payslip has a refund of another"
+msgstr ""
+
+#. module: hr_payroll
+#: selection:hr.contract,schedule_pay:0
+msgid "Bi-monthly"
+msgstr ""
+
+#. module: hr_payroll
+#: report:paylip.details:0
+msgid "Pay Slip Details"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form
+#: model:ir.ui.menu,name:hr_payroll.menu_department_tree
+msgid "Employee Payslips"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.line:0 field:hr.payslip.line,register_id:0
+#: field:hr.salary.rule,register_id:0
+#: model:ir.model,name:hr_payroll.model_hr_contribution_register
+msgid "Contribution Register"
+msgstr ""
+
+#. module: hr_payroll
+#: view:payslip.lines.contribution.register:0
+msgid "Print"
+msgstr ""
+
+#. module: hr_payroll
+#: model:ir.actions.act_window,help:hr_payroll.action_contribution_register_form
+msgid ""
+"A contribution register is a third party involved in the salary payment of "
+"the employees. It can be the social security, the estate or anyone that "
+"collect or inject money on payslips."
+msgstr ""
+
+#. module: hr_payroll
+#: code:addons/hr_payroll/hr_payroll.py:889
+#, python-format
+msgid "Wrong range condition defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: view:hr.payroll.structure:0
-#: view:hr.payslip:0
#: view:hr.payslip.line:0
-#: field:hr.payslip.line,function_id:0
-msgid "Function"
-msgstr "Función"
+msgid "Calculations"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "States"
-msgstr "Estados"
+msgid "Worked Days"
+msgstr ""
#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Apreciado Sr./Sra.,"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_allounce_deduction_categoty
-msgid "Allowance Deduction Heads"
-msgstr "Cabeceras prima/deducción"
-
-#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Gross Sal."
-msgstr "Sal. bruto"
-
-#. module: hr_payroll
-#: view:company.contribution:0
-#: field:company.contribution,note:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,note:0
-#: view:hr.contibution.register:0
-#: field:hr.contibution.register,note:0
-#: view:hr.passport:0
-#: field:hr.passport,note:0
-#: field:hr.payroll.advice,note:0
-#: field:hr.payroll.register,note:0
-#: view:hr.payroll.structure:0
-#: field:hr.payroll.structure,note:0
#: view:hr.payslip:0
-#: field:hr.payslip,note:0
-#: view:hr.payslip.line:0
-#: field:hr.payslip.line,note:0
+msgid "Search Payslips"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.run:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_run_tree
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_payslip_run
+msgid "Payslips Batches"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.contribution.register:0 field:hr.contribution.register,note:0
+#: field:hr.payroll.structure,note:0 field:hr.payslip,name:0
+#: field:hr.payslip,note:0 field:hr.payslip.input,name:0
+#: view:hr.payslip.line:0 field:hr.payslip.line,note:0
+#: field:hr.payslip.worked_days,name:0 field:hr.rule.input,name:0
+#: view:hr.salary.rule:0 field:hr.salary.rule,note:0
+#: field:hr.salary.rule.category,note:0
msgid "Description"
-msgstr "Descripción"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payroll.employees.detail,date_from:0
-#: field:hr.payroll.year.salary,date_from:0
-#: report:salary.structure:0
-msgid "Start Date"
-msgstr "Fecha inicio"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Deduction -"
-msgstr "Deducción -"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
+#: report:paylip.details:0 report:payslip:0
msgid ")"
-msgstr ")"
+msgstr ""
#. module: hr_payroll
-#: view:hr.contibution.register:0
+#: view:hr.contribution.register:0
+#: model:ir.actions.act_window,name:hr_payroll.action_contribution_register_form
+#: model:ir.ui.menu,name:hr_payroll.menu_action_hr_contribution_register_form
msgid "Contribution Registers"
-msgstr "Registros de contribución"
+msgstr ""
#. module: hr_payroll
#: model:ir.ui.menu,name:hr_payroll.menu_hr_payroll_reporting
#: model:ir.ui.menu,name:hr_payroll.menu_hr_root_payroll
#: model:ir.ui.menu,name:hr_payroll.payroll_configure
msgid "Payroll"
-msgstr "Nómina"
+msgstr ""
#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_contract_wage_type
-msgid "Wage Type"
-msgstr "Tipo de salario"
+#: model:ir.actions.report.xml,name:hr_payroll.contribution_register
+msgid "PaySlip Lines By Conribution Register"
+msgstr ""
#. module: hr_payroll
-#: report:hr.payroll.register.sheet:0
-msgid "Net Sal."
-msgstr "Sal. neto"
-
-#. module: hr_payroll
-#: sql_constraint:hr.passport:0
-msgid "The Passport No must be unique !"
-msgstr "¡El número de pasaporte debe ser único!"
-
-#. module: hr_payroll
-#: field:hr.allounce.deduction.categoty,name:0
-msgid "Category Name"
-msgstr "Nombre categoría"
-
-#. module: hr_payroll
-#: model:ir.model,name:hr_payroll.model_hr_payroll_year_salary
-msgid "hr.payroll.year.salary"
-msgstr "hr.nómina.año.salario"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.passport,address_id:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
-msgid "Address"
-msgstr "Dirección"
-
-#. module: hr_payroll
-#: field:hr.payslip.line.line,slipline_id:0
-msgid "Slip Line"
-msgstr "Línea justificante"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Number of Leaves"
-msgstr "Número de hojas"
-
-#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.payroll.advice,bank_id:0
-#: field:hr.payroll.register,bank_id:0
-#: report:salary.structure:0
-msgid "Bank"
-msgstr "Banco"
-
-#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Cancel Sheet"
-msgstr "Cancelar hoja"
-
-#. module: hr_payroll
-#: selection:hr.allounce.deduction.categoty,type:0
-#: selection:hr.payslip.line,type:0
-msgid "Advance"
-msgstr "Adelanto"
-
-#. module: hr_payroll
-#: report:salary.structure:0
-msgid "Special Allowances and Deductions For Employee:"
-msgstr "Primas y deducciones especiales por empleado:"
-
-#. module: hr_payroll
-#: field:company.contribution,name:0
-#: field:company.contribution.line,name:0
-#: field:hr.contibution.register,name:0
-#: field:hr.contibution.register.line,name:0
-#: field:hr.payroll.advice,name:0
-#: field:hr.payroll.register,name:0
-#: field:hr.payroll.structure,name:0
-#: field:hr.payslip,name:0
-#: field:hr.payslip.line,name:0
-#: field:hr.payslip.line.line,name:0
-#: report:payslip.pdf:0
-#: report:salary.structure:0
-#: report:year.salary:0
-msgid "Name"
-msgstr "Nombre"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Leaved Deduction"
-msgstr "Hojas de deducción"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-msgid "Country"
-msgstr "País"
-
-#. module: hr_payroll
-#: view:hr.passport:0
-#: view:hr.payroll.employees.detail:0
-#: field:hr.payroll.employees.detail,employee_ids:0
-#: view:hr.payroll.year.salary:0
-#: field:hr.payroll.year.salary,employee_ids:0
-#: view:hr.payslip:0
-msgid "Employees"
-msgstr "Empleados"
-
-#. module: hr_payroll
-#: report:payroll.advice:0
-msgid "Bank Account"
-msgstr "Cuenta bancaria"
-
-#. module: hr_payroll
-#: help:company.contribution,register_id:0
-msgid "Contribution register based on company"
-msgstr "Registro de contribución basado en la empresa"
-
-#. module: hr_payroll
-#: help:hr.allounce.deduction.categoty,sequence:0
-msgid "Use to arrange calculation sequence"
-msgstr "Se utiliza para organizar la secuencia de cálculo"
-
-#. module: hr_payroll
-#: field:hr.payslip,total_pay:0
-msgid "Total Payment"
-msgstr "Pago total"
-
-#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Leave Deductions Line:"
-msgstr "Línea de deducciones por ausencias:"
-
-#. module: hr_payroll
-#: selection:hr.payroll.register,state:0
#: selection:hr.payslip,state:0
-msgid "Wating for Account Verification"
-msgstr "Esperando por verificación de la cuenta"
+msgid "Waiting"
+msgstr ""
#. module: hr_payroll
-#: field:hr.contibution.register.line,comp_deduction:0
-msgid "Company Deduction"
-msgstr "Deducción de la Compañía"
+#: report:paylip.details:0 report:payslip:0
+msgid "Address"
+msgstr ""
#. module: hr_payroll
-#: view:hr.holidays.status:0
-msgid "Payroll Configurtion"
-msgstr "Configuración nómina"
-
-#. module: hr_payroll
-#: code:addons/hr_payroll/hr_payroll.py:469
+#: code:addons/hr_payroll/hr_payroll.py:866
#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr "Por favor, defina la cuenta bancaria para el empleado %s"
+msgid "Wrong percentage base or quantity defined for salary rule %s (%s)"
+msgstr ""
#. module: hr_payroll
-#: field:hr.passport,date_issue:0
-msgid "Passport Issue Date"
-msgstr "Fecha de emisión del pasaporte"
+#: field:hr.payslip,worked_days_line_ids:0
+#: model:ir.model,name:hr_payroll.model_hr_payslip_worked_days
+msgid "Payslip Worked Days"
+msgstr ""
#. module: hr_payroll
-#: view:hr.allounce.deduction.categoty:0
-#: selection:hr.allounce.deduction.categoty,type:0
-#: field:hr.payroll.register,allounce:0
-#: field:hr.payslip,allounce:0
-#: selection:hr.payslip.line,type:0
-msgid "Allowance"
-msgstr "Prima"
+#: view:hr.salary.rule.category:0
+msgid "Salary Categories"
+msgstr ""
#. module: hr_payroll
-#: field:hr.payslip,holiday_days:0
-msgid "No of Leaves"
-msgstr "N º de hojas"
+#: report:contribution.register.lines:0 field:hr.contribution.register,name:0
+#: field:hr.payroll.structure,name:0 field:hr.payslip.line,name:0
+#: field:hr.payslip.run,name:0 field:hr.salary.rule,name:0
+#: field:hr.salary.rule.category,name:0 report:paylip.details:0
+#: report:payslip:0
+msgid "Name"
+msgstr ""
#. module: hr_payroll
-#: field:hr.employee,otherid:0
-msgid "Other Id"
-msgstr "Otro id"
+#: view:hr.payroll.structure:0
+msgid "Payroll Structures"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Bank Details"
-msgstr "Detalles bancarios"
+#: view:hr.payslip:0 view:hr.payslip.employees:0
+#: field:hr.payslip.employees,employee_ids:0 view:hr.payslip.line:0
+msgid "Employees"
+msgstr ""
#. module: hr_payroll
-#: report:payslip.pdf:0
-msgid "Slip ID"
-msgstr "ID justificante"
+#: report:paylip.details:0 report:payslip:0
+msgid "Bank Account"
+msgstr ""
#. module: hr_payroll
-#: field:company.contribution.line,sequence:0
-#: field:hr.allounce.deduction.categoty,sequence:0
-#: field:hr.payslip.line,sequence:0
-#: field:hr.payslip.line.line,sequence:0
-msgid "Sequence"
-msgstr "Secuencia"
+#: help:hr.payslip.line,sequence:0 help:hr.salary.rule,sequence:0
+msgid "Use to arrange calculation sequence"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.act_window,name:hr_payroll.action_view_hr_payslip_form
-#: model:ir.ui.menu,name:hr_payroll.menu_department_tree
-msgid "Employee Payslip"
-msgstr "Nómina de los empleados"
+#: help:hr.payslip.line,condition_range:0
+#: help:hr.salary.rule,condition_range:0
+msgid ""
+"This will be used to compute the % fields values; in general it is on basic, "
+"but you can also use categories code fields in lowercase as a variable names "
+"(hra, ma, lta, etc.) and the variable basic."
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Content"
-msgstr "Contenido carta"
+#: selection:hr.contract,schedule_pay:0
+msgid "Annually"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.employees.detail:0
-#: view:hr.payroll.year.salary:0
-msgid "Year Salary"
-msgstr "Salario anual"
+#: field:hr.payslip,input_line_ids:0
+msgid "Payslip Inputs"
+msgstr ""
#. module: hr_payroll
-#: view:hr.payroll.register:0
-msgid "Allowance / Deduction"
-msgstr "Prima / Deducción"
+#: field:hr.payslip.line,salary_rule_id:0
+msgid "Rule"
+msgstr ""
#. module: hr_payroll
-#: model:ir.actions.report.xml,name:hr_payroll.payroll_advice
-msgid "Bank Payment Advice"
-msgstr "Aviso de pago del banco"
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_salary_rule_category_tree_view
+#: model:ir.ui.menu,name:hr_payroll.menu_hr_salary_rule_category_tree_view
+msgid "Salary Rule Categories Hierarchy"
+msgstr ""
+
+#. module: hr_payroll
+#: report:contribution.register.lines:0 field:hr.payslip.line,total:0
+#: report:paylip.details:0 report:payslip:0
+msgid "Total"
+msgstr ""
+
+#. module: hr_payroll
+#: help:hr.payslip.line,appears_on_payslip:0
+#: help:hr.salary.rule,appears_on_payslip:0
+msgid "Used for the display of rule on payslip"
+msgstr ""
+
+#. module: hr_payroll
+#: view:hr.payslip.line:0
+msgid "Search Payslip Lines"
+msgstr ""
#. module: hr_payroll
#: view:hr.payslip:0
-msgid "Search Payslips"
-msgstr "Buscar nóminas"
+msgid "Details By Salary Rule Category"
+msgstr ""
#. module: hr_payroll
-#: report:employees.salary:0
-#: field:hr.contibution.register.line,total:0
-#: report:year.salary:0
-msgid "Total"
-msgstr "Total"
+#: help:hr.payslip.input,code:0 help:hr.payslip.worked_days,code:0
+#: help:hr.rule.input,code:0
+msgid "The code that can be used in the salary rules"
+msgstr ""
#. module: hr_payroll
-#: view:company.contribution:0
-#: view:hr.allounce.deduction.categoty:0
-#: field:hr.allounce.deduction.categoty,contribute_ids:0
-msgid "Contributions"
-msgstr "Contribuciones"
+#: view:hr.payslip.run:0
+#: model:ir.actions.act_window,name:hr_payroll.action_hr_payslip_by_employees
+msgid "Generate Payslips"
+msgstr ""
-#~ msgid "Categoty Code"
-#~ msgstr "Código de categoría"
+#. module: hr_payroll
+#: selection:hr.contract,schedule_pay:0
+msgid "Bi-weekly"
+msgstr ""
-#~ msgid "Categoty Name"
-#~ msgstr "Nombre categoría"
+#. module: hr_payroll
+#: field:hr.employee,total_wage:0
+msgid "Total Basic Salary"
+msgstr ""
-#~ msgid "Invalid model name in the action definition."
-#~ msgstr "Nombre del modelo inválido en la definición de acción."
+#. module: hr_payroll
+#: selection:hr.payslip.line,condition_select:0
+#: selection:hr.salary.rule,condition_select:0
+msgid "Always True"
+msgstr ""
-#~ msgid "Analytic Account for Salary Analysis"
-#~ msgstr "Cuenta analítica para análisis de nóminas"
+#. module: hr_payroll
+#: report:contribution.register.lines:0
+msgid "PaySlip Name"
+msgstr ""
-#~ msgid "Employee No"
-#~ msgstr "Núm. trabajador"
-
-#~ msgid "Employee Payable Account"
-#~ msgstr "Cuenta a pagar del trabajador"
-
-#~ msgid "Account"
-#~ msgstr "Cuenta"
-
-#, python-format
-#~ msgid "Warning !"
-#~ msgstr "¡ Aviso !"
-
-#~ msgid "Payment From"
-#~ msgstr "Pago desde"
-
-#~ msgid "Keep empty to use the period of the validation(Payslip) date."
-#~ msgstr ""
-#~ "Deje en blanco para usar el período de la fecha de validación de la nómina"
-
-#~ msgid "Analytic Account"
-#~ msgstr "Cuenta analítica"
-
-#~ msgid "Force Period"
-#~ msgstr "Forzar período"
-
-#~ msgid "Accounting Information"
-#~ msgstr "Información contable"
-
-#, python-format
-#~ msgid "Integrity Error !"
-#~ msgstr "¡Error de integridad!"
-
-#~ msgid "Miscelleanous"
-#~ msgstr "Misceláneos"
-
-#~ msgid "Error! You can not create recursive analytic accounts."
-#~ msgstr "¡Error! No puede crear cuentas analíticas recursivas."
-
-#~ msgid "Account Lines"
-#~ msgstr "Movimientos"
-
-#~ msgid "Accounting Informations"
-#~ msgstr "Información contable"
-
-#~ msgid "Print"
-#~ msgstr "Imprimir"
-
-#~ msgid "Invalid XML for View Architecture!"
-#~ msgstr "¡XML inválido para la definición de la vista!"
-
-#~ msgid "Accounting Lines"
-#~ msgstr "Movimientos contables"
-
-#~ msgid "Bank Journal"
-#~ msgstr "Diario bancario"
-
-#~ msgid "Expense"
-#~ msgstr "Gastos"
-
-#~ msgid "Payment Entries"
-#~ msgstr "Asientos de pago"
-
-#~ msgid "Salary Account"
-#~ msgstr "Cuenta de nómina"
-
-#~ msgid "Employee Contract"
-#~ msgstr "Contrato de trabajador"
-
-#~ msgid ""
-#~ "The Object name must start with x_ and not contain any special character !"
-#~ msgstr ""
-#~ "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
-#~ "especial!"
-
-#~ msgid "General Account"
-#~ msgstr "Cuenta general"
-
-#~ msgid "Process"
-#~ msgstr "Proceso"
-
-#~ msgid "Employee Account"
-#~ msgstr "Cuenta trabajador"
-
-#~ msgid "General Information"
-#~ msgstr "Información general"
-
-#~ msgid "Accounting Details"
-#~ msgstr "Detalles de contabilidad"
-
-#~ msgid "Account Information"
-#~ msgstr "Información de la cuenta"
-
-#~ msgid "Generalities"
-#~ msgstr "Generalidades"
-
-#~ msgid "Contract Duration"
-#~ msgstr "Duración del contrato"
-
-#~ msgid "Notes"
-#~ msgstr "Notas"
-
-#~ msgid "Fiscal Year"
-#~ msgstr "Ejercicio fiscal"
+#. module: hr_payroll
+#: field:hr.payslip.line,condition_range:0
+#: field:hr.salary.rule,condition_range:0
+msgid "Range Based on"
+msgstr ""
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index 31959d7e9c7..ccfcae0d26e 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -26,6 +26,7 @@ from base_status.base_stage import base_stage
from datetime import datetime
from osv import fields, osv
from tools.translate import _
+from tools import html2plaintext
AVAILABLE_STATES = [
('draft', 'New'),
@@ -327,9 +328,10 @@ class hr_applicant(base_stage, osv.Model):
This override updates the document according to the email.
"""
if custom_values is None: custom_values = {}
+ desc = html2plaintext(msg.get('body')) if msg.get('body') else ''
custom_values.update({
'name': msg.get('subject') or _("No Subject"),
- 'description': msg.get('body'),
+ 'description': desc,
'email_from': msg.get('from'),
'email_cc': msg.get('cc'),
'user_id': False,
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 08e5f31a2d2..d48086f5663 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -208,7 +208,7 @@
-
+
diff --git a/addons/hr_timesheet_sheet/__openerp__.py b/addons/hr_timesheet_sheet/__openerp__.py
index 9aab412d425..fd025491588 100644
--- a/addons/hr_timesheet_sheet/__openerp__.py
+++ b/addons/hr_timesheet_sheet/__openerp__.py
@@ -65,5 +65,8 @@ The validation can be configured in the company:
'installable': True,
'auto_install': False,
'application': True,
+ 'js': ['static/src/js/timesheet.js',],
+ 'css': ['static/src/css/timesheet.css',],
+ 'qweb': ['static/src/xml/timesheet.xml',],
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index cd58f52f959..96cb15ddce1 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -27,80 +27,6 @@ from osv import fields, osv
from tools.translate import _
import netsvc
-class one2many_mod2(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
- if context is None:
- context = {}
-
- if values is None:
- values = {}
-
- # res6 = {id: date_current, ...}
- res6 = dict([(rec['id'], rec['date_current'])
- for rec in obj.read(cr, user, ids, ['date_current'], context=context)])
-
- dom = []
- for c, id in enumerate(ids):
- if id in res6:
- if c: # skip first
- dom.insert(0 ,'|')
- dom.append('&')
- dom.append('&')
- 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)
-
- 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_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):
- if context is None:
- context = {}
-
- context = context.copy()
- context['sheet_id'] = id
- return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, context=context)
-
-
-class one2many_mod(fields.one2many):
- def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
- if context is None:
- context = {}
-
- if values is None:
- values = {}
-
-
- res5 = obj.read(cr, user, ids, ['date_current'], context=context)
- res6 = {}
- for r in res5:
- res6[r['id']] = r['date_current']
-
- ids2 = []
- for id in ids:
- dom = []
- if id in res6:
- 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_read'):
- if r[self._fields_id]:
- res[r[self._fields_id][0]].append(r['id'])
-
- return res
-
class hr_timesheet_sheet(osv.osv):
_name = "hr_timesheet_sheet.sheet"
_inherit = "mail.thread"
@@ -111,8 +37,7 @@ class hr_timesheet_sheet(osv.osv):
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, ...},
+ {id: {'total_per_day': {day: timedelta, ...},
},
...
}
@@ -122,7 +47,6 @@ class hr_timesheet_sheet(osv.osv):
res = {}
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)
@@ -143,20 +67,7 @@ class hr_timesheet_sheet(osv.osv):
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}
+ res[sheet_id] = {'total_per_day': total_attendance}
return res
def _total_timesheet(self, cr, uid, ids, name, args, context=None):
@@ -210,24 +121,16 @@ class hr_timesheet_sheet(osv.osv):
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):
@@ -277,44 +180,6 @@ class hr_timesheet_sheet(osv.osv):
raise osv.except_osv(_('Warning!'), _('Please verify that the total difference of the sheet is lower than %.2f.') %(di,))
return True
- def date_today(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.today() <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- elif datetime.now() >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {'date_current': time.strftime('%Y-%m-%d')}, context=context)
- return True
-
- def date_previous(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {
- 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=-1)).strftime('%Y-%m-%d'),
- }, context=context)
- return True
-
- def date_next(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- else:
- self.write(cr, uid, [sheet.id], {
- 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=1)).strftime('%Y-%m-%d'),
- }, context=context)
- return True
-
- def button_dummy(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context)
- elif datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'):
- self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context)
- return True
-
def attendance_action_change(self, cr, uid, ids, context=None):
hr_employee = self.pool.get('hr.employee')
employee_ids = []
@@ -329,14 +194,13 @@ class hr_timesheet_sheet(osv.osv):
'user_id': fields.related('employee_id', 'user_id', type="many2one", relation="res.users", store=True, string="User", required=False, readonly=True),#fields.many2one('res.users', 'User', required=True, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}),
'date_from': fields.date('Date from', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}),
'date_to': fields.date('Date to', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}),
- 'date_current': fields.date('Current date', required=True, select=1),
- 'timesheet_ids' : one2many_mod('hr.analytic.timesheet', 'sheet_id',
- 'Timesheet lines', domain=[('date', '=', time.strftime('%Y-%m-%d'))],
+ 'timesheet_ids' : fields.one2many('hr.analytic.timesheet', 'sheet_id',
+ 'Timesheet lines',
readonly=True, states={
'draft': [('readonly', False)],
'new': [('readonly', False)]}
),
- 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances'),
+ 'attendances_ids' : fields.one2many('hr.attendance', 'sheet_id', 'Attendances'),
'state' : fields.selection([
('new', 'New'),
('draft','Open'),
@@ -346,9 +210,6 @@ 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, 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"),
@@ -386,7 +247,6 @@ class hr_timesheet_sheet(osv.osv):
_defaults = {
'date_from' : _default_date_from,
- 'date_current' : lambda *a: time.strftime('%Y-%m-%d'),
'date_to' : _default_date_to,
'state': 'new',
'employee_id': _default_employee,
@@ -406,16 +266,9 @@ class hr_timesheet_sheet(osv.osv):
return False
return True
- def _date_current_check(self, cr, uid, ids, context=None):
- for sheet in self.browse(cr, uid, ids, context=context):
- if sheet.date_current < sheet.date_from or sheet.date_current > sheet.date_to:
- return False
- return True
-
_constraints = [
(_sheet_date, 'You cannot have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.', ['date_from','date_to']),
- (_date_current_check, 'You must select a Current date which is in the timesheet dates !', ['date_current']),
]
def action_set_to_draft(self, cr, uid, ids, *args):
@@ -498,7 +351,7 @@ class hr_timesheet_line(osv.osv):
_columns = {
'sheet_id': fields.function(_sheet, string='Sheet',
- type='many2one', relation='hr_timesheet_sheet.sheet',
+ type='many2one', relation='hr_timesheet_sheet.sheet', ondelete="cascade",
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),
@@ -534,6 +387,10 @@ class hr_timesheet_line(osv.osv):
raise osv.except_osv(_('Error!'), _('You cannot modify an entry in a confirmed timesheet.'))
return True
+ def multi_on_change_account_id(self, cr, uid, ids, account_ids, context=None):
+ return dict([(el, self.on_change_account_id(cr, uid, ids, el)) for el in account_ids])
+
+
hr_timesheet_line()
class hr_attendance(osv.osv):
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
index 42497eb537e..4e0e1becbe9 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_demo.xml
@@ -6,7 +6,6 @@
Sheet 1
-
-->
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 9a7416464af..7dd2b9a1b88 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -71,20 +71,13 @@
+
+
+
+
-
-
- :
-
-
-
-
-
-
-
-
-
+
@@ -101,9 +94,9 @@
-
+
-
+
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index 3db7ff8feb2..497fe8da117 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -46,7 +46,6 @@ class timesheet_report(osv.osv):
'department_id':fields.many2one('hr.department','Department',readonly=True),
'date_from': fields.date('Date from',readonly=True,),
'date_to': fields.date('Date to',readonly=True),
- 'date_current': fields.date('Current date', required=True),
'state' : fields.selection([
('new', 'New'),
('draft','Draft'),
@@ -62,13 +61,9 @@ class timesheet_report(osv.osv):
create or replace view timesheet_report as (
select
min(aal.id) as id,
- htss.date_current,
htss.name,
htss.date_from,
htss.date_to,
- to_char(htss.date_current,'YYYY') as year,
- to_char(htss.date_current,'MM') as month,
- to_char(htss.date_current, 'YYYY-MM-DD') as day,
count(*) as nbr,
aal.unit_amount as quantity,
aal.amount as cost,
@@ -77,18 +72,15 @@ class timesheet_report(osv.osv):
(SELECT sum(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=htss.id) as total_diff,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_diff,
(SELECT sum(day.total_timesheet)
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=htss.id) as total_timesheet,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_timesheet,
(SELECT sum(day.total_attendance)
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=htss.id) as total_attendance,
+ ON (sheet.id = day.sheet_id) where sheet.id=htss.id) as total_attendance,
aal.to_invoice,
aal.general_account_id,
htss.user_id,
@@ -99,15 +91,11 @@ class timesheet_report(osv.osv):
left join hr_analytic_timesheet as hat ON (hat.line_id=aal.id)
left join hr_timesheet_sheet_sheet as htss ON (hat.line_id=htss.id)
group by
- to_char(htss.date_current,'YYYY'),
- to_char(htss.date_current,'MM'),
- to_char(htss.date_current, 'YYYY-MM-DD'),
aal.account_id,
htss.date_from,
htss.date_to,
aal.unit_amount,
aal.amount,
- htss.date_current,
aal.to_invoice,
aal.product_id,
aal.general_account_id,
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
index 7b31f72235b..711bbaf2a35 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
+++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml
@@ -17,7 +17,6 @@
timesheet.report
-
@@ -56,7 +55,6 @@
-
diff --git a/addons/hr_timesheet_sheet/static/src/css/timesheet.css b/addons/hr_timesheet_sheet/static/src/css/timesheet.css
new file mode 100644
index 00000000000..b486f76694d
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/css/timesheet.css
@@ -0,0 +1,79 @@
+
+.openerp .oe_timesheet_weekly {
+ overflow-x: auto;
+}
+
+.openerp .oe_timesheet_weekly table {
+ width: 100%;
+}
+
+.openerp .oe_timesheet_weekly td {
+ padding-top: 15px;
+}
+
+.openerp .oe_timesheet_weekly th {
+ text-align: right;
+ color: #069;
+ font-family: 'Helvetica Neue', Arial, Verdana, 'Nimbus Sans L', sans-serif;
+ font-size: 10px;
+}
+
+.openerp .oe_timesheet_weekly th.oe_timesheet_weekly_date_head {
+ width: 60px;
+}
+
+.openerp .oe_timesheet_weekly td {
+ text-align: right;
+ vertical-align: middle;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_account {
+ text-align: left;
+ padding-right: 30px;
+}
+
+.openerp .oe_timesheet_weekly td input.oe_timesheet_weekly_input {
+ border: 1px solid #CCC;
+ padding: 5px 2px !important;
+ color: #666 !important;
+ font-size: 14px;
+ font-weight: bold;
+ width: 38px;
+ text-align: right;
+ min-width: 0 !important;
+}
+
+.openerp .oe_timesheet_weekly td .oe_timesheet_weekly_box {
+ padding: 5px 2px !important;
+ color: #666 !important;
+ font-size: 14px;
+ font-weight: bold;
+ width: 38px;
+ display: inline-block;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding_tot {
+ display: table;
+ width: 100%;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_adding {
+ display: table-cell;
+ text-align: left;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_tottot {
+ display: table-cell;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row td {
+ text-align: left;
+}
+
+.openerp .oe_timesheet_weekly .oe_timesheet_weekly_add_row .oe_form_field_many2one {
+ display: inline-block;
+ width: 200px;
+}
+
+.openerp .oe_timesheet_weekly_today {
+}
diff --git a/addons/hr_timesheet_sheet/static/src/js/timesheet.js b/addons/hr_timesheet_sheet/static/src/js/timesheet.js
new file mode 100644
index 00000000000..1be965fd63d
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/js/timesheet.js
@@ -0,0 +1,299 @@
+
+openerp.hr_timesheet_sheet = function(instance) {
+ var QWeb = instance.web.qweb;
+ var _t = instance.web._t;
+
+ instance.hr_timesheet_sheet.WeeklyTimesheet = instance.web.form.FormWidget.extend(instance.web.form.ReinitializeWidgetMixin, {
+ init: function() {
+ this._super.apply(this, arguments);
+ this.set({
+ sheets: [],
+ date_to: false,
+ date_from: false,
+ });
+ this.field_manager.on("field_changed:timesheet_ids", this, this.query_sheets);
+ this.field_manager.on("field_changed:date_from", this, function() {
+ this.set({"date_from": instance.web.str_to_date(this.field_manager.get_field_value("date_from"))});
+ });
+ this.field_manager.on("field_changed:date_to", this, function() {
+ this.set({"date_to": instance.web.str_to_date(this.field_manager.get_field_value("date_to"))});
+ });
+ this.field_manager.on("field_changed:user_id", this, function() {
+ this.set({"user_id": this.field_manager.get_field_value("user_id")});
+ });
+ this.on("change:sheets", this, this.update_sheets);
+ this.res_o2m_drop = new instance.web.DropMisordered();
+ this.render_drop = new instance.web.DropMisordered();
+ this.description_line = _t("/");
+ },
+ query_sheets: function() {
+ var self = this;
+ if (self.updating)
+ return;
+ var commands = this.field_manager.get_field_value("timesheet_ids");
+ this.res_o2m_drop.add(new instance.web.Model(this.view.model).call("resolve_2many_commands", ["timesheet_ids", commands, [],
+ new instance.web.CompoundContext()]))
+ .then(function(result) {
+ self.querying = true;
+ self.set({sheets: result});
+ self.querying = false;
+ });
+ },
+ update_sheets: function() {
+ var self = this;
+ if (self.querying)
+ return;
+ self.updating = true;
+ self.field_manager.set_values({timesheet_ids: self.get("sheets")}).then(function() {
+ self.updating = false;
+ });
+ },
+ initialize_field: function() {
+ instance.web.form.ReinitializeWidgetMixin.initialize_field.call(this);
+ var self = this;
+ self.on("change:sheets", self, self.initialize_content);
+ self.on("change:date_to", self, self.initialize_content);
+ self.on("change:date_from", self, self.initialize_content);
+ self.on("change:user_id", self, self.initialize_content);
+ },
+ initialize_content: function() {
+ var self = this;
+ if (self.setting)
+ return;
+ // don't render anything until we have date_to and date_from
+ if (!self.get("date_to") || !self.get("date_from"))
+ return;
+ this.destroy_content();
+
+ // it's important to use those vars to avoid race conditions
+ var dates;
+ var accounts;
+ var account_names;
+ var default_get;
+ return this.render_drop.add(new instance.web.Model("hr.analytic.timesheet").call("default_get", [
+ ['account_id','general_account_id', 'journal_id','date','name','user_id','product_id','product_uom_id','to_invoice','amount','unit_amount'],
+ new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(result) {
+ default_get = result;
+ // calculating dates
+ dates = [];
+ var start = self.get("date_from");
+ var end = self.get("date_to");
+ while (start <= end) {
+ dates.push(start);
+ start = start.clone().addDays(1);
+ }
+ // group by account
+ accounts = _(self.get("sheets")).chain()
+ .map(function(el) {
+ // much simpler to use only the id in all cases
+ if (typeof(el.account_id) === "object")
+ el.account_id = el.account_id[0];
+ return el;
+ })
+ .groupBy("account_id").value();
+
+ var account_ids = _.map(_.keys(accounts), function(el) { return el === "false" ? false : Number(el) });
+
+ return new instance.web.Model("hr.analytic.timesheet").call("multi_on_change_account_id", [[], account_ids,
+ new instance.web.CompoundContext({'user_id': self.get('user_id')})]).pipe(function(accounts_defaults) {
+ accounts = _(accounts).chain().map(function(lines, account_id) {
+ account_defaults = _.extend({}, default_get, accounts_defaults[account_id]);
+ // group by days
+ account_id = account_id === "false" ? false : Number(account_id);
+ var index = _.groupBy(lines, "date");
+ var days = _.map(dates, function(date) {
+ var day = {day: date, lines: index[instance.web.date_to_str(date)] || []};
+ // add line where we will insert/remove hours
+ var to_add = _.find(day.lines, function(line) { return line.name === self.description_line });
+ if (to_add) {
+ day.lines = _.without(day.lines, to_add);
+ day.lines.unshift(to_add);
+ } else {
+ day.lines.unshift(_.extend(_.clone(account_defaults), {
+ name: self.description_line,
+ unit_amount: 0,
+ date: instance.web.date_to_str(date),
+ account_id: account_id,
+ }));
+ }
+ return day;
+ });
+ return {account: account_id, days: days, account_defaults: account_defaults};
+ }).value();
+
+ // we need the name_get of the analytic accounts
+ return new instance.web.Model("account.analytic.account").call("name_get", [_.pluck(accounts, "account"),
+ new instance.web.CompoundContext()]).pipe(function(result) {
+ account_names = {};
+ _.each(result, function(el) {
+ account_names[el[0]] = el[1];
+ });
+ accounts = _.sortBy(accounts, function(el) {
+ return account_names[el.account];
+ });
+ });;
+ });
+ })).pipe(function(result) {
+ // we put all the gathered data in self, then we render
+ self.dates = dates;
+ self.accounts = accounts;
+ self.account_names = account_names;
+ self.default_get = default_get;
+ //real rendering
+ self.display_data();
+ });
+ },
+ destroy_content: function() {
+ if (this.dfm) {
+ this.dfm.destroy();
+ this.dfm = undefined;
+ }
+ },
+ display_data: function() {
+ var self = this;
+ self.$el.html(QWeb.render("hr_timesheet_sheet.WeeklyTimesheet", {widget: self}));
+ _.each(self.accounts, function(account) {
+ _.each(_.range(account.days.length), function(day_count) {
+ if (!self.get('effective_readonly')) {
+ self.get_box(account, day_count).val(self.sum_box(account, day_count)).change(function() {
+ var num = Number($(this).val());
+ if (isNaN(num)) {
+ $(this).val(self.sum_box(account, day_count));
+ } else {
+ account.days[day_count].lines[0].unit_amount += num - self.sum_box(account, day_count);
+ self.display_totals();
+ self.sync();
+ }
+ });
+ } else {
+ self.get_box(account, day_count).html(self.sum_box(account, day_count));
+ }
+ });
+ });
+ self.display_totals();
+ self.$(".oe_timesheet_weekly_adding button").click(_.bind(this.init_add_account, this));
+ },
+ init_add_account: function() {
+ var self = this;
+ if (self.dfm)
+ return;
+ self.$(".oe_timesheet_weekly_add_row").show();
+ self.dfm = new instance.web.form.DefaultFieldManager(self);
+ self.dfm.extend_field_desc({
+ account: {
+ relation: "account.analytic.account",
+ },
+ });
+ self.account_m2o = new instance.web.form.FieldMany2One(self.dfm, {
+ attrs: {
+ name: "account",
+ type: "many2one",
+ domain: [
+ ['type','in',['normal', 'contract']],
+ ['state', '<>', 'close'],
+ ['use_timesheets','=',1],
+ ['id', 'not in', _.pluck(self.accounts, "account")],
+ ],
+ modifiers: '{"required": true}',
+ },
+ });
+ self.account_m2o.prependTo(self.$(".oe_timesheet_weekly_add_row td"));
+ self.$(".oe_timesheet_weekly_add_row button").click(function() {
+ var id = self.account_m2o.get_value();
+ if (id === false) {
+ self.dfm.set({display_invalid_fields: true});
+ return;
+ }
+ var ops = self.generate_o2m_value();
+ new instance.web.Model("hr.analytic.timesheet").call("on_change_account_id", [[], id]).pipe(function(res) {
+ var def = _.extend({}, self.default_get, res.value, {
+ name: self.description_line,
+ unit_amount: 0,
+ date: instance.web.date_to_str(self.dates[0]),
+ account_id: id,
+ });
+ ops.push(def);
+ self.set({"sheets": ops});
+ });
+ });
+ },
+ get_box: function(account, day_count) {
+ return this.$('[data-account="' + account.account + '"][data-day-count="' + day_count + '"]');
+ },
+ get_total: function(account) {
+ return this.$('[data-account-total="' + account.account + '"]');
+ },
+ get_day_total: function(day_count) {
+ return this.$('[data-day-total="' + day_count + '"]');
+ },
+ get_super_total: function() {
+ return this.$('.oe_timesheet_weekly_supertotal');
+ },
+ sum_box: function(account, day_count) {
+ var line_total = 0;
+ _.each(account.days[day_count].lines, function(line) {
+ line_total += line.unit_amount;
+ });
+ return line_total;
+ },
+ display_totals: function() {
+ var self = this;
+ var day_tots = _.map(_.range(self.dates.length), function() { return 0 });
+ var super_tot = 0;
+ _.each(self.accounts, function(account) {
+ var acc_tot = 0;
+ _.each(_.range(self.dates.length), function(day_count) {
+ var sum = self.sum_box(account, day_count);
+ acc_tot += sum;
+ day_tots[day_count] += sum;
+ super_tot += sum;
+ });
+ self.get_total(account).html(acc_tot);
+ });
+ _.each(_.range(self.dates.length), function(day_count) {
+ self.get_day_total(day_count).html(day_tots[day_count]);
+ });
+ self.get_super_total().html(super_tot);
+ },
+ sync: function() {
+ var self = this;
+ self.setting = true;
+ self.set({sheets: this.generate_o2m_value()});
+ self.setting = false;
+ },
+ generate_o2m_value: function() {
+ var self = this;
+ var ops = [];
+
+ _.each(self.accounts, function(account) {
+ var auth_keys = _.extend(_.clone(account.account_defaults), {
+ name: true, unit_amount: true, date: true, account_id:true,
+ });
+ _.each(account.days, function(day) {
+ _.each(day.lines, function(line) {
+ if (line.unit_amount !== 0) {
+ var tmp = _.clone(line);
+ tmp.id = undefined;
+ _.each(line, function(v, k) {
+ if (v instanceof Array) {
+ tmp[k] = v[0];
+ }
+ });
+ // we have to remove some keys, because analytic lines are shitty
+ _.each(_.keys(tmp), function(key) {
+ if (auth_keys[key] === undefined) {
+ tmp[key] = undefined;
+ }
+ });
+ ops.push(tmp);
+ }
+ });
+ });
+ });
+ return ops;
+ },
+ });
+
+ instance.web.form.custom_widgets.add('weekly_timesheet', 'instance.hr_timesheet_sheet.WeeklyTimesheet');
+
+};
diff --git a/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml
new file mode 100644
index 00000000000..0c4ad857d3b
--- /dev/null
+++ b/addons/hr_timesheet_sheet/static/src/xml/timesheet.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
index 070079a4b80..71776af61ba 100644
--- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
+++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml
@@ -16,7 +16,6 @@
I create a timesheet for employee "Quentin Paolinon".
-
!record {model: hr_timesheet_sheet.sheet, id: hr_timesheet_sheet_sheet_deddk0}:
- date_current: !eval time.strftime('%Y-%m-%d')
date_from: !eval time.strftime('%Y-%m-01')
name: Quentin Paolinon
state: new
@@ -34,30 +33,6 @@
-
!assert {model: hr.employee, id: hr.employee_qdp}:
- state == 'present'
--
- I want to check attendance and work of yesterday. I click on <- button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_prev = self.date_previous(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_prev == True, "I See Previous Date Timesheet"
--
- Then I click on "Today" button to fill today's timesheet.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_to = self.date_today(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_to == True, "I See Today Date Timesheet"
--
- I can also move to next day by clicking on -> button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- date_next = self.date_next(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert date_next == True, "I See Next Date Timesheet"
--
- I want to go to a particular date and see attendance then I select the date and click on "Go to:" button.
--
- !python {model: hr_timesheet_sheet.sheet}: |
- button_dumy = self.button_dummy(cr, uid, [ref('hr_timesheet_sheet_sheet_deddk0')], None)
- assert button_dumy == True, "I See Particular Date Attendance"
-
At the time of logout, I create attendance and perform "Sign Out".
-
diff --git a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
index a6974fc2ccf..3bd495036d5 100644
--- a/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
+++ b/addons/hr_timesheet_sheet/wizard/hr_timesheet_current.py
@@ -42,7 +42,6 @@ class hr_timesheet_current_open(osv.osv_memory):
view_type = 'tree,form'
domain = "[('id','in',["+','.join(map(str, ids))+"]),('user_id', '=', uid)]"
elif len(ids)==1:
- ts.write(cr, uid, ids, {'date_current': time.strftime('%Y-%m-%d')}, context=context)
domain = "[('user_id', '=', uid)]"
else:
domain = "[('user_id', '=', uid)]"
diff --git a/addons/l10n_in_hr_payroll/i18n/bn.po b/addons/l10n_in_hr_payroll/i18n/bn.po
index ea9fcfd7bb3..0fd88c3813e 100644
--- a/addons/l10n_in_hr_payroll/i18n/bn.po
+++ b/addons/l10n_in_hr_payroll/i18n/bn.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Bengali \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr ""
\ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/gu.po b/addons/l10n_in_hr_payroll/i18n/gu.po
index 2c321b13191..844c492e28b 100644
--- a/addons/l10n_in_hr_payroll/i18n/gu.po
+++ b/addons/l10n_in_hr_payroll/i18n/gu.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Gujarati \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr ""
\ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/hi.po b/addons/l10n_in_hr_payroll/i18n/hi.po
index d7cc9dc1519..b13e24e05f9 100644
--- a/addons/l10n_in_hr_payroll/i18n/hi.po
+++ b/addons/l10n_in_hr_payroll/i18n/hi.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Hindi \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr ""
\ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/ta.po b/addons/l10n_in_hr_payroll/i18n/ta.po
index 98d00c76a33..dbe0e244bee 100644
--- a/addons/l10n_in_hr_payroll/i18n/ta.po
+++ b/addons/l10n_in_hr_payroll/i18n/ta.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Tamil \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr ""
\ No newline at end of file
diff --git a/addons/l10n_in_hr_payroll/i18n/te.po b/addons/l10n_in_hr_payroll/i18n/te.po
index 0c6f6127c4d..47ea35552f8 100644
--- a/addons/l10n_in_hr_payroll/i18n/te.po
+++ b/addons/l10n_in_hr_payroll/i18n/te.po
@@ -6,928 +6,14 @@ msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0alpha\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-08-17 06:46+0000\n"
-"PO-Revision-Date: 2012-08-17 06:46+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2012-09-10 09:14+0000\n"
+"PO-Revision-Date: 2012-10-10 12:31+0000\n"
+"Last-Translator: Fabien (Open ERP) \n"
"Language-Team: Telugu \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2012-10-11 05:00+0000\n"
+"X-Generator: Launchpad (build 16118)\n"
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "E-mail Address"
-msgstr ""
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,employee_bank_no:0
-msgid "Employee Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in draft state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Title"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Payment Advice from"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_yearly_salary_detail
-msgid "Hr Salary Employee By Category Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employees Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Allowances with Basic:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Department"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Deductions:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "A/C no."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,driver_salay:0
-msgid "Driver Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_yearly_salary_detail
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.yearly_salary
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_yearly_salary_detail
-msgid "Yearly Salary by Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.act_hr_emp_payslip_list
-msgid "Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "March"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "("
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,company_id:0
-#: field:hr.payroll.advice.line,company_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,company_id:0
-msgid "Company"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "The Manager"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Letter Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ","
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Set to Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,number_of_year:0
-msgid "Total years of work experience"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "to"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Total :"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payslip.run,available_advice:0
-msgid "Made Payment Advice?"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Advices which are paid using NEFT transfer"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,tds:0
-msgid "Amount for Tax Deduction at Source"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip
-msgid "Pay Slip"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,day:0
-msgid "Day"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Month of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.payslip:0
-msgid "Payslip 'Date From' must be before 'Date To'."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,batch_id:0
-msgid "Batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Other Information"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Cancelled"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "For"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Details by Salary Rule Category:"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,voluntary_provident_fund:0
-msgid "VPF computed as percentage(%)"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,number:0
-#: report:paylip.details.in:0
-msgid "Reference"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Group By..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,medical_insurance:0
-msgid "Medical Insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Identification No"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.payroll.advice,state:0
-#: selection:payment.advice.report,state:0
-msgid "Confirmed"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,bysal:0
-#: field:payment.advice.report,bysal:0
-#: report:payroll.advice:0
-msgid "By Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Confirm"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,chaque_nos:0
-#: field:payment.advice.report,cheque_nos:0
-msgid "Cheque Numbers"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:res.company:0
-msgid "Error! You can not create recursive companies."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_salary_employee_month
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.hr_salary_employee_bymonth
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_salary_employee_month
-msgid "Yearly Salary by Head"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#, python-format
-msgid "You can not confirm Payment advice without advice lines."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,state:0
-#: field:payment.advice.report,state:0
-msgid "State"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Yours Sincerely"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,medical_insurance:0
-msgid "Deduction towards company provided medical insurance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice_line
-msgid "Bank Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Email"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payslip.run,available_advice:0
-msgid "If this box is checked which means that Payment Advice exists for current batch"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:184
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Error !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Print"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payslip_run
-msgid "Payslip Batches"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,debit_credit:0
-#: report:payroll.advice:0
-msgid "C/D"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.employee.bymonth:0
-msgid "Yearly Salary Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payroll_advice
-msgid "Print Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,line_ids:0
-msgid "Employee Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "July"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Configuration"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_view_hr_bank_advice_tree
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.hr_menu_payment_advice
-msgid "Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,name:l10n_in_hr_payroll.action_payment_advice_report_all
-#: model:ir.ui.menu,name:l10n_in_hr_payroll.menu_reporting_payment_advice
-#: view:payment.advice.report:0
-msgid "Advices Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "This wizard will print report which displays employees break-up of Net Head for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc:0
-msgid "IFSC"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,tds:0
-msgid "TDS"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,join_date:0
-msgid "Join Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.contract:0
-msgid "Error! Contract start-date must be less than contract end-date."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:res.company,dearness_allowance:0
-msgid "Dearness Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "August"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Deduction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Search Payment advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "SI. No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Payment Advices which are in confirm state"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "December"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Confirm Sheet"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,month:0
-msgid "Month"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Non Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "or"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_salary_employee_month
-msgid "Hr Salary Employee By Month Report"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,category_id:0
-msgid "Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:240
-#, python-format
-msgid "Payment advice already exists for %s, 'Set to Draft' to create a new advice."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "To Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.employee,number_of_year:0
-msgid "No. of Years of Service"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Note"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Salary Rule Category"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: selection:hr.payroll.advice,state:0
-#: view:payment.advice.report:0
-#: selection:payment.advice.report,state:0
-msgid "Draft"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Date From"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,voluntary_provident_fund:0
-msgid "Voluntary Provident Fund"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Employee Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_payment_advice_report
-msgid "Payment Advice Analysis"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:payment.advice.report:0
-msgid "Status"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.contract,city_type:0
-msgid "Type of City"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:res.company,dearness_allowance:0
-msgid "Check this box if your company provide Dearness Allowance to employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,ifsc_code:0
-#: field:payment.advice.report,ifsc_code:0
-#: report:payroll.advice:0
-msgid "IFSC Code"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "June"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,nbr:0
-msgid "# Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.report.xml,name:l10n_in_hr_payroll.payslip_details_report
-msgid "PaySlip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Payment Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,date:0
-#: field:payment.advice.report,date:0
-msgid "Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "November"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Extended Filters..."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.actions.act_window,help:l10n_in_hr_payroll.action_payment_advice_report_all
-msgid "This report performs analysis on Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "October"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Designation"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "January"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "Pay Head Employee Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_res_company
-msgid "Companies"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:payroll.advice:0
-msgid "Authorized Signature"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_contract
-msgid "Contract"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice.line:0
-msgid "Advice Lines"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "To,"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.contract,driver_salay:0
-msgid "Check this box if you provide allowance for driver"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice.line,advice_id:0
-#: field:hr.payslip,advice_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_payroll_advice
-msgid "Bank Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Other No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Draft Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,neft:0
-msgid "Check this box if your company use online transfer for salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "To"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:payment.advice.report,number:0
-msgid "Number"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "September"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: view:hr.salary.employee.month:0
-#: view:yearly.salary.detail:0
-msgid "Cancel"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Day of Payment Advices"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: constraint:hr.employee:0
-msgid "Error! You cannot create recursive hierarchy of Employee(s)."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:yearly.salary.detail:0
-msgid "This wizard will print report which display a pay head employee breakup for a specified dates."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Payslip Batches ready to be Adviced"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Pay Slip Details"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Total Salary"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,employee_id:0
-#: model:ir.model,name:l10n_in_hr_payroll.model_hr_employee
-#: view:payment.advice.report:0
-#: field:payment.advice.report,employee_id:0
-msgid "Employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-msgid "Compute Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.employee,join_date:0
-msgid "Joining date of employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Dear Sir/Madam,"
-msgstr "Dear Sir/Madam,"
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,note:0
-msgid "Description"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid ")"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:res.company:0
-msgid "Payroll"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "NEFT"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-msgid "Address"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,bank_id:0
-#: view:payment.advice.report:0
-#: field:payment.advice.report,bank_id:0
-#: report:payroll.advice:0
-#: report:salary.detail.byyear:0
-msgid "Bank"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,end_date:0
-#: field:yearly.salary.detail,date_to:0
-msgid "End Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "February"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: sql_constraint:res.company:0
-msgid "The company name must be unique !"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payroll.advice:0
-#: field:hr.payroll.advice,name:0
-#: report:paylip.details.in:0
-#: field:payment.advice.report,name:0
-#: report:salary.employee.bymonth:0
-msgid "Name"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:hr.contract,city_type:0
-msgid "Metro"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-#: field:hr.salary.employee.month,employee_ids:0
-#: view:yearly.salary.detail:0
-#: field:yearly.salary.detail,employee_ids:0
-msgid "Employees"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Bank Account"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "April"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "Name of the Employe"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:158
-#: code:addons/l10n_in_hr_payroll/l10n_in_hr_payroll.py:257
-#, python-format
-msgid "Please define bank account for the %s employee"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.salary.employee.month,start_date:0
-#: field:yearly.salary.detail,date_from:0
-msgid "Start Date"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.contract:0
-msgid "Allowance"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,bank_id:0
-msgid "Select the Bank from which the salary is going to be paid"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.salary.employee.month:0
-msgid "Employee Pay Head Breakup"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:salary.detail.byyear:0
-msgid "Phone No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-msgid "Credit"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice.line,name:0
-#: report:payroll.advice:0
-msgid "Bank Account No."
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: help:hr.payroll.advice,date:0
-msgid "Advice Date is used to search Payslips"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: selection:payment.advice.report,month:0
-msgid "May"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:hr.payslip.run:0
-msgid "Create Advice"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-#: field:payment.advice.report,year:0
-msgid "Year"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: field:hr.payroll.advice,neft:0
-#: field:payment.advice.report,neft:0
-msgid "NEFT Transaction"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:paylip.details.in:0
-#: report:salary.detail.byyear:0
-#: report:salary.employee.bymonth:0
-msgid "Total"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: report:payroll.advice:0
-msgid "form period"
-msgstr ""
-
-#. module: l10n_in_hr_payroll
-#: view:payment.advice.report:0
-msgid "Year of Payment Advices"
-msgstr ""
\ No newline at end of file
diff --git a/addons/l10n_uk/data/account.account.type.csv b/addons/l10n_uk/data/account.account.type.csv
index 0827975b22f..379656ece39 100644
--- a/addons/l10n_uk/data/account.account.type.csv
+++ b/addons/l10n_uk/data/account.account.type.csv
@@ -10,4 +10,4 @@
"account_type_output_tax","Output Tax","Output Tax","liability","Unreconciled"
"account_type_input_tax","Input Tax","Input Tax","asset","Unreconciled"
"account_type_profit_and_loss","Profit and Loss","Profit and Loss","none","None"
-"account_type_view","View","view",,"None"
+"account_type_view","View","view","none","None"
diff --git a/addons/mail/__init__.py b/addons/mail/__init__.py
index 92e882ae6d8..abf714ad534 100644
--- a/addons/mail/__init__.py
+++ b/addons/mail/__init__.py
@@ -33,6 +33,7 @@ import report
import wizard
import res_config
import mail_group_menu
+import update
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mail/data/mail_data.xml b/addons/mail/data/mail_data.xml
index 5fe1ee45b1d..522cbe8c7a7 100644
--- a/addons/mail/data/mail_data.xml
+++ b/addons/mail/data/mail_data.xml
@@ -13,6 +13,20 @@
+
+ Update Notification
+
+
+ 1
+ weeks
+ -1
+
+
+
+
+ 1000
+
+
diff --git a/addons/mail/data/mail_demo.xml b/addons/mail/data/mail_demo.xml
index 1350fd33547..7bda32c002b 100644
--- a/addons/mail/data/mail_demo.xml
+++ b/addons/mail/data/mail_demo.xml
@@ -42,10 +42,5 @@ This month you also get 250 EUR of eco-vouchers if you have been in the company
comment
-
- mail.catchall.domain
- demo.openerp.com
-
-
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index e9a569a8192..741184ef7a3 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -63,10 +63,12 @@ class mail_mail(osv.Model):
}
def _get_default_from(self, cr, uid, context=None):
- cur = self.pool.get('res.users').browse(cr, uid, uid, context=context)
- if not cur.alias_domain:
- raise osv.except_osv(_('Invalid Action!'), _('Unable to send email, set an alias domain in your server settings.'))
- return cur.alias_name + '@' + cur.alias_domain
+ this = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+ if this.alias_domain:
+ return '%s@%s' % (this.alias_name, this.alias_domain)
+ elif this.email:
+ return this.email
+ raise osv.except_osv(_('Invalid Action!'), _("Unable to send email, please configure the sender's email address or alias."))
_defaults = {
'state': 'outgoing',
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index bbf68509277..7e77b2f2e8c 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -180,7 +180,6 @@ class mail_message(osv.Model):
fields allow to have the foreign record name without having
to check external access rights).
"""
- child_nbr = len(msg.child_ids)
has_voted = False
vote_ids = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [user.id for user in msg.vote_user_ids], context=context)
for vote in vote_ids:
@@ -194,7 +193,7 @@ class mail_message(osv.Model):
try:
author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
is_author = uid == msg.author_id.user_ids[0].id
- except (orm.except_orm, osv.except_osv):
+ except Exception:
author_id = False
is_author = False
try:
@@ -502,9 +501,9 @@ class mail_message(osv.Model):
def create(self, cr, uid, values, context=None):
if not values.get('message_id') and values.get('res_id') and values.get('model'):
- values['message_id'] = tools.generate_tracking_message_id('%(model)s-%(res_id)s' % values)
+ values['message_id'] = tools.generate_tracking_message_id('%(res_id)s-%(model)s' % values)
newid = super(mail_message, self).create(cr, uid, values, context)
- self._notify(cr, 1, newid, context=context)
+ self._notify(cr, SUPERUSER_ID, newid, context=context)
return newid
def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index 9f53b4c08b1..e6150640eb3 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -39,63 +39,6 @@ _logger = logging.getLogger(__name__)
def decode_header(message, header, separator=' '):
return separator.join(map(decode, message.get_all(header, [])))
-class many2many_reference(fields.many2many):
- """ many2many_reference manages many2many fields where one id is found
- by a reference-like key (a char column in addition to the foreign id).
- The reference_column attribute on the many2many fields is used;
- if not defined, ``res_model`` is used. """
-
- def _get_query_and_where_params(self, cr, model, ids, values, where_params):
- """ Add in where condition like mail_followers.res_model = 'crm.lead' """
- reference_column = self.reference_column if self.reference_column else 'res_model'
- values.update(reference_column=reference_column, reference_value=model._name)
- query = 'SELECT %(rel)s.%(id2)s, %(rel)s.%(id1)s \
- FROM %(rel)s, %(from_c)s \
- WHERE %(rel)s.%(id1)s IN %%s \
- AND %(rel)s.%(id2)s = %(tbl)s.id \
- AND %(rel)s.%(reference_column)s = \'%(reference_value)s\' \
- %(where_c)s \
- %(order_by)s \
- %(limit)s \
- OFFSET %(offset)d' \
- % values
- return query, where_params
-
- def set(self, cr, model, id, name, values, user=None, context=None):
- """ Override to add the reference field in queries. """
- if not values: return
- rel, id1, id2 = self._sql_names(model)
- obj = model.pool.get(self._obj)
- # reference column name: given by attribute or res_model
- reference_column = self.reference_column if self.reference_column else 'res_model'
- for act in values:
- if not (isinstance(act, list) or isinstance(act, tuple)) or not act:
- continue
- if act[0] == 0:
- idnew = obj.create(cr, user, act[2], context=context)
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, idnew, model._name))
- elif act[0] == 3:
- cr.execute('DELETE FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND '+reference_column+'=%s', (id, act[1], model._name))
- elif act[0] == 4:
- # following queries are in the same transaction - so should be relatively safe
- cr.execute('SELECT 1 FROM '+rel+' WHERE '+id1+'=%s AND '+id2+'=%s AND '+reference_column+'=%s', (id, act[1], model._name))
- if not cr.fetchone():
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, act[1], model._name))
- elif act[0] == 5:
- cr.execute('delete from '+rel+' where '+id1+' = %s AND '+reference_column+'=%s', (id, model._name))
- elif act[0] == 6:
- d1, d2,tables = obj.pool.get('ir.rule').domain_get(cr, user, obj._name, context=context)
- if d1:
- d1 = ' and ' + ' and '.join(d1)
- else:
- d1 = ''
- cr.execute('DELETE FROM '+rel+' WHERE '+id1+'=%s AND '+reference_column+'=%s AND '+id2+' IN (SELECT '+rel+'.'+id2+' FROM '+rel+', '+','.join(tables)+' WHERE '+rel+'.'+id1+'=%s AND '+rel+'.'+id2+' = '+obj._table+'.id '+ d1 +')', [id, model._name, id]+d2)
- for act_nbr in act[2]:
- cr.execute('INSERT INTO '+rel+' ('+id1+','+id2+','+reference_column+') VALUES (%s,%s,%s)', (id, act_nbr, model._name))
- # cases 1, 2: performs write and unlink -> default implementation is ok
- else:
- return super(many2many_reference, self).set(cr, model, id, name, values, user, context)
-
class mail_thread(osv.AbstractModel):
''' mail_thread model is meant to be inherited by any model that needs to
@@ -186,6 +129,64 @@ class mail_thread(osv.AbstractModel):
res[notif.message_id.res_id] = True
return [('id', 'in', res.keys())]
+ def _get_followers(self, cr, uid, ids, name, arg, context=None):
+ fol_obj = self.pool.get('mail.followers')
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('res_id', 'in', ids)])
+ res = dict((res_id, []) for res_id in ids)
+ for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids):
+ res[fol.res_id].append(fol.partner_id.id)
+ return res
+
+ def _set_followers(self, cr, uid, id, name, value, arg, context=None):
+ if not value:
+ return
+ partner_obj = self.pool.get('res.partner')
+ fol_obj = self.pool.get('mail.followers')
+
+ # read the old set of followers, and determine the new set of followers
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('res_id', '=', id)])
+ old = set(fol.partner_id.id for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids))
+ new = set(old)
+
+ for command in value:
+ if isinstance(command, (int, long)):
+ new.add(command)
+ elif command[0] == 0:
+ new.add(partner_obj.create(cr, uid, command[2], context=context))
+ elif command[0] == 1:
+ partner_obj.write(cr, uid, [command[1]], command[2], context=context)
+ new.add(command[1])
+ elif command[0] == 2:
+ partner_obj.unlink(cr, uid, [command[1]], context=context)
+ new.discard(command[1])
+ elif command[0] == 3:
+ new.discard(command[1])
+ elif command[0] == 4:
+ new.add(command[1])
+ elif command[0] == 5:
+ new.clear()
+ elif command[0] == 6:
+ new = set(command[2])
+
+ # remove partners that are no longer followers
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID,
+ [('res_model', '=', self._name), ('res_id', '=', id), ('partner_id', 'not in', list(new))])
+ fol_obj.unlink(cr, SUPERUSER_ID, fol_ids)
+
+ # add new followers
+ for partner_id in new - old:
+ fol_obj.create(cr, SUPERUSER_ID, {'res_model': self._name, 'res_id': id, 'partner_id': partner_id})
+
+ def _search_followers(self, cr, uid, obj, name, args, context):
+ fol_obj = self.pool.get('mail.followers')
+ res = []
+ for field, operator, value in args:
+ assert field == name
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [('res_model', '=', self._name), ('partner_id', operator, value)])
+ res_ids = [fol.res_id for fol in fol_obj.browse(cr, SUPERUSER_ID, fol_ids)]
+ res.append(('id', 'in', res_ids))
+ return res
+
_columns = {
'message_is_follower': fields.function(_get_subscription_data,
type='boolean', string='Is a Follower', multi='_get_subscription_data,'),
@@ -194,9 +195,8 @@ class mail_thread(osv.AbstractModel):
help="Holds data about the subtypes. The content of this field "\
"is a structure holding the current model subtypes, and the "\
"current document followed subtypes."),
- 'message_follower_ids': many2many_reference('res.partner',
- 'mail_followers', 'res_id', 'partner_id',
- reference_column='res_model', string='Followers'),
+ 'message_follower_ids': fields.function(_get_followers, fnct_inv=_set_followers,
+ fnct_search=_search_followers, type='many2many', obj='res.partner', string='Followers'),
'message_comment_ids': fields.one2many('mail.message', 'res_id',
domain=lambda self: [('model', '=', self._name), ('type', 'in', ('comment', 'email'))],
string='Comments and emails',
@@ -422,12 +422,12 @@ class mail_thread(osv.AbstractModel):
model_pool = self.pool.get(model)
assert thread_id and hasattr(model_pool, 'message_update') or hasattr(model_pool, 'message_new'), \
"Undeliverable mail with Message-Id %s, model %s does not accept incoming emails" % \
- (msg['message-id'], model)
+ (msg['message_id'], model)
if thread_id and hasattr(model_pool, 'message_update'):
model_pool.message_update(cr, user_id, [thread_id], msg, context=context)
else:
thread_id = model_pool.message_new(cr, user_id, msg, custom_values, context=context)
- self.message_post(cr, uid, [thread_id], context=context, **msg)
+ model_pool.message_post(cr, uid, [thread_id], context=context, **msg)
return thread_id
def message_new(self, cr, uid, msg_dict, custom_values=None, context=None):
@@ -538,7 +538,7 @@ class mail_thread(osv.AbstractModel):
field may not be present if missing in original
message::
- { 'message-id': msg_id,
+ { 'message_id': msg_id,
'subject': subject,
'from': from,
'to': to,
diff --git a/addons/mail/res_config.py b/addons/mail/res_config.py
index ce2f75687ba..91606e1c720 100644
--- a/addons/mail/res_config.py
+++ b/addons/mail/res_config.py
@@ -19,6 +19,8 @@
#
##############################################################################
+import urlparse
+
from openerp.osv import osv, fields
class project_configuration(osv.TransientModel):
@@ -31,9 +33,16 @@ class project_configuration(osv.TransientModel):
}
def get_default_alias_domain(self, cr, uid, ids, context=None):
- return {'alias_domain': self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)}
+ alias_domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context)
+ if not alias_domain:
+ domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "web.base.url", context=context)
+ try:
+ alias_domain = urlparse.urlsplit(domain).netloc.split(':')[0]
+ except Exception:
+ pass
+ return {'alias_domain': alias_domain}
def set_alias_domain(self, cr, uid, ids, context=None):
config_parameters = self.pool.get("ir.config_parameter")
for record in self.browse(cr, uid, ids, context=context):
- config_parameters.set_param(cr, uid, "mail.catchall.domain", record.alias_domain or '', context=context)
\ No newline at end of file
+ config_parameters.set_param(cr, uid, "mail.catchall.domain", record.alias_domain or '', context=context)
diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py
index 545198f4c7f..f870604b03a 100644
--- a/addons/mail/res_users.py
+++ b/addons/mail/res_users.py
@@ -110,9 +110,19 @@ class res_users(osv.Model):
alias_pool.unlink(cr, uid, alias_ids, context=context)
return res
- def message_post(self, cr, uid, thread_id, **kwargs):
- partner_id = self.pool.get('res.users').browse(cr, uid, thread_id)[0].partner_id.id
- return self.pool.get('res.partner').message_post(cr, uid, partner_id, **kwargs)
+ def message_post(self, cr, uid, thread_id, context=None, **kwargs):
+ assert thread_id, "res.users does not support posting global messages"
+ if context and 'thread_model' in context:
+ context['thread_model'] = 'res.partner'
+ if isinstance(thread_id, (list, tuple)):
+ thread_id = thread_id[0]
+ partner_id = self.pool.get('res.users').browse(cr, uid, thread_id).partner_id.id
+ return self.pool.get('res.partner').message_post(cr, uid, partner_id, context=context, **kwargs)
+
+ def message_update(self, cr, uid, ids, msg_dict, update_vals=None, context=None):
+ partner_id = self.pool.get('res.users').browse(cr, uid, ids)[0].partner_id.id
+ return self.pool.get('res.partner').message_update(cr, uid, [partner_id], msg_dict,
+ update_vals=update_vals, context=context)
class res_users_mail_group(osv.Model):
""" Update of res.users class
diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml
index b503565bd11..be3bb667628 100644
--- a/addons/mail/security/mail_security.xml
+++ b/addons/mail/security/mail_security.xml
@@ -7,7 +7,7 @@
Mail.group: access only public and joined groups
- ['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.id]), '&', ('public','=','groups'), ('group_public_id','in', [x.id for x in user.groups_id])]
+ ['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.partner_id.id]), '&', ('public','=','groups'), ('group_public_id','in', [g.id for g in user.groups_id])]
diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py
index 653a05d40aa..83b10b39c28 100644
--- a/addons/portal/tests/test_portal.py
+++ b/addons/portal/tests/test_portal.py
@@ -33,6 +33,7 @@ class test_portal(test_mail.TestMailMockups):
self.mail_group = self.registry('mail.group')
self.mail_mail = self.registry('mail.mail')
self.mail_message = self.registry('mail.message')
+ self.mail_invite = self.registry('mail.wizard.invite')
self.res_users = self.registry('res.users')
self.res_partner = self.registry('res.partner')
@@ -41,19 +42,20 @@ class test_portal(test_mail.TestMailMockups):
{'name': 'Pigs', 'description': 'Fans of Pigs, unite !'})
# Find Portal group
- group_portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
- self.group_portal_id = group_portal_ref and group_portal_ref[1] or False
+ group_portal = self.registry('ir.model.data').get_object(cr, uid, 'portal', 'group_portal')
+ self.group_portal_id = group_portal.id
# Create Chell (portal user)
self.user_chell_id = self.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'groups_id': [(6, 0, [self.group_portal_id])]})
- self.user_chell = self.res_users.browse(cr, uid, self.user_chell_id)
- self.partner_chell_id = self.user_chell.partner_id.id
+ user_chell = self.res_users.browse(cr, uid, self.user_chell_id)
+ self.partner_chell_id = user_chell.partner_id.id
+
+ # Set an email address for the user running the tests, used as Sender for outgoing mails
+ self.res_users.write(cr, uid, uid, {'email': 'test@localhost'})
def test_00_access_rights(self):
""" Test basic mail_message and mail_group access rights for portal users. """
cr, uid = self.cr, self.uid
- partner_chell_id = self.partner_chell_id
- user_chell_id = self.user_chell_id
# Prepare group: Pigs (portal)
self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message')
@@ -64,56 +66,56 @@ class test_portal(test_mail.TestMailMockups):
# ----------------------------------------
# Do: Chell reads Pigs messages, ok because restricted to portal group
- message_ids = self.mail_group.read(cr, user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids']
- self.mail_message.read(cr, user_chell_id, message_ids)
+ message_ids = self.mail_group.read(cr, self.user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids']
+ self.mail_message.read(cr, self.user_chell_id, message_ids)
+
# Do: Chell posts a message on Pigs, crash because can not write on group or is not in the followers
- self.assertRaises(except_orm,
- self.mail_group.message_post,
- cr, user_chell_id, self.group_pigs_id, body='Message')
+ with self.assertRaises(except_orm):
+ self.mail_group.message_post(cr, self.user_chell_id, self.group_pigs_id, body='Message')
+
# Do: Chell is added to Pigs followers
- self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [partner_chell_id])
+ self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [self.partner_chell_id])
+
# Test: Chell posts a message on Pigs, ok because in the followers
- self.mail_group.message_post(cr, user_chell_id, self.group_pigs_id, body='Message')
+ self.mail_group.message_post(cr, self.user_chell_id, self.group_pigs_id, body='Message')
def test_50_mail_invite(self):
cr, uid = self.cr, self.uid
user_admin = self.res_users.browse(cr, uid, uid)
- self.mail_invite = self.registry('mail.wizard.invite')
base_url = self.registry('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='')
- portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
- portal_id = portal_ref and portal_ref[1] or False
-
# 0 - Admin
- p_a_id = user_admin.partner_id.id
+ partner_admin_id = user_admin.partner_id.id
# 1 - Bert Tartopoils, with email, should receive emails for comments and emails
- p_b_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
+ partner_bert_id = self.res_partner.create(cr, uid, {'name': 'Bert Tartopoils', 'email': 'b@b'})
# ----------------------------------------
- # CASE1: generated URL
+ # CASE: invite Bert to follow Pigs
# ----------------------------------------
- url = self.mail_mail._generate_signin_url(cr, uid, p_b_id, portal_id, 1234)
- self.assertEqual(url, base_url + '/login?action=signin&partner_id=%s&group=%s&key=%s' % (p_b_id, portal_id, 1234),
- 'generated signin URL incorrect')
-
- # ----------------------------------------
- # CASE2: invite Bert
- # ----------------------------------------
-
- _sent_email_subject = 'Invitation to follow Pigs'
- _sent_email_body = append_content_to_html('You have been invited to follow Pigs.
', url)
-
# Do: create a mail_wizard_invite, validate it
self._init_mock_build_email()
- mail_invite_id = self.mail_invite.create(cr, uid, {'partner_ids': [(4, p_b_id)]}, {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id})
+ context = {'default_res_model': 'mail.group', 'default_res_id': self.group_pigs_id}
+ mail_invite_id = self.mail_invite.create(cr, uid, {'partner_ids': [(4, partner_bert_id)]}, context)
self.mail_invite.add_followers(cr, uid, [mail_invite_id])
- group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
# Test: Pigs followers should contain Admin and Bert
+ group_pigs = self.mail_group.browse(cr, uid, self.group_pigs_id)
follower_ids = [follower.id for follower in group_pigs.message_follower_ids]
- self.assertEqual(set(follower_ids), set([p_a_id, p_b_id]), 'Pigs followers after invite is incorrect')
- # Test: sent email subject, body
+ self.assertEqual(set(follower_ids), set([partner_admin_id, partner_bert_id]), 'Pigs followers after invite is incorrect')
+
+ # Test: partner must have been prepared for signup
+ partner_bert = self.res_partner.browse(cr, uid, partner_bert_id)
+ self.assertTrue(partner_bert.signup_valid, 'partner has not been prepared for signup')
+ self.assertTrue(base_url in partner_bert.signup_url, 'signup url is incorrect')
+ self.assertTrue(cr.dbname in partner_bert.signup_url, 'signup url is incorrect')
+ self.assertTrue(partner_bert.signup_token in partner_bert.signup_url, 'signup url is incorrect')
+
+ # Test: (pretend to) send email and check subject, body
self.assertEqual(len(self._build_email_kwargs_list), 1, 'sent email number incorrect, should be only for Bert')
for sent_email in self._build_email_kwargs_list:
- self.assertEqual(sent_email.get('subject'), _sent_email_subject, 'sent email subject incorrect')
- self.assertEqual(sent_email.get('body'), _sent_email_body, 'sent email body incorrect')
+ self.assertEqual(sent_email.get('subject'), 'Invitation to follow Pigs',
+ 'subject of invitation email is incorrect')
+ self.assertTrue('You have been invited to follow Pigs' in sent_email.get('body'),
+ 'body of invitation email is incorrect')
+ self.assertTrue(partner_bert.signup_url in sent_email.get('body'),
+ 'body of invitation email does not contain signup url')
diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py
index 3cc706c2129..c94d6509f63 100644
--- a/addons/portal/wizard/portal_wizard.py
+++ b/addons/portal/wizard/portal_wizard.py
@@ -30,17 +30,19 @@ from openerp import SUPERUSER_ID
from base.res.res_partner import _lang_get
_logger = logging.getLogger(__name__)
-# welcome/goodbye email sent to portal users
+# welcome email sent to portal users
# (note that calling '_' has no effect except exporting those strings for translation)
WELCOME_EMAIL_SUBJECT = _("Your OpenERP account at %(company)s")
WELCOME_EMAIL_BODY = _("""Dear %(name)s,
-You have been given access to %(portal)s at %(url)s.
+You have been given access to %(portal)s.
Your login account data is:
Database: %(db)s
-User: %(login)s
-Password: %(password)s
+Username: %(login)s
+
+In order to complete the signin process, click on the following url:
+%(url)s
%(welcome_message)s
@@ -49,28 +51,10 @@ OpenERP - Open Source Business Applications
http://www.openerp.com
""")
-GOODBYE_EMAIL_SUBJECT = _("Your OpenERP account at %(company)s")
-GOODBYE_EMAIL_BODY = _("""Dear %(name)s,
-
-Your access to %(portal)s has been withdrawn.
-
-%(goodbye_message)s
-
---
-OpenERP - Open Source Business Applications
-http://www.openerp.com
-""")
-
-# character sets for passwords, excluding 0, O, o, 1, I, l
-_PASSU = 'ABCDEFGHIJKLMNPQRSTUVWXYZ'
-_PASSL = 'abcdefghijkmnpqrstuvwxyz'
-_PASSD = '23456789'
-
def random_password():
- # get 3 uppercase letters, 3 lowercase letters, 2 digits, and shuffle them
- chars = map(random.choice, [_PASSU] * 3 + [_PASSL] * 3 + [_PASSD] * 2)
- random.shuffle(chars)
- return ''.join(chars)
+ # temporary random stuff; user password is reset by signup process
+ chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
+ return ''.join(random.choice(chars) for i in xrange(12))
def extract_email(email):
""" extract the email address from a user-friendly email address """
@@ -92,8 +76,6 @@ class wizard(osv.osv_memory):
'user_ids': fields.one2many('portal.wizard.user', 'wizard_id', string='Users'),
'welcome_message': fields.text(string='Invitation Message',
help="This text is included in the email sent to new users of the portal."),
- 'goodbye_message': fields.text(string='Withdrawal Message',
- help="This text is included in the email sent to users withdrawn from the portal."),
}
def _default_portal(self, cr, uid, context):
@@ -164,6 +146,8 @@ class wizard_user(osv.osv_memory):
user = self._create_user(cr, SUPERUSER_ID, wizard_user, context)
if (not user.active) or (portal not in user.groups_id):
user.write({'active': True, 'groups_id': [(4, portal.id)]})
+ # prepare for the signup process
+ user.partner_id.signup_prepare()
wizard_user = self.browse(cr, SUPERUSER_ID, wizard_user.id, context)
self._send_email(cr, uid, wizard_user, context)
else:
@@ -174,8 +158,6 @@ class wizard_user(osv.osv_memory):
user.write({'groups_id': [(3, portal.id)], 'active': False})
else:
user.write({'groups_id': [(3, portal.id)]})
- wizard_user = self.browse(cr, SUPERUSER_ID, wizard_user.id, context)
- self._send_email(cr, uid, wizard_user, context)
def _retrieve_user(self, cr, uid, wizard_user, context=None):
""" retrieve the (possibly inactive) user corresponding to wizard_user.partner_id
@@ -208,7 +190,7 @@ class wizard_user(osv.osv_memory):
return res_users.browse(cr, uid, user_id, context)
def _send_email(self, cr, uid, wizard_user, context=None):
- """ send notification email to a new/former portal user
+ """ send notification email to a new portal user
@param wizard_user: browse record of model portal.wizard.user
@return: the id of the created mail.mail record
"""
@@ -219,33 +201,23 @@ class wizard_user(osv.osv_memory):
_('You must have an email address in your User Preferences to send emails.'))
# determine subject and body in the portal user's language
- url = self.pool.get('ir.config_parameter').get_param(cr, SUPERUSER_ID, 'web.base.url', context=this_context)
user = self._retrieve_user(cr, SUPERUSER_ID, wizard_user, context)
context = dict(this_context or {}, lang=user.lang)
data = {
'company': this_user.company_id.name,
'portal': wizard_user.wizard_id.portal_id.name,
'welcome_message': wizard_user.wizard_id.welcome_message or "",
- 'goodbye_message': wizard_user.wizard_id.goodbye_message or "",
- 'url': url or _("(missing url)"),
'db': cr.dbname,
+ 'name': user.name,
'login': user.login,
- 'password': user.password,
- 'name': user.name
+ 'url': user.signup_url,
}
- if wizard_user.in_portal:
- subject = _(WELCOME_EMAIL_SUBJECT) % data
- body = _(WELCOME_EMAIL_BODY) % data
- else:
- subject = _(GOODBYE_EMAIL_SUBJECT) % data
- body = _(GOODBYE_EMAIL_BODY) % data
-
mail_mail = self.pool.get('mail.mail')
mail_values = {
'email_from': this_user.email,
'email_to': user.email,
- 'subject': subject,
- 'body_html': '%s ' % body,
+ 'subject': _(WELCOME_EMAIL_SUBJECT) % data,
+ 'body_html': '%s ' % (_(WELCOME_EMAIL_BODY) % data),
'state': 'outgoing',
}
return mail_mail.create(cr, uid, mail_values, context=this_context)
diff --git a/addons/portal/wizard/portal_wizard_view.xml b/addons/portal/wizard/portal_wizard_view.xml
index c8e3f30b128..373b4ad8e7a 100644
--- a/addons/portal/wizard/portal_wizard_view.xml
+++ b/addons/portal/wizard/portal_wizard_view.xml
@@ -27,8 +27,6 @@
-
or
diff --git a/addons/portal_crm/wizard/contact_view.xml b/addons/portal_crm/wizard/contact_view.xml
index 1776632d7ab..778e7f9562e 100644
--- a/addons/portal_crm/wizard/contact_view.xml
+++ b/addons/portal_crm/wizard/contact_view.xml
@@ -35,8 +35,8 @@
-
-
+
+
diff --git a/addons/process/static/src/js/process.js b/addons/process/static/src/js/process.js
index 57c6f196012..386a9653c02 100644
--- a/addons/process/static/src/js/process.js
+++ b/addons/process/static/src/js/process.js
@@ -6,7 +6,6 @@ instance.web.ViewManager.include({
var self = this;
var _super = this._super();
this.process_help = this.action ? this.action.help : '';
- self.process_help = $(this.process_help).text();
if(this.action) {
this.process_model = this.action.res_model;
} else {
@@ -240,9 +239,7 @@ instance.web.ViewManager.include({
title: _t('Process')
});
var form_controller = pop.view_form;
- pop.on_write_completed.add_last(function() {
- self.initialize_process_view();
- });
+ pop.on('write_completed', self, self.initialize_process_view);
}
});
};
diff --git a/addons/project/project.py b/addons/project/project.py
index 6b02a018293..4f1d2826980 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -19,12 +19,14 @@
#
##############################################################################
-from base_status.base_stage import base_stage
-from datetime import datetime, date
+import time
from lxml import etree
+from datetime import datetime, date
+
+import tools
+from base_status.base_stage import base_stage
from osv import fields, osv
from openerp.addons.resource.faces import task as Task
-import time
from tools.translate import _
from openerp import SUPERUSER_ID
@@ -1099,7 +1101,7 @@ class task(base_stage, osv.osv):
task_record = self.browse(cr, uid, task_id, context=context)
if task_record.project_id:
project_follower_ids = [follower.id for follower in task_record.project_id.message_follower_ids]
- self.message_subscribe(cr, uid, [task_id], project_follower_ids,
+ self.message_subscribe(cr, uid, [task_id], project_follower_ids,
context=context)
self._store_history(cr, uid, [task_id], context=context)
self.create_send_note(cr, uid, [task_id], context=context)
@@ -1173,11 +1175,10 @@ class task(base_stage, osv.osv):
""" Override to updates the document according to the email. """
if custom_values is None: custom_values = {}
custom_values.update({
- 'name': subject,
+ 'name': msg.get('subject'),
'planned_hours': 0.0,
- 'subject': msg.get('subject'),
})
- return super(project_tasks,self).message_new(cr, uid, msg, custom_values=custom_values, context=context)
+ return super(task,self).message_new(cr, uid, msg, custom_values=custom_values, context=context)
def message_update(self, cr, uid, ids, msg, update_vals=None, context=None):
""" Override to update the task according to the email. """
@@ -1202,7 +1203,7 @@ class task(base_stage, osv.osv):
act = 'do_%s' % res.group(2).lower()
if act:
getattr(self,act)(cr, uid, ids, context=context)
- return super(project_tasks,self).message_update(cr, uid, msg, update_vals=update_vals, context=context)
+ return super(task,self).message_update(cr, uid, msg, update_vals=update_vals, context=context)
# ---------------------------------------------------
# OpenChatter methods and notifications
@@ -1353,16 +1354,15 @@ class project_project(osv.osv):
'use_tasks': True
}
-
-#
-# Tasks History, used for cumulative flow charts (Lean/Agile)
-#
-
class project_task_history(osv.osv):
+ """
+ Tasks History, used for cumulative flow charts (Lean/Agile)
+ """
_name = 'project.task.history'
_description = 'History of Tasks'
_rec_name = 'task_id'
_log_access = False
+
def _get_date(self, cr, uid, ids, name, arg, context=None):
result = {}
for history in self.browse(cr, uid, ids, context=context):
@@ -1414,35 +1414,38 @@ class project_task_history(osv.osv):
'date': fields.date.context_today,
}
-
class project_task_history_cumulative(osv.osv):
_name = 'project.task.history.cumulative'
_table = 'project_task_history_cumulative'
_inherit = 'project.task.history'
_auto = False
+
_columns = {
'end_date': fields.date('End Date'),
- 'project_id': fields.related('task_id', 'project_id', string='Project', type='many2one', relation='project.project')
+ 'project_id': fields.many2one('project.project', 'Project'),
}
+
def init(self, cr):
cr.execute(""" CREATE OR REPLACE VIEW project_task_history_cumulative AS (
SELECT
- history.date::varchar||'-'||history.history_id::varchar as id,
- history.date as end_date,
+ history.date::varchar||'-'||history.history_id::varchar AS id,
+ history.date AS end_date,
*
FROM (
SELECT
- id as history_id,
- date+generate_series(0, CAST((coalesce(end_date,DATE 'tomorrow')::date - date)AS integer)-1) as date,
- task_id, type_id, user_id, kanban_state, state,
- greatest(remaining_hours,1) as remaining_hours, greatest(planned_hours,1) as planned_hours
+ h.id AS history_id,
+ h.date+generate_series(0, CAST((coalesce(h.end_date, DATE 'tomorrow')::date - h.date) AS integer)-1) AS date,
+ h.task_id, h.type_id, h.user_id, h.kanban_state, h.state,
+ greatest(h.remaining_hours, 1) AS remaining_hours, greatest(h.planned_hours, 1) AS planned_hours,
+ t.project_id
FROM
- project_task_history
- ) as history
+ project_task_history AS h
+ JOIN project_task AS t ON (h.task_id = t.id)
+
+ ) AS history
)
""")
-
class project_category(osv.osv):
""" Category of project's task (or issue) """
_name = "project.category"
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index bd63eec84c5..03c0ee2440b 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -163,7 +163,7 @@
-
+
@@ -311,7 +311,7 @@
-
+
@@ -401,7 +401,7 @@
-
+
@@ -619,7 +619,7 @@
-
+
diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml
index 8fd9c3ee1b6..c30c91fe6c0 100644
--- a/addons/project/report/project_cumulative.xml
+++ b/addons/project/report/project_cumulative.xml
@@ -18,10 +18,12 @@
+
project.task.history.cumulative.graph
project.task.history.cumulative
+
@@ -29,21 +31,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
project.task.history.cumulative.search
@@ -51,18 +38,18 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -73,27 +60,12 @@
form
graph,tree
-
+
{"search_default_open":1, "search_default_this_month": 1}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ parent="base.menu_project_report"/>
diff --git a/addons/project_gtd/project_gtd_view.xml b/addons/project_gtd/project_gtd_view.xml
index fdb8ae8495c..a7026da8854 100644
--- a/addons/project_gtd/project_gtd_view.xml
+++ b/addons/project_gtd/project_gtd_view.xml
@@ -92,8 +92,8 @@
-
-
+
+
diff --git a/addons/project_gtd/wizard/project_gtd_fill_view.xml b/addons/project_gtd/wizard/project_gtd_fill_view.xml
index 8807c00a76b..626dfb699b8 100644
--- a/addons/project_gtd/wizard/project_gtd_fill_view.xml
+++ b/addons/project_gtd/wizard/project_gtd_fill_view.xml
@@ -8,7 +8,7 @@
@@ -323,7 +324,7 @@
-
+
diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 34f3c536917..9ba6c43a588 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -201,6 +201,7 @@ class sale_order(osv.osv):
help="""This field controls how invoice and delivery operations are synchronized.
- With 'Before Delivery', a draft invoice is created, and it must be paid before delivery."""),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="Pricelist for current sales order."),
+ 'currency_id': fields.related('pricelist_id', 'currency_id', type="many2one", relation="res.currency", readonly=True, required=True),
'project_id': fields.many2one('account.analytic.account', 'Contract/Analytic Account', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}, help="The analytic account related to a sales order."),
'order_line': fields.one2many('sale.order.line', 'order_id', 'Order Lines', readonly=True, states={'draft': [('readonly', False)], 'sent': [('readonly', False)]}),
@@ -264,13 +265,18 @@ class sale_order(osv.osv):
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
def onchange_pricelist_id(self, cr, uid, ids, pricelist_id, order_lines, context=None):
- if (not pricelist_id) or (not order_lines):
+ if not pricelist_id:
return {}
+ value = {
+ 'currency_id': self.pool.get('product.pricelist').browse(cr, uid, pricelist_id, context=context).currency_id.id
+ }
+ if not order_lines:
+ return {'value': value}
warning = {
'title': _('Pricelist Warning!'),
'message' : _('If you change the pricelist of this order (and eventually the currency), prices of existing order lines will not be updated.')
}
- return {'warning': warning}
+ return {'warning': warning, 'value': value}
def onchange_partner_id(self, cr, uid, ids, part):
if not part:
@@ -793,6 +799,7 @@ class sale_order_line(osv.osv):
_('There is no Fiscal Position defined or Income category account defined for default properties of Product categories.'))
res = {
'name': line.name,
+ 'sequence': line.sequence,
'origin': line.order_id.name,
'account_id': account_id,
'price_unit': pu,
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 5505a6a88b5..8b89e8047cb 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -184,6 +184,7 @@
+
@@ -214,7 +215,7 @@
-
+
@@ -251,7 +252,7 @@
on_change="product_id_change(parent.pricelist_id, product_id, product_uom_qty, product_uom, product_uos_qty, product_uos, name, parent.partner_id, False, False, parent.date_order, False, parent.fiscal_position, True, context)"/>
+ groups="product.group_uom" options='{"no_open": True}'/>
@@ -261,14 +262,14 @@
@@ -337,7 +338,7 @@
-
+
diff --git a/addons/sale_margin/sale_margin_view.xml b/addons/sale_margin/sale_margin_view.xml
index 69f49bd48ea..6aa34bae26c 100644
--- a/addons/sale_margin/sale_margin_view.xml
+++ b/addons/sale_margin/sale_margin_view.xml
@@ -11,7 +11,7 @@
-
+
diff --git a/addons/share/i18n/ar.po b/addons/share/i18n/ar.po
index 28215c8d748..c6fba54885c 100644
--- a/addons/share/i18n/ar.po
+++ b/addons/share/i18n/ar.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-01-13 21:14+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2012-10-08 15:06+0000\n"
+"Last-Translator: almodhesh \n"
"Language-Team: Arabic \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:34+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-09 04:51+0000\n"
+"X-Generator: Launchpad (build 16112)\n"
#. module: share
#: field:share.wizard,embed_option_title:0
@@ -25,7 +25,7 @@ msgstr "عرض العنوان"
#. module: share
#: view:share.wizard:0
msgid "Access granted!"
-msgstr ""
+msgstr "منح الوصول!"
#. module: share
#: field:share.wizard,user_type:0
@@ -50,13 +50,15 @@ msgstr "مشاركة"
#. module: share
#: field:share.wizard,share_root_url:0
msgid "Share Access URL"
-msgstr ""
+msgstr "مشاركة الوصول URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:782
#, python-format
msgid "You may use your current login (%s) and password to view them.\n"
msgstr ""
+"يمكنك استخدام معلومات تسجيل الدخول الخاصة بك الحالية(%s) وكلمة المرور "
+"لعرضها.\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:601
@@ -83,24 +85,25 @@ msgstr ""
#. module: share
#: field:share.wizard,embed_url:0 field:share.wizard.result.line,share_url:0
msgid "Share URL"
-msgstr ""
+msgstr "مشاركة URL"
#. module: share
#: code:addons/share/wizard/share_wizard.py:776
#, python-format
msgid "These are your credentials to access this protected area:\n"
-msgstr ""
+msgstr "هذا هو اعتمادك للوصول إلى هذه المناطق المحمية\n"
#. module: share
#: code:addons/share/wizard/share_wizard.py:643
#, python-format
msgid "You must be a member of the Share/User group to use the share wizard"
msgstr ""
+"يجب أن تكون عضوا في المجموعة مشاركة / المستخدم لاستخدام مشاركة صندوق الحوار"
#. module: share
#: view:share.wizard:0
msgid "Access info"
-msgstr ""
+msgstr "معلومات الولوج"
#. module: share
#: view:share.wizard:0
@@ -111,12 +114,12 @@ msgstr "حصة"
#: code:addons/share/wizard/share_wizard.py:551
#, python-format
msgid "(Duplicated for modified sharing permissions)"
-msgstr ""
+msgstr "(تكرار للحصول على أذونات مشاركة تعديل)"
#. module: share
#: help:share.wizard,domain:0
msgid "Optional domain for further data filtering"
-msgstr ""
+msgstr "المجال اختياري لمزيد من بيانات التصفية"
#. module: share
#: sql_constraint:res.users:0
@@ -159,7 +162,7 @@ msgstr "إغلاق"
#: code:addons/share/wizard/share_wizard.py:640
#, python-format
msgid "Action and Access Mode are required to create a shared access"
-msgstr ""
+msgstr "نمط الإجراء والوصول لإنشاء مشاركة الوصول"
#. module: share
#: view:share.wizard:0
@@ -167,6 +170,7 @@ msgid ""
"Please select the action that opens the screen containing the data you want "
"to share."
msgstr ""
+"الرجاء اختيار الإجراء الذي يفتح شاشة تحتوي على البيانات التي تريد مشاركتها."
#. module: share
#: code:addons/share/wizard/share_wizard.py:781
@@ -174,7 +178,7 @@ msgstr ""
msgid ""
"The documents have been automatically added to your current OpenERP "
"documents.\n"
-msgstr ""
+msgstr "المستندات تمت إضافتها بشكل تلقائي لمستندات اوبن اي ار بي الخاصة بك\n"
#. module: share
#: view:share.wizard:0
@@ -184,7 +188,7 @@ msgstr "إلغاء"
#. module: share
#: field:res.groups,share:0
msgid "Share Group"
-msgstr ""
+msgstr "مشاركة المجموعة"
#. module: share
#: code:addons/share/wizard/share_wizard.py:763
@@ -197,12 +201,12 @@ msgstr "لا بدّ من ذكر عنوان بريد إلكتروني"
msgid ""
"Optionally, you may specify an additional domain restriction that will be "
"applied to the shared data."
-msgstr ""
+msgstr "اختيارياً، اختيار محدودية مجال لتطبيقها على المعلومات المشاركة."
#. module: share
#: help:share.wizard,name:0
msgid "Title for the share (displayed to users as menu and shortcut name)"
-msgstr ""
+msgstr "عنوان المشاركة (تعرض للمستخدمين كقائمة واسم مختصر)"
#. module: share
#: view:share.wizard:0
@@ -212,7 +216,7 @@ msgstr "خيارات"
#. module: share
#: view:res.groups:0
msgid "Regular groups only (no share groups"
-msgstr ""
+msgstr "المجموعات المنتظمة فقط( لا مجموعات مشاركة)"
#. module: share
#: code:addons/share/wizard/share_wizard.py:787
@@ -222,27 +226,32 @@ msgid ""
"Sales, HR, etc.)\n"
"It is open source and can be found on http://www.openerp.com."
msgstr ""
+"OpenERP هي قوية ومجموعة من تطبيقات الأعمال سهل الاستعمال(إدارة علاقات "
+"العملاء,المبيعات, موارد بشرية, الخ.)\n"
+"هي مفتوحة المصدر ويمكنك الوصول إليها عن طريق هذا الرابط "
+"http://www.openerp.com."
#. module: share
#: field:share.wizard,action_id:0
msgid "Action to share"
-msgstr ""
+msgstr "إجراء للمشاركة"
#. module: share
#: view:share.wizard:0
msgid "Optional: include a personal message"
-msgstr ""
+msgstr "اختياري: تضمين رسالة خاصة"
#. module: share
#: field:res.users,share:0
msgid "Share User"
-msgstr ""
+msgstr "مشاركة المستخدم"
#. module: share
#: code:addons/share/wizard/share_wizard.py:647
#, python-format
msgid "Please indicate the emails of the persons to share with, one per line"
msgstr ""
+"يرجى الإشارة إلى رسائل البريد الإلكتروني للأشخاص للمشاركة معه، واحد في كل سطر"
#. module: share
#: field:share.wizard,embed_code:0 field:share.wizard.result.line,user_id:0
@@ -252,13 +261,13 @@ msgstr "مجهول"
#. module: share
#: help:res.groups,share:0
msgid "Group created to set access rights for sharing data with some users."
-msgstr ""
+msgstr "إنشاء مجموعة لتعيين حقوق الوصول لتبادل البيانات مع بعض المستخدمين."
#. module: share
#: help:share.wizard,action_id:0
msgid ""
"The action that opens the screen containing the data you wish to share."
-msgstr ""
+msgstr "الإجراء الذي يفتح شاشة تحتوي على البيانات التي ترغب في مشاركتها."
#. module: share
#: constraint:res.users:0
@@ -270,12 +279,12 @@ msgstr ""
#: code:addons/share/wizard/share_wizard.py:526
#, python-format
msgid "(Copy for sharing)"
-msgstr ""
+msgstr "(نسخة من المشاركة)"
#. module: share
#: field:share.wizard.result.line,newly_created:0
msgid "Newly created"
-msgstr ""
+msgstr "منشأة حديثاً"
#. module: share
#: code:addons/share/wizard/share_wizard.py:616
@@ -292,7 +301,7 @@ msgstr ""
#. module: share
#: help:share.wizard,share_root_url:0
msgid "Main access page for users that are granted shared access"
-msgstr ""
+msgstr "صفحة الوصول الرئيسية للمستخدمين لضمان مشاركة الوصول"
#. module: share
#: sql_constraint:res.groups:0
@@ -343,12 +352,12 @@ msgstr "ملخّص"
#: code:addons/share/wizard/share_wizard.py:493
#, python-format
msgid "Copied access for sharing"
-msgstr ""
+msgstr "نسخ الوصول للمشاركة"
#. module: share
#: model:ir.actions.act_window,name:share.action_share_wizard_step1
msgid "Share your documents"
-msgstr ""
+msgstr "مشاركة المستندات الخاصة بك"
#. module: share
#: view:share.wizard:0
@@ -370,22 +379,22 @@ msgstr "share.wizard.result.line"
#. module: share
#: help:share.wizard,user_type:0
msgid "Select the type of user(s) you would like to share data with."
-msgstr ""
+msgstr "استخدم نوع المستخدم الذي تود مشاركة المعلومات معه"
#. module: share
#: field:share.wizard,view_type:0
msgid "Current View Type"
-msgstr ""
+msgstr "نوع عرض الحالي"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can view"
-msgstr ""
+msgstr "امكانية المشاهدة"
#. module: share
#: selection:share.wizard,access_mode:0
msgid "Can edit"
-msgstr ""
+msgstr "امكانية التعديل"
#. module: share
#: help:share.wizard,message:0
@@ -528,3 +537,10 @@ msgstr "مشاركة مع..."
#~ msgid "Share with these people (one e-mail per line)"
#~ msgstr "المشاركة مع هؤلاء الناس (بريد إلكتروني واحد في كل سطر)"
+
+#~ msgid ""
+#~ "An optional personal message, to be included in the e-mail notification."
+#~ msgstr "رسالة اختيارية شخصية، ليتم تضمينها في اخطار البريد الإلكتروني."
+
+#~ msgid "Use this link"
+#~ msgstr "استخدم هذا الرابط"
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index f5320a963c7..1a3f8e57d5c 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -272,7 +272,7 @@
+ sequence="3"/>