[Merge]with: lp:openobject-addons
bzr revid: dbr@tinyerp.com-20111122052259-ujqowej61mn43p4j
This commit is contained in:
@@ -286,6 +286,9 @@ class account_invoice(osv.osv):
|
||||
'internal_number': False,
|
||||
'user_id': lambda s, cr, u, c: u,
|
||||
}
|
||||
_sql_constraints = [
|
||||
('number_uniq', 'unique(number, company_id)', 'Invoice Number must be unique per Company!'),
|
||||
]
|
||||
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False):
|
||||
journal_obj = self.pool.get('account.journal')
|
||||
|
||||
@@ -55,10 +55,10 @@ class analytic_entries_report(osv.osv):
|
||||
select
|
||||
min(a.id) as id,
|
||||
count(distinct a.id) as nbr,
|
||||
a.create_date as date,
|
||||
to_char(a.create_date, 'YYYY') as year,
|
||||
to_char(a.create_date, 'MM') as month,
|
||||
to_char(a.create_date, 'YYYY-MM-DD') as day,
|
||||
a.date as date,
|
||||
to_char(a.date, 'YYYY') as year,
|
||||
to_char(a.date, 'MM') as month,
|
||||
to_char(a.date, 'YYYY-MM-DD') as day,
|
||||
a.user_id as user_id,
|
||||
a.name as name,
|
||||
analytic.partner_id as partner_id,
|
||||
@@ -76,7 +76,7 @@ class analytic_entries_report(osv.osv):
|
||||
account_analytic_line a, account_analytic_account analytic
|
||||
where analytic.id = a.account_id
|
||||
group by
|
||||
a.create_date, a.user_id,a.name,analytic.partner_id,a.company_id,a.currency_id,
|
||||
a.date, a.user_id,a.name,analytic.partner_id,a.company_id,a.currency_id,
|
||||
a.account_id,a.general_account_id,a.journal_id,
|
||||
a.move_id,a.product_id,a.product_uom_id
|
||||
)
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# Bengali translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-21 12:33+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bengali <bn@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,description:account_accountant.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
"This module gives the admin user the access to all the accounting features "
|
||||
"like the journal\n"
|
||||
"items and the chart of accounts.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"এই মডিউল admin ব্যবহারকারীকে সকল হিসাবরক্ষন এর সুবিধা দিবে\n"
|
||||
" "
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
|
||||
msgid "Accountant"
|
||||
msgstr "হিসাবরক্ষনকারী"
|
||||
@@ -0,0 +1,33 @@
|
||||
# Hebrew translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-18 17:39+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Hebrew <he@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-19 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,description:account_accountant.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
"This module gives the admin user the access to all the accounting features "
|
||||
"like the journal\n"
|
||||
"items and the chart of accounts.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
|
||||
msgid "Accountant"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,38 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:14+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,description:account_accountant.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
"This module gives the admin user the access to all the accounting features "
|
||||
"like the journal\n"
|
||||
"items and the chart of accounts.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Aqueste modul balha a l'administrator los accèsses a totas las "
|
||||
"foncionalitats comptablas talas coma las linhas\n"
|
||||
"d'escritura e lo plan comptable.\n"
|
||||
" "
|
||||
|
||||
#. module: account_accountant
|
||||
#: model:ir.module.module,shortdesc:account_accountant.module_meta_information
|
||||
msgid "Accountant"
|
||||
msgstr "Comptable"
|
||||
@@ -0,0 +1,36 @@
|
||||
# Bengali translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-21 12:37+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bengali <bn@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: account_cancel
|
||||
#: model:ir.module.module,description:account_cancel.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" Module adds 'Allow cancelling entries' field on form view of account "
|
||||
"journal. If set to true it allows user to cancel entries & invoices.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" মডিউলটি 'Allow cancelling entries' ফিল্ড যুক্ত করবে যা দিয়ে জাবেদা "
|
||||
"অন্তর্ভুক্তি বাতিল করা যাবে।\n"
|
||||
" "
|
||||
|
||||
#. module: account_cancel
|
||||
#: model:ir.module.module,shortdesc:account_cancel.module_meta_information
|
||||
msgid "Account Cancel"
|
||||
msgstr "হিসাব বাতিল"
|
||||
@@ -0,0 +1,37 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:15+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: account_cancel
|
||||
#: model:ir.module.module,description:account_cancel.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" Module adds 'Allow cancelling entries' field on form view of account "
|
||||
"journal. If set to true it allows user to cancel entries & invoices.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Lo modul apond lo camp 'Permetre l'anullacion de las entradas' dins la "
|
||||
"vista formulari del jornal. S'es egal a Verai, aquò permet a l'utilizaire "
|
||||
"d'anullar l'entrada e la factura.\n"
|
||||
" "
|
||||
|
||||
#. module: account_cancel
|
||||
#: model:ir.module.module,shortdesc:account_cancel.module_meta_information
|
||||
msgid "Account Cancel"
|
||||
msgstr "Anullacion comptabla"
|
||||
@@ -28,7 +28,7 @@ class followup(osv.osv):
|
||||
'name': fields.char('Name', size=64, required=True),
|
||||
'description': fields.text('Description'),
|
||||
'followup_line': fields.one2many('account_followup.followup.line', 'followup_id', 'Follow-Up'),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'account_followup.followup', context=c),
|
||||
|
||||
@@ -35,45 +35,44 @@ class report_rappel(report_sxw.rml_parse):
|
||||
'get_text': self._get_text
|
||||
})
|
||||
|
||||
def _ids_to_objects(self, partner_ids):
|
||||
def _ids_to_objects(self, ids):
|
||||
pool = pooler.get_pool(self.cr.dbname)
|
||||
all_partners = []
|
||||
for partner in pool.get('res.partner').browse(self.cr, self.uid, partner_ids):
|
||||
if partner not in all_partners:
|
||||
all_partners.append(partner)
|
||||
return all_partners
|
||||
all_lines = []
|
||||
for line in pool.get('account_followup.stat.by.partner').browse(self.cr, self.uid, ids):
|
||||
if line not in all_lines:
|
||||
all_lines.append(line)
|
||||
return all_lines
|
||||
|
||||
def _adr_get(self, partner, type):
|
||||
def _adr_get(self, stat_line, type):
|
||||
res_partner = pooler.get_pool(self.cr.dbname).get('res.partner')
|
||||
res_partner_address = pooler.get_pool(self.cr.dbname).get('res.partner.address')
|
||||
adr = res_partner.address_get(self.cr, self.uid, [partner.id], [type])[type]
|
||||
adr = res_partner.address_get(self.cr, self.uid, [stat_line.partner_id.id], [type])[type]
|
||||
return adr and res_partner_address.read(self.cr, self.uid, [adr]) or [{}]
|
||||
|
||||
def _lines_get(self, partner):
|
||||
def _lines_get(self, stat_by_partner_line):
|
||||
pool = pooler.get_pool(self.cr.dbname)
|
||||
moveline_obj = pool.get('account.move.line')
|
||||
company_obj = pool.get('res.company')
|
||||
obj_currency = pool.get('res.currency')
|
||||
#FIXME: search on company accounting entries only
|
||||
movelines = moveline_obj.search(self.cr, self.uid,
|
||||
[('partner_id', '=', partner.id),
|
||||
[('partner_id', '=', stat_by_partner_line.partner_id.id),
|
||||
('account_id.type', '=', 'receivable'),
|
||||
('reconcile_id', '=', False), ('state', '<>', 'draft')])
|
||||
('reconcile_id', '=', False), ('state', '<>', 'draft'),('company_id','=', stat_by_partner_line.company_id.id)])
|
||||
movelines = moveline_obj.browse(self.cr, self.uid, movelines)
|
||||
base_currency = movelines[0].company_id.currency_id
|
||||
final_res = []
|
||||
line_cur = {base_currency.id: {'line': []}}
|
||||
|
||||
for line in movelines:
|
||||
if line.currency_id and (not line.currency_id.id in line_cur):
|
||||
line_cur[line.currency_id.id] = {'line': []}
|
||||
currency = line.currency_id or line.company_id.currency_id
|
||||
if line.account_id.currency_id and (not line.account_id.currency_id.id in line_cur):
|
||||
line_cur[line.account_id.currency_id.id] = {'line': []}
|
||||
currency = line.account_id.currency_id or line.company_id.currency_id
|
||||
line_data = {
|
||||
'name': line.move_id.name,
|
||||
'ref': line.ref,
|
||||
'date':line.date,
|
||||
'date_maturity': line.date_maturity,
|
||||
'balance': line.currency_id and line.amount_currency or (line.debit - line.credit),
|
||||
'balance': currency.id <> line.company_id.currency_id.id and line.amount_currency or (line.debit - line.credit),
|
||||
'blocked': line.blocked,
|
||||
'currency_id': currency.symbol or currency.name,
|
||||
}
|
||||
@@ -85,7 +84,7 @@ class report_rappel(report_sxw.rml_parse):
|
||||
return final_res
|
||||
|
||||
|
||||
def _get_text(self, partner, followup_id, context=None):
|
||||
def _get_text(self, stat_line, followup_id, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
fp_obj = pooler.get_pool(self.cr.dbname).get('account_followup.followup')
|
||||
@@ -96,10 +95,10 @@ class report_rappel(report_sxw.rml_parse):
|
||||
li_delay.sort(reverse=True)
|
||||
text = ""
|
||||
a = {}
|
||||
partner_line = pooler.get_pool(self.cr.dbname).get('account.move.line').search(self.cr, self.uid, [('partner_id','=',partner.id),('reconcile_id','=',False)])
|
||||
partner_line_ids = pooler.get_pool(self.cr.dbname).get('account.move.line').search(self.cr, self.uid, [('partner_id','=',stat_line.partner_id.id),('reconcile_id','=',False),('company_id','=',stat_line.company_id.id)])
|
||||
partner_delay = []
|
||||
context.update({'lang': partner.lang})
|
||||
for i in pooler.get_pool(self.cr.dbname).get('account.move.line').browse(self.cr, self.uid, partner_line, context):
|
||||
context.update({'lang': stat_line.partner_id.lang})
|
||||
for i in pooler.get_pool(self.cr.dbname).get('account.move.line').browse(self.cr, self.uid, partner_line_ids, context):
|
||||
for delay in li_delay:
|
||||
if i.followup_line_id and str(i.followup_line_id.delay)==str(delay):
|
||||
text = i.followup_line_id.description
|
||||
@@ -108,16 +107,16 @@ class report_rappel(report_sxw.rml_parse):
|
||||
text = partner_delay and a[max(partner_delay)] or ''
|
||||
if text:
|
||||
text = text % {
|
||||
'partner_name': partner.name,
|
||||
'partner_name': stat_line.partner_id.name,
|
||||
'date': time.strftime('%Y-%m-%d'),
|
||||
'company_name': fp_obj.browse(self.cr, self.uid, followup_id).company_id.name,
|
||||
'company_name': stat_line.company_id.name,
|
||||
'user_signature': pooler.get_pool(self.cr.dbname).get('res.users').browse(self.cr, self.uid, self.uid, context).signature or '',
|
||||
}
|
||||
|
||||
return text
|
||||
|
||||
report_sxw.report_sxw('report.account_followup.followup.print',
|
||||
'res.partner', 'addons/account_followup/report/account_followup_print.rml',
|
||||
'account_followup.stat.by.partner', 'addons/account_followup/report/account_followup_print.rml',
|
||||
parser=report_rappel)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
</stylesheet>
|
||||
<story>
|
||||
<para style="terp_default_8">[[ repeatIn(ids_to_objects(data['form']['partner_ids']),'o') ]] </para>
|
||||
<para style="terp_default_8">[[ setLang(o.lang) ]]</para>
|
||||
<para style="terp_default_8">[[ setLang(o.partner_id.lang) ]]</para>
|
||||
|
||||
<blockTable colWidths="298.0,234.0" style="Tableau2">
|
||||
<tr>
|
||||
@@ -132,7 +132,7 @@
|
||||
<para style="terp_default_9">[[ repeatIn(adr_get(o,'invoice'),'a' )]]</para>
|
||||
</td>
|
||||
<td>
|
||||
<para style="terp_default_9">[[ o.name or '' ]]</para>
|
||||
<para style="terp_default_9">[[ o.partner_id.name or '' ]]</para>
|
||||
<para style="terp_default_9">[[ a['street'] or '']]</para>
|
||||
<para style="terp_default_9">[[ a['street2'] or removeParentNode('para') ]]</para>
|
||||
<para style="terp_default_9">[[ a['zip'] or '' ]] [[ a['city'] or '' ]]</para>
|
||||
@@ -141,7 +141,7 @@
|
||||
<para style="terp_default_9">
|
||||
<font color="white"> </font>
|
||||
</para>
|
||||
<para style="terp_default_9">VAT: [[ o.vat or removeParentNode('para') ]]</para>
|
||||
<para style="terp_default_9">VAT: [[ o.partner_id.vat or removeParentNode('para') ]]</para>
|
||||
</td>
|
||||
</tr>
|
||||
</blockTable>
|
||||
@@ -150,7 +150,7 @@
|
||||
</para>
|
||||
<para style="terp_default_9">Document : Customer account statement</para>
|
||||
<para style="terp_default_9">Date : [[ formatLang(data['form']['date'],date=True) ]]</para>
|
||||
<para style="terp_default_9">Customer Ref : [[ o.ref or '' ]]</para>
|
||||
<para style="terp_default_9">Customer Ref : [[ o.partner_id.ref or '' ]]</para>
|
||||
<para style="terp_default_8">
|
||||
<font color="white"> </font>
|
||||
</para>
|
||||
|
||||
@@ -68,7 +68,7 @@ class account_followup_stat(osv.osv):
|
||||
cr.execute("""
|
||||
create or replace view account_followup_stat as (
|
||||
SELECT
|
||||
l.partner_id as id,
|
||||
l.id as id,
|
||||
l.partner_id AS partner_id,
|
||||
min(l.date) AS date_move,
|
||||
max(l.date) AS date_move_last,
|
||||
|
||||
@@ -105,4 +105,5 @@
|
||||
self.do_print(cr, uid, [ref("account_followup_print_all_0")], {"lang": 'en_US',
|
||||
"active_model": "ir.ui.menu", "active_ids": [ref("account_followup.account_followup_print_menu")],
|
||||
"tz": False, "date": time.strftime('%Y-%m-%d'), "followup_id": ref("account_followup_followup_testfollowups0"), "active_id": ref("account_followup.account_followup_print_menu"),
|
||||
"company_id": ref('base.main_company'),
|
||||
})
|
||||
|
||||
@@ -31,7 +31,7 @@ class account_followup_print(osv.osv_memory):
|
||||
_description = 'Print Followup & Send Mail to Customers'
|
||||
_columns = {
|
||||
'date': fields.date('Follow-up Sending Date', required=True, help="This field allow you to select a forecast date to plan your follow-ups"),
|
||||
'followup_id': fields.many2one('account_followup.followup', 'Follow-up', required=True)
|
||||
'followup_id': fields.many2one('account_followup.followup', 'Follow-up', required=True),
|
||||
}
|
||||
|
||||
def _get_followup(self, cr, uid, context=None):
|
||||
@@ -51,7 +51,7 @@ class account_followup_print(osv.osv_memory):
|
||||
data = self.browse(cr, uid, ids, context=context)[0]
|
||||
model_data_ids = mod_obj.search(cr, uid, [('model','=','ir.ui.view'),('name','=','view_account_followup_print_all')], context=context)
|
||||
resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
|
||||
context.update({'followup_id': data.followup_id.id, 'date':data.date})
|
||||
context.update({'followup_id': data.followup_id.id, 'date': data.date, 'company_id': data.followup_id.company_id.id})
|
||||
return {
|
||||
'name': _('Select Partners'),
|
||||
'view_type': 'form',
|
||||
@@ -87,10 +87,13 @@ class account_followup_stat_by_partner(osv.osv):
|
||||
|
||||
def init(self, cr):
|
||||
tools.drop_view_if_exists(cr, 'account_followup_stat_by_partner')
|
||||
# Here we don't have other choice but to create a virtual ID based on the concatenation
|
||||
# of the partner_id and the company_id. An assumption that the number of companies will
|
||||
# not reach 10 000 records is made, what should be enough for a time.
|
||||
cr.execute("""
|
||||
create or replace view account_followup_stat_by_partner as (
|
||||
SELECT
|
||||
l.partner_id AS id,
|
||||
l.partner_id * 10000 + l.company_id as id,
|
||||
l.partner_id AS partner_id,
|
||||
min(l.date) AS date_move,
|
||||
max(l.date) AS date_move_last,
|
||||
@@ -148,6 +151,8 @@ class account_followup_print_all(osv.osv_memory):
|
||||
context = {}
|
||||
if ids:
|
||||
data = self.browse(cr, uid, ids, context=context)[0]
|
||||
company_id = 'company_id' in context and context['company_id'] or data.company_id.id
|
||||
|
||||
cr.execute(
|
||||
"SELECT l.partner_id, l.followup_line_id,l.date_maturity, l.date, l.id "\
|
||||
"FROM account_move_line AS l "\
|
||||
@@ -159,7 +164,8 @@ class account_followup_print_all(osv.osv_memory):
|
||||
"AND (l.partner_id is NOT NULL) "\
|
||||
"AND (a.active) "\
|
||||
"AND (l.debit > 0) "\
|
||||
"ORDER BY l.date")
|
||||
"AND (l.company_id = %s) "\
|
||||
"ORDER BY l.date", (company_id,))
|
||||
move_lines = cr.fetchall()
|
||||
old = None
|
||||
fups = {}
|
||||
@@ -189,16 +195,16 @@ class account_followup_print_all(osv.osv_memory):
|
||||
continue
|
||||
if followup_line_id not in fups:
|
||||
continue
|
||||
stat_line_id = partner_id * 10000 + company_id
|
||||
if date_maturity:
|
||||
if date_maturity <= fups[followup_line_id][0].strftime('%Y-%m-%d'):
|
||||
if partner_id not in partner_list:
|
||||
partner_list.append(partner_id)
|
||||
partner_list.append(stat_line_id)
|
||||
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': partner_id}
|
||||
elif date and date <= fups[followup_line_id][0].strftime('%Y-%m-%d'):
|
||||
if partner_id not in partner_list:
|
||||
partner_list.append(partner_id)
|
||||
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': partner_id}
|
||||
|
||||
partner_list.append(stat_line_id)
|
||||
to_update[str(id)]= {'level': fups[followup_line_id][1], 'partner_id': stat_line_id}
|
||||
return {'partner_ids': partner_list, 'to_update': to_update}
|
||||
|
||||
def do_mail(self ,cr, uid, ids, context=None):
|
||||
@@ -225,7 +231,7 @@ class account_followup_print_all(osv.osv_memory):
|
||||
partners.append(line.partner_id)
|
||||
dict_lines[line.partner_id.id] =line
|
||||
for partner in partners:
|
||||
ids_lines = move_obj.search(cr,uid,[('partner_id','=',partner.id),('reconcile_id','=',False),('account_id.type','in',['receivable'])])
|
||||
ids_lines = move_obj.search(cr,uid,[('partner_id','=',partner.id),('reconcile_id','=',False),('account_id.type','in',['receivable']),('company_id','=',context.get('company_id', False))])
|
||||
data_lines = move_obj.browse(cr, uid, ids_lines, context=context)
|
||||
followup_data = dict_lines[partner.id]
|
||||
dest = False
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
<group col="4" colspan="6">
|
||||
<field name="followup_id"/>
|
||||
<field name="date"/>
|
||||
<newline/>
|
||||
</group>
|
||||
<separator colspan="4"/>
|
||||
<group col="2" colspan="4">
|
||||
@@ -81,7 +80,7 @@
|
||||
<notebook>
|
||||
<page string="Partner Selection">
|
||||
<separator string="Select Partners to Remind" colspan="4"/>
|
||||
<field name="partner_ids" colspan="4" nolabel="1" context="{'search_default_balance_positive': 1}"/>
|
||||
<field name="partner_ids" colspan="4" nolabel="1" context="{'search_default_balance_positive': 1}" domain="[('company_id','=',context.get('company_id',False))]"/>
|
||||
</page>
|
||||
<page string="Email Settings">
|
||||
<field name="email_conf" colspan="4"/>
|
||||
@@ -137,7 +136,5 @@
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
-
|
||||
Now I create a Vendor Voucher
|
||||
-
|
||||
!record {model: account.voucher, id: account_voucher_voucheraxelor0}:
|
||||
!record {model: account.voucher, id: account_voucher_voucheraxelor0, view: False}:
|
||||
account_id: account.cash
|
||||
amount: 1000.0
|
||||
company_id: base.main_company
|
||||
|
||||
+258
-231
@@ -43,22 +43,17 @@ class audittrail_rule(osv.osv):
|
||||
"log_create": fields.boolean("Log Creates",help="Select this if you want to keep track of creation on any record of the object of this rule"),
|
||||
"log_action": fields.boolean("Log Action",help="Select this if you want to keep track of actions on the object of this rule"),
|
||||
"log_workflow": fields.boolean("Log Workflow",help="Select this if you want to keep track of workflow on any record of the object of this rule"),
|
||||
"state": fields.selection((("draft", "Draft"),
|
||||
("subscribed", "Subscribed")),
|
||||
"State", required=True),
|
||||
"state": fields.selection((("draft", "Draft"), ("subscribed", "Subscribed")), "State", required=True),
|
||||
"action_id": fields.many2one('ir.actions.act_window', "Action ID"),
|
||||
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'state': lambda *a: 'draft',
|
||||
'log_create': lambda *a: 1,
|
||||
'log_unlink': lambda *a: 1,
|
||||
'log_write': lambda *a: 1,
|
||||
'state': 'draft',
|
||||
'log_create': 1,
|
||||
'log_unlink': 1,
|
||||
'log_write': 1,
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
('model_uniq', 'unique (object_id)', """There is a rule defined on this object\n You cannot define another one the same object!""")
|
||||
('model_uniq', 'unique (object_id)', """There is already a rule defined on this object\n You cannot define another: please edit the existing one.""")
|
||||
]
|
||||
__functions = {}
|
||||
|
||||
@@ -178,54 +173,33 @@ class audittrail_log_line(osv.osv):
|
||||
class audittrail_objects_proxy(object_proxy):
|
||||
""" Uses Object proxy for auditing changes on object of subscribed Rules"""
|
||||
|
||||
def get_value_text(self, cr, uid, field_name, values, model, context=None):
|
||||
def get_value_text(self, cr, uid, pool, resource_pool, method, field, value):
|
||||
"""
|
||||
Gets textual values for the fields.
|
||||
If the field is a many2one, it returns the name.
|
||||
If it's a one2many or a many2many, it returns a list of name.
|
||||
In other cases, it just returns the value.
|
||||
:param cr: the current row, from the database cursor,
|
||||
:param uid: the current user’s ID for security checks,
|
||||
:param pool: current db's pooler object.
|
||||
:param resource_pool: pooler object of the model which values are being changed.
|
||||
:param field: for which the text value is to be returned.
|
||||
:param value: value of the field.
|
||||
:param recursive: True or False, True will repeat the process recursively
|
||||
:return: string value or a list of values(for O2M/M2M)
|
||||
"""
|
||||
Gets textual values for the fields
|
||||
e.g.: For field of type many2one it gives its name value instead of id
|
||||
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param field_name: List of fields for text values
|
||||
@param values: Values for field to be converted into textual values
|
||||
@return: values: List of textual values for given fields
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
if field_name in('__last_update','id'):
|
||||
return values
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
field_pool = pool.get('ir.model.fields')
|
||||
model_pool = pool.get('ir.model')
|
||||
obj_pool = pool.get(model.model)
|
||||
if obj_pool._inherits:
|
||||
inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
|
||||
field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', 'in', (model.id, inherits_ids[0]))])
|
||||
field_obj = (resource_pool._all_columns.get(field)).column
|
||||
if field_obj._type in ('one2many','many2many'):
|
||||
data = pool.get(field_obj._obj).name_get(cr, uid, value)
|
||||
#return the modifications on x2many fields as a list of names
|
||||
res = map(lambda x:x[1], data)
|
||||
elif field_obj._type == 'many2one':
|
||||
#return the modifications on a many2one field as its value returned by name_get()
|
||||
res = value and value[1] or value
|
||||
else:
|
||||
field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', '=', model.id)])
|
||||
field_id = field_ids and field_ids[0] or False
|
||||
assert field_id, _("'%s' field does not exist in '%s' model" %(field_name, model.model))
|
||||
|
||||
field = field_pool.read(cr, uid, field_id)
|
||||
relation_model = field['relation']
|
||||
relation_model_pool = relation_model and pool.get(relation_model) or False
|
||||
|
||||
if field['ttype'] == 'many2one':
|
||||
res = False
|
||||
relation_id = False
|
||||
if values and type(values) == tuple:
|
||||
relation_id = values[0]
|
||||
if relation_id and relation_model_pool:
|
||||
relation_model_object = relation_model_pool.read(cr, uid, relation_id, [relation_model_pool._rec_name])
|
||||
res = relation_model_object[relation_model_pool._rec_name]
|
||||
return res
|
||||
|
||||
elif field['ttype'] in ('many2many','one2many'):
|
||||
res = []
|
||||
for relation_model_object in relation_model_pool.read(cr, uid, values, [relation_model_pool._rec_name]):
|
||||
res.append(relation_model_object[relation_model_pool._rec_name])
|
||||
return res
|
||||
|
||||
return values
|
||||
res = value
|
||||
return res
|
||||
|
||||
def create_log_line(self, cr, uid, log_id, model, lines=[]):
|
||||
"""
|
||||
@@ -233,7 +207,7 @@ class audittrail_objects_proxy(object_proxy):
|
||||
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param model: Object who's values are being changed
|
||||
@param model: Object which values are being changed
|
||||
@param lines: List of values for line is to be created
|
||||
"""
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
@@ -241,216 +215,273 @@ class audittrail_objects_proxy(object_proxy):
|
||||
model_pool = pool.get('ir.model')
|
||||
field_pool = pool.get('ir.model.fields')
|
||||
log_line_pool = pool.get('audittrail.log.line')
|
||||
#start Loop
|
||||
for line in lines:
|
||||
if line['name'] in('__last_update','id'):
|
||||
continue
|
||||
field_obj = obj_pool._all_columns.get(line['name'])
|
||||
assert field_obj, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
|
||||
field_obj = field_obj.column
|
||||
old_value = line.get('old_value', '')
|
||||
new_value = line.get('new_value', '')
|
||||
search_models = [model.id]
|
||||
if obj_pool._inherits:
|
||||
inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])])
|
||||
field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (model.id, inherits_ids[0]))])
|
||||
else:
|
||||
field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', '=', model.id)])
|
||||
field_id = field_ids and field_ids[0] or False
|
||||
assert field_id, _("'%s' field does not exist in '%s' model" %(line['name'], model.model))
|
||||
|
||||
field = field_pool.read(cr, uid, field_id)
|
||||
old_value = 'old_value' in line and line['old_value'] or ''
|
||||
new_value = 'new_value' in line and line['new_value'] or ''
|
||||
old_value_text = 'old_value_text' in line and line['old_value_text'] or ''
|
||||
new_value_text = 'new_value_text' in line and line['new_value_text'] or ''
|
||||
|
||||
if old_value_text == new_value_text:
|
||||
continue
|
||||
if field['ttype'] == 'many2one':
|
||||
if type(old_value) == tuple:
|
||||
old_value = old_value[0]
|
||||
if type(new_value) == tuple:
|
||||
new_value = new_value[0]
|
||||
search_models += model_pool.search(cr, uid, [('model', 'in', obj_pool._inherits.keys())])
|
||||
field_id = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', search_models)])
|
||||
if field_obj._type == 'many2one':
|
||||
old_value = old_value and old_value[0] or old_value
|
||||
new_value = new_value and new_value[0] or new_value
|
||||
vals = {
|
||||
"log_id": log_id,
|
||||
"field_id": field_id,
|
||||
"field_id": field_id and field_id[0] or False,
|
||||
"old_value": old_value,
|
||||
"new_value": new_value,
|
||||
"old_value_text": old_value_text,
|
||||
"new_value_text": new_value_text,
|
||||
"field_description": field['field_description']
|
||||
"old_value_text": line.get('old_value_text', ''),
|
||||
"new_value_text": line.get('new_value_text', ''),
|
||||
"field_description": field_obj.string
|
||||
}
|
||||
line_id = log_line_pool.create(cr, uid, vals)
|
||||
cr.commit()
|
||||
#End Loop
|
||||
return True
|
||||
|
||||
def log_fct(self, cr, uid, model, method, fct_src, *args):
|
||||
def log_fct(self, cr, uid_orig, model, method, fct_src, *args):
|
||||
"""
|
||||
Logging function: This function is performs logging oprations according to method
|
||||
@param db: the current database
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param object: Object who's values are being changed
|
||||
@param method: method to log: create, read, write, unlink
|
||||
Logging function: This function is performing the logging operation
|
||||
@param model: Object whose values are being changed
|
||||
@param method: method to log: create, read, write, unlink, action or workflow action
|
||||
@param fct_src: execute method of Object proxy
|
||||
|
||||
@return: Returns result as per method of Object proxy
|
||||
"""
|
||||
uid_orig = uid
|
||||
uid = 1
|
||||
res2 = args
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
resource_pool = pool.get(model)
|
||||
log_pool = pool.get('audittrail.log')
|
||||
model_pool = pool.get('ir.model')
|
||||
|
||||
model_ids = model_pool.search(cr, uid, [('model', '=', model)])
|
||||
model_ids = model_pool.search(cr, 1, [('model', '=', model)])
|
||||
model_id = model_ids and model_ids[0] or False
|
||||
assert model_id, _("'%s' Model does not exist..." %(model))
|
||||
model = model_pool.browse(cr, uid, model_id)
|
||||
model = model_pool.browse(cr, 1, model_id)
|
||||
|
||||
if method in ('create'):
|
||||
res_id = fct_src(cr, uid_orig, model.model, method, *args)
|
||||
resource = resource_pool.read(cr, uid, res_id, args[0].keys())
|
||||
vals = {
|
||||
"method": method,
|
||||
"object_id": model.id,
|
||||
"user_id": uid_orig,
|
||||
"res_id": resource['id'],
|
||||
}
|
||||
if 'id' in resource:
|
||||
del resource['id']
|
||||
log_id = log_pool.create(cr, uid, vals)
|
||||
lines = []
|
||||
for field in resource:
|
||||
line = {
|
||||
'name': field,
|
||||
'new_value': resource[field],
|
||||
'new_value_text': self.get_value_text(cr, uid, field, resource[field], model)
|
||||
}
|
||||
lines.append(line)
|
||||
self.create_log_line(cr, uid, log_id, model, lines)
|
||||
# fields to log. currently only used by log on read()
|
||||
field_list = []
|
||||
old_values = new_values = {}
|
||||
|
||||
return res_id
|
||||
|
||||
elif method in ('read'):
|
||||
res_ids = args[0]
|
||||
old_values = {}
|
||||
if method == 'create':
|
||||
res = fct_src(cr, uid_orig, model.model, method, *args)
|
||||
if type(res) == list:
|
||||
for v in res:
|
||||
old_values[v['id']] = v
|
||||
else:
|
||||
old_values[res['id']] = res
|
||||
for res_id in old_values:
|
||||
vals = {
|
||||
"method": method,
|
||||
"object_id": model.id,
|
||||
"user_id": uid_orig,
|
||||
"res_id": res_id,
|
||||
|
||||
}
|
||||
log_id = log_pool.create(cr, uid, vals)
|
||||
lines = []
|
||||
for field in old_values[res_id]:
|
||||
line = {
|
||||
'name': field,
|
||||
'old_value': old_values[res_id][field],
|
||||
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
|
||||
}
|
||||
lines.append(line)
|
||||
|
||||
self.create_log_line(cr, uid, log_id, model, lines)
|
||||
return res
|
||||
|
||||
elif method in ('unlink'):
|
||||
res_ids = args[0]
|
||||
old_values = {}
|
||||
for res_id in res_ids:
|
||||
old_values[res_id] = resource_pool.read(cr, uid, res_id)
|
||||
|
||||
for res_id in res_ids:
|
||||
vals = {
|
||||
"method": method,
|
||||
"object_id": model.id,
|
||||
"user_id": uid_orig,
|
||||
"res_id": res_id,
|
||||
|
||||
}
|
||||
log_id = log_pool.create(cr, uid, vals)
|
||||
lines = []
|
||||
for field in old_values[res_id]:
|
||||
if field in ('id'):
|
||||
continue
|
||||
line = {
|
||||
'name': field,
|
||||
'old_value': old_values[res_id][field],
|
||||
'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model)
|
||||
}
|
||||
lines.append(line)
|
||||
|
||||
self.create_log_line(cr, uid, log_id, model, lines)
|
||||
if res:
|
||||
res_ids = [res]
|
||||
new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
|
||||
elif method == 'read':
|
||||
res = fct_src(cr, uid_orig, model.model, method, *args)
|
||||
return res
|
||||
else:
|
||||
# build the res_ids and the old_values dict. Here we don't use get_data() to
|
||||
# avoid performing an additional read()
|
||||
res_ids = []
|
||||
for record in res:
|
||||
res_ids.append(record['id'])
|
||||
old_values[(model.id, record['id'])] = {'value': record, 'text': record}
|
||||
# log only the fields read
|
||||
field_list = args[1]
|
||||
elif method == 'unlink':
|
||||
res_ids = args[0]
|
||||
old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
|
||||
res = fct_src(cr, uid_orig, model.model, method, *args)
|
||||
else: # method is write, action or workflow action
|
||||
res_ids = []
|
||||
res = True
|
||||
if args:
|
||||
res_ids = args[0]
|
||||
old_values = {}
|
||||
fields = []
|
||||
if len(args)>1 and type(args[1]) == dict:
|
||||
fields = args[1].keys()
|
||||
if type(res_ids) in (long, int):
|
||||
if isinstance(res_ids, (long, int)):
|
||||
res_ids = [res_ids]
|
||||
if res_ids:
|
||||
for resource in resource_pool.read(cr, uid, res_ids):
|
||||
resource_id = resource['id']
|
||||
if 'id' in resource:
|
||||
del resource['id']
|
||||
old_values_text = {}
|
||||
old_value = {}
|
||||
for field in resource.keys():
|
||||
old_value[field] = resource[field]
|
||||
old_values_text[field] = self.get_value_text(cr, uid, field, resource[field], model)
|
||||
old_values[resource_id] = {'text':old_values_text, 'value': old_value}
|
||||
|
||||
# store the old values into a dictionary
|
||||
old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
|
||||
# process the original function, workflow trigger...
|
||||
res = fct_src(cr, uid_orig, model.model, method, *args)
|
||||
|
||||
if method == 'copy':
|
||||
res_ids = [res]
|
||||
if res_ids:
|
||||
for resource in resource_pool.read(cr, uid, res_ids):
|
||||
resource_id = resource['id']
|
||||
if 'id' in resource:
|
||||
del resource['id']
|
||||
vals = {
|
||||
"method": method,
|
||||
"object_id": model.id,
|
||||
"user_id": uid_orig,
|
||||
"res_id": resource_id,
|
||||
}
|
||||
# check the new values and store them into a dictionary
|
||||
new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method)
|
||||
# compare the old and new values and create audittrail log if needed
|
||||
self.process_data(cr, uid_orig, pool, res_ids, model, method, old_values, new_values, field_list)
|
||||
return res
|
||||
|
||||
def get_data(self, cr, uid, pool, res_ids, model, method):
|
||||
"""
|
||||
This function simply read all the fields of the given res_ids, and also recurisvely on
|
||||
all records of a x2m fields read that need to be logged. Then it returns the result in
|
||||
convenient structure that will be used as comparison basis.
|
||||
|
||||
log_id = log_pool.create(cr, uid, vals)
|
||||
lines = []
|
||||
for field in resource.keys():
|
||||
line = {
|
||||
'name': field,
|
||||
'new_value': resource[field],
|
||||
'old_value': old_values[resource_id]['value'][field],
|
||||
'new_value_text': self.get_value_text(cr, uid, field, resource[field], model),
|
||||
'old_value_text': old_values[resource_id]['text'][field]
|
||||
}
|
||||
lines.append(line)
|
||||
:param cr: the current row, from the database cursor,
|
||||
:param uid: the current user’s ID. This parameter is currently not used as every
|
||||
operation to get data is made as super admin. Though, it could be usefull later.
|
||||
:param pool: current db's pooler object.
|
||||
:param res_ids: Id's of resource to be logged/compared.
|
||||
:param model: Object whose values are being changed
|
||||
:param method: method to log: create, read, unlink, write, actions, workflow actions
|
||||
:return: dict mapping a tuple (model_id, resource_id) with its value and textual value
|
||||
{ (model_id, resource_id): { 'value': ...
|
||||
'textual_value': ...
|
||||
},
|
||||
}
|
||||
"""
|
||||
data = {}
|
||||
resource_pool = pool.get(model.model)
|
||||
# read all the fields of the given resources in super admin mode
|
||||
for resource in resource_pool.read(cr, 1, res_ids):
|
||||
values = {}
|
||||
values_text = {}
|
||||
resource_id = resource['id']
|
||||
# loop on each field on the res_ids we just have read
|
||||
for field in resource:
|
||||
if field in ('__last_update', 'id'):
|
||||
continue
|
||||
values[field] = resource[field]
|
||||
# get the textual value of that field for this record
|
||||
values_text[field] = self.get_value_text(cr, 1, pool, resource_pool, method, field, resource[field])
|
||||
|
||||
self.create_log_line(cr, uid, log_id, model, lines)
|
||||
return res
|
||||
field_obj = resource_pool._all_columns.get(field).column
|
||||
if field_obj._type in ('one2many','many2many'):
|
||||
# check if an audittrail rule apply in super admin mode
|
||||
if self.check_rules(cr, 1, field_obj._obj, method):
|
||||
# check if the model associated to a *2m field exists, in super admin mode
|
||||
x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
|
||||
x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
|
||||
assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
|
||||
x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
|
||||
#recursive call on x2m fields that need to be checked too
|
||||
data.update(self.get_data(cr, 1, pool, resource[field], x2m_model, method))
|
||||
data[(model.id, resource_id)] = {'text':values_text, 'value': values}
|
||||
return data
|
||||
|
||||
def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=[]):
|
||||
"""
|
||||
This function compares the old data (i.e before the method was executed) and the new data
|
||||
(after the method was executed) and returns a structure with all the needed information to
|
||||
log those differences.
|
||||
|
||||
:param cr: the current row, from the database cursor,
|
||||
:param uid: the current user’s ID. This parameter is currently not used as every
|
||||
operation to get data is made as super admin. Though, it could be usefull later.
|
||||
:param pool: current db's pooler object.
|
||||
:param model: model object which values are being changed
|
||||
:param resource_id: ID of record to which values are being changed
|
||||
:param method: method to log: create, read, unlink, write, actions, workflow actions
|
||||
:param old_values: dict of values read before execution of the method
|
||||
:param new_values: dict of values read after execution of the method
|
||||
:param field_list: optional argument containing the list of fields to log. Currently only
|
||||
used when performing a read, it could be usefull later on if we want to log the write
|
||||
on specific fields only.
|
||||
|
||||
:return: dictionary with
|
||||
* keys: tuples build as ID of model object to log and ID of resource to log
|
||||
* values: list of all the changes in field values for this couple (model, resource)
|
||||
return {
|
||||
(model.id, resource_id): []
|
||||
}
|
||||
|
||||
The reason why the structure returned is build as above is because when modifying an existing
|
||||
record (res.partner, for example), we may have to log a change done in a x2many field (on
|
||||
res.partner.address, for example)
|
||||
"""
|
||||
key = (model.id, resource_id)
|
||||
lines = {
|
||||
key: []
|
||||
}
|
||||
# loop on all the fields
|
||||
for field_name, field_definition in pool.get(model.model)._all_columns.items():
|
||||
#if the field_list param is given, skip all the fields not in that list
|
||||
if field_list and field_name not in field_list:
|
||||
continue
|
||||
field_obj = field_definition.column
|
||||
if field_obj._type in ('one2many','many2many'):
|
||||
# checking if an audittrail rule apply in super admin mode
|
||||
if self.check_rules(cr, 1, field_obj._obj, method):
|
||||
# checking if the model associated to a *2m field exists, in super admin mode
|
||||
x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)])
|
||||
x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False
|
||||
assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj))
|
||||
x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id)
|
||||
# the resource_ids that need to be checked are the sum of both old and previous values (because we
|
||||
# need to log also creation or deletion in those lists).
|
||||
x2m_old_values_ids = old_values.get(key, {'value': {}})['value'].get(field_name, [])
|
||||
x2m_new_values_ids = new_values.get(key, {'value': {}})['value'].get(field_name, [])
|
||||
# We use list(set(...)) to remove duplicates.
|
||||
res_ids = list(set(x2m_old_values_ids + x2m_new_values_ids))
|
||||
for res_id in res_ids:
|
||||
lines.update(self.prepare_audittrail_log_line(cr, 1, pool, x2m_model, res_id, method, old_values, new_values, field_list))
|
||||
# if the value value is different than the old value: record the change
|
||||
if key not in old_values or key not in new_values or old_values[key]['value'][field_name] != new_values[key]['value'][field_name]:
|
||||
data = {
|
||||
'name': field_name,
|
||||
'new_value': key in new_values and new_values[key]['value'].get(field_name),
|
||||
'old_value': key in old_values and old_values[key]['value'].get(field_name),
|
||||
'new_value_text': key in new_values and new_values[key]['text'].get(field_name),
|
||||
'old_value_text': key in old_values and old_values[key]['text'].get(field_name)
|
||||
}
|
||||
lines[key].append(data)
|
||||
return lines
|
||||
|
||||
def process_data(self, cr, uid, pool, res_ids, model, method, old_values={}, new_values={}, field_list=[]):
|
||||
"""
|
||||
This function processes and iterates recursively to log the difference between the old
|
||||
data (i.e before the method was executed) and the new data and creates audittrail log
|
||||
accordingly.
|
||||
|
||||
:param cr: the current row, from the database cursor,
|
||||
:param uid: the current user’s ID,
|
||||
:param pool: current db's pooler object.
|
||||
:param res_ids: Id's of resource to be logged/compared.
|
||||
:param model: model object which values are being changed
|
||||
:param method: method to log: create, read, unlink, write, actions, workflow actions
|
||||
:param old_values: dict of values read before execution of the method
|
||||
:param new_values: dict of values read after execution of the method
|
||||
:param field_list: optional argument containing the list of fields to log. Currently only
|
||||
used when performing a read, it could be usefull later on if we want to log the write
|
||||
on specific fields only.
|
||||
:return: True
|
||||
"""
|
||||
# loop on all the given ids
|
||||
for res_id in res_ids:
|
||||
# compare old and new values and get audittrail log lines accordingly
|
||||
lines = self.prepare_audittrail_log_line(cr, uid, pool, model, res_id, method, old_values, new_values, field_list)
|
||||
|
||||
# if at least one modification has been found
|
||||
for model_id, resource_id in lines:
|
||||
vals = {
|
||||
'method': method,
|
||||
'object_id': model_id,
|
||||
'user_id': uid,
|
||||
'res_id': resource_id,
|
||||
}
|
||||
if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
|
||||
# the resource was not existing so we are forcing the method to 'create'
|
||||
# (because it could also come with the value 'write' if we are creating
|
||||
# new record through a one2many field)
|
||||
vals.update({'method': 'create'})
|
||||
if (model_id, resource_id) not in new_values and method not in ('copy', 'read'):
|
||||
# the resource is not existing anymore so we are forcing the method to 'unlink'
|
||||
# (because it could also come with the value 'write' if we are deleting the
|
||||
# record through a one2many field)
|
||||
vals.update({'method': 'unlink'})
|
||||
# create the audittrail log in super admin mode, only if a change has been detected
|
||||
if lines[(model_id, resource_id)]:
|
||||
log_id = pool.get('audittrail.log').create(cr, 1, vals)
|
||||
model = pool.get('ir.model').browse(cr, uid, model_id)
|
||||
self.create_log_line(cr, 1, log_id, model, lines[(model_id, resource_id)])
|
||||
return True
|
||||
|
||||
def check_rules(self, cr, uid, model, method):
|
||||
"""
|
||||
Checks if auditrails is installed for that db and then if one rule match
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID,
|
||||
@param model: value of _name of the object which values are being changed
|
||||
@param method: method to log: create, read, unlink,write,actions,workflow actions
|
||||
@return: True or False
|
||||
"""
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
# Check if auditrails is installed for that db and then if one rule match
|
||||
if 'audittrail.rule' in pool.models:
|
||||
model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', model)])
|
||||
model_id = model_ids and model_ids[0] or False
|
||||
if model_id:
|
||||
rule_ids = pool.get('audittrail.rule').search(cr, 1, [('object_id', '=', model_id), ('state', '=', 'subscribed')])
|
||||
for rule in pool.get('audittrail.rule').read(cr, 1, rule_ids, ['user_id','log_read','log_write','log_create','log_unlink','log_action','log_workflow']):
|
||||
if len(rule['user_id'])==0 or uid in rule['user_id']:
|
||||
if len(rule['user_id']) == 0 or uid in rule['user_id']:
|
||||
if rule.get('log_'+method,0):
|
||||
return True
|
||||
elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'):
|
||||
@@ -460,18 +491,14 @@ class audittrail_objects_proxy(object_proxy):
|
||||
def execute_cr(self, cr, uid, model, method, *args, **kw):
|
||||
fct_src = super(audittrail_objects_proxy, self).execute_cr
|
||||
if self.check_rules(cr,uid,model,method):
|
||||
res = self.log_fct(cr, uid, model, method, fct_src, *args)
|
||||
else:
|
||||
res = fct_src(cr, uid, model, method, *args)
|
||||
return res
|
||||
return self.log_fct(cr, uid, model, method, fct_src, *args)
|
||||
return fct_src(cr, uid, model, method, *args)
|
||||
|
||||
def exec_workflow_cr(self, cr, uid, model, method, *args, **argv):
|
||||
fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr
|
||||
if self.check_rules(cr,uid,model,'workflow'):
|
||||
res = self.log_fct(cr, uid, model, method, fct_src, *args)
|
||||
else:
|
||||
res = fct_src(cr, uid, model, method, *args)
|
||||
return res
|
||||
return self.log_fct(cr, uid, model, method, fct_src, *args)
|
||||
return fct_src(cr, uid, model, method, *args)
|
||||
|
||||
audittrail_objects_proxy()
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,73 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:17+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: base_crypt
|
||||
#: sql_constraint:res.users:0
|
||||
msgid "You can not have two users with the same login !"
|
||||
msgstr "Podètz pas aver dos utilizaires amb lo meteis identificant !"
|
||||
|
||||
#. module: base_crypt
|
||||
#: model:ir.model,name:base_crypt.model_res_users
|
||||
msgid "res.users"
|
||||
msgstr "res.users"
|
||||
|
||||
#. module: base_crypt
|
||||
#: constraint:res.users:0
|
||||
msgid "The chosen company is not in the allowed companies for this user"
|
||||
msgstr ""
|
||||
"La societat causida fa pas partida de las societats autorizadas per aqueste "
|
||||
"utilizaire"
|
||||
|
||||
#. module: base_crypt
|
||||
#: code:addons/base_crypt/crypt.py:132
|
||||
#, python-format
|
||||
msgid "Please specify the password !"
|
||||
msgstr "Entratz un senhal"
|
||||
|
||||
#. module: base_crypt
|
||||
#: model:ir.module.module,shortdesc:base_crypt.module_meta_information
|
||||
msgid "Base - Password Encryption"
|
||||
msgstr "Basa - Chifratge del senhal"
|
||||
|
||||
#. module: base_crypt
|
||||
#: code:addons/base_crypt/crypt.py:132
|
||||
#, python-format
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
#. module: base_crypt
|
||||
#: model:ir.module.module,description:base_crypt.module_meta_information
|
||||
msgid ""
|
||||
"This module replaces the cleartext password in the database with a password "
|
||||
"hash,\n"
|
||||
"preventing anyone from reading the original password.\n"
|
||||
"For your existing user base, the removal of the cleartext passwords occurs "
|
||||
"the first time\n"
|
||||
"a user logs into the database, after installing base_crypt.\n"
|
||||
"After installing this module it won't be possible to recover a forgotten "
|
||||
"password for your\n"
|
||||
"users, the only solution is for an admin to set a new password.\n"
|
||||
"\n"
|
||||
"Note: installing this module does not mean you can ignore basic security "
|
||||
"measures,\n"
|
||||
"as the password is still transmitted unencrypted on the network (by the "
|
||||
"client),\n"
|
||||
"unless you are using a secure protocol such as XML-RPCS.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
@@ -0,0 +1,32 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:19+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: base_tools
|
||||
#: model:ir.module.module,shortdesc:base_tools.module_meta_information
|
||||
msgid "Common base for tools modules"
|
||||
msgstr "Basa comuna pels moduls utilitaris"
|
||||
|
||||
#. module: base_tools
|
||||
#: model:ir.module.module,description:base_tools.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" "
|
||||
@@ -158,7 +158,7 @@
|
||||
</record>
|
||||
|
||||
<!-- bind adminitration dashboard to the root administration -->
|
||||
<menuitem id="base.menu_administration" icon="terp-administration" name="Administration" sequence="50" action="open_board_administration_form"/>
|
||||
<menuitem id="base.menu_administration" icon="terp-administration" name="Settings" sequence="50" action="open_board_administration_form"/>
|
||||
|
||||
<!-- add a menu item in adminitration/reporting/dashboards -->
|
||||
<menuitem id="base.menu_reporting" name="Reporting" parent="base.menu_administration" sequence="11" groups="base.group_extended"/>
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:14+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:19+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: claim_from_delivery
|
||||
#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
|
||||
msgid "Claim"
|
||||
msgstr "Reclamacion"
|
||||
|
||||
#. module: claim_from_delivery
|
||||
#: model:ir.module.module,description:claim_from_delivery.module_meta_information
|
||||
msgid "Create Claim from delivery order:\n"
|
||||
msgstr "Crear una reclamacion sus un bon de liurason :\n"
|
||||
|
||||
#. module: claim_from_delivery
|
||||
#: model:ir.module.module,shortdesc:claim_from_delivery.module_meta_information
|
||||
msgid "Claim from delivery"
|
||||
msgstr "Reclamacion sus la liurason"
|
||||
+10
-4
@@ -42,11 +42,17 @@ class crm_lead(crm_case, osv.osv):
|
||||
_order = "priority,date_action,id desc"
|
||||
_inherit = ['mail.thread','res.partner.address']
|
||||
|
||||
def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
|
||||
context = context or {}
|
||||
def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None):
|
||||
stage_obj = self.pool.get('crm.case.stage')
|
||||
stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids), ('case_default','=',1)], context=context)
|
||||
return stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
order = stage_obj._order
|
||||
if read_group_order == 'stage_id desc':
|
||||
# lame hack to allow reverting search, should just work in the trivial case
|
||||
order = "%s desc" % order
|
||||
stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids),('case_default','=',1)], order=order, context=context)
|
||||
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
# restore order of the search
|
||||
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
|
||||
return result
|
||||
|
||||
_group_by_full = {
|
||||
'stage_id': _read_group_stage_ids
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:20+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: crm_caldav
|
||||
#: model:ir.actions.act_window,name:crm_caldav.action_caldav_browse
|
||||
msgid "Caldav Browse"
|
||||
msgstr "Navigar dins CalDav"
|
||||
|
||||
#. module: crm_caldav
|
||||
#: model:ir.model,name:crm_caldav.model_crm_meeting
|
||||
msgid "Meeting"
|
||||
msgstr "Rendètz-vos"
|
||||
|
||||
#. module: crm_caldav
|
||||
#: model:ir.module.module,shortdesc:crm_caldav.module_meta_information
|
||||
msgid "Extended Module to Add CalDav feature on Meeting"
|
||||
msgstr "Modul espandit per apondre la foncionalitat CalDav a las acampadas"
|
||||
|
||||
#. module: crm_caldav
|
||||
#: model:ir.module.module,description:crm_caldav.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" New Features in Meeting:\n"
|
||||
" * Share meeting with other calendar clients like sunbird\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Foncionalitats novèlas per las acampadas :\n"
|
||||
" * Partiment d'acampadas amb d'autres clients de calendièrs coma "
|
||||
"sunbird\n"
|
||||
|
||||
#. module: crm_caldav
|
||||
#: model:ir.ui.menu,name:crm_caldav.menu_caldav_browse
|
||||
msgid "Synchronyze this calendar"
|
||||
msgstr "Sincronizar aqueste calendièr"
|
||||
@@ -0,0 +1,135 @@
|
||||
# Arabic translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-18 07:10+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Arabic <ar@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-19 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.model,name:document_ftp.model_document_ftp_configuration
|
||||
msgid "Auto Directory Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.configuration:0
|
||||
msgid ""
|
||||
"Indicate the network address on which your OpenERP server should be "
|
||||
"reachable for end-users. This depends on your network topology and "
|
||||
"configuration, and will only affect the links displayed to the users. The "
|
||||
"format is HOST:PORT and the default host (localhost) is only suitable for "
|
||||
"access from the server machine itself.."
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: field:document.ftp.configuration,progress:0
|
||||
msgid "Configuration Progress"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.actions.url,name:document_ftp.action_document_browse
|
||||
msgid "Browse Files"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: field:document.ftp.configuration,config_logo:0
|
||||
msgid "Image"
|
||||
msgstr "الصورة"
|
||||
|
||||
#. module: document_ftp
|
||||
#: field:document.ftp.configuration,host:0
|
||||
msgid "Address"
|
||||
msgstr "العنوان"
|
||||
|
||||
#. module: document_ftp
|
||||
#: field:document.ftp.browse,url:0
|
||||
msgid "FTP Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.actions.act_window,name:document_ftp.action_config_auto_directory
|
||||
msgid "FTP Server Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.module.module,description:document_ftp.module_meta_information
|
||||
msgid ""
|
||||
"This is a support FTP Interface with document management system.\n"
|
||||
" With this module you would not only be able to access documents through "
|
||||
"OpenERP\n"
|
||||
" but you would also be able to connect with them through the file system "
|
||||
"using the\n"
|
||||
" FTP client.\n"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.browse:0
|
||||
msgid "_Browse"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: help:document.ftp.configuration,host:0
|
||||
msgid ""
|
||||
"Server address or IP and port to which users should connect to for DMS access"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.ui.menu,name:document_ftp.menu_document_browse
|
||||
msgid "Shared Repository (FTP)"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.browse:0
|
||||
msgid "_Cancel"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.configuration:0
|
||||
msgid "Configure FTP Server"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.module.module,shortdesc:document_ftp.module_meta_information
|
||||
msgid "Integrated FTP Server with Document Management System"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.configuration:0
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.model,name:document_ftp.model_document_ftp_browse
|
||||
msgid "Document FTP Browse"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.configuration:0
|
||||
msgid "Knowledge Application Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: model:ir.actions.act_window,name:document_ftp.action_ftp_browse
|
||||
msgid "Document Browse"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.browse:0
|
||||
msgid "Browse Document"
|
||||
msgstr ""
|
||||
|
||||
#. module: document_ftp
|
||||
#: view:document.ftp.configuration:0
|
||||
msgid "res_config_contents"
|
||||
msgstr ""
|
||||
@@ -18,10 +18,17 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
import logging
|
||||
|
||||
import models
|
||||
import edi_service
|
||||
from models.edi import EDIMixin, edi_document
|
||||
|
||||
# web
|
||||
import controllers
|
||||
try:
|
||||
import controllers
|
||||
except ImportError:
|
||||
logging.getLogger('init.load').warn(
|
||||
"""Could not load openerp-web section of EDI, EDI will not behave correctly
|
||||
|
||||
To fix, launch openerp-web in embedded mode""")
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
openerp.edi = function(openerp) {
|
||||
openerp.web.qweb.add_template("/web/static/src/xml/base.xml");
|
||||
openerp.web.qweb.add_template("/edi/static/src/xml/edi.xml");
|
||||
openerp.web.qweb.add_template("/edi/static/src/xml/edi_account.xml");
|
||||
openerp.web.qweb.add_template("/edi/static/src/xml/edi_sale_purchase.xml");
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<h1 class="oe_edi_doc_title">Invoice <t t-esc="doc.internal_number"/>: <t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
|
||||
<h1 class="oe_edi_doc_title">Invoice <t t-esc="doc.internal_number"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
|
||||
<table width="100%" class="oe_edi_data oe_edi_shade">
|
||||
<tr class="oe_edi_floor">
|
||||
<th align="left">Description</th>
|
||||
@@ -60,10 +60,10 @@
|
||||
<pre class="oe_edi_inner_note"><t t-esc="invoice_line.note"/></pre>
|
||||
</t>
|
||||
</td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.quantity)"/> <t t-esc="invoice_line.uos_id[1]"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.price_unit)"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.discount)"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',invoice_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.quantity)"/> <t t-esc="invoice_line.uos_id[1]"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_unit)"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.discount)"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',invoice_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
|
||||
</tr>
|
||||
</t>
|
||||
<tr>
|
||||
@@ -73,7 +73,7 @@
|
||||
Net Total:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -84,7 +84,7 @@
|
||||
Taxes:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -95,7 +95,7 @@
|
||||
Total:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
@@ -110,8 +110,8 @@
|
||||
<t t-if="doc.tax_line"><t t-foreach="doc.tax_line" t-as="tax_line">
|
||||
<tr class="oe_edi_data_row">
|
||||
<td align="left"><t t-esc="tax_line.name"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',tax_line.base_amount)"/> <t t-esc="doc.currency.code"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',tax_line.amount)"/> <t t-esc="doc.currency.code"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.base_amount)"/> <t t-esc="doc.currency.code"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',tax_line.amount)"/> <t t-esc="doc.currency.code"/></td>
|
||||
</tr>
|
||||
</t>
|
||||
</t>
|
||||
@@ -145,7 +145,7 @@
|
||||
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
|
||||
</div>
|
||||
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
|
||||
Please transfer <strong><t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
|
||||
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
|
||||
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the invoice header)
|
||||
using one of the following bank accounts. Be sure to mention the invoice
|
||||
reference <strong><t t-esc="doc.internal_number"/></strong> on the transfer:
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h1 class="oe_edi_doc_title">Order <t t-esc="doc.name"/>: <t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
|
||||
<h1 class="oe_edi_doc_title">Order <t t-esc="doc.name"/>: <t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></h1>
|
||||
|
||||
<table width="100%" class="oe_edi_data oe_edi_shade">
|
||||
<tr class="oe_edi_floor">
|
||||
@@ -68,11 +68,11 @@
|
||||
</t>
|
||||
</td>
|
||||
<td align="right">
|
||||
<t t-esc="_.sprintf('%.2f',doc_line.product_qty)"/> <t t-esc="doc_line.product_uom[1]"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc_line.product_qty)"/> <t t-esc="doc_line.product_uom[1]"/>
|
||||
</td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.price_unit)"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.discount or 0.0)"/></td>
|
||||
<td align="right"><t t-esc="_.sprintf('%.2f',doc_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_unit)"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.discount or 0.0)"/></td>
|
||||
<td align="right"><t t-esc="_.str.sprintf('%.2f',doc_line.price_subtotal)"/> <t t-esc="doc.currency.code"/></td>
|
||||
</tr>
|
||||
</t>
|
||||
<tr>
|
||||
@@ -82,7 +82,7 @@
|
||||
Net Total:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_untaxed)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -93,7 +93,7 @@
|
||||
Taxes:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_tax)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -104,7 +104,7 @@
|
||||
Total:
|
||||
</div>
|
||||
<div class="oe_edi_summary_value">
|
||||
<t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
|
||||
<t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/>
|
||||
</div>
|
||||
</th>
|
||||
</tr>
|
||||
@@ -137,7 +137,7 @@
|
||||
<label for="oe_edi_pay_wire" id="oe_edi_pay_wire" class="oe_edi_pay_choice_label">Bank Wire Transfer</label>
|
||||
</div>
|
||||
<p class="oe_edi_nested_block_pay oe_edi_pay_wire_nested">
|
||||
Please transfer <strong><t t-esc="_.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
|
||||
Please transfer <strong><t t-esc="_.str.sprintf('%.2f',doc.amount_total)"/> <t t-esc="doc.currency.code"/></strong> to
|
||||
<strong><t t-esc="doc.company_id[1]"/></strong> (postal address on the order header)
|
||||
using one of the following bank accounts. Be sure to mention the document
|
||||
reference <strong><t t-esc="doc.name"/></strong> on the transfer:
|
||||
|
||||
@@ -0,0 +1,829 @@
|
||||
# Bengali translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-21 12:43+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Bengali <bn@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,name:hr.process_node_openerpuser0
|
||||
msgid "Openerp user"
|
||||
msgstr "Openerp ব্যাবহারকারী"
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
#: field:hr.job,requirements:0
|
||||
msgid "Requirements"
|
||||
msgstr "আবশ্যকতা"
|
||||
|
||||
#. module: hr
|
||||
#: constraint:hr.department:0
|
||||
msgid "Error! You can not create recursive departments."
|
||||
msgstr "ভুল! আপনি রিকারসিভ দপ্তর তৈরি করতে পারবেন না।"
|
||||
|
||||
#. module: hr
|
||||
#: model:process.transition,name:hr.process_transition_contactofemployee0
|
||||
msgid "Link the employee to information"
|
||||
msgstr "তথ্যের সাথে কর্মচারী যুক্ত করুন"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,sinid:0
|
||||
msgid "SIN No"
|
||||
msgstr "ন্যাশনাল আইডি নং"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.module.module,shortdesc:hr.module_meta_information
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_deshboard
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_main
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_management
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_root
|
||||
msgid "Human Resources"
|
||||
msgstr "জনসম্পদ"
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: view:hr.job:0
|
||||
msgid "Group By..."
|
||||
msgstr "...দিয়ে গ্রুপ করুন"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,help:hr.action_hr_job
|
||||
msgid ""
|
||||
"Job Positions are used to define jobs and their requirements. You can keep "
|
||||
"track of the number of employees you have per job position and how many you "
|
||||
"expect in the future. You can also attach a survey to a job position that "
|
||||
"will be used in the recruitment process to evaluate the applicants for this "
|
||||
"job position."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.employee,department_id:0
|
||||
#: view:hr.job:0
|
||||
#: field:hr.job,department_id:0
|
||||
#: view:res.users:0
|
||||
msgid "Department"
|
||||
msgstr "বিভাগ"
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_attendance:0
|
||||
msgid "Simplifies the management of employee's attendances."
|
||||
msgstr "কর্মচারী উপস্থিতি ম্যানেজমেন্ট সহজতর করে"
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
msgid "Mark as Old"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
msgid "Jobs"
|
||||
msgstr "কাজ"
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
msgid "In Recruitment"
|
||||
msgstr "নিয়োগপ্রাপ্ত"
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.installer:0
|
||||
msgid "title"
|
||||
msgstr "শিরোনাম"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,company_id:0
|
||||
#: view:hr.employee:0
|
||||
#: view:hr.job:0
|
||||
#: field:hr.job,company_id:0
|
||||
msgid "Company"
|
||||
msgstr "কোম্পানি"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.job,no_of_recruitment:0
|
||||
msgid "Expected in Recruitment"
|
||||
msgstr "নিয়োগে কাম্য"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_config
|
||||
msgid "Holidays"
|
||||
msgstr "ছুটির দিন"
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_holidays:0
|
||||
msgid "Tracks employee leaves, allocation requests and planning."
|
||||
msgstr "কর্মচারীদের ছুটির হিসাব রাখে"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.model,name:hr.model_hr_employee_marital_status
|
||||
msgid "Employee Marital Status"
|
||||
msgstr "কর্মচারীর বৈবাহিক অবস্থা"
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,partner_id:0
|
||||
msgid ""
|
||||
"Partner that is related to the current employee. Accounting transaction will "
|
||||
"be written on this partner belongs to employee."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.transition,name:hr.process_transition_employeeuser0
|
||||
msgid "Link a user to an employee"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_contract:0
|
||||
msgid "Employee's Contracts"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_payroll:0
|
||||
msgid "Generic Payroll system."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "My Departments Employee"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_married
|
||||
msgid "Married"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: constraint:hr.employee:0
|
||||
msgid ""
|
||||
"Error ! You cannot select a department for which the employee is the manager."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,passport_id:0
|
||||
msgid "Employee Passport Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,help:hr.open_module_tree_department
|
||||
msgid ""
|
||||
"Your Company's Department Structure is used to manage all documents related "
|
||||
"to employees by departments: expenses and timesheet validation, leaves "
|
||||
"management, recruitments, etc."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Position"
|
||||
msgstr "পদ"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.action2
|
||||
msgid "Employee Hierarchy"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.transition,note:hr.process_transition_employeeuser0
|
||||
msgid ""
|
||||
"The Related user field on the Employee form allows to link the OpenERP user "
|
||||
"(and her rights) to the employee."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
#: selection:hr.job,state:0
|
||||
msgid "In Recruitement"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,identification_id:0
|
||||
msgid "Identification No"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.job,no_of_employee:0
|
||||
msgid "No of Employee"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: selection:hr.employee,gender:0
|
||||
msgid "Female"
|
||||
msgstr "মহিলা"
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_timesheet_sheet:0
|
||||
msgid ""
|
||||
"Tracks and helps employees encode and validate timesheets and attendances."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_evaluation:0
|
||||
msgid "Periodic Evaluations"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_timesheet_sheet:0
|
||||
msgid "Timesheets"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_view_employee_tree
|
||||
msgid "Employees Structure"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Social IDs"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.job,no_of_employee:0
|
||||
msgid "Number of employee with that job."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,work_phone:0
|
||||
msgid "Work Phone"
|
||||
msgstr "কর্মস্থলের ফোন"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee.category,child_ids:0
|
||||
msgid "Child Categories"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
#: field:hr.job,description:0
|
||||
#: model:ir.model,name:hr.model_hr_job
|
||||
msgid "Job Description"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,work_location:0
|
||||
msgid "Office Location"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: view:hr.job:0
|
||||
#: model:ir.model,name:hr.model_hr_employee
|
||||
#: model:process.node,name:hr.process_node_employee0
|
||||
msgid "Employee"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,note:hr.process_node_employeecontact0
|
||||
msgid "Other information"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,work_email:0
|
||||
msgid "Work E-mail"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,complete_name:0
|
||||
#: field:hr.employee.category,complete_name:0
|
||||
msgid "Name"
|
||||
msgstr "নাম"
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,birthday:0
|
||||
msgid "Date of Birth"
|
||||
msgstr "জন্মদিন"
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_reporting
|
||||
msgid "Reporting"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.model,name:hr.model_ir_actions_act_window
|
||||
msgid "ir.actions.act_window"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_board_hr
|
||||
msgid "Human Resources Dashboard"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.employee,job_id:0
|
||||
#: view:hr.job:0
|
||||
msgid "Job"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
#: field:hr.department,member_ids:0
|
||||
msgid "Members"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_configuration
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.installer:0
|
||||
msgid ""
|
||||
"You can enhance the base HR Application by installing few HR-related "
|
||||
"functionalities."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.job,expected_employees:0
|
||||
msgid "Expected Employees"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,sinid:0
|
||||
msgid "Social Insurance Number"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_divorced
|
||||
msgid "Divorced"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee.category,parent_id:0
|
||||
msgid "Parent Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: constraint:hr.employee.category:0
|
||||
msgid "Error ! You cannot create recursive Categories."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
#: model:ir.actions.act_window,name:hr.open_module_tree_department
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_department_tree
|
||||
#: view:res.users:0
|
||||
#: field:res.users,context_department_id:0
|
||||
msgid "Departments"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,name:hr.process_node_employeecontact0
|
||||
msgid "Employee Contact"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:board.board:0
|
||||
msgid "My Board"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: selection:hr.employee,gender:0
|
||||
msgid "Male"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,progress:0
|
||||
msgid "Configuration Progress"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_view_categ_form
|
||||
#: model:ir.ui.menu,name:hr.menu_view_employee_category_form
|
||||
msgid "Categories of Employee"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee.category:0
|
||||
#: model:ir.model,name:hr.model_hr_employee_category
|
||||
msgid "Employee Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,config_logo:0
|
||||
msgid "Image"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.process,name:hr.process_process_employeecontractprocess0
|
||||
msgid "Employee Contract"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_evaluation:0
|
||||
msgid ""
|
||||
"Lets you create and manage the periodic evaluation and performance review of "
|
||||
"employees."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.model,name:hr.model_hr_department
|
||||
msgid "hr.department"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,parent_id:0
|
||||
msgid "It is linked with manager of Department"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_recruitment:0
|
||||
msgid "Recruitment Process"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,category_ids:0
|
||||
#: field:hr.employee.category,name:0
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,help:hr.open_view_employee_list_my
|
||||
msgid ""
|
||||
"Here you can manage your work force by creating employees and assigning them "
|
||||
"specific properties in the system. Maintain all employee related information "
|
||||
"and keep track of anything that needs to be recorded for them. The personal "
|
||||
"information tab will help you maintain their identity data. The Categories "
|
||||
"tab gives you the opportunity to assign them related employee categories "
|
||||
"depending on their position and activities within the company. A category "
|
||||
"can be a seniority level within the company or a department. The Timesheets "
|
||||
"tab allows to assign them a specific timesheet and analytic journal where "
|
||||
"they will be able to enter time through the system. In the note tab, you can "
|
||||
"enter text data that should be recorded for a specific employee."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,bank_account_id:0
|
||||
msgid "Employee bank salary account"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,note:0
|
||||
msgid "Note"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: constraint:res.users:0
|
||||
msgid "The chosen company is not in the allowed companies for this user"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Contact Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,address_id:0
|
||||
msgid "Working Address"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_board_hr_manager
|
||||
msgid "HR Manager Dashboard"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.installer:0
|
||||
msgid "Configure"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.open_view_categ_tree
|
||||
#: model:ir.ui.menu,name:hr.menu_view_employee_category_tree
|
||||
msgid "Categories structure"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,partner_id:0
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_holidays:0
|
||||
msgid "Holidays / Leaves Management"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,ssnid:0
|
||||
msgid "SSN No"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: constraint:hr.employee:0
|
||||
msgid "Error ! You cannot create recursive Hierarchy of Employees."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
msgid "Companies"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.module.module,description:hr.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" Module for human resource management. You can manage:\n"
|
||||
" * Employees and hierarchies : You can define your employee with User and "
|
||||
"display hierarchies\n"
|
||||
" * HR Departments\n"
|
||||
" * HR Jobs\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.transition,note:hr.process_transition_contactofemployee0
|
||||
msgid ""
|
||||
"In the Employee form, there are different kind of information like Contact "
|
||||
"information."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.job,expected_employees:0
|
||||
msgid "Required number of Employees in total for that job."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: selection:hr.job,state:0
|
||||
msgid "Old"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee.marital.status,description:0
|
||||
msgid "Status Description"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: sql_constraint:res.users:0
|
||||
msgid "You can not have two users with the same login !"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
#: field:hr.job,state:0
|
||||
msgid "State"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,marital:0
|
||||
#: view:hr.employee.marital.status:0
|
||||
#: field:hr.employee.marital.status,name:0
|
||||
#: model:ir.actions.act_window,name:hr.action_hr_marital_status
|
||||
#: model:ir.ui.menu,name:hr.hr_menu_marital_status
|
||||
msgid "Marital Status"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_recruitment:0
|
||||
msgid "Helps you manage and streamline your recruitment process."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,note:hr.process_node_employee0
|
||||
msgid "Employee form and structure"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,photo:0
|
||||
msgid "Photo"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.model,name:hr.model_res_users
|
||||
msgid "res.users"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_payroll_account:0
|
||||
msgid "Payroll Accounting"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
msgid "Personal Information"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,passport_id:0
|
||||
msgid "Passport No"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:res.users:0
|
||||
msgid "Current Activity"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_expense:0
|
||||
msgid ""
|
||||
"Tracks and manages employee expenses, and can automatically re-invoice "
|
||||
"clients if the expenses are project-related."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,parent_id:0
|
||||
msgid "Parent Department"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee.category:0
|
||||
msgid "Employees Categories"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,address_home_id:0
|
||||
msgid "Home Address"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_attendance:0
|
||||
#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config
|
||||
msgid "Attendances"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee.marital.status:0
|
||||
#: view:hr.job:0
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_contract:0
|
||||
msgid "Extends employee profiles to help manage their contracts."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_payroll:0
|
||||
msgid "Payroll"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_single
|
||||
msgid "Single"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.job,name:0
|
||||
msgid "Job Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.job:0
|
||||
#: selection:hr.job,state:0
|
||||
msgid "In Position"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,mobile_phone:0
|
||||
msgid "Mobile"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
msgid "department"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,country_id:0
|
||||
msgid "Nationality"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.department:0
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.employee,notes:0
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.model,name:hr.model_hr_installer
|
||||
msgid "hr.installer"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:board.board:0
|
||||
msgid "HR Manager Board"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,resource_id:0
|
||||
msgid "Resource"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.installer:0
|
||||
#: model:ir.actions.act_window,name:hr.action_hr_installer
|
||||
msgid "Human Resources Application Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,gender:0
|
||||
msgid "Gender"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.job,employee_ids:0
|
||||
#: model:ir.actions.act_window,name:hr.hr_employee_normal_action_tree
|
||||
#: model:ir.actions.act_window,name:hr.open_view_employee_list
|
||||
#: model:ir.actions.act_window,name:hr.open_view_employee_list_my
|
||||
#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my
|
||||
#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form
|
||||
msgid "Employees"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,bank_account_id:0
|
||||
msgid "Bank Account"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,name:0
|
||||
msgid "Department Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.employee,ssnid:0
|
||||
msgid "Social Security Number"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:process.node,note:hr.process_node_openerpuser0
|
||||
msgid "Creation of a OpenERP user"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,child_ids:0
|
||||
msgid "Child Departments"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:ir.actions.act_window,name:hr.action_hr_job
|
||||
#: model:ir.ui.menu,name:hr.menu_hr_job
|
||||
msgid "Job Positions"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.employee,coach_id:0
|
||||
msgid "Coach"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: view:hr.installer:0
|
||||
msgid "Configure Your Human Resources Application"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.installer,hr_expense:0
|
||||
msgid "Expenses"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.department,manager_id:0
|
||||
#: view:hr.employee:0
|
||||
#: field:hr.employee,parent_id:0
|
||||
msgid "Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_widower
|
||||
msgid "Widower"
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: help:hr.installer,hr_payroll_account:0
|
||||
msgid "Generic Payroll system Integrated with Accountings."
|
||||
msgstr ""
|
||||
|
||||
#. module: hr
|
||||
#: field:hr.employee,child_ids:0
|
||||
msgid "Subordinates"
|
||||
msgstr ""
|
||||
@@ -39,7 +39,7 @@ level of employee hierarchy fills what and final review and evaluation
|
||||
is done by the manager.Every evaluation filled by the employees can be viewed
|
||||
in the form of pdf file. Implements a dashboard for My Current Evaluations
|
||||
""",
|
||||
"demo": [],
|
||||
"demo": ["hr_evaluation_demo.xml"],
|
||||
"data": [
|
||||
"security/ir.model.access.csv",
|
||||
"security/hr_evaluation_security.xml",
|
||||
|
||||
@@ -1210,23 +1210,11 @@ Once the form had been filled, the employee send it to his supervisor.
|
||||
<field eval="1" name="wait"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
|
||||
<data noupdate="1">
|
||||
<record id="hr.employee" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee1" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee2" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee3" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
<data>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="hr.employee1" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee2" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee3" model="hr.employee">
|
||||
<field name="evaluation_plan_id" ref="hr_evaluation_plan_managersevaluationplan0"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -137,8 +137,9 @@ class hr_expense_expense(osv.osv):
|
||||
inv_ids.append(self.browse(cr, uid, id).invoice_id.id)
|
||||
return {
|
||||
'name': _('Supplier Invoices'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'view_id': [res[1] if res else False],
|
||||
'view_id': [res and res[1] or False],
|
||||
'res_model': 'account.invoice',
|
||||
'context': "{'type':'out_invoice', 'journal_type': 'purchase'}",
|
||||
'type': 'ir.actions.act_window',
|
||||
|
||||
@@ -104,13 +104,6 @@
|
||||
</record>
|
||||
|
||||
<record id="t10" model="workflow.transition">
|
||||
<field name="act_from" ref="act_invoice"/>
|
||||
<field name="act_to" ref="act_refused"/>
|
||||
<field name="signal">subflow.cancel</field>
|
||||
<field name="group_id" ref="base.group_hr_user"/>
|
||||
</record>
|
||||
|
||||
<record id="t11" model="workflow.transition">
|
||||
<field name="act_from" ref="act_refused"/>
|
||||
<field name="act_to" ref="act_draft"/>
|
||||
<field name="signal">draft</field>
|
||||
|
||||
@@ -39,7 +39,13 @@ class hr_payslip(osv.osv):
|
||||
'journal_id': fields.many2one('account.journal', 'Expense Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
|
||||
'move_id': fields.many2one('account.move', 'Accounting Entry', readonly=True),
|
||||
}
|
||||
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default['move_id'] = False
|
||||
return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
@@ -95,9 +101,9 @@ class hr_payslip(osv.osv):
|
||||
partner_id = False
|
||||
debit_account_id = line.salary_rule_id.account_debit.id
|
||||
credit_account_id = line.salary_rule_id.account_credit.id
|
||||
|
||||
|
||||
if debit_account_id:
|
||||
|
||||
|
||||
debit_line = (0, 0, {
|
||||
'name': line.name,
|
||||
'date': timenow,
|
||||
@@ -113,9 +119,9 @@ class hr_payslip(osv.osv):
|
||||
})
|
||||
line_ids.append(debit_line)
|
||||
debit_sum += debit_line[2]['debit'] - debit_line[2]['credit']
|
||||
|
||||
|
||||
if credit_account_id:
|
||||
|
||||
|
||||
credit_line = (0, 0, {
|
||||
'name': line.name,
|
||||
'date': timenow,
|
||||
@@ -147,7 +153,7 @@ class hr_payslip(osv.osv):
|
||||
'credit': debit_sum - credit_sum,
|
||||
})
|
||||
line_ids.append(adjust_credit)
|
||||
|
||||
|
||||
elif debit_sum < credit_sum:
|
||||
acc_id = slip.journal_id.default_debit_account_id.id
|
||||
if not acc_id:
|
||||
|
||||
@@ -54,7 +54,7 @@ system to store and search in your CV base.
|
||||
'hr_recruitment_data.xml'
|
||||
],
|
||||
'demo_xml': [
|
||||
'hr_recruitment_demo.xml',
|
||||
'hr_recruitment_demo.yml',
|
||||
],
|
||||
'test':['test/test_hr_recruitment.yml'],
|
||||
'installable': True,
|
||||
|
||||
@@ -197,11 +197,17 @@ class hr_applicant(crm.crm_case, osv.osv):
|
||||
'color': 0,
|
||||
}
|
||||
|
||||
def _read_group_stage_ids(self, cr, uid, ids, domain, context=None):
|
||||
context = context or {}
|
||||
def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None):
|
||||
stage_obj = self.pool.get('hr.recruitment.stage')
|
||||
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids), ('department_id','=',False)], context=context)
|
||||
return stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
order = stage_obj._order
|
||||
if read_group_order == 'stage_id desc':
|
||||
# lame hack to allow reverting search, should just work in the trivial case
|
||||
order = "%s desc" % order
|
||||
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids),('department_id','=',False)], order=order, context=context)
|
||||
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
# restore order of the search
|
||||
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
|
||||
return result
|
||||
|
||||
_group_by_full = {
|
||||
'stage_id': _read_group_stage_ids
|
||||
@@ -440,7 +446,18 @@ class hr_applicant(crm.crm_case, osv.osv):
|
||||
})
|
||||
else:
|
||||
raise osv.except_osv(_('Warning!'),_('You must define Applied Job for Applicant !'))
|
||||
return self.case_close(cr, uid, ids, *args)
|
||||
self.case_close(cr, uid, ids, *args)
|
||||
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
act = mod_obj.get_object_reference(cr, uid, 'hr', 'open_view_employee_list')
|
||||
|
||||
act_obj = self.pool.get('ir.actions.act_window')
|
||||
act_win = act_obj.read(cr, uid, act[1], [])
|
||||
|
||||
act_win['domain'] = [('id','=',emp_id)]
|
||||
act_win['view_mode'] = 'form,tree'
|
||||
act_win['res_id'] = emp_id
|
||||
return act_win
|
||||
|
||||
def case_reset(self, cr, uid, ids, *args):
|
||||
"""Resets case as draft
|
||||
|
||||
@@ -19,19 +19,6 @@
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
<!-- CASE CATEGORY(categ_id) -->
|
||||
|
||||
<record model="crm.case.categ" id="categ_job1">
|
||||
<field name="name">Salesman</field>
|
||||
<field name="object_id" search="[('model','=','hr.applicant')]" model="ir.model"/>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.categ" id="categ_job2">
|
||||
<field name="name">Junior Developer</field>
|
||||
<field name="object_id" search="[('model','=','hr.applicant')]" model="ir.model"/>
|
||||
</record>
|
||||
|
||||
<!-- Resource(type_id) -->
|
||||
|
||||
<record model="hr.recruitment.degree" id="degree_graduate">
|
||||
|
||||
@@ -1,178 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<!--
|
||||
((((((((((( Demo Cases )))))))))))
|
||||
-->
|
||||
|
||||
<!--For Jobs Requests-->
|
||||
<record id="hr_case_salesman0" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-01 10:35:50')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-03')" name="date_deadline"/>
|
||||
<field name="type_id" ref="degree_graduate"/>
|
||||
<field name="partner_id" ref="base.res_partner_asus"/>
|
||||
<field eval="'2'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Enrique Jones'" name="partner_name"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field eval="'enrique@rediff.com'" name="partner_name2"/>
|
||||
<field eval="'9963214587'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field eval="9.0" name="duration"/>
|
||||
<field name="categ_id" ref="categ_job1"/>
|
||||
<field name="stage_id" ref="stage_job1"/>
|
||||
<field eval="'Salesman'" name="name"/>
|
||||
<field eval="'1236547890'" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="hr_case_traineemca0" model="hr.applicant">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field eval="time.strftime('%Y-%m-10 18:15:00')" name="date"/>
|
||||
<field name="type_id" ref="degree_bac5"/>
|
||||
<field name="partner_id" ref="base.res_partner_15"/>
|
||||
<field eval="'3'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Marie Justine'" name="partner_name"/>
|
||||
<field eval="'open'" name="state"/>
|
||||
<field eval="5.15" name="duration"/>
|
||||
<field eval="'marie@gmail.com'" name="partner_name2"/>
|
||||
<field eval="'9988774455'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="categ_id" ref="categ_job2"/>
|
||||
<field name="stage_id" ref="stage_job4"/>
|
||||
<field eval="'Trainee - MCA'" name="name"/>
|
||||
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
|
||||
<field eval="'6633225'" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="hr_case_fresher0" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-15 16:10:00')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-18')" name="date_deadline"/>
|
||||
<field name="type_id" ref="degree_licenced"/>
|
||||
<field name="partner_id" ref="base.res_partner_5"/>
|
||||
<field eval="'1'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="1.45" name="duration"/>
|
||||
<field eval="'Jose'" name="partner_name"/>
|
||||
<field eval="'pending'" name="state"/>
|
||||
<field eval="'jose@timesgroup.com'" name="partner_name2"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="categ_id" ref="categ_job1"/>
|
||||
<field name="stage_id" ref="stage_job3"/>
|
||||
<field eval="'Fresher'" name="name"/>
|
||||
<field eval="'999666735'" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="hr_case_yrsexperienceinphp0" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-25 16:25:52')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="categ_id" ref="categ_job2"/>
|
||||
<field name="type_id" ref="degree_bac5"/>
|
||||
<field name="partner_id" ref="base.res_partner_10"/>
|
||||
<field eval="'3'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="1.35" name="duration"/>
|
||||
<field eval="'Sandra Elvis'" name="partner_name"/>
|
||||
<field eval="'sandra@example.com'" name="partner_name2"/>
|
||||
<field eval="'cancel'" name="state"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="stage_id" ref="stage_job6"/>
|
||||
<field eval="'More than 5 yrs Experience in PHP'" name="name"/>
|
||||
</record>
|
||||
<record id="hr_case_marketingjob0" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-26 17:15:32')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="type_id" ref="degree_licenced"/>
|
||||
<field name="partner_id" ref="base.res_partner_11"/>
|
||||
<field eval="'4'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field eval="2.0" name="duration"/>
|
||||
<field eval="'John Bruno'" name="partner_name"/>
|
||||
<field eval="'done'" name="state"/>
|
||||
<field eval="'john@market.edu'" name="partner_name2"/>
|
||||
<field eval="'9966332214'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="categ_id" ref="categ_job1"/>
|
||||
<field name="stage_id" ref="stage_job5"/>
|
||||
<field eval="'Marketing Job'" name="name"/>
|
||||
<field eval="'33968745'" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="hr_case_financejob0" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="type_id" ref="degree_licenced"/>
|
||||
<field name="partner_id" ref="base.res_partner_11"/>
|
||||
<field eval="'4'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'David Armstrong'" name="partner_name"/>
|
||||
<field eval="'done'" name="state"/>
|
||||
<field eval="'david@market.edu'" name="partner_name2"/>
|
||||
<field eval="'9966332214'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field eval="2.20" name="duration"/>
|
||||
<field name="categ_id" ref="categ_job1"/>
|
||||
<field name="stage_id" ref="stage_job5"/>
|
||||
<field eval="'Finance Job'" name="name"/>
|
||||
<field eval="'33968745'" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="hr_case_traineemca1" model="hr.applicant">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field eval="time.strftime('%Y-%m-12 17:49:19')" name="date"/>
|
||||
<field name="type_id" ref="degree_bac5"/>
|
||||
<field name="partner_id" ref="base.res_partner_15"/>
|
||||
<field eval="'3'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Tina Augustie'" name="partner_name"/>
|
||||
<field eval="'open'" name="state"/>
|
||||
<field eval="1.15" name="duration"/>
|
||||
<field eval="'tina_augustie@example.com'" name="partner_name2"/>
|
||||
<field eval="'9898745745'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="categ_id" ref="categ_job2"/>
|
||||
<field name="stage_id" ref="stage_job4"/>
|
||||
<field eval="'Trainee - MCA'" name="name"/>
|
||||
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
|
||||
<field eval="'6630125'" name="partner_phone"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_case_programmer" model="hr.applicant">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field eval="time.strftime('%Y-%m-12 17:49:19')" name="date"/>
|
||||
<field name="type_id" ref="degree_bac5"/>
|
||||
<field name="partner_id" ref="base.res_partner_15"/>
|
||||
<field eval="'3'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Shane Williams'" name="partner_name"/>
|
||||
<field eval="'open'" name="state"/>
|
||||
<field eval="1.15" name="duration"/>
|
||||
<field eval="'tina_augustie@example.com'" name="partner_name2"/>
|
||||
<field eval="'9812398524'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="categ_id" ref="categ_job2"/>
|
||||
<field name="stage_id" ref="stage_job4"/>
|
||||
<field eval="'Programmer'" name="name"/>
|
||||
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
|
||||
<field eval="'6630125'" name="partner_phone"/>
|
||||
<field name="job_id" ref="hr.job_jr_appli"/>
|
||||
<field name="department_id" ref="hr.dep_it"/>
|
||||
<field eval="11000.0" name="salary_expected"/>
|
||||
</record>
|
||||
|
||||
<record id="hr_case_advertisement" model="hr.applicant">
|
||||
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="type_id" ref="degree_licenced"/>
|
||||
<field name="partner_id" ref="base.res_partner_11"/>
|
||||
<field eval="'4'" name="priority"/>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'David Armstrong'" name="partner_name"/>
|
||||
<field eval="'done'" name="state"/>
|
||||
<field eval="'david@market.edu'" name="partner_name2"/>
|
||||
<field eval="'9925741564'" name="partner_mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field eval="2.20" name="duration"/>
|
||||
<field name="categ_id" ref="categ_job1"/>
|
||||
<field name="stage_id" ref="stage_job5"/>
|
||||
<field eval="'Advertisement'" name="name"/>
|
||||
<field eval="'25968745'" name="partner_phone"/>
|
||||
<field eval="11000.0" name="salary_expected"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,109 @@
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_salesman0}:
|
||||
date: !eval time.strftime('%Y-%m-01 10:35:50')
|
||||
type_id: degree_graduate
|
||||
priority: '2'
|
||||
partner_name: 'Enrique Jones'
|
||||
partner_mobile: '9963214587'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job1
|
||||
name: 'Salesman'
|
||||
partner_phone: '1236547890'
|
||||
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_traineemca0}:
|
||||
partner_address_id: base.res_partner_address_14
|
||||
date: !eval time.strftime('%Y-%m-10 18:15:00')
|
||||
type_id: degree_bac5
|
||||
priority: '3'
|
||||
user_id: base.user_demo
|
||||
partner_name: 'Marie Justine'
|
||||
state: 'open'
|
||||
partner_mobile: '9988774455'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job4
|
||||
name: 'Trainee - MCA'
|
||||
partner_phone: '6633225'
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_fresher0}:
|
||||
date: !eval time.strftime('%Y-%m-15 16:10:00')
|
||||
type_id: degree_licenced
|
||||
priority: '1'
|
||||
user_id: base.user_root
|
||||
partner_name: 'Jose'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job3
|
||||
name: 'Fresher'
|
||||
partner_phone: '999666735'
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_yrsexperienceinphp0}:
|
||||
date: !eval time.strftime('%Y-%m-25 16:25:52')
|
||||
job_id: hr.job_jr_appli
|
||||
type_id: degree_bac5
|
||||
user_id: base.user_root
|
||||
partner_name: 'Sandra Elvis'
|
||||
state: 'cancel'
|
||||
stage_id: stage_job6
|
||||
name: 'More than 5 yrs Experience in PHP'
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_marketingjob0}:
|
||||
date: !eval time.strftime('%Y-%m-26 17:15:32')
|
||||
type_id: degree_licenced
|
||||
user_id: base.user_demo
|
||||
partner_name: 'John Bruno'
|
||||
state: 'done'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job5
|
||||
name: 'Marketing Job'
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_financejob0}:
|
||||
date: !eval time.strftime('%Y-%m-26 17:39:42')
|
||||
type_id: degree_licenced
|
||||
priority: '4'
|
||||
partner_name: 'David Armstrong'
|
||||
state: 'pending'
|
||||
state: open
|
||||
partner_mobile: '9966332214'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job2
|
||||
name: 'Finance Job'
|
||||
partner_phone: '33968745'
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_traineemca1}:
|
||||
partner_address_id: base.res_partner_address_14
|
||||
date: !eval time.strftime('%Y-%m-12 17:49:19')
|
||||
type_id: degree_bac5
|
||||
partner_name: 'Tina Augustie'
|
||||
state: 'open'
|
||||
partner_mobile: '9898745745'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job4
|
||||
name: 'Trainee - MCA'
|
||||
partner_phone: '6630125'
|
||||
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_programmer}:
|
||||
partner_address_id: base.res_partner_address_14
|
||||
date: !eval time.strftime('%Y-%m-12 17:49:19')
|
||||
type_id: degree_bac5
|
||||
partner_name: 'Shane Williams'
|
||||
state: 'open'
|
||||
partner_mobile: '9812398524'
|
||||
stage_id: stage_job4
|
||||
name: 'Programmer'
|
||||
partner_phone: '6630125'
|
||||
job_id: hr.job_jr_appli
|
||||
department_id: hr.dep_it
|
||||
salary_expected: 11000.0
|
||||
|
||||
-
|
||||
!record {model: hr.applicant, id: hr_case_advertisement}:
|
||||
date: !eval time.strftime('%Y-%m-26 17:39:42')
|
||||
type_id: degree_licenced
|
||||
partner_id: base.res_partner_11
|
||||
partner_name: 'David Armstrong'
|
||||
job_id: hr.job_jr_appli
|
||||
stage_id: stage_job2
|
||||
name: 'Advertisement'
|
||||
salary_expected: 11000.0
|
||||
|
||||
@@ -48,8 +48,7 @@ class hired_employee(osv.osv_memory):
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
|
||||
return {}
|
||||
return self.pool.get('hr.applicant').case_close_with_emp(cr, uid,context.get('active_ids', []))
|
||||
|
||||
hired_employee()
|
||||
|
||||
|
||||
@@ -2,9 +2,6 @@
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="hr.employee" model="hr.employee">
|
||||
<field name="product_id" ref="product.product_consultant"/>
|
||||
</record>
|
||||
|
||||
<record id="analytic_journal" model="account.analytic.journal">
|
||||
<field name="code">TS</field>
|
||||
@@ -12,5 +9,10 @@
|
||||
<field name="type">general</field>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee" model="hr.employee">
|
||||
<field name="product_id" ref="product.product_consultant"/>
|
||||
<field name="journal_id" ref="analytic_journal"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-07 06:40+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:22+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: l10n_br
|
||||
#: model:ir.actions.todo,note:l10n_br.config_call_account_template_brazilian_localization
|
||||
msgid ""
|
||||
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
|
||||
"the name of the company, the chart template to follow, the no. of digits to "
|
||||
"generate the code for your accounts and Bank account, currency to create "
|
||||
"Journals. Thus,the pure copy of chart Template is generated.\n"
|
||||
" This is the same wizard that runs from Financial "
|
||||
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
|
||||
"Chart of Accounts from a Chart Template."
|
||||
msgstr ""
|
||||
|
||||
#. module: l10n_br
|
||||
#: model:ir.module.module,description:l10n_br.module_meta_information
|
||||
#: model:ir.module.module,shortdesc:l10n_br.module_meta_information
|
||||
msgid "Brazilian Localization"
|
||||
msgstr "Localizacion brasilièra"
|
||||
@@ -63,7 +63,7 @@ TODO :
|
||||
""",
|
||||
"version" : "6.1",
|
||||
"author" : "Camptocamp",
|
||||
"category" : "Finance",
|
||||
'category': 'Localization/Account Charts',
|
||||
"website": "http://www.camptocamp.com",
|
||||
|
||||
"depends" : [
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:22+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: l10n_es
|
||||
#: model:ir.module.module,shortdesc:l10n_es.module_meta_information
|
||||
msgid "Spanish Charts of Accounts (PGCE 2008)"
|
||||
msgstr "Plan comptable espanhòl (PGCE 2008)"
|
||||
|
||||
#. module: l10n_es
|
||||
#: model:ir.module.module,description:l10n_es.module_meta_information
|
||||
msgid ""
|
||||
"Spanish Charts of Accounts (PGCE 2008)\n"
|
||||
"\n"
|
||||
"* Defines the following chart of account templates:\n"
|
||||
" * Spanish General Chart of Accounts 2008.\n"
|
||||
" * Spanish General Chart of Accounts 2008 for small and medium "
|
||||
"companies.\n"
|
||||
"* Defines templates for sale and purchase VAT.\n"
|
||||
"* Defines tax code templates.\n"
|
||||
"\n"
|
||||
"Note: You should install the l10n_ES_account_balance_report module\n"
|
||||
"for yearly account reporting (balance, profit & losses).\n"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,39 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:23+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: l10n_gt
|
||||
#: model:ir.module.module,shortdesc:l10n_gt.module_meta_information
|
||||
msgid "Guatemala - Plan contable general"
|
||||
msgstr "Guatemala - Plan comptable general"
|
||||
|
||||
#. module: l10n_gt
|
||||
#: model:ir.actions.todo,note:l10n_gt.config_call_account_template_gt_minimal
|
||||
msgid ""
|
||||
"Generar la nomenclatura contable a partir de un modelo. Deberá seleccionar "
|
||||
"una compañía, el modelo a utilizar, el número de digitos a usar en la "
|
||||
"nomenclatura, la moneda para crear los diarios."
|
||||
msgstr ""
|
||||
|
||||
#. module: l10n_gt
|
||||
#: model:ir.module.module,description:l10n_gt.module_meta_information
|
||||
msgid ""
|
||||
"Agrega una nomenclatura contable para Guatemala. También icluye impuestos y "
|
||||
"la moneda del Quetzal. -- Adds accounting chart for Guatemala. It also "
|
||||
"includes taxes and the Quetzal currency"
|
||||
msgstr ""
|
||||
@@ -0,0 +1,46 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:23+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: l10n_in
|
||||
#: model:ir.module.module,description:l10n_in.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" Indian Accounting : chart of Account\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Comptabilitat indiana : plan de comptes\n"
|
||||
" "
|
||||
|
||||
#. module: l10n_in
|
||||
#: model:ir.module.module,shortdesc:l10n_in.module_meta_information
|
||||
msgid "Indian Chart of Account"
|
||||
msgstr "Plan comptable indian"
|
||||
|
||||
#. module: l10n_in
|
||||
#: model:ir.actions.todo,note:l10n_in.config_call_account_template_in_minimal
|
||||
msgid ""
|
||||
"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
|
||||
"the name of the company, the chart template to follow, the no. of digits to "
|
||||
"generate the code for your accounts and Bank account, currency to create "
|
||||
"Journals. Thus,the pure copy of chart Template is generated.\n"
|
||||
"\tThis is the same wizard that runs from Financial "
|
||||
"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
|
||||
"Chart of Accounts from a Chart Template."
|
||||
msgstr ""
|
||||
@@ -14,8 +14,8 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-17 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14291)\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-18 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: l10n_th
|
||||
#: model:ir.actions.todo,note:l10n_th.config_call_account_template_th
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
<field name="name">Membership Products</field>
|
||||
<field name="res_model">product.product</field>
|
||||
<field name="domain">[('membership','=',True), ('type', '=', 'service')]</field>
|
||||
<field name="context">{'membership':True, 'type':'service'}</field>
|
||||
<field name="context">{'membership':True, 'type':'service', 'default_membership': True, 'default_type': 'service'}</field>
|
||||
<field name="search_view_id" ref="membership_product_search_form_view"/>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -491,6 +491,9 @@ class mrp_production(osv.osv):
|
||||
'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'mrp.production') or '/',
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.production', context=c),
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per Company!'),
|
||||
]
|
||||
_order = 'priority desc, date_planned asc';
|
||||
|
||||
def _check_qty(self, cr, uid, ids, context=None):
|
||||
|
||||
@@ -179,11 +179,9 @@
|
||||
-
|
||||
!record {model: mrp.production, id: mrp_production_mo0}:
|
||||
bom_id: mrp.mrp_bom_orangejuice0
|
||||
company_id: base.main_company
|
||||
date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
|
||||
location_dest_id: stock.stock_location_output
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00002
|
||||
product_id: mrp.product_product_orangejuice0
|
||||
product_lines:
|
||||
- name: Orange
|
||||
|
||||
@@ -106,14 +106,11 @@
|
||||
-
|
||||
!record {model: mrp.production, id: mrp_production_mo0}:
|
||||
bom_id: mrp_bom_woodenchair0
|
||||
company_id: base.main_company
|
||||
date_planned: !eval datetime.today().strftime("%Y-%m-%d %H:%M:%S")
|
||||
location_dest_id: stock.stock_location_stock
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00004
|
||||
product_id: product_product_woodenchair0
|
||||
product_qty: 10.0
|
||||
product_uom: product.product_uom_unit
|
||||
product_uos_qty: 0.0
|
||||
-
|
||||
I compute the data of production order.
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
-
|
||||
I click on the "Make Payment" wizard to pay the PoS order with a partial amount of 100.0 EUR
|
||||
-
|
||||
!record {model: pos.make.payment, id: pos_make_payment_0, context: {'active_id': ref('pos_order_pos0'), 'active_ids': [ref('pos_order_pos0')]} }:
|
||||
!record {model: pos.make.payment, id: pos_make_payment_0, context: '{"active_id": ref("pos_order_pos0"), "active_ids": [ref("pos_order_pos0")]}' }:
|
||||
amount: 100.0
|
||||
-
|
||||
I click on the validate button to register the payment.
|
||||
@@ -95,7 +95,7 @@
|
||||
-
|
||||
I pay the remaining balance.
|
||||
-
|
||||
!record {model: pos.make.payment, id: pos_make_payment_1, context: {'active_id': [ref('pos_order_pos0')], 'active_ids': [ref('pos_order_pos0')]} }:
|
||||
!record {model: pos.make.payment, id: pos_make_payment_1, context: '{"active_id": ref("pos_order_pos0"), "active_ids": [ref("pos_order_pos0")]}' }:
|
||||
amount: !eval >
|
||||
(450*2 + 300*3*1.05)*0.95-100.0
|
||||
-
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
-
|
||||
I click on the "Make Payment" wizard to pay the PoS order
|
||||
-
|
||||
!record {model: pos.make.payment, id: pos_make_payment_2, context: {'active_id': ref('pos_order_pos1'), 'active_ids': [ref('pos_order_pos1')]} }:
|
||||
!record {model: pos.make.payment, id: pos_make_payment_2, context: '{"active_id": ref("pos_order_pos1"), "active_ids": [ref("pos_order_pos1")]}' }:
|
||||
amount: !eval >
|
||||
(450*2 + 300*3*1.05)*0.95
|
||||
-
|
||||
|
||||
+97
-44
@@ -78,7 +78,7 @@ class project(osv.osv):
|
||||
return {'value':{'contact_id': False}}
|
||||
addr = partner_obj.address_get(cr, uid, [part], ['contact'])
|
||||
val = {'contact_id': addr['contact']}
|
||||
if pricelist_id in self._columns:
|
||||
if 'pricelist_id' in self.fields_get(cr, uid, context=context):
|
||||
pricelist = partner_obj.read(cr, uid, part, ['property_product_pricelist'], context=context)
|
||||
pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False
|
||||
val['pricelist_id'] = pricelist_id
|
||||
@@ -424,21 +424,53 @@ class task(osv.osv):
|
||||
_log_create = True
|
||||
_date_name = "date_start"
|
||||
|
||||
def _read_group_type_id(self, cr, uid, ids, domain, context=None):
|
||||
context = context or {}
|
||||
stage_obj = self.pool.get('project.task.type')
|
||||
stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids)] + [('project_default','=',1)], context=context)
|
||||
return stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
|
||||
def _read_group_user_id(self, cr, uid, ids, domain, context={}):
|
||||
context = context or {}
|
||||
if type(context.get('project_id', None)) not in (int, long):
|
||||
return None
|
||||
proj = self.pool.get('project.project').browse(cr, uid, context['project_id'], context=context)
|
||||
ids += map(lambda x: x.id, proj.members)
|
||||
stage_obj = self.pool.get('res.users')
|
||||
stage_ids = stage_obj.search(cr, uid, [('id','in',ids)], context=context)
|
||||
return stage_obj.name_get(cr, uid, ids, context=context)
|
||||
def _resolve_project_id_from_context(self, cr, uid, context=None):
|
||||
"""Return ID of project based on the value of 'project_id'
|
||||
context key, or None if it cannot be resolved to a single project.
|
||||
"""
|
||||
if context is None: context = {}
|
||||
if type(context.get('project_id')) in (int, long):
|
||||
project_id = context['project_id']
|
||||
return project_id
|
||||
if isinstance(context.get('project_id'), basestring):
|
||||
project_name = context['project_id']
|
||||
project_ids = self.pool.get('project.project').name_search(cr, uid, name=project_name)
|
||||
if len(project_ids) == 1:
|
||||
return project_ids[0][0]
|
||||
|
||||
def _read_group_type_id(self, cr, uid, ids, domain, read_group_order=None, context=None):
|
||||
stage_obj = self.pool.get('project.task.type')
|
||||
project_id = self._resolve_project_id_from_context(cr, uid, context=context)
|
||||
order = stage_obj._order
|
||||
if read_group_order == 'type_id desc':
|
||||
# lame way to allow reverting search, should just work in the trivial case
|
||||
order = '%s desc' % order
|
||||
if project_id:
|
||||
domain = ['|', ('id','in',ids), ('project_ids','in',project_id)]
|
||||
else:
|
||||
domain = ['|', ('id','in',ids), ('project_default','=',1)]
|
||||
stage_ids = stage_obj.search(cr, uid, domain, order=order, context=context)
|
||||
result = stage_obj.name_get(cr, uid, stage_ids, context=context)
|
||||
# restore order of the search
|
||||
result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0])))
|
||||
return result
|
||||
|
||||
def _read_group_user_id(self, cr, uid, ids, domain, read_group_order=None, context=None):
|
||||
res_users = self.pool.get('res.users')
|
||||
project_id = self._resolve_project_id_from_context(cr, uid, context=context)
|
||||
if project_id:
|
||||
ids += self.pool.get('project.project').read(cr, uid, project_id, ['members'], context=context)['members']
|
||||
order = res_users._order
|
||||
# lame way to allow reverting search, should just work in the trivial case
|
||||
if read_group_order == 'user_id desc':
|
||||
order = '%s desc' % order
|
||||
# de-duplicate and apply search order
|
||||
ids = res_users.search(cr, uid, [('id','in',ids)], order=order, context=context)
|
||||
result = res_users.name_get(cr, uid, ids, context=context)
|
||||
# restore order of the search
|
||||
result.sort(lambda x,y: cmp(ids.index(x[0]), ids.index(y[0])))
|
||||
return result
|
||||
|
||||
_group_by_full = {
|
||||
'type_id': _read_group_type_id,
|
||||
@@ -560,7 +592,12 @@ class task(osv.osv):
|
||||
'state': fields.selection([('draft', 'New'),('open', 'In Progress'),('pending', 'Pending'), ('done', 'Done'), ('cancelled', 'Cancelled')], 'State', readonly=True, required=True,
|
||||
help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\
|
||||
\n If the task is over, the states is set to \'Done\'.'),
|
||||
'kanban_state': fields.selection([('blocked', 'Blocked'),('normal', 'Normal'),('done', 'Done')], 'Kanban State', readonly=True, required=False),
|
||||
'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready To Pull')], 'Kanban State',
|
||||
help="A task's kanban state indicates special situations affecting it:\n"
|
||||
" * Normal is the default situation\n"
|
||||
" * Blocked indicates something is preventing the progress of this task\n"
|
||||
" * Ready To Pull indicates the task is ready to be pulled to the next stage",
|
||||
readonly=True, required=False),
|
||||
'create_date': fields.datetime('Create Date', readonly=True,select=True),
|
||||
'date_start': fields.datetime('Starting Date',select=True),
|
||||
'date_end': fields.datetime('Ending Date',select=True),
|
||||
@@ -840,37 +877,39 @@ class task(osv.osv):
|
||||
self.write(cr, uid, ids, {'state': 'draft'}, context=context)
|
||||
return True
|
||||
|
||||
def do_delegate(self, cr, uid, task_id, delegate_data={}, context=None):
|
||||
def do_delegate(self, cr, uid, ids, delegate_data={}, context=None):
|
||||
"""
|
||||
Delegate Task to another users.
|
||||
"""
|
||||
task = self.browse(cr, uid, task_id, context=context)
|
||||
self.copy(cr, uid, task.id, {
|
||||
'name': delegate_data['name'],
|
||||
'user_id': delegate_data['user_id'],
|
||||
'planned_hours': delegate_data['planned_hours'],
|
||||
'remaining_hours': delegate_data['planned_hours'],
|
||||
'parent_ids': [(6, 0, [task.id])],
|
||||
'state': 'draft',
|
||||
'description': delegate_data['new_task_description'] or '',
|
||||
'child_ids': [],
|
||||
'work_ids': []
|
||||
}, context=context)
|
||||
newname = delegate_data['prefix'] or ''
|
||||
self.write(cr, uid, [task.id], {
|
||||
'remaining_hours': delegate_data['planned_hours_me'],
|
||||
'planned_hours': delegate_data['planned_hours_me'] + (task.effective_hours or 0.0),
|
||||
'name': newname,
|
||||
}, context=context)
|
||||
if delegate_data['state'] == 'pending':
|
||||
self.do_pending(cr, uid, [task.id], context)
|
||||
else:
|
||||
self.do_close(cr, uid, [task.id], context=context)
|
||||
user_pool = self.pool.get('res.users')
|
||||
delegate_user = user_pool.browse(cr, uid, delegate_data['user_id'], context=context)
|
||||
message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_user.name)
|
||||
self.log(cr, uid, task.id, message)
|
||||
return True
|
||||
assert delegate_data['user_id'], _("Delegated User should be specified")
|
||||
delegrated_tasks = {}
|
||||
for task in self.browse(cr, uid, ids, context=context):
|
||||
delegrated_task_id = self.copy(cr, uid, task.id, {
|
||||
'name': delegate_data['name'],
|
||||
'project_id': delegate_data['project_id'] and delegate_data['project_id'][0] or False,
|
||||
'user_id': delegate_data['user_id'] and delegate_data['user_id'][0] or False,
|
||||
'planned_hours': delegate_data['planned_hours'] or 0.0,
|
||||
'parent_ids': [(6, 0, [task.id])],
|
||||
'state': 'draft',
|
||||
'description': delegate_data['new_task_description'] or '',
|
||||
'child_ids': [],
|
||||
'work_ids': []
|
||||
}, context=context)
|
||||
newname = delegate_data['prefix'] or ''
|
||||
task.write({
|
||||
'remaining_hours': delegate_data['planned_hours_me'],
|
||||
'planned_hours': delegate_data['planned_hours_me'] + (task.effective_hours or 0.0),
|
||||
'name': newname,
|
||||
}, context=context)
|
||||
if delegate_data['state'] == 'pending':
|
||||
self.do_pending(cr, uid, task.id, context=context)
|
||||
elif delegate_data['state'] == 'done':
|
||||
self.do_close(cr, uid, task.id, context=context)
|
||||
|
||||
message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_data['user_id'][1])
|
||||
self.log(cr, uid, task.id, message)
|
||||
delegrated_tasks[task.id] = delegrated_task_id
|
||||
return delegrated_tasks
|
||||
|
||||
def do_pending(self, cr, uid, ids, context={}):
|
||||
self.write(cr, uid, ids, {'state': 'pending'}, context=context)
|
||||
@@ -933,6 +972,20 @@ class task(osv.osv):
|
||||
def prev_type(self, cr, uid, ids, *args):
|
||||
return self._change_type(cr, uid, ids, False, *args)
|
||||
|
||||
# Overridden to reset the kanban_state to normal whenever
|
||||
# the stage (type_id) of the task changes.
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
if vals and not 'kanban_state' in vals and 'type_id' in vals:
|
||||
new_stage = vals.get('type_id')
|
||||
vals_reset_kstate = dict(vals, kanban_state='normal')
|
||||
for t in self.browse(cr, uid, ids, context=context):
|
||||
write_vals = vals_reset_kstate if t.type_id != new_stage else vals
|
||||
super(task,self).write(cr, uid, [t.id], write_vals, context=context)
|
||||
return True
|
||||
return super(task,self).write(cr, uid, ids, vals, context=context)
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
if context == None:
|
||||
context = {}
|
||||
|
||||
@@ -31,14 +31,23 @@ class project_task_delegate(osv.osv_memory):
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Delegated Title', size=64, required=True, help="New title of the task delegated to the user"),
|
||||
'prefix': fields.char('Your Task Title', size=64, required=True, help="Title for your validation task"),
|
||||
'prefix': fields.char('Your Task Title', size=64, help="Title for your validation task"),
|
||||
'project_id': fields.many2one('project.project', 'Project', help="User you want to delegate this task to"),
|
||||
'user_id': fields.many2one('res.users', 'Assign To', required=True, help="User you want to delegate this task to"),
|
||||
'new_task_description': fields.text('New Task Description', help="Reinclude the description of the task in the task of the user"),
|
||||
'planned_hours': fields.float('Planned Hours', help="Estimated time to close this task by the delegated user"),
|
||||
'planned_hours_me': fields.float('Hours to Validate', required=True, help="Estimated time for you to validate the work done by the user to whom you delegate this task"),
|
||||
'state': fields.selection([('pending','Pending'), ('done','Done'), ], 'Validation State', required=True, help="New state of your own task. Pending will be reopened automatically when the delegated task is closed")
|
||||
'planned_hours_me': fields.float('Hours to Validate', help="Estimated time for you to validate the work done by the user to whom you delegate this task"),
|
||||
'state': fields.selection([('pending','Pending'), ('done','Done'), ], 'Validation State', help="New state of your own task. Pending will be reopened automatically when the delegated task is closed")
|
||||
}
|
||||
|
||||
def onchange_project_id(self, cr, uid, ids, project_id=False, context=None):
|
||||
project_project = self.pool.get('project.project')
|
||||
if not project_id:
|
||||
return {'value':{'user_id': False}}
|
||||
project = project_project.browse(cr, uid, project_id, context=context)
|
||||
return {'value': {'user_id': project.user_id and project.user_id.id or False}}
|
||||
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
"""
|
||||
This function gets default values
|
||||
@@ -47,10 +56,15 @@ class project_task_delegate(osv.osv_memory):
|
||||
if context is None:
|
||||
context = {}
|
||||
record_id = context and context.get('active_id', False) or False
|
||||
if not record_id:
|
||||
return res
|
||||
task_pool = self.pool.get('project.task')
|
||||
task = task_pool.browse(cr, uid, record_id, context=context)
|
||||
task_name =tools.ustr(task.name)
|
||||
|
||||
if 'project_id' in fields:
|
||||
res.update({'project_id': task.project_id and task.project_id.id})
|
||||
|
||||
if 'name' in fields:
|
||||
if task_name.startswith(_('CHECK: ')):
|
||||
newname = tools.ustr(task_name).replace(_('CHECK: '), '')
|
||||
@@ -105,9 +119,17 @@ class project_task_delegate(osv.osv_memory):
|
||||
task_id = context.get('active_id', False)
|
||||
task_pool = self.pool.get('project.task')
|
||||
delegate_data = self.read(cr, uid, ids, context=context)[0]
|
||||
delegate_data['user_id'] = delegate_data['user_id'][0]
|
||||
delegate_data['name'] = tools.ustr(delegate_data['name'])
|
||||
task_pool.do_delegate(cr, uid, task_id, delegate_data, context=context)
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
delegated_tasks = task_pool.do_delegate(cr, uid, [task_id], delegate_data, context=context)
|
||||
models_data = self.pool.get('ir.model.data')
|
||||
|
||||
action_model, action_id = models_data.get_object_reference(cr, uid, 'project', 'action_view_task')
|
||||
view_model, task_view_form_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_form2')
|
||||
view_model, task_view_tree_id = models_data.get_object_reference(cr, uid, 'project', 'view_task_tree2')
|
||||
action = self.pool.get(action_model).read(cr, uid, action_id, context=context)
|
||||
action['res_id'] = delegated_tasks[task_id]
|
||||
action['view_id'] = False
|
||||
action['views'] = [(task_view_form_id, 'form'), (task_view_tree_id, 'tree')]
|
||||
action['help'] = False
|
||||
return action
|
||||
|
||||
project_task_delegate()
|
||||
|
||||
@@ -8,18 +8,19 @@
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Project Task Delegate">
|
||||
<field name="project_id" on_change="onchange_project_id(project_id)"/>
|
||||
<field name="user_id"/>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="Delegated Task" colspan="4"/>
|
||||
<field name="user_id" colspan="4"/>
|
||||
<field name="planned_hours" widget="float_time" colspan="4"/>
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="name"/>
|
||||
<field name="planned_hours"/>
|
||||
<separator string="New Task Description" colspan="4"/>
|
||||
<field name="new_task_description" colspan="4" nolabel="1"/>
|
||||
<field name="new_task_description" colspan="4" nolabel="1"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="Validation Task" colspan="4"/>
|
||||
<field name="planned_hours_me" widget="float_time" colspan="4"/>
|
||||
<field name="prefix" string="Validation Task Title" colspan="4"/>
|
||||
<field name="prefix" string="Validation Task Title"/>
|
||||
<field name="planned_hours_me"/>
|
||||
<field name="state" colspan="4"/>
|
||||
</group>
|
||||
<separator string="" colspan="4"/>
|
||||
@@ -40,7 +41,6 @@
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_project_task_delegate"/>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:25+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: project_retro_planning
|
||||
#: model:ir.model,name:project_retro_planning.model_project_project
|
||||
msgid "Project"
|
||||
msgstr "Projècte"
|
||||
|
||||
#. module: project_retro_planning
|
||||
#: model:ir.module.module,shortdesc:project_retro_planning.module_meta_information
|
||||
msgid "Project Retro planning"
|
||||
msgstr "Retroplanificacion de projèctes"
|
||||
|
||||
#. module: project_retro_planning
|
||||
#: model:ir.module.module,description:project_retro_planning.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" - If end date of project is changed\n"
|
||||
" then the deadline date and start date for all the tasks will "
|
||||
"change accordingly "
|
||||
msgstr ""
|
||||
|
||||
#. module: project_retro_planning
|
||||
#: constraint:project.project:0
|
||||
msgid "Error! project start-date must be lower then project end-date."
|
||||
msgstr ""
|
||||
|
||||
#. module: project_retro_planning
|
||||
#: constraint:project.project:0
|
||||
msgid "Error! You cannot assign escalation to the same project!"
|
||||
msgstr ""
|
||||
@@ -227,7 +227,7 @@ class purchase_order(osv.osv):
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'purchase.order', context=c),
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique(name)', 'Order Reference must be unique !'),
|
||||
('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
|
||||
]
|
||||
_name = "purchase.order"
|
||||
_description = "Purchase Order"
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
# Thai translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-17 07:34+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Thai <th@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-18 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: report_designer
|
||||
#: model:ir.actions.act_window,name:report_designer.action_report_designer_installer
|
||||
#: view:report_designer.installer:0
|
||||
msgid "Reporting Tools Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: field:report_designer.installer,base_report_creator:0
|
||||
msgid "Query Builder"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: view:report_designer.installer:0
|
||||
msgid "Configure"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: view:report_designer.installer:0
|
||||
msgid "title"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: model:ir.model,name:report_designer.model_report_designer_installer
|
||||
msgid "report_designer.installer"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: field:report_designer.installer,config_logo:0
|
||||
msgid "Image"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: field:report_designer.installer,base_report_designer:0
|
||||
msgid "OpenOffice Report Designer"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: model:ir.module.module,shortdesc:report_designer.module_meta_information
|
||||
msgid "Reporting Tools"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: view:report_designer.installer:0
|
||||
msgid ""
|
||||
"OpenERP's built-in reporting abilities can be improved even further with "
|
||||
"some of the following applications"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: view:report_designer.installer:0
|
||||
msgid "Configure Reporting Tools"
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: help:report_designer.installer,base_report_creator:0
|
||||
msgid ""
|
||||
"Allows you to create any statistic reports on several objects. It's a SQL "
|
||||
"query builder and browser for end users."
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: help:report_designer.installer,base_report_designer:0
|
||||
msgid ""
|
||||
"Adds wizards to Import/Export .SXW report which you can modify in "
|
||||
"OpenOffice.Once you have modified it you can upload the report using the "
|
||||
"same wizard."
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: model:ir.module.module,description:report_designer.module_meta_information
|
||||
msgid ""
|
||||
"Installer for reporting tools selection\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: report_designer
|
||||
#: field:report_designer.installer,progress:0
|
||||
msgid "Configuration Progress"
|
||||
msgstr ""
|
||||
File diff suppressed because it is too large
Load Diff
+8
-4
@@ -280,7 +280,7 @@ class sale_order(osv.osv):
|
||||
'partner_shipping_id': lambda self, cr, uid, context: context.get('partner_id', False) and self.pool.get('res.partner').address_get(cr, uid, [context['partner_id']], ['delivery'])['delivery'],
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique(name)', 'Order Reference must be unique !'),
|
||||
('name_uniq', 'unique(name, company_id)', 'Order Reference must be unique per Company!'),
|
||||
]
|
||||
_order = 'name desc'
|
||||
|
||||
@@ -772,6 +772,10 @@ class sale_order(osv.osv):
|
||||
will be added. A new picking will be created if ommitted.
|
||||
:return: True
|
||||
"""
|
||||
move_obj = self.pool.get('stock.move')
|
||||
picking_obj = self.pool.get('stock.picking')
|
||||
procurement_obj = self.pool.get('procurement.order')
|
||||
|
||||
proc_ids = []
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for line in order_lines:
|
||||
@@ -784,17 +788,17 @@ class sale_order(osv.osv):
|
||||
if line.product_id:
|
||||
if line.product_id.product_tmpl_id.type in ('product', 'consu'):
|
||||
if not picking_id:
|
||||
picking_id = self.pool.get('stock.picking').create(cr, uid, self._prepare_order_picking(cr, uid, order, *args))
|
||||
picking_id = picking_obj.create(cr, uid, self._prepare_order_picking(cr, uid, order, *args))
|
||||
move_id = move_obj.create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args))
|
||||
else:
|
||||
# a service has no stock move
|
||||
move_id = False
|
||||
|
||||
proc_id = self.pool.get('procurement.order').create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args))
|
||||
proc_id = procurement_obj.create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args))
|
||||
proc_ids.append(proc_id)
|
||||
line.write({'procurement_id': proc_id})
|
||||
self.ship_exception(cr, uid, order, move_obj, line, move_id, proc_id)
|
||||
|
||||
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
if picking_id:
|
||||
wf_service.trg_validate(uid, 'stock.picking', picking_id, 'button_confirm', cr)
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:25+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: sale_analytic_plans
|
||||
#: field:sale.order.line,analytics_id:0
|
||||
msgid "Analytic Distribution"
|
||||
msgstr "Distribucion analitica"
|
||||
|
||||
#. module: sale_analytic_plans
|
||||
#: model:ir.module.module,shortdesc:sale_analytic_plans.module_meta_information
|
||||
msgid "Sales Analytic Distribution Management"
|
||||
msgstr "Gestion de la Distribucion Analitica de las Vendas"
|
||||
|
||||
#. module: sale_analytic_plans
|
||||
#: model:ir.module.module,description:sale_analytic_plans.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" The base module to manage analytic distribution and sales orders.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Lo modul de basa per gerir la distribucion analitica e los bons de "
|
||||
"comanda.\n"
|
||||
" "
|
||||
|
||||
#. module: sale_analytic_plans
|
||||
#: model:ir.model,name:sale_analytic_plans.model_sale_order_line
|
||||
msgid "Sales Order Line"
|
||||
msgstr "Linha de bon de comanda"
|
||||
@@ -661,6 +661,9 @@ class stock_picking(osv.osv):
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
|
||||
}
|
||||
_sql_constraints = [
|
||||
('name_uniq', 'unique(name, company_id)', 'Reference must be unique per Company!'),
|
||||
]
|
||||
|
||||
def action_process(self, cr, uid, ids, context=None):
|
||||
if context is None: context = {}
|
||||
@@ -1525,7 +1528,7 @@ class stock_move(osv.osv):
|
||||
return True
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True, select=True),
|
||||
'name': fields.char('Name', size=250, required=True, select=True),
|
||||
'priority': fields.selection([('0', 'Not urgent'), ('1', 'Urgent')], 'Priority'),
|
||||
'create_date': fields.datetime('Creation Date', readonly=True, select=True),
|
||||
'date': fields.datetime('Date', required=True, select=True, help="Move date: scheduled date until move is done, then date of actual move processing", states={'done': [('readonly', True)]}),
|
||||
|
||||
@@ -43,15 +43,15 @@ class stock_location_product(osv.osv_memory):
|
||||
location_products = self.read(cr, uid, ids, ['from_date', 'to_date'], context=context)
|
||||
if location_products:
|
||||
return {
|
||||
'name': False,
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'product.product',
|
||||
'type': 'ir.actions.act_window',
|
||||
'context': {'location': context.get('active_id'),
|
||||
'from_date': location_products[0]['from_date'],
|
||||
'to_date': location_products[0]['to_date']},
|
||||
'domain': [('type', '<>', 'service')],
|
||||
'name': False,
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'product.product',
|
||||
'type': 'ir.actions.act_window',
|
||||
'context': {'location': context['active_id'],
|
||||
'from_date': location_products[0]['from_date'],
|
||||
'to_date': location_products[0]['to_date']},
|
||||
'domain': [('type', '<>', 'service')],
|
||||
}
|
||||
|
||||
stock_location_product()
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:30+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: stock_invoice_directly
|
||||
#: model:ir.model,name:stock_invoice_directly.model_stock_partial_picking
|
||||
msgid "Partial Picking"
|
||||
msgstr "Tractament parcial"
|
||||
|
||||
#. module: stock_invoice_directly
|
||||
#: model:ir.module.module,description:stock_invoice_directly.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" When you send or deliver goods, this module automatically launch\n"
|
||||
" the invoicing wizard if the delivery is to be invoiced.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: stock_invoice_directly
|
||||
#: model:ir.module.module,shortdesc:stock_invoice_directly.module_meta_information
|
||||
msgid "Invoice Picking Directly"
|
||||
msgstr "Facturar la liurason dirèctament"
|
||||
@@ -0,0 +1,70 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-03 16:58+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:30+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: model:ir.model,name:stock_no_autopicking.model_product_product
|
||||
msgid "Product"
|
||||
msgstr "Produch"
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: model:ir.module.module,description:stock_no_autopicking.module_meta_information
|
||||
msgid ""
|
||||
"\n"
|
||||
" This module allows an intermediate picking process to provide raw "
|
||||
"materials\n"
|
||||
" to production orders.\n"
|
||||
"\n"
|
||||
" One example of usage of this module is to manage production made by "
|
||||
"your\n"
|
||||
" suppliers (sub-contracting). To achieve this, set the assembled product\n"
|
||||
" which is sub-contracted to \"No Auto-Picking\" and put the location of "
|
||||
"the\n"
|
||||
" supplier in the routing of the assembly operation.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: model:ir.model,name:stock_no_autopicking.model_mrp_production
|
||||
msgid "Manufacturing Order"
|
||||
msgstr "Òrdre de fabricacion"
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: field:product.product,auto_pick:0
|
||||
msgid "Auto Picking"
|
||||
msgstr "Prelevament automatic"
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: help:product.product,auto_pick:0
|
||||
msgid "Auto picking for raw materials of production orders."
|
||||
msgstr ""
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: constraint:product.product:0
|
||||
msgid "Error: Invalid ean code"
|
||||
msgstr "Error : Còde ean invalid"
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: model:ir.module.module,shortdesc:stock_no_autopicking.module_meta_information
|
||||
msgid "Stock No Auto-Picking"
|
||||
msgstr ""
|
||||
|
||||
#. module: stock_no_autopicking
|
||||
#: constraint:mrp.production:0
|
||||
msgid "Order quantity cannot be negative or zero !"
|
||||
msgstr ""
|
||||
@@ -142,11 +142,9 @@
|
||||
product_uos_qty: 0.0
|
||||
bom_id: mrp_bom_cupoftea0
|
||||
routing_id: mrp_routing_productionrouting0
|
||||
company_id: base.main_company
|
||||
date_planned: !eval time.strftime('%Y-%m-%d %H:%M:%S')
|
||||
location_dest_id: stock.stock_location_stock
|
||||
location_src_id: stock.stock_location_stock
|
||||
name: MO/00002
|
||||
-
|
||||
I compute the data of production order.
|
||||
-
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:29+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: web_livechat
|
||||
#: sql_constraint:publisher_warranty.contract:0
|
||||
msgid ""
|
||||
"Your publisher warranty contract is already subscribed in the system !"
|
||||
msgstr ""
|
||||
|
||||
#. module: web_livechat
|
||||
#: model:ir.module.module,shortdesc:web_livechat.module_meta_information
|
||||
msgid "Live Chat Support"
|
||||
msgstr "Supòrt per messatjariá instantanèa"
|
||||
|
||||
#. module: web_livechat
|
||||
#: model:ir.model,name:web_livechat.model_publisher_warranty_contract
|
||||
msgid "publisher_warranty.contract"
|
||||
msgstr "publisher_warranty.contract"
|
||||
|
||||
#. module: web_livechat
|
||||
#: model:ir.module.module,description:web_livechat.module_meta_information
|
||||
msgid "Enable live chat support for whom have a maintenance contract"
|
||||
msgstr ""
|
||||
"Validar lo supòrt per messatjariá instantanèa pels detentors d'un contracte "
|
||||
"de mantenença"
|
||||
@@ -0,0 +1,29 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-12 16:15+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:28+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: web_uservoice
|
||||
#: model:ir.module.module,shortdesc:web_uservoice.module_meta_information
|
||||
msgid "Add uservoice button in header"
|
||||
msgstr "Apondre un boton \"viscut utilizaire\" dins l'entèsta"
|
||||
|
||||
#. module: web_uservoice
|
||||
#: code:addons/web_uservoice/web/editors.py:72
|
||||
#, python-format
|
||||
msgid "feedback"
|
||||
msgstr "retorn d'experiéncia"
|
||||
@@ -0,0 +1,32 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:27+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: wiki_faq
|
||||
#: model:ir.module.module,description:wiki_faq.module_meta_information
|
||||
msgid ""
|
||||
"This module provides a wiki FAQ Template\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Aqueste modul provesís un modèl de FAQ Wiki\n"
|
||||
" "
|
||||
|
||||
#. module: wiki_faq
|
||||
#: model:ir.module.module,shortdesc:wiki_faq.module_meta_information
|
||||
msgid "Document Management - Wiki - FAQ"
|
||||
msgstr "Gestion documentària - Wiki - FAQ"
|
||||
@@ -0,0 +1,32 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:27+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: wiki_quality_manual
|
||||
#: model:ir.module.module,description:wiki_quality_manual.module_meta_information
|
||||
msgid ""
|
||||
"Quality Manual Template\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Modèl de manual qualitat\n"
|
||||
" "
|
||||
|
||||
#. module: wiki_quality_manual
|
||||
#: model:ir.module.module,shortdesc:wiki_quality_manual.module_meta_information
|
||||
msgid "Document Management - Wiki - Quality Manual"
|
||||
msgstr "Gestion documentària - Wiki - Manual Qualitat"
|
||||
@@ -0,0 +1,68 @@
|
||||
# Occitan (post 1500) translation for openobject-addons
|
||||
# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2011-01-11 11:16+0000\n"
|
||||
"PO-Revision-Date: 2011-11-20 09:26+0000\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: Occitan (post 1500) <oc@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2011-11-21 05:22+0000\n"
|
||||
"X-Generator: Launchpad (build 14299)\n"
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.actions.act_window,name:wiki_sale_faq.action_document_form
|
||||
#: model:ir.ui.menu,name:wiki_sale_faq.menu_document_files
|
||||
#: model:ir.ui.menu,name:wiki_sale_faq.menu_sales
|
||||
msgid "Documents"
|
||||
msgstr "Documents"
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.actions.act_window,name:wiki_sale_faq.action_wiki_test
|
||||
msgid "Wiki Pages"
|
||||
msgstr "Paginas del wiki"
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.ui.menu,name:wiki_sale_faq.menu_action_wiki_wiki
|
||||
msgid "FAQ"
|
||||
msgstr "Questions frequentas (FAQ)"
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.module.module,description:wiki_sale_faq.module_meta_information
|
||||
msgid ""
|
||||
"This module provides a wiki FAQ Template\n"
|
||||
" "
|
||||
msgstr ""
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.actions.act_window,help:wiki_sale_faq.action_wiki_test
|
||||
msgid ""
|
||||
"Wiki pages allow you to share ideas and questions with coworkers. You can "
|
||||
"create a new document that can be linked to one or several applications "
|
||||
"(specifications of a project, FAQ for sales teams, etc.). Keywords can be "
|
||||
"used to easily tag wiki pages. You should use this application with the "
|
||||
"OpenERP web client interface."
|
||||
msgstr ""
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.module.module,shortdesc:wiki_sale_faq.module_meta_information
|
||||
msgid "Wiki -Sale - FAQ"
|
||||
msgstr "FAQ Wiki Vendas"
|
||||
|
||||
#. module: wiki_sale_faq
|
||||
#: model:ir.actions.act_window,help:wiki_sale_faq.action_document_form
|
||||
msgid ""
|
||||
"Documents give you access to all files attached to any record. It is a "
|
||||
"repository of all documents such as emails, project-related attachments or "
|
||||
"any other documents. From this view, you can search through the content of "
|
||||
"the documents. OpenERP automatically assign meta data based on the record "
|
||||
"like the related partner and indexes the content of .DOC, .ODT, .TXT, .SXW "
|
||||
"and .PDF documents."
|
||||
msgstr ""
|
||||
Reference in New Issue
Block a user