diff --git a/addons/account/__init__.py b/addons/account/__init__.py index 52c65f0c3da..36cc1c85b5a 100644 --- a/addons/account/__init__.py +++ b/addons/account/__init__.py @@ -23,7 +23,7 @@ import account import installer import project import partner -import invoice +import account_invoice import account_bank_statement import account_bank import account_cash_statement @@ -32,7 +32,7 @@ import account_analytic_line import wizard import report import product -import sequence +import ir_sequence import company import res_currency diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index d1726d164b6..9445688ec6d 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -22,7 +22,7 @@ "name" : "Accounting and Financial Management", "version" : "1.1", "author" : "OpenERP SA", - "category": 'Finance', + "category": 'Accounting & Finance', 'complexity': "normal", "description": """ Accounting and Financial Management. @@ -103,8 +103,7 @@ module named account_voucher. 'account_end_fy.xml', 'account_invoice_view.xml', 'partner_view.xml', - 'data/account_invoice.xml', - 'data/account_data2.xml', + 'data/account_data.xml', 'account_invoice_workflow.xml', 'project/project_view.xml', 'project/project_report.xml', @@ -119,7 +118,7 @@ module named account_voucher. 'process/statement_process.xml', 'process/customer_invoice_process.xml', 'process/supplier_invoice_process.xml', - 'sequence_view.xml', + 'ir_sequence_view.xml', 'company_view.xml', 'board_account_view.xml', "wizard/account_report_profit_loss_view.xml", diff --git a/addons/account/account.py b/addons/account/account.py index 41d4673df0a..68af88754f5 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -346,6 +346,52 @@ class account_account(osv.osv): res[account.id] = level return res + def _set_credit_debit(self, cr, uid, account_id, name, value, arg, context=None): + if context.get('config_invisible', True): + return True + + account = self.browse(cr, uid, account_id, context=context) + diff = value - getattr(account,name) + if not diff: + return True + + journal_obj = self.pool.get('account.journal') + jids = journal_obj.search(cr, uid, [('type','=','situation'),('centralisation','=',1),('company_id','=',account.company_id.id)], context=context) + if not jids: + raise osv.except_osv(_('Error!'),_("You need an Opening journal with centralisation checked to set the initial balance!")) + + period_obj = self.pool.get('account.period') + pids = period_obj.search(cr, uid, [('special','=',True),('company_id','=',account.company_id.id)], context=context) + if not pids: + raise osv.except_osv(_('Error!'),_("No opening/closing period defined, please create one to set the initial balance!")) + + move_obj = self.pool.get('account.move.line') + move_id = move_obj.search(cr, uid, [ + ('journal_id','=',jids[0]), + ('period_id','=',pids[0]), + ('account_id','=', account_id), + (name,'>', 0.0), + ('name','=', _('Opening Balance')) + ], context=context) + if move_id: + move = move_obj.browse(cr, uid, move_id[0], context=context) + move_obj.write(cr, uid, move_id[0], { + name: diff+getattr(move,name) + }, context=context) + else: + if diff<0.0: + raise osv.except_osv(_('Error!'),_("Unable to adapt the initial balance (negative value)!")) + nameinv = (name=='credit' and 'debit') or 'credit' + move_id = move_obj.create(cr, uid, { + 'name': _('Opening Balance'), + 'account_id': account_id, + 'journal_id': jids[0], + 'period_id': pids[0], + name: diff, + nameinv: 0.0 + }, context=context) + return True + _columns = { 'name': fields.char('Name', size=128, required=True, select=True), 'currency_id': fields.many2one('res.currency', 'Secondary Currency', help="Forces all moves for this account to have this secondary currency."), @@ -370,9 +416,9 @@ class account_account(osv.osv): 'child_consol_ids': fields.many2many('account.account', 'account_account_consol_rel', 'child_id', 'parent_id', 'Consolidated Children'), 'child_id': fields.function(_get_child_ids, type='many2many', relation="account.account", string="Child Accounts"), 'balance': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Balance', multi='balance'), - 'credit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'), - 'debit': fields.function(__compute, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'), - 'reconcile': fields.boolean('Reconcile', help="Check this if the user is allowed to reconcile entries in this account."), + 'credit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Credit', multi='balance'), + 'debit': fields.function(__compute, fnct_inv=_set_credit_debit, digits_compute=dp.get_precision('Account'), string='Debit', multi='balance'), + 'reconcile': fields.boolean('Allow Reconciliation', help="Check this box if this account allows reconciliation of journal items."), 'shortcut': fields.char('Shortcut', size=12), 'tax_ids': fields.many2many('account.tax', 'account_account_tax_default_rel', 'account_id', 'tax_id', 'Default Taxes'), @@ -672,32 +718,22 @@ class account_journal(osv.osv): return super(account_journal, self).write(cr, uid, ids, vals, context=context) def create_sequence(self, cr, uid, vals, context=None): + """ Create new no_gap entry sequence for every new Joural """ - Create new entry sequence for every new Joural - """ - seq_pool = self.pool.get('ir.sequence') - seq_typ_pool = self.pool.get('ir.sequence.type') - - name = vals['name'] - code = vals['code'].lower() - - types = { - 'name': name, - 'code': code - } - seq_typ_pool.create(cr, uid, types) + # in account.journal code is actually the prefix of the sequence + # whereas ir.sequence code is a key to lookup global sequences. + prefix = vals['code'].upper() seq = { - 'name': name, - 'code': code, - 'active': True, - 'prefix': code + "/%(year)s/", + 'name': vals['name'], + 'implementation':'no_gap', + 'prefix': prefix + "/%(year)s/", 'padding': 4, 'number_increment': 1 } if 'company_id' in vals: seq['company_id'] = vals['company_id'] - return seq_pool.create(cr, uid, seq) + return self.pool.get('ir.sequence').create(cr, uid, seq) def create(self, cr, uid, vals, context=None): if not 'sequence_id' in vals or not vals['sequence_id']: @@ -722,8 +758,6 @@ class account_journal(osv.osv): name = rs.name if rs.currency: name = "%s (%s)" % (rs.name, rs.currency.name) - else: - name = "%s (%s)" % (rs.name, rs.company_id.currency_id.name) res += [(rs.id, name)] return res @@ -932,17 +966,10 @@ class account_period(osv.osv): return False def find(self, cr, uid, dt=None, context=None): - if context is None: context = {} if not dt: dt = time.strftime('%Y-%m-%d') #CHECKME: shouldn't we check the state of the period? - args = [('date_start', '<=' ,dt), ('date_stop', '>=', dt)] - if context.get('company_id', False): - args.append(('company_id', '=', context['company_id'])) - else: - company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id - args.append(('company_id', '=', company_id)) - ids = self.search(cr, uid, args, context=context) + ids = self.search(cr, uid, [('date_start','<=',dt),('date_stop','>=',dt)]) if not ids: raise osv.except_osv(_('Error !'), _('No period defined for this date: %s !\nPlease create one.')%dt) return ids @@ -1223,7 +1250,7 @@ class account_move(osv.osv): else: if journal.sequence_id: c = {'fiscalyear_id': move.period_id.fiscalyear_id.id} - new_name = obj_sequence.get_id(cr, uid, journal.sequence_id.id, context=c) + new_name = obj_sequence.next_by_id(cr, uid, journal.sequence_id.id, c) else: raise osv.except_osv(_('Error'), _('No sequence defined on the journal !')) @@ -1265,7 +1292,7 @@ class account_move(osv.osv): context = {} c = context.copy() c['novalidate'] = True - result = super(osv.osv, self).write(cr, uid, ids, vals, c) + result = super(account_move, self).write(cr, uid, ids, vals, c) self.validate(cr, uid, ids, context=context) return result @@ -2739,7 +2766,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): _columns = { 'company_id':fields.many2one('res.company', 'Company', required=True), 'chart_template_id': fields.many2one('account.chart.template', 'Chart Template', required=True), - 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Bank Accounts', required=True), + 'bank_accounts_id': fields.one2many('account.bank.accounts.wizard', 'bank_account_id', 'Cash and Banks', required=True), 'code_digits':fields.integer('# of Digits', required=True, help="No. of Digits to use for account code"), 'seq_journal':fields.boolean('Separated Journal Sequences', help="Check this box if you want to use a different sequence for each created journal. Otherwise, all will use the same sequence."), "sale_tax": fields.many2one("account.tax.template", "Default Sale Tax"), @@ -2787,7 +2814,6 @@ class wizard_multi_charts_accounts(osv.osv_memory): def _get_default_accounts(self, cr, uid, context=None): return [ - {'acc_name': _('Bank Account'),'account_type':'bank'}, {'acc_name': _('Cash'),'account_type':'cash'} ] diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index 4cc2ed89786..98051a319fd 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -340,9 +340,9 @@ class account_bank_statement(osv.osv): else: if st.journal_id.sequence_id: c = {'fiscalyear_id': st.period_id.fiscalyear_id.id} - st_number = obj_seq.get_id(cr, uid, st.journal_id.sequence_id.id, context=c) + st_number = obj_seq.next_by_id(cr, uid, st.journal_id.sequence_id.id, context=c) else: - st_number = obj_seq.get(cr, uid, 'account.bank.statement') + st_number = obj_seq.next_by_code(cr, uid, 'account.bank.statement') for line in st.move_line_ids: if line.state <> 'valid': diff --git a/addons/account/account_bank_view.xml b/addons/account/account_bank_view.xml index d91739817ac..1a0e26e7c1f 100644 --- a/addons/account/account_bank_view.xml +++ b/addons/account/account_bank_view.xml @@ -13,7 +13,7 @@ - + @@ -23,16 +23,16 @@ - Bank Accounts + Setup your Bank Accounts res.partner.bank form tree,form - Configure your company's bank account and select those that must appear on the report footer. You can drag & drop bank in the list view to reorder bank accounts. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. + Configure your company's bank account and select those that must appear on the report footer. You can reorder banks in the list view. If you use the accounting application of OpenERP, journals and accounts will be created automatically based on these data. diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py index dc78d19bab4..ebc97fe8a84 100644 --- a/addons/account/account_cash_statement.py +++ b/addons/account/account_cash_statement.py @@ -294,9 +294,9 @@ class account_cash_statement(osv.osv): if statement.name and statement.name == '/': if statement.journal_id.sequence_id: c = {'fiscalyear_id': statement.period_id.fiscalyear_id.id} - st_number = obj_seq.get_id(cr, uid, statement.journal_id.sequence_id.id, context=c) + st_number = obj_seq.next_by_id(cr, uid, statement.journal_id.sequence_id.id, context=c) else: - st_number = obj_seq.get(cr, uid, 'account.cash.statement') + st_number = obj_seq.next_by_code(cr, uid, 'account.cash.statement') vals.update({ 'name': st_number }) diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index 361a371fb97..b35b37aa972 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -11,7 +11,7 @@ Accounting Application Configuration - Configure Your Accounting Chart + Configure Your Chart of Accounts The default Chart of Accounts is matching your country selection. If no certified Chart of Accounts exists for your specified country, a generic one can be installed and will be selected by default. @@ -26,7 +26,7 @@ - + @@ -43,28 +43,8 @@ - - account.installer.modules.form - base.setup.installer - form - - - - - - - - - - - - - - - - - Accounting Chart Configuration + Install your Chart of Accounts ir.actions.act_window account.installer @@ -85,25 +65,13 @@ automatic - - Define your Bank Account - ir.actions.act_window - res.partner.bank - form - form - - - - - - - Review your Financial Accounts ir.actions.act_window account.account form tree,form + {'config_invisible': False} @@ -113,11 +81,12 @@ - Review your Financial Journal + Review your Financial Journals ir.actions.act_window account.journal form tree,form + Setup your accounting journals. For bank accounts, it's better to use the 'Setup Your Bank Accounts' tool that will automatically create the accounts and journals for you. @@ -131,6 +100,7 @@ account.payment.term form tree,form + Payment terms define the conditions to pay a customer or supplier invoice in one or several payments. Customers periodic reminders will use the payment terms for each letter. Each customer or supplier can be assigned to one of these payment terms. diff --git a/addons/account/invoice.py b/addons/account/account_invoice.py similarity index 99% rename from addons/account/invoice.py rename to addons/account/account_invoice.py index 3747ef978a8..834da02d1b4 100644 --- a/addons/account/invoice.py +++ b/addons/account/account_invoice.py @@ -209,7 +209,7 @@ class account_invoice(osv.osv): \n* The \'Open\' state is used when user create invoice,a invoice number is generated.Its in open state till user does not pay invoice. \ \n* The \'Paid\' state is set automatically when invoice is paid.\ \n* The \'Cancelled\' state is used when user cancel invoice.'), - 'date_invoice': fields.date('Invoice Date', readonly=True, states={'draft':[('readonly',False)]}, select=True, help="Keep empty to use the current date"), + 'date_invoice': fields.date('Invoice Date', states={'paid':[('readonly',True)], 'open':[('readonly',True)], 'close':[('readonly',True)]}, select=True, help="Keep empty to use the current date"), 'date_due': fields.date('Due Date', states={'paid':[('readonly',True)], 'open':[('readonly',True)], 'close':[('readonly',True)]}, select=True, help="If you use payment terms, the due date will be computed automatically at the generation "\ "of accounting entries. If you keep the payment term and the due date empty, it means direct payment. The payment term may compute several due dates, for example 50% now, 50% in one month."), diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml index 09a90b98686..11ec7d8360a 100644 --- a/addons/account/account_invoice_view.xml +++ b/addons/account/account_invoice_view.xml @@ -234,7 +234,6 @@ - @@ -333,7 +332,6 @@ - diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index a7b2633504d..92d71339168 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -23,8 +23,10 @@ import time from datetime import datetime from operator import itemgetter +from lxml import etree + import netsvc -from osv import fields, osv +from osv import fields, osv, orm from tools.translate import _ import decimal_precision as dp import tools @@ -718,7 +720,7 @@ class account_move_line(osv.osv): ) return cr.fetchone() - def reconcile_partial(self, cr, uid, ids, type='auto', context=None): + def reconcile_partial(self, cr, uid, ids, type='auto', context=None, writeoff_acc_id=False, writeoff_period_id=False, writeoff_journal_id=False): move_rec_obj = self.pool.get('account.move.reconcile') merges = [] unmerge = [] @@ -747,7 +749,7 @@ class account_move_line(osv.osv): unmerge.append(line.id) total += (line.debit or 0.0) - (line.credit or 0.0) if self.pool.get('res.currency').is_zero(cr, uid, company_currency_id, total): - res = self.reconcile(cr, uid, merges+unmerge, context=context) + res = self.reconcile(cr, uid, merges+unmerge, context=context, writeoff_acc_id=writeoff_acc_id, writeoff_period_id=writeoff_period_id, writeoff_journal_id=writeoff_journal_id) return res r_id = move_rec_obj.create(cr, uid, { 'type': type, @@ -812,7 +814,7 @@ class account_move_line(osv.osv): if (not currency_obj.is_zero(cr, uid, account.company_id.currency_id, writeoff)) or \ (account.currency_id and (not currency_obj.is_zero(cr, uid, account.currency_id, currency))): if not writeoff_acc_id: - raise osv.except_osv(_('Warning'), _('You have to provide an account for the write off entry !')) + raise osv.except_osv(_('Warning'), _('You have to provide an account for the write off/exchange difference entry !')) if writeoff > 0: debit = writeoff credit = 0.0 @@ -970,7 +972,6 @@ class account_move_line(osv.osv): fields = {} flds = [] title = _("Accounting Entries") #self.view_header_get(cr, uid, view_id, view_type, context) - xml = '''\n\n\t''' % (title) ids = journal_pool.search(cr, uid, []) journals = journal_pool.browse(cr, uid, ids, context=context) @@ -982,14 +983,14 @@ class account_move_line(osv.osv): for field in journal.view_id.columns_id: if not field.field in fields: fields[field.field] = [journal.id] - fld.append((field.field, field.sequence, field.name)) + fld.append((field.field, field.sequence)) flds.append(field.field) common_fields[field.field] = 1 else: fields.get(field.field).append(journal.id) common_fields[field.field] = common_fields[field.field] + 1 - fld.append(('period_id', 3, _('Period'))) - fld.append(('journal_id', 10, _('Journal'))) + fld.append(('period_id', 3)) + fld.append(('journal_id', 10)) flds.append('period_id') flds.append('journal_id') fields['period_id'] = all_journal @@ -1001,62 +1002,71 @@ class account_move_line(osv.osv): 'tax_code_id': 50, 'move_id': 40, } - for field_it in fld: - field = field_it[0] + + document = etree.Element('tree', string=title, editable="top", + refresh="5", on_write="on_create_write", + colors="red:state=='draft';black:state=='valid'") + fields_get = self.fields_get(cr, uid, flds, context) + for field, _seq in fld: if common_fields.get(field) == total: fields.get(field).append(None) -# if field=='state': -# state = 'colors="red:state==\'draft\'"' - attrs = [] + # if field=='state': + # state = 'colors="red:state==\'draft\'"' + f = etree.SubElement(document, 'field', name=field) + if field == 'debit': - attrs.append('sum = "%s"' % _("Total debit")) + f.set('sum', _("Total debit")) elif field == 'credit': - attrs.append('sum = "%s"' % _("Total credit")) + f.set('sum', _("Total credit")) elif field == 'move_id': - attrs.append('required = "False"') + f.set('required', 'False') elif field == 'account_tax_id': - attrs.append('domain="[(\'parent_id\', \'=\' ,False)]"') - attrs.append("context=\"{'journal_id': journal_id}\"") + f.set('domain', "[('parent_id', '=' ,False)]") + f.set('context', "{'journal_id': journal_id}") elif field == 'account_id' and journal.id: - attrs.append('domain="[(\'journal_id\', \'=\', journal_id),(\'type\',\'<>\',\'view\'), (\'type\',\'<>\',\'closed\')]" on_change="onchange_account_id(account_id, partner_id)"') + f.set('domain', "[('journal_id', '=', journal_id),('type','!=','view'), ('type','!=','closed')]") + f.set('on_change', 'onchange_account_id(account_id, partner_id)') elif field == 'partner_id': - attrs.append('on_change="onchange_partner_id(move_id, partner_id, account_id, debit, credit, date, journal_id)"') + f.set('on_change', 'onchange_partner_id(move_id, partner_id, account_id, debit, credit, date, journal_id)') elif field == 'journal_id': - attrs.append("context=\"{'journal_id': journal_id}\"") + f.set('context', "{'journal_id': journal_id}") elif field == 'statement_id': - attrs.append("domain=\"[('state', '!=', 'confirm'),('journal_id.type', '=', 'bank')]\"") + f.set('domain', "[('state', '!=', 'confirm'),('journal_id.type', '=', 'bank')]") elif field == 'date': - attrs.append('on_change="onchange_date(date)"') + f.set('on_change', 'onchange_date(date)') elif field == 'analytic_account_id': - attrs.append('''groups="analytic.group_analytic_accounting"''') # Currently it is not working due to framework problem may be .. + # Currently it is not working due to being executed by superclass's fields_view_get + # f.set('groups', 'analytic.group_analytic_accounting') + pass if field in ('amount_currency', 'currency_id'): - attrs.append('on_change="onchange_currency(account_id, amount_currency, currency_id, date, journal_id)"') - attrs.append('''attrs="{'readonly': [('state', '=', 'valid')]}"''') + f.set('on_change', 'onchange_currency(account_id, amount_currency, currency_id, date, journal_id)') + f.set('attrs', "{'readonly': [('state', '=', 'valid')]}") if field in widths: - attrs.append('width="'+str(widths[field])+'"') + f.set('width', str(widths[field])) if field in ('journal_id',): - attrs.append("invisible=\"context.get('journal_id', False)\"") + f.set("invisible", "context.get('journal_id', False)") elif field in ('period_id',): - attrs.append("invisible=\"context.get('period_id', False)\"") + f.set("invisible", "context.get('period_id', False)") else: - attrs.append("invisible=\"context.get('visible_id') not in %s\"" % (fields.get(field))) - xml += '''\n''' % (field,' '.join(attrs)) + f.set('invisible', "context.get('visible_id') not in %s" % (fields.get(field))) - xml += '''''' - result['arch'] = xml - result['fields'] = self.fields_get(cr, uid, flds, context) + orm.setup_modifiers(f, fields_get[field], context=context, + in_tree_view=True) + + result['arch'] = etree.tostring(document, pretty_print=True) + result['fields'] = fields_get return result def _check_moves(self, cr, uid, context=None): @@ -1221,7 +1231,7 @@ class account_move_line(osv.osv): vals['move_id'] = res[0] if not vals.get('move_id', False): if journal.sequence_id: - #name = self.pool.get('ir.sequence').get_id(cr, uid, journal.sequence_id.id) + #name = self.pool.get('ir.sequence').next_by_id(cr, uid, journal.sequence_id.id) v = { 'date': vals.get('date', time.strftime('%Y-%m-%d')), 'period_id': context['period_id'], @@ -1249,7 +1259,7 @@ class account_move_line(osv.osv): break # Automatically convert in the account's secondary currency if there is one and # the provided values were not already multi-currency - if account.currency_id and 'amount_currency' not in vals and account.currency_id.id != account.company_id.currency_id.id: + if account.currency_id and not vals.get('ammount_currency') and account.currency_id.id != account.company_id.currency_id.id: vals['currency_id'] = account.currency_id.id ctx = {} if 'date' in vals: @@ -1273,7 +1283,7 @@ class account_move_line(osv.osv): 'user_id': uid })] - result = super(osv.osv, self).create(cr, uid, vals, context=context) + result = super(account_move_line, self).create(cr, uid, vals, context=context) # CREATE Taxes if vals.get('account_tax_id', False): tax_id = tax_obj.browse(cr, uid, vals['account_tax_id']) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index e5dbbedb9de..2ae910a36b3 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -162,17 +162,21 @@
- - - - - - - + + + + + + + + + + + + - @@ -209,7 +213,6 @@ - @@ -438,9 +441,9 @@ - + - + @@ -1193,7 +1196,7 @@ - + @@ -2375,8 +2378,7 @@ Accounting Application Configuration - Generate Your Accounting Chart from a Chart Template + Generate Your Chart of Accounts from a Chart Template This will automatically configure your chart of accounts, bank accounts, taxes and journals according to the selected template @@ -2388,13 +2390,13 @@ - + - + - +
diff --git a/addons/account/company.py b/addons/account/company.py index bbbb8aa60c8..c903b6d4a71 100644 --- a/addons/account/company.py +++ b/addons/account/company.py @@ -32,7 +32,7 @@ class res_company(osv.osv): string="Reserve and Profit/Loss Account", view_load=True, domain="[('type', '=', 'other')]", - help="This Account is used for transferring Profit/Loss(If It is Profit: Amount will be added, Loss : Amount will be deducted.), Which is calculated from Profit & Loss Report"), + help="This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report"), } _defaults = { diff --git a/addons/account/configurable_account_chart.xml b/addons/account/configurable_account_chart.xml index d947a06dd0e..cc1e5b27380 100644 --- a/addons/account/configurable_account_chart.xml +++ b/addons/account/configurable_account_chart.xml @@ -21,26 +21,26 @@ none - - Income View - view - income - - - Expense View - expense - expense - - - Asset View - asset - asset - - - Liability View - liability - liability - + + Income View + view + income + + + Expense View + expense + expense + + + Asset View + asset + asset + + + Liability View + liability + liability + Income @@ -87,7 +87,7 @@ Equity equity - asset + liability balance @@ -106,16 +106,16 @@ - - - 0 - Configurable Account Chart - - view - - + + + 0 + Configurable Account Chart + + view + + - + 1 @@ -125,120 +125,120 @@ - - 10 - Fixed Assets - - view - - + + 10 + Fixed Assets + + view + + - - 100 - Fixed Asset Account - - other - - + + 100 + Fixed Asset Account + + other + + - - 11 - Net Current Assets - - view - - + + 11 + Net Current Assets + + view + + - - 110 - Current Assets - - view - - + + 110 + Current Assets + + view + + - - 1101 - Purchased Stocks - - other - - + + 1101 + Purchased Stocks + + other + + - - 1102 - Debtors - - receivable - - - + + 1102 + Debtors + + receivable + + + - - 1103 - Tax Paid - - other - - + + 1103 + Tax Paid + + other + + - - 1104 - Bank Current Account - - view - - + + 1104 + Bank Current Account + + view + + - - 1106 - Opening Income Account - - other - - + + 1106 + Opening Income Account + + other + + - - 111 - Current Liabilities - - view - - + + 111 + Current Liabilities + + view + + - - 1111 - Creditors - - payable - - - + + 1111 + Creditors + + payable + + + - - 1112 - Tax Received - - other - - + + 1112 + Tax Received + + other + + - - 1113 - Reserve and Profit/Loss Account - - other - - - + + 1113 + Reserve and Profit/Loss Account + + other + + + - - 1114 - Opening Expense Account - - other - - + + 1114 + Opening Expense Account + + other + + @@ -250,53 +250,53 @@ - - 20 - Revenue - - view - - + + 20 + Revenue + + view + + - - 200 - Product Sales - - other - - + + 200 + Product Sales + + other + + - - 21 - Cost of Sales - - view - - + + 21 + Cost of Sales + + view + + - - 210 - Cost of Goods Sold - - other - - + + 210 + Cost of Goods Sold + + other + + - - 22 - Overheads - - view - - + + 22 + Overheads + + view + + - - 220 - Expenses - - other - - + + 220 + Expenses + + other + + 221 @@ -315,126 +315,126 @@ Plan Fees - - Tax Balance to Pay - - + + Tax Balance to Pay + + - - - Tax Received - - - + + + Tax Received + + + - - Tax Received Rate S (15%) - - + + Tax Received Rate S (15%) + + - - Tax Received Rate R (5%) - - + + Tax Received Rate R (5%) + + - - Tax Received Rate X (Exempt) - - + + Tax Received Rate X (Exempt) + + - - Tax Received Rate O (Out of scope) - - + + Tax Received Rate O (Out of scope) + + - + - - Tax Paid - - + + Tax Paid + + - - Tax Paid Rate S (15%) - - + + Tax Paid Rate S (15%) + + - - Tax Paid Rate R (5%) - - + + Tax Paid Rate R (5%) + + - - Tax Paid Rate X (Exempt) - - + + Tax Paid Rate X (Exempt) + + - - Tax Paid Rate O (Out of scope) - - + + Tax Paid Rate O (Out of scope) + + - + - + - - Tax Bases - - + + Tax Bases + + - - Taxable Purchases Base - - + + Taxable Purchases Base + + - - Taxable Purchases Rated S (15%) - - + + Taxable Purchases Rated S (15%) + + - - Taxable Purchases Rated R (5%) - - + + Taxable Purchases Rated R (5%) + + - - Taxable Purchases Type X (Exempt) - - + + Taxable Purchases Type X (Exempt) + + - - Taxable Purchases Type O (Out of scope) - - + + Taxable Purchases Type O (Out of scope) + + - + - - Base of Taxable Sales - - + + Base of Taxable Sales + + - - Taxable Sales Rated S (15%) - - + + Taxable Sales Rated S (15%) + + - - Taxable Sales Rated R (5%) - - + + Taxable Sales Rated R (5%) + + - - Taxable Sales Type X (Exempt) - - + + Taxable Sales Type X (Exempt) + + - - Taxable Sales Type O (Out of scope) - - + + Taxable Sales Type O (Out of scope) + + Configurable Account Chart Template @@ -450,7 +450,7 @@ - + @@ -569,9 +569,9 @@ - - - + + + @@ -584,40 +584,40 @@ - - - + + + - + - + - + - - - + + + - - - + + + - - Generate Chart of Accounts from a Chart Template - - - automatic - + + Generate Chart of Accounts from a Chart Template + + + automatic + diff --git a/addons/account/data/account_data2.xml b/addons/account/data/account_data.xml similarity index 94% rename from addons/account/data/account_data2.xml rename to addons/account/data/account_data.xml index 48630c9899d..e111c453325 100644 --- a/addons/account/data/account_data2.xml +++ b/addons/account/data/account_data.xml @@ -469,66 +469,48 @@ Account Journal Sequences --> - - Account Journal - account.journal - - - Account Journal - account.journal - - - Sale Journal - account.journal + Account Default Sales Journal SAJ/%(year)s/ - Sales Credit Note Journal - account.journal + Account Default Sales Credit Note Journal SCNJ/%(year)s/ - Purchase Journal - account.journal + Account Default Expenses Journal EXJ/%(year)s/ - Expenses Credit Notes Journal - account.journal + Account Default Expenses Credit Notes Journal ECNJ/%(year)s/ - Bank Journal - account.journal + Account Default Bank Journal BNK/%(year)s/ - Checks Journal - account.journal + Account Default Checks Journal CHK/%(year)s/ - Cash Journal - account.journal + Account Default Cash Journal CSH/%(year)s/ - Opening Entries Journal - account.journal + Account Default Opening Entries Journal OPEJ/%(year)s/ - Miscellaneous Journal - account.journal + Account Default Miscellaneous Journal MISJ/%(year)s/ @@ -538,7 +520,7 @@ --> - Account reconcile sequence + Account Reconcile account.reconcile @@ -550,7 +532,7 @@ - Bank Statement + Account Bank Statement account.bank.statement @@ -562,7 +544,7 @@ - Cash Statement + Account Cash Statement account.cash.statement @@ -572,5 +554,30 @@ + + + + Analytic account + account.analytic.account + + + Analytic account sequence + account.analytic.account + + + + + + + Invoice + account.invoice + + + + diff --git a/addons/account/data/account_invoice.xml b/addons/account/data/account_invoice.xml deleted file mode 100644 index 54f5ed6de91..00000000000 --- a/addons/account/data/account_invoice.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - Invoice - account.invoice - - - - - Account Invoice Out - account.invoice.out_invoice - - - Account Invoice In - account.invoice.in_invoice - - - Account Refund Out - account.invoice.out_refund - - - Account Refund In - account.invoice.in_refund - - - - - Account Invoice Out - account.invoice.out_invoice - - %(year)s/ - - - Account Invoice In - account.invoice.in_invoice - - %(year)s/ - - - Account Refund Out - account.invoice.out_refund - - %(year)s/ - - - Account Refund In - account.invoice.in_refund - - %(year)s/ - - - - - Analytic account - account.analytic.account - - - - - Analytic account sequence - account.analytic.account - - - - - diff --git a/addons/account/demo/account_minimal.xml b/addons/account/demo/account_minimal.xml index cadd590eb2d..8afb41f1e8d 100644 --- a/addons/account/demo/account_minimal.xml +++ b/addons/account/demo/account_minimal.xml @@ -49,7 +49,7 @@ Equity equity - asset + liability balance diff --git a/addons/account/i18n/ar.po b/addons/account/i18n/ar.po index 170ac722c7a..74fcc0ee06d 100644 --- a/addons/account/i18n/ar.po +++ b/addons/account/i18n/ar.po @@ -7,19 +7,19 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-09-22 02:55+0000\n" +"PO-Revision-Date: 2011-09-30 23:12+0000\n" "Last-Translator: Majed Majbour \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-23 04:38+0000\n" -"X-Generator: Launchpad (build 14012)\n" +"X-Launchpad-Export-Date: 2011-10-02 04:51+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 msgid "System payment" -msgstr "الدفع عن طريق النظام" +msgstr "نظام الدفع" #. module: account #: view:account.journal:0 @@ -124,6 +124,8 @@ msgid "" "If you unreconciliate transactions, you must also verify all the actions " "that are linked to those transactions because they will not be disabled" msgstr "" +"إذا كنت توافق على المعاملات ، يجب عليك أيضا التحقق من كافة الإجراءات التي " +"ترتبط بتلك المعاملات لأنه لن يكونوا غير مفعّلين" #. module: account #: report:account.tax.code.entries:0 diff --git a/addons/account/i18n/et.po b/addons/account/i18n/et.po index 6c6a6385ec9..ff6ae9bfc3a 100644 --- a/addons/account/i18n/et.po +++ b/addons/account/i18n/et.po @@ -7,24 +7,24 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-12 00:12+0000\n" -"Last-Translator: qdp (OpenERP) \n" +"PO-Revision-Date: 2011-09-30 07:02+0000\n" +"Last-Translator: Raiko Pajur \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-17 04:56+0000\n" -"X-Generator: Launchpad (build 13955)\n" +"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 msgid "System payment" -msgstr "" +msgstr "Süsteemi maksed" #. module: account #: view:account.journal:0 msgid "Other Configuration" -msgstr "" +msgstr "Muud konfiguratsioonid" #. module: account #: code:addons/account/wizard/account_open_closed_fiscalyear.py:40 @@ -39,6 +39,8 @@ msgid "" "You cannot remove/deactivate an account which is set as a property to any " "Partner." msgstr "" +"Sa ei saa kustutada / desaktiveerida kontot, mis on määratud mis tahes " +"\"Partner\" varaks." #. module: account #: view:account.move.reconcile:0 @@ -48,7 +50,7 @@ msgstr "" #. module: account #: field:account.installer.modules,account_voucher:0 msgid "Voucher Management" -msgstr "" +msgstr "Voucheri juhtimine" #. module: account #: view:account.account:0 @@ -133,13 +135,13 @@ msgstr "Raamatupidamise kirjed-" #: code:addons/account/account.py:1291 #, python-format msgid "You can not delete posted movement: \"%s\"!" -msgstr "" +msgstr "Sa ei saa kustutada postitatud liikumist: \"%s\"!" #. module: account #: report:account.invoice:0 #: field:account.invoice.line,origin:0 msgid "Origin" -msgstr "Päritolu" +msgstr "Allikas" #. module: account #: view:account.account:0 @@ -164,7 +166,7 @@ msgstr "Viide" #. module: account #: view:account.open.closed.fiscalyear:0 msgid "Choose Fiscal Year " -msgstr "" +msgstr "Vali eelarveaasta " #. module: account #: help:account.payment.term,active:0 @@ -172,12 +174,14 @@ msgid "" "If the active field is set to False, it will allow you to hide the payment " "term without removing it." msgstr "" +"Kui aktiivne ala on väärne ( False ), siis see võimaldab teil peita/varjata " +"maksetähtaeg seda kustutamata." #. module: account #: code:addons/account/invoice.py:1421 #, python-format msgid "Warning!" -msgstr "" +msgstr "Hoiatus!" #. module: account #: field:account.fiscal.position.account,account_src_id:0 @@ -204,7 +208,7 @@ msgstr "Negatiivne" #: code:addons/account/wizard/account_move_journal.py:95 #, python-format msgid "Journal: %s" -msgstr "" +msgstr "Päevik: %s" #. module: account #: help:account.analytic.journal,type:0 @@ -231,7 +235,7 @@ msgstr "konto.maks" msgid "" "No period defined for this date: %s !\n" "Please create a fiscal year." -msgstr "" +msgstr "Periood ei ole defineeritud sellele kuupäevale: %s" #. module: account #: model:ir.model,name:account.model_account_move_line_reconcile_select @@ -259,7 +263,7 @@ msgstr "" #: code:addons/account/invoice.py:1210 #, python-format msgid "Invoice '%s' is paid partially: %s%s of %s%s (%s%s remaining)" -msgstr "" +msgstr "Arve '%s' on makstud osaliselt: %s%s on tasutud %s%s (%s%s maksmata)" #. module: account #: model:process.transition,note:account.process_transition_supplierentriesreconcile0 @@ -280,7 +284,7 @@ msgstr "Teie ei saa lisada/muuta suletud päeviku kirjeid." #. module: account #: view:account.bank.statement:0 msgid "Calculated Balance" -msgstr "" +msgstr "Välja arvutatud tasakaal (Calculated Balance)" #. module: account #: model:ir.actions.act_window,name:account.action_account_use_model_create_entry @@ -352,7 +356,7 @@ msgstr "Ostu omadused" #: view:account.installer:0 #: view:account.installer.modules:0 msgid "Configure" -msgstr "" +msgstr "Seadista" #. module: account #: selection:account.entries.report,month:0 @@ -361,7 +365,7 @@ msgstr "" #: selection:report.account.sales,month:0 #: selection:report.account_type.sales,month:0 msgid "June" -msgstr "" +msgstr "Juuni" #. module: account #: model:ir.actions.act_window,help:account.action_account_moves_bank @@ -395,12 +399,12 @@ msgstr "" #. module: account #: selection:account.journal,type:0 msgid "Opening/Closing Situation" -msgstr "" +msgstr "Avamise/Sulgemise situatsioon" #. module: account #: help:account.journal,currency:0 msgid "The currency used to enter statement" -msgstr "" +msgstr "Valuuta väite sisestamiseks" #. module: account #: field:account.open.closed.fiscalyear,fyear_id:0 @@ -498,17 +502,17 @@ msgstr "Päevik" #. module: account #: model:ir.model,name:account.model_account_invoice_confirm msgid "Confirm the selected invoices" -msgstr "" +msgstr "Kinnita valitud arved" #. module: account #: field:account.addtmpl.wizard,cparent_id:0 msgid "Parent target" -msgstr "" +msgstr "Lapsevanema sihtmärk" #. module: account #: field:account.bank.statement,account_id:0 msgid "Account used in this journal" -msgstr "" +msgstr "Konto kasutatud selles arveraamatus" #. module: account #: help:account.aged.trial.balance,chart_account_id:0 @@ -527,7 +531,7 @@ msgstr "" #: help:account.report.general.ledger,chart_account_id:0 #: help:account.vat.declaration,chart_account_id:0 msgid "Select Charts of Accounts" -msgstr "" +msgstr "Vali Kontode graafikud" #. module: account #: view:product.product:0 @@ -537,7 +541,7 @@ msgstr "Ostumaksud" #. module: account #: model:ir.model,name:account.model_account_invoice_refund msgid "Invoice Refund" -msgstr "" +msgstr "Arveraamatu tagasimakse" #. module: account #: report:account.overdue:0 @@ -560,7 +564,7 @@ msgstr "" #: field:account.fiscal.position,tax_ids:0 #: field:account.fiscal.position.template,tax_ids:0 msgid "Tax Mapping" -msgstr "" +msgstr "Maksude kaardistamine" #. module: account #: model:ir.actions.act_window,name:account.action_account_fiscalyear_close_state @@ -571,7 +575,7 @@ msgstr "Sule majandusaasta" #. module: account #: model:process.transition,note:account.process_transition_confirmstatementfromdraft0 msgid "The accountant confirms the statement." -msgstr "" +msgstr "Raamatupidaja kinnitab selle avalduse" #. module: account #: selection:account.balance.report,display_account:0 @@ -587,12 +591,12 @@ msgstr "Kõik" #. module: account #: field:account.invoice.report,address_invoice_id:0 msgid "Invoice Address Name" -msgstr "" +msgstr "Arveraamatu Aadressi Nimi" #. module: account #: selection:account.installer,period:0 msgid "3 Monthly" -msgstr "" +msgstr "Iga 3 kuu tagant" #. module: account #: view:account.unreconcile.reconcile:0 @@ -604,7 +608,7 @@ msgstr "" #. module: account #: view:analytic.entries.report:0 msgid " 30 Days " -msgstr "" +msgstr " 30 päeva " #. module: account #: field:ir.sequence,fiscal_ids:0 @@ -624,7 +628,7 @@ msgstr "" #. module: account #: sql_constraint:account.sequence.fiscalyear:0 msgid "Main Sequence must be different from current !" -msgstr "" +msgstr "Pea" #. module: account #: field:account.invoice.tax,tax_amount:0 @@ -652,12 +656,12 @@ msgstr "Sulge periood" #. module: account #: model:ir.model,name:account.model_account_common_partner_report msgid "Account Common Partner Report" -msgstr "" +msgstr "Konto tava \"Partner\" aruanne" #. module: account #: field:account.fiscalyear.close,period_id:0 msgid "Opening Entries Period" -msgstr "" +msgstr "Avatud sissekanete periood" #. module: account #: model:ir.model,name:account.model_account_journal_period @@ -791,7 +795,7 @@ msgstr "J.C./liiguta nime" #: selection:report.account.sales,month:0 #: selection:report.account_type.sales,month:0 msgid "September" -msgstr "" +msgstr "September" #. module: account #: selection:account.subscription,period_type:0 @@ -802,7 +806,7 @@ msgstr "päevad" #: help:account.account.template,nocreate:0 msgid "" "If checked, the new chart of accounts will not contain this by default." -msgstr "" +msgstr "Kui märgitud, siis uus kontode graafik ei sisalda seda puudujääki." #. module: account #: code:addons/account/wizard/account_invoice_refund.py:102 @@ -825,7 +829,7 @@ msgstr "Arvutus" #. module: account #: view:account.move.line:0 msgid "Next Partner to reconcile" -msgstr "" +msgstr "Kooskõlastama järgmise \"Partner\"-iga" #. module: account #: code:addons/account/account_move_line.py:1191 @@ -834,12 +838,14 @@ msgid "" "You can not do this modification on a confirmed entry ! Please note that you " "can just change some non important fields !" msgstr "" +"Teie ei saa teha see muudatus kinnitatud kirjel ! Teie saate muuta ainult " +"mõned vähetähtsad väljad !" #. module: account #: view:account.invoice.report:0 #: field:account.invoice.report,delay_to_pay:0 msgid "Avg. Delay To Pay" -msgstr "" +msgstr "Keskmine viivitus maksete tegemisel" #. module: account #: model:ir.actions.act_window,name:account.action_account_tax_chart @@ -862,7 +868,7 @@ msgstr "Tähtaeg" #: view:account.invoice.report:0 #: field:account.invoice.report,price_total_tax:0 msgid "Total With Tax" -msgstr "" +msgstr "Kokku koos maksudega" #. module: account #: view:account.invoice:0 @@ -870,7 +876,7 @@ msgstr "" #: view:validate.account.move:0 #: view:validate.account.move.lines:0 msgid "Approve" -msgstr "" +msgstr "Nõustu" #. module: account #: view:account.invoice:0 @@ -925,7 +931,7 @@ msgstr "" #. module: account #: view:account.analytic.line:0 msgid "Purchases" -msgstr "" +msgstr "Ostud" #. module: account #: field:account.model,lines_id:0 @@ -972,7 +978,7 @@ msgstr "Partneri bilanss" #. module: account #: field:account.bank.accounts.wizard,acc_name:0 msgid "Account Name." -msgstr "" +msgstr "Konto nimi." #. module: account #: field:account.chart.template,property_reserve_and_surplus_account:0 @@ -983,7 +989,7 @@ msgstr "" #. module: account #: field:report.account.receivable,name:0 msgid "Week of Year" -msgstr "" +msgstr "Nädal" #. module: account #: field:account.bs.report,display_type:0 @@ -995,12 +1001,12 @@ msgstr "Rõhtpaigutus" #. module: account #: view:board.board:0 msgid "Customer Invoices to Approve" -msgstr "" +msgstr "Kliendi arved kinnitamiseks" #. module: account #: help:account.fiscalyear.close,fy_id:0 msgid "Select a Fiscal year to close" -msgstr "" +msgstr "Vali eelarve aasta mida sulgeda" #. module: account #: help:account.account,user_type:0 @@ -1018,13 +1024,13 @@ msgstr "" #. module: account #: report:account.partner.balance:0 msgid "In dispute" -msgstr "" +msgstr "Vaidlustatav" #. module: account #: model:ir.actions.act_window,name:account.action_view_bank_statement_tree #: model:ir.ui.menu,name:account.journal_cash_move_lines msgid "Cash Registers" -msgstr "" +msgstr "Raha register" #. module: account #: selection:account.account.type,report_type:0 @@ -1042,7 +1048,7 @@ msgstr "-" #. module: account #: view:account.analytic.account:0 msgid "Manager" -msgstr "" +msgstr "Juhataja" #. module: account #: view:account.subscription.generate:0 @@ -1052,7 +1058,7 @@ msgstr "" #. module: account #: selection:account.bank.accounts.wizard,account_type:0 msgid "Bank" -msgstr "" +msgstr "Pank" #. module: account #: field:account.period,date_start:0 @@ -1062,13 +1068,13 @@ msgstr "Perioodi algus" #. module: account #: model:process.transition,name:account.process_transition_confirmstatementfromdraft0 msgid "Confirm statement" -msgstr "" +msgstr "Kinnita avaldus" #. module: account #: field:account.fiscal.position.tax,tax_dest_id:0 #: field:account.fiscal.position.tax.template,tax_dest_id:0 msgid "Replacement Tax" -msgstr "" +msgstr "Vahetus maks" #. module: account #: selection:account.move.line,centralisation:0 @@ -1087,12 +1093,12 @@ msgstr "" #. module: account #: view:account.invoice.cancel:0 msgid "Cancel Invoices" -msgstr "" +msgstr "Peata arved" #. module: account #: view:account.unreconcile.reconcile:0 msgid "Unreconciliation transactions" -msgstr "" +msgstr "Mittesobivad tehingud" #. module: account #: field:account.invoice.tax,tax_code_id:0 @@ -1110,7 +1116,7 @@ msgstr "" #. module: account #: help:account.move.line,move_id:0 msgid "The move of this entry line." -msgstr "" +msgstr "Selle rea liigutus." #. module: account #: field:account.move.line.reconcile,trans_nbr:0 @@ -1174,7 +1180,7 @@ msgstr "Konto" #. module: account #: field:account.tax,include_base_amount:0 msgid "Included in base amount" -msgstr "" +msgstr "Lisa baas osa" #. module: account #: view:account.entries.report:0 @@ -1186,7 +1192,7 @@ msgstr "" #. module: account #: field:account.account,level:0 msgid "Level" -msgstr "" +msgstr "Tase" #. module: account #: report:account.invoice:0 @@ -1207,7 +1213,7 @@ msgstr "Maksud" #: code:addons/account/wizard/account_report_common.py:120 #, python-format msgid "Select a starting and an ending period" -msgstr "" +msgstr "Vali algus ja lõpp periood" #. module: account #: model:ir.model,name:account.model_account_account_template @@ -1217,12 +1223,12 @@ msgstr "Mallid kontodele" #. module: account #: view:account.tax.code.template:0 msgid "Search tax template" -msgstr "" +msgstr "Otsi maksu templati" #. module: account #: report:account.invoice:0 msgid "Your Reference" -msgstr "" +msgstr "Teie viide" #. module: account #: view:account.move.reconcile:0 @@ -1246,7 +1252,7 @@ msgstr "" #. module: account #: view:account.invoice:0 msgid "Reset to Draft" -msgstr "" +msgstr "Lähtesta mustandiks" #. module: account #: view:wizard.multi.charts.accounts:0 @@ -1268,7 +1274,7 @@ msgstr "" #: model:ir.actions.act_window,name:account.action_partner_all #: model:ir.ui.menu,name:account.next_id_22 msgid "Partners" -msgstr "" +msgstr "Partnerid" #. module: account #: view:account.bank.statement:0 @@ -1323,7 +1329,7 @@ msgstr "Bilanss pole 0" #. module: account #: view:account.tax:0 msgid "Search Taxes" -msgstr "" +msgstr "Otsi maksu" #. module: account #: model:ir.model,name:account.model_account_analytic_cost_ledger @@ -1338,7 +1344,7 @@ msgstr "Loo sissekanded" #. module: account #: field:account.entries.report,nbr:0 msgid "# of Items" -msgstr "" +msgstr "# detaile" #. module: account #: field:account.automatic.reconcile,max_amount:0 @@ -1353,7 +1359,7 @@ msgstr "Arvuta maksud" #. module: account #: field:wizard.multi.charts.accounts,code_digits:0 msgid "# of Digits" -msgstr "" +msgstr "# numbrit" #. module: account #: field:account.journal,entry_posted:0 @@ -1364,7 +1370,7 @@ msgstr "" #: view:account.invoice.report:0 #: field:account.invoice.report,price_total:0 msgid "Total Without Tax" -msgstr "" +msgstr "Kokku ilma maksudeta" #. module: account #: model:ir.actions.act_window,help:account.action_move_journal_line @@ -1378,7 +1384,7 @@ msgstr "" #. module: account #: view:account.entries.report:0 msgid "# of Entries " -msgstr "" +msgstr "# sisestusi " #. module: account #: model:ir.model,name:account.model_temp_range @@ -1435,7 +1441,7 @@ msgstr "Mall finantspositsioonile" #. module: account #: model:account.tax.code,name:account.account_tax_code_0 msgid "Tax Code Test" -msgstr "" +msgstr "Maksu koodi test" #. module: account #: field:account.automatic.reconcile,reconciled:0 @@ -1445,22 +1451,22 @@ msgstr "" #. module: account #: field:account.journal.view,columns_id:0 msgid "Columns" -msgstr "" +msgstr "Veerud" #. module: account #: report:account.overdue:0 msgid "." -msgstr "" +msgstr "." #. module: account #: view:account.analytic.cost.ledger.journal.report:0 msgid "and Journals" -msgstr "" +msgstr "ja arveraamatud" #. module: account #: field:account.journal,groups_id:0 msgid "Groups" -msgstr "" +msgstr "Grupid" #. module: account #: field:account.invoice,amount_untaxed:0 @@ -1471,18 +1477,20 @@ msgstr "Maksuvaba" #. module: account #: view:account.partner.reconcile.process:0 msgid "Go to next partner" -msgstr "" +msgstr "Mine järgmise \"Partner\"-ile" #. module: account #: view:account.bank.statement:0 msgid "Search Bank Statements" -msgstr "" +msgstr "Otsi panga avaldust" #. module: account #: sql_constraint:account.model.line:0 msgid "" "Wrong credit or debit value in model (Credit + Debit Must Be greater \"0\")!" msgstr "" +"Vale krediidi või deebeti arv mudelis ( Krediit + Deebet Peab olema suurem " +"kui \"0\" ) !" #. module: account #: view:account.chart.template:0 @@ -1516,14 +1524,14 @@ msgstr "" #. module: account #: report:account.analytic.account.cost_ledger:0 msgid "Date/Code" -msgstr "" +msgstr "Kuupäev/Kood" #. module: account #: field:account.analytic.line,general_account_id:0 #: view:analytic.entries.report:0 #: field:analytic.entries.report,general_account_id:0 msgid "General Account" -msgstr "" +msgstr "Üldine konto" #. module: account #: field:res.partner,debit_limit:0 @@ -1554,13 +1562,13 @@ msgstr "" #. module: account #: field:wizard.multi.charts.accounts,seq_journal:0 msgid "Separated Journal Sequences" -msgstr "" +msgstr "Eraldatud päeviku järjekorrad" #. module: account #: field:account.bank.statement,user_id:0 #: view:account.invoice:0 msgid "Responsible" -msgstr "" +msgstr "Vastutav" #. module: account #: report:account.overdue:0 @@ -1570,7 +1578,7 @@ msgstr "Vahesumma:" #. module: account #: model:ir.actions.act_window,name:account.action_report_account_type_sales_tree_all msgid "Sales by Account Type" -msgstr "" +msgstr "Müügid konto järgi" #. module: account #: view:account.invoice.refund:0 @@ -1582,7 +1590,7 @@ msgstr "" #. module: account #: model:ir.ui.menu,name:account.periodical_processing_invoicing msgid "Invoicing" -msgstr "" +msgstr "Arveldamine" #. module: account #: field:account.chart.template,tax_code_root_id:0 @@ -1598,17 +1606,17 @@ msgstr "Kaasa algsed" #. module: account #: field:account.tax.code,sum:0 msgid "Year Sum" -msgstr "" +msgstr "Aasta kokkuvõtte" #. module: account #: model:ir.actions.report.xml,name:account.report_account_voucher_new msgid "Print Voucher" -msgstr "" +msgstr "Prindi voucher" #. module: account #: view:account.change.currency:0 msgid "This wizard will change the currency of the invoice" -msgstr "" +msgstr "See wizard muudab valuuta arvelduses" #. module: account #: model:ir.actions.act_window,help:account.action_account_chart @@ -1632,7 +1640,7 @@ msgstr "" #. module: account #: field:account.cashbox.line,pieces:0 msgid "Values" -msgstr "" +msgstr "Väärtused" #. module: account #: help:account.journal.period,active:0 @@ -1675,7 +1683,7 @@ msgstr "" #. module: account #: report:account.move.voucher:0 msgid "Ref. :" -msgstr "" +msgstr "Viide:" #. module: account #: view:account.analytic.chart:0 @@ -1685,7 +1693,7 @@ msgstr "Analüütilised kontoplaanid" #. module: account #: view:account.analytic.line:0 msgid "My Entries" -msgstr "" +msgstr "Minu sisestused" #. module: account #: report:account.overdue:0 @@ -1696,7 +1704,7 @@ msgstr "Kliendi viide:" #: code:addons/account/account_cash_statement.py:328 #, python-format msgid "User %s does not have rights to access %s journal !" -msgstr "" +msgstr "Kasutajal %s ei ole õigusi et siseneda %s arveraamatusse !" #. module: account #: help:account.period,special:0 @@ -1717,12 +1725,12 @@ msgstr "" #: code:addons/account/account.py:499 #, python-format msgid "You cannot deactivate an account that contains account moves." -msgstr "" +msgstr "Sa ei saa deaktiveerida kontot mis sisaldab konto liikumisi." #. module: account #: field:account.move.line.reconcile,credit:0 msgid "Credit amount" -msgstr "" +msgstr "Kreedidi kogus" #. module: account #: constraint:account.move.line:0 @@ -1745,7 +1753,7 @@ msgstr "" #. module: account #: sql_constraint:account.move.line:0 msgid "Wrong credit or debit value in accounting entry !" -msgstr "" +msgstr "Vale kreedit või deebeti raamatupidamise sisend !" #. module: account #: view:account.invoice.report:0 @@ -1757,7 +1765,7 @@ msgstr "" #. module: account #: model:ir.model,name:account.model_account_period_close msgid "period close" -msgstr "" +msgstr "Periood suletud" #. module: account #: view:account.installer:0 @@ -1767,18 +1775,18 @@ msgstr "" #. module: account #: model:ir.actions.act_window,name:account.action_project_account_analytic_line_form msgid "Entries By Line" -msgstr "" +msgstr "SIsestused ridade kaupa" #. module: account #: report:account.tax.code.entries:0 msgid "A/c Code" -msgstr "" +msgstr "A/c kood" #. module: account #: field:account.invoice,move_id:0 #: field:account.invoice,move_name:0 msgid "Journal Entry" -msgstr "" +msgstr "Päevaraamatu kanne" #. module: account #: view:account.tax:0 @@ -1788,7 +1796,7 @@ msgstr "" #. module: account #: field:account.cashbox.line,subtotal:0 msgid "Sub Total" -msgstr "" +msgstr "Vahesumma" #. module: account #: view:account.account:0 @@ -1798,7 +1806,7 @@ msgstr "" #. module: account #: constraint:res.company:0 msgid "Error! You can not create recursive companies." -msgstr "" +msgstr "Viga! Sa ei saa luua rekursiivseid ettevõtteid." #. module: account #: view:account.analytic.account:0 @@ -1821,12 +1829,12 @@ msgstr "Kehtiv" #: model:ir.actions.act_window,name:account.action_account_print_journal #: model:ir.model,name:account.model_account_print_journal msgid "Account Print Journal" -msgstr "" +msgstr "Prindi konto arveraamat" #. module: account #: model:ir.model,name:account.model_product_category msgid "Product Category" -msgstr "" +msgstr "Toote kategooria" #. module: account #: selection:account.account.type,report_type:0 @@ -1836,7 +1844,7 @@ msgstr "/" #. module: account #: field:account.bs.report,reserve_account_id:0 msgid "Reserve & Profit/Loss Account" -msgstr "" +msgstr "Reservi & kasumi/kahjumi konto" #. module: account #: help:account.bank.statement,balance_end:0 @@ -1887,12 +1895,12 @@ msgstr "" #: field:account.installer.modules,config_logo:0 #: field:wizard.multi.charts.accounts,config_logo:0 msgid "Image" -msgstr "" +msgstr "Pilt" #. module: account #: report:account.move.voucher:0 msgid "Canceled" -msgstr "" +msgstr "Tühistatud" #. module: account #: view:account.invoice:0 diff --git a/addons/account/i18n/zh_TW.po b/addons/account/i18n/zh_TW.po index e054121df59..21498f1c100 100644 --- a/addons/account/i18n/zh_TW.po +++ b/addons/account/i18n/zh_TW.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-11 23:34+0000\n" -"Last-Translator: BlueT - Matthew Lien - 練喆明 \n" +"PO-Revision-Date: 2011-09-27 10:01+0000\n" +"Last-Translator: Walter Cheuk \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-17 05:02+0000\n" -"X-Generator: Launchpad (build 13955)\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" #. module: account #: model:process.transition,name:account.process_transition_supplierreconcilepaid0 @@ -48,7 +48,7 @@ msgstr "" #. module: account #: field:account.installer.modules,account_voucher:0 msgid "Voucher Management" -msgstr "" +msgstr "換票券管理" #. module: account #: view:account.account:0 @@ -3550,7 +3550,7 @@ msgstr "" #: view:product.template:0 #: view:res.partner:0 msgid "Accounting" -msgstr "账号" +msgstr "會計" #. module: account #: help:account.central.journal,amount_currency:0 @@ -6779,7 +6779,7 @@ msgstr "" #: field:account.invoice.tax,invoice_id:0 #: model:ir.model,name:account.model_account_invoice_line msgid "Invoice Line" -msgstr "发票行" +msgstr "發票明細" #. module: account #: field:account.balance.report,display_account:0 @@ -6788,7 +6788,7 @@ msgstr "发票行" #: field:account.pl.report,display_account:0 #: field:account.report.general.ledger,display_account:0 msgid "Display accounts" -msgstr "" +msgstr "顯示帳號" #. module: account #: field:account.account.type,sign:0 @@ -9305,7 +9305,7 @@ msgstr "" #. module: account #: field:account.invoice,invoice_line:0 msgid "Invoice Lines" -msgstr "发票行" +msgstr "發票明細" #. module: account #: constraint:account.account.template:0 diff --git a/addons/account/installer.py b/addons/account/installer.py index 33ddaa94b12..bed92df4fd2 100644 --- a/addons/account/installer.py +++ b/addons/account/installer.py @@ -65,21 +65,6 @@ class account_installer(osv.osv_memory): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) return user.company_id and user.company_id.id or False - def _get_default_charts(self, cr, uid, context=None): - module_name = False - company_id = self._default_company(cr, uid, context=context) - company = self.pool.get('res.company').browse(cr, uid, company_id, context=context) - address_id = self.pool.get('res.partner').address_get(cr, uid, [company.partner_id.id]) - if address_id['default']: - address = self.pool.get('res.partner.address').browse(cr, uid, address_id['default'], context=context) - code = address.country_id.code - module_name = (code and 'l10n_' + code.lower()) or False - if module_name: - module_id = self.pool.get('ir.module.module').search(cr, uid, [('name', '=', module_name)], context=context) - if module_id: - return module_name - return 'configurable' - _defaults = { 'date_start': lambda *a: time.strftime('%Y-01-01'), 'date_stop': lambda *a: time.strftime('%Y-12-31'), @@ -87,7 +72,7 @@ class account_installer(osv.osv_memory): 'sale_tax': 0.0, 'purchase_tax': 0.0, 'company_id': _default_company, - 'charts': _get_default_charts + 'charts': 'configurable' } def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): @@ -239,26 +224,4 @@ class account_installer(osv.osv_memory): account_installer() -class account_installer_modules(osv.osv_memory): - _inherit = 'base.setup.installer' - _columns = { - 'account_analytic_plans': fields.boolean('Multiple Analytic Plans', - help="Allows invoice lines to impact multiple analytic accounts " - "simultaneously."), - 'account_payment': fields.boolean('Suppliers Payment Management', - help="Streamlines invoice payment and creates hooks to plug " - "automated payment systems in."), - 'account_followup': fields.boolean('Followups Management', - help="Helps you generate reminder letters for unpaid invoices, " - "including multiple levels of reminding and customized " - "per-partner policies."), - 'account_anglo_saxon': fields.boolean('Anglo-Saxon Accounting', - help="This module will support the Anglo-Saxons accounting methodology by " - "changing the accounting logic with stock transactions."), - 'account_asset': fields.boolean('Assets Management', - help="Helps you to manage your assets and their depreciation entries."), - } - -account_installer_modules() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/sequence.py b/addons/account/ir_sequence.py similarity index 70% rename from addons/account/sequence.py rename to addons/account/ir_sequence.py index 1683e5feb06..5c9039e43c3 100644 --- a/addons/account/sequence.py +++ b/addons/account/ir_sequence.py @@ -46,23 +46,14 @@ class ir_sequence(osv.osv): 'fiscal_ids': fields.one2many('account.sequence.fiscalyear', 'sequence_main_id', 'Sequences') } - def get_id(self, cr, uid, sequence_id, test='id', context=None): - if context is None: - context = {} - cr.execute('select id from ir_sequence where ' - + test + '=%s and active=%s', (sequence_id, True,)) - res = cr.dictfetchone() - if res: - for line in self.browse(cr, uid, res['id'], - context=context).fiscal_ids: - if line.fiscalyear_id.id == context.get('fiscalyear_id', False): - return super(ir_sequence, self).get_id(cr, uid, - line.sequence_id.id, - test="id", - context=context) - return super(ir_sequence, self).get_id(cr, uid, sequence_id, test, - context=context) + + def _next(self, cr, uid, seq_ids, context=None): + for seq in self.browse(cr, uid, seq_ids, context): + for line in seq.fiscal_ids: + if line.fiscalyear_id.id == context.get('fiscalyear_id'): + return super(ir_sequence, self)._next(cr, uid, [line.sequence_id.id], context) + return super(ir_sequence, self)._next(cr, uid, seq_ids, context) ir_sequence() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/sequence_view.xml b/addons/account/ir_sequence_view.xml similarity index 100% rename from addons/account/sequence_view.xml rename to addons/account/ir_sequence_view.xml diff --git a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py index 93208532e45..186d39c4859 100644 --- a/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py +++ b/addons/account/project/wizard/account_analytic_cost_ledger_for_journal_report.py @@ -29,7 +29,7 @@ class account_analytic_cost_ledger_journal_report(osv.osv_memory): _columns = { 'date1': fields.date('Start of period', required=True), 'date2': fields.date('End of period', required=True), - 'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'Journal_id', 'Journals'), + 'journal': fields.many2many('account.analytic.journal', 'ledger_journal_rel', 'ledger_id', 'journal_id', 'Journals'), } _defaults = { diff --git a/addons/account/test/account_fiscalyear_close.yml b/addons/account/test/account_fiscalyear_close.yml index 109b098d6a7..1e24d2ca0e7 100644 --- a/addons/account/test/account_fiscalyear_close.yml +++ b/addons/account/test/account_fiscalyear_close.yml @@ -26,7 +26,6 @@ code: NEW type: situation analytic_journal_id: sit - sequence_id: sequence_journal default_debit_account_id: cash default_credit_account_id: cash company_id: base.main_company diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml index d5bb6bada65..40ba7ea7127 100644 --- a/addons/account/test/account_report.yml +++ b/addons/account/test/account_report.yml @@ -147,7 +147,7 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all'} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') - @@ -156,7 +156,7 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True,'target_move': 'all'} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') - diff --git a/addons/account/wizard/account_report_account_balance.py b/addons/account/wizard/account_report_account_balance.py index a72d58dd904..4e52066b49e 100644 --- a/addons/account/wizard/account_report_account_balance.py +++ b/addons/account/wizard/account_report_account_balance.py @@ -19,13 +19,17 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_balance_report(osv.osv_memory): _inherit = "account.common.account.report" _name = 'account.balance.report' _description = 'Trial Balance Report' + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_balance_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + _defaults = { 'journal_ids': [], } diff --git a/addons/account/wizard/account_report_aged_partner_balance.py b/addons/account/wizard/account_report_aged_partner_balance.py index 4e6c6dea752..9b89b30c93b 100644 --- a/addons/account/wizard/account_report_aged_partner_balance.py +++ b/addons/account/wizard/account_report_aged_partner_balance.py @@ -35,6 +35,7 @@ class account_aged_trial_balance(osv.osv_memory): 'direction_selection': fields.selection([('past','Past'), ('future','Future')], 'Analysis Direction', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_aged_trial_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'period_length': 30, diff --git a/addons/account/wizard/account_report_balance_sheet.py b/addons/account/wizard/account_report_balance_sheet.py index 873ede3832c..01a89168a43 100644 --- a/addons/account/wizard/account_report_balance_sheet.py +++ b/addons/account/wizard/account_report_balance_sheet.py @@ -40,11 +40,9 @@ class account_bs_report(osv.osv_memory): _columns = { 'display_type': fields.boolean("Landscape Mode"), 'reserve_account_id': fields.many2one('account.account', 'Reserve & Profit/Loss Account', - required=True, - help='This Account is used for transfering Profit/Loss ' \ - '(Profit: Amount will be added, Loss: Amount will be duducted), ' \ - 'which is calculated from Profilt & Loss Report', + help='This account is used for transferring Profit/Loss (If It is Profit: Amount will be added, Loss : Amount will be deducted.), as calculated in Profit & Loss Report', domain = [('type','=','other')]), + 'journal_ids': fields.many2many('account.journal', 'account_bs_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults={ diff --git a/addons/account/wizard/account_report_balance_sheet_view.xml b/addons/account/wizard/account_report_balance_sheet_view.xml index 22a6e0608b2..faac52388a1 100644 --- a/addons/account/wizard/account_report_balance_sheet_view.xml +++ b/addons/account/wizard/account_report_balance_sheet_view.xml @@ -21,7 +21,7 @@ - + diff --git a/addons/account/wizard/account_report_central_journal.py b/addons/account/wizard/account_report_central_journal.py index d66be0a70e4..eed21f976a5 100644 --- a/addons/account/wizard/account_report_central_journal.py +++ b/addons/account/wizard/account_report_central_journal.py @@ -19,13 +19,17 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_central_journal(osv.osv_memory): _name = 'account.central.journal' _description = 'Account Central Journal' _inherit = "account.common.journal.report" + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_central_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + def _print_report(self, cr, uid, ids, data, context=None): data = self.pre_print_report(cr, uid, ids, data, context=context) return { diff --git a/addons/account/wizard/account_report_common.py b/addons/account/wizard/account_report_common.py index 0d0b69ce132..48130b041d0 100644 --- a/addons/account/wizard/account_report_common.py +++ b/addons/account/wizard/account_report_common.py @@ -35,7 +35,7 @@ class account_common_report(osv.osv_memory): 'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods')], "Filter by", required=True), 'period_from': fields.many2one('account.period', 'Start Period'), 'period_to': fields.many2one('account.period', 'End Period'), - 'journal_ids': fields.many2many('account.journal', 'account_common_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + 'journal_ids': fields.many2many('account.journal', string='Journals', required=True), 'date_from': fields.date("Start Date"), 'date_to': fields.date("End Date"), 'target_move': fields.selection([('posted', 'All Posted Entries'), diff --git a/addons/account/wizard/account_report_general_journal.py b/addons/account/wizard/account_report_general_journal.py index af091d9bc08..521c4667a80 100644 --- a/addons/account/wizard/account_report_general_journal.py +++ b/addons/account/wizard/account_report_general_journal.py @@ -19,17 +19,21 @@ # ############################################################################## -from osv import osv +from osv import osv, fields class account_general_journal(osv.osv_memory): _inherit = "account.common.journal.report" _name = 'account.general.journal' _description = 'Account General Journal' + _columns = { + 'journal_ids': fields.many2many('account.journal', 'account_general_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), + } + def _print_report(self, cr, uid, ids, data, context=None): data = self.pre_print_report(cr, uid, ids, data, context=context) return {'type': 'ir.actions.report.xml', 'report_name': 'account.general.journal', 'datas': data} account_general_journal() -#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_general_ledger.py b/addons/account/wizard/account_report_general_ledger.py index ed75b3c1dce..d0b3c0fa3d3 100644 --- a/addons/account/wizard/account_report_general_ledger.py +++ b/addons/account/wizard/account_report_general_ledger.py @@ -32,6 +32,7 @@ class account_report_general_ledger(osv.osv_memory): help='If you selected to filter by date or period, this field allow you to add a row to display the amount of debit/credit/balance that precedes the filter you\'ve set.'), 'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"), 'sortby': fields.selection([('sort_date', 'Date'), ('sort_journal_partner', 'Journal & Partner')], 'Sort by', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_report_general_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'landscape': True, diff --git a/addons/account/wizard/account_report_partner_balance.py b/addons/account/wizard/account_report_partner_balance.py index eff9e71cb72..80ee455456c 100644 --- a/addons/account/wizard/account_report_partner_balance.py +++ b/addons/account/wizard/account_report_partner_balance.py @@ -31,6 +31,7 @@ class account_partner_balance(osv.osv_memory): _columns = { 'display_partner': fields.selection([('non-zero_balance', 'With balance is not equal to 0'), ('all', 'All Partners')] ,'Display Partners'), + 'journal_ids': fields.many2many('account.journal', 'account_partner_balance_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { @@ -51,4 +52,4 @@ class account_partner_balance(osv.osv_memory): account_partner_balance() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_partner_ledger.py b/addons/account/wizard/account_report_partner_ledger.py index 8a2b6c7bacb..7a3f3932f1b 100644 --- a/addons/account/wizard/account_report_partner_ledger.py +++ b/addons/account/wizard/account_report_partner_ledger.py @@ -35,6 +35,7 @@ class account_partner_ledger(osv.osv_memory): 'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods'), ('unreconciled', 'Unreconciled Entries')], "Filter by", required=True), 'page_split': fields.boolean('One Partner Per Page', help='Display Ledger Report with One partner per page'), 'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"), + 'journal_ids': fields.many2many('account.journal', 'account_partner_ledger_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'initial_balance': False, diff --git a/addons/account/wizard/account_report_print_journal.py b/addons/account/wizard/account_report_print_journal.py index f4a5fcaf9f9..d7e8f11a7f8 100644 --- a/addons/account/wizard/account_report_print_journal.py +++ b/addons/account/wizard/account_report_print_journal.py @@ -30,6 +30,7 @@ class account_print_journal(osv.osv_memory): 'sort_selection': fields.selection([('date', 'Date'), ('ref', 'Reference Number'),], 'Entries Sorted by', required=True), + 'journal_ids': fields.many2many('account.journal', 'account_print_journal_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'sort_selection': 'date', @@ -44,4 +45,4 @@ class account_print_journal(osv.osv_memory): account_print_journal() -#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +#vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_report_profit_loss.py b/addons/account/wizard/account_report_profit_loss.py index 6372539c056..f4c2897bfe0 100644 --- a/addons/account/wizard/account_report_profit_loss.py +++ b/addons/account/wizard/account_report_profit_loss.py @@ -28,14 +28,15 @@ class account_pl_report(osv.osv_memory): _inherit = "account.common.account.report" _name = "account.pl.report" _description = "Account Profit And Loss Report" + _columns = { 'display_type': fields.boolean("Landscape Mode"), + 'journal_ids': fields.many2many('account.journal', 'account_pl_report_journal_rel', 'account_id', 'journal_id', 'Journals', required=True), } _defaults = { 'display_type': False, 'journal_ids': [], - 'target_move': False } def _print_report(self, cr, uid, ids, data, context=None): diff --git a/addons/account/wizard/account_report_profit_loss_view.xml b/addons/account/wizard/account_report_profit_loss_view.xml index d9876f57454..75b6766ff87 100644 --- a/addons/account/wizard/account_report_profit_loss_view.xml +++ b/addons/account/wizard/account_report_profit_loss_view.xml @@ -9,9 +9,6 @@ - - - diff --git a/addons/account_accountant/__openerp__.py b/addons/account_accountant/__openerp__.py index c018d277d46..d808a38fa18 100644 --- a/addons/account_accountant/__openerp__.py +++ b/addons/account_accountant/__openerp__.py @@ -22,7 +22,7 @@ "name" : "Accountant Access", "version" : "1.1", "author" : "OpenERP SA", - "category": 'Finance', + "category": 'Hidden', 'complexity': "normal", "description": """ Accounting Access Rights. diff --git a/addons/account_accountant/i18n/zh_TW.po b/addons/account_accountant/i18n/zh_TW.po new file mode 100644 index 00000000000..b338ecd1fdc --- /dev/null +++ b/addons/account_accountant/i18n/zh_TW.po @@ -0,0 +1,33 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 09:57+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\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 "會計師" diff --git a/addons/account_analytic_analysis/__openerp__.py b/addons/account_analytic_analysis/__openerp__.py index 5e93307865c..f75fe3d1615 100644 --- a/addons/account_analytic_analysis/__openerp__.py +++ b/addons/account_analytic_analysis/__openerp__.py @@ -23,7 +23,7 @@ { 'name' : 'Analytic Account View', 'version' : '1.1', - 'category' : 'Finance', + 'category' : 'Hidden', 'complexity': "normal", 'description': """ This module is for modifying account analytic view to show important data to project manager of services companies. diff --git a/addons/account_analytic_default/__openerp__.py b/addons/account_analytic_default/__openerp__.py index 07cde53d003..e46f285d9c6 100644 --- a/addons/account_analytic_default/__openerp__.py +++ b/addons/account_analytic_default/__openerp__.py @@ -22,7 +22,7 @@ { 'name' : 'Account Analytic Defaults', 'version' : '1.0', - 'category' : 'Finance', + 'category' : 'Hidden', 'complexity': "normal", 'description': """Set default values for your analytic accounts Allows to automatically select analytic accounts based on criterions: diff --git a/addons/account_analytic_plans/__openerp__.py b/addons/account_analytic_plans/__openerp__.py index d6a5834517e..ffb20ffe3e8 100644 --- a/addons/account_analytic_plans/__openerp__.py +++ b/addons/account_analytic_plans/__openerp__.py @@ -21,9 +21,9 @@ { - 'name' : 'Manage multiple plans in Analytic Accounting', + 'name' : 'Multiple Analytic Plans', 'version' : '1.0', - 'category' : 'Finance', + 'category' : 'Accounting & Finance', 'complexity': "normal", 'description': """ This module allows to use several analytic plans, according to the general journal. diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index c8ab5334d8a..c62e6ea98d0 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -366,7 +366,7 @@ class account_move_line(osv.osv): def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if context is None: context = {} - result = super(osv.osv, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + result = super(account_move_line, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) return result account_move_line() @@ -496,4 +496,4 @@ class account_bank_statement_line(osv.osv): } account_bank_statement_line() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml index c9d21147458..c6879774078 100644 --- a/addons/account_analytic_plans/account_analytic_plans_installer_view.xml +++ b/addons/account_analytic_plans/account_analytic_plans_installer_view.xml @@ -7,14 +7,15 @@ account.analytic.plan form tree,form - + + To setup a multiple analytic plans environment, you must define the root analytic accounts for each plan set. Then, you must attach a plan set to your account journals. + + + + + + 15 - - - - - 15 - diff --git a/addons/account_anglo_saxon/__openerp__.py b/addons/account_anglo_saxon/__openerp__.py index 79afb26ab26..8cf6a37c3fc 100644 --- a/addons/account_anglo_saxon/__openerp__.py +++ b/addons/account_anglo_saxon/__openerp__.py @@ -19,7 +19,7 @@ ############################################################################## { - "name" : "Stock Accounting for Anglo-Saxon countries", + "name" : "Anglo-Saxon Accouting", "version" : "1.2", "author" : "OpenERP SA, Veritos", "website" : "http://tinyerp.com - http://veritos.nl", @@ -36,7 +36,7 @@ when the invoice is created to transfer this amount to the debtor or creditor ac Secondly, price differences between actual purchase price and fixed product standard price are booked on a separate account""", "images" : ["images/account_anglo_saxon.jpeg"], "depends" : ["product", "purchase"], - "category" : "Warehouse", + "category" : "Accounting & Finance", "init_xml" : [], "demo_xml" : [], "update_xml" : ["product_view.xml",], diff --git a/addons/account_anglo_saxon/i18n/zh_TW.po b/addons/account_anglo_saxon/i18n/zh_TW.po new file mode 100644 index 00000000000..c8e5d49a3e4 --- /dev/null +++ b/addons/account_anglo_saxon/i18n/zh_TW.po @@ -0,0 +1,107 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 10:28+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: account_anglo_saxon +#: view:product.category:0 +msgid " Accounting Property" +msgstr "" + +#. module: account_anglo_saxon +#: sql_constraint:purchase.order:0 +msgid "Order Reference must be unique !" +msgstr "訂單參考不能重覆!" + +#. module: account_anglo_saxon +#: constraint:product.category:0 +msgid "Error ! You can not create recursive categories." +msgstr "" + +#. module: account_anglo_saxon +#: constraint:product.template:0 +msgid "" +"Error: The default UOM and the purchase UOM must be in the same category." +msgstr "" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_account_invoice_line +msgid "Invoice Line" +msgstr "發票明細" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_purchase_order +msgid "Purchase Order" +msgstr "購貨單" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_product_template +msgid "Product Template" +msgstr "產品範本" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_product_category +msgid "Product Category" +msgstr "產品分類" + +#. module: account_anglo_saxon +#: model:ir.module.module,shortdesc:account_anglo_saxon.module_meta_information +msgid "Stock Accounting for Anglo Saxon countries" +msgstr "" + +#. module: account_anglo_saxon +#: field:product.category,property_account_creditor_price_difference_categ:0 +#: field:product.template,property_account_creditor_price_difference:0 +msgid "Price Difference Account" +msgstr "" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_account_invoice +msgid "Invoice" +msgstr "發票" + +#. module: account_anglo_saxon +#: model:ir.model,name:account_anglo_saxon.model_stock_picking +msgid "Picking List" +msgstr "提貨清單" + +#. module: account_anglo_saxon +#: model:ir.module.module,description:account_anglo_saxon.module_meta_information +msgid "" +"This module will support the Anglo-Saxons accounting methodology by\n" +" changing the accounting logic with stock transactions. The difference " +"between the Anglo-Saxon accounting countries\n" +" and the Rhine or also called Continental accounting countries is the " +"moment of taking the Cost of Goods Sold versus Cost of Sales.\n" +" Anglo-Saxons accounting does take the cost when sales invoice is " +"created, Continental accounting will take the cost at the moment the goods " +"are shipped.\n" +" This module will add this functionality by using a interim account, to " +"store the value of shipped goods and will contra book this interim account\n" +" when the invoice is created to transfer this amount to the debtor or " +"creditor account.\n" +" Secondly, price differences between actual purchase price and fixed " +"product standard price are booked on a separate account" +msgstr "" + +#. module: account_anglo_saxon +#: help:product.category,property_account_creditor_price_difference_categ:0 +#: help:product.template,property_account_creditor_price_difference:0 +msgid "" +"This account will be used to value price difference between purchase price " +"and cost price." +msgstr "" diff --git a/addons/account_asset/__openerp__.py b/addons/account_asset/__openerp__.py index 4cad6f74af3..dd1161e1a14 100644 --- a/addons/account_asset/__openerp__.py +++ b/addons/account_asset/__openerp__.py @@ -20,16 +20,16 @@ ############################################################################## { - "name" : "Asset management", + "name" : "Assets Management", "version" : "1.0", "depends" : ["account"], - "author" : "Tiny", + "author" : "OpenERP S.A.", "description": """Financial and accounting asset management. This Module manages the assets owned by a company or an individual. It will keep track of depreciation's occurred on those assets. And it allows to create Move's of the depreciation lines. """, "website" : "http://www.openerp.com", - "category" : "Generic Modules/Accounting", + "category" : "Accounting & Finance", "init_xml" : [ ], "demo_xml" : [ 'account_asset_demo.xml' diff --git a/addons/account_asset/i18n/fr.po b/addons/account_asset/i18n/fr.po index cfdf5e5432b..e2966bfa8c1 100755 --- a/addons/account_asset/i18n/fr.po +++ b/addons/account_asset/i18n/fr.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-24 12:54+0000\n" -"PO-Revision-Date: 2011-09-17 13:42+0000\n" +"PO-Revision-Date: 2011-09-26 12:09+0000\n" "Last-Translator: lholivier \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-18 04:58+0000\n" -"X-Generator: Launchpad (build 13955)\n" +"X-Launchpad-Export-Date: 2011-09-27 04:47+0000\n" +"X-Generator: Launchpad (build 14028)\n" #. module: account_asset #: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal @@ -131,7 +131,7 @@ msgstr "Commentaires" #. module: account_asset #: view:account.asset.asset:0 msgid "Change history" -msgstr "" +msgstr "Historique des modifications" #. module: account_asset #: view:account.asset.asset:0 @@ -341,7 +341,7 @@ msgstr "" #: field:account.asset.asset,date:0 #: field:account.asset.property.history,date:0 msgid "Date" -msgstr "" +msgstr "Date" #. module: account_asset #: field:account.asset.board,value_net:0 diff --git a/addons/account_asset/i18n/pt_BR.po b/addons/account_asset/i18n/pt_BR.po new file mode 100644 index 00000000000..fbfd6d7feb4 --- /dev/null +++ b/addons/account_asset/i18n/pt_BR.po @@ -0,0 +1,529 @@ +# Brazilian Portuguese 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2009-11-24 12:54+0000\n" +"PO-Revision-Date: 2011-09-30 14:07+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-10-01 05:08+0000\n" +"X-Generator: Launchpad (build 14071)\n" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_normal +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_normal +msgid "Open Assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_end:0 +#: field:account.asset.property.history,method_end:0 +msgid "Ending date" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation board" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: field:account.asset.asset,name:0 +#: field:account.asset.board,asset_id:0 +#: field:account.asset.property,asset_id:0 +#: field:account.invoice.line,asset_id:0 +#: field:account.move.line,asset_id:0 +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_form +#: model:ir.model,name:account_asset.model_account_asset_asset +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_form +msgid "Asset" +msgstr "" + +#. module: account_asset +#: constraint:ir.actions.act_window:0 +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method:0 +msgid "Linear" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Change duration" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,child_ids:0 +msgid "Child assets" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_asset:0 +msgid "Asset Value" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,name:0 +msgid "Reason" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: field:account.asset.asset,entry_ids:0 +#: wizard_field:account.asset.compute,asset_compute,move_ids:0 +msgid "Entries" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.compute,asset_compute:0 +msgid "Generated entries" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,method_delay:0 +#: field:account.asset.property,method_delay:0 +#: field:account.asset.property.history,method_delay:0 +msgid "Number of interval" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.compute,asset_compute,asset_open:0 +msgid "Open entries" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list +#: model:ir.ui.menu,name:account_asset.menu_finance_Assets +#: model:ir.ui.menu,name:account_asset.menu_finance_config_Assets +msgid "Assets" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method:0 +msgid "Progressive" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_list_draft +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_list_draft +msgid "Draft Assets" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +#: wizard_field:account.asset.modify,init,note:0 +#: view:account.asset.property.history:0 +msgid "Notes" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Change history" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation entries" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Methods" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +msgid "Asset properties to modify" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: account_asset +#: wizard_field:account.asset.modify,init,method_period:0 +#: field:account.asset.property,method_period:0 +#: field:account.asset.property.history,method_period:0 +msgid "Period per interval" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation duration" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_analytic_id:0 +msgid "Analytic account" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,state:0 +msgid "State" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation methods" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Other information" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_asset_cumul:0 +msgid "Cumul. value" +msgstr "" + +#. module: account_asset +#: view:account.asset.property:0 +msgid "Assets methods" +msgstr "" + +#. module: account_asset +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: account_asset +#: model:ir.model,name:account_asset.model_account_asset_property +msgid "Asset property" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.compute,asset_compute:0 +#: wizard_view:account.asset.compute,init:0 +#: wizard_button:account.asset.compute,init,asset_compute:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_compute +#: model:ir.ui.menu,name:account_asset.menu_wizard_asset_compute +msgid "Compute assets" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.modify,init:0 +#: wizard_button:account.asset.modify,init,asset_modify:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_modify +msgid "Modify asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Confirm asset" +msgstr "" + +#. module: account_asset +#: view:account.asset.property.history:0 +#: model:ir.model,name:account_asset.model_account_asset_property_history +msgid "Asset history" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,date:0 +msgid "Date created" +msgstr "" + +#. module: account_asset +#: model:ir.module.module,description:account_asset.module_meta_information +msgid "" +"Financial and accounting asset management.\n" +" Allows to define\n" +" * Asset category. \n" +" * Assets.\n" +" *Asset usage period and property.\n" +" " +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_gross:0 +#: field:account.asset.property,value_total:0 +msgid "Gross value" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method_time:0 +msgid "Ending period" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,name:0 +msgid "Asset name" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Accounts information" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,note:0 +#: field:account.asset.category,note:0 +#: field:account.asset.property.history,note:0 +msgid "Note" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +#: selection:account.asset.property,state:0 +msgid "Draft" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,type:0 +msgid "Depr. method type" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_asset_id:0 +msgid "Asset account" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,asset_property_id:0 +msgid "Method" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +msgid "Normal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_progress_factor:0 +msgid "Progressif factor" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,localisation:0 +msgid "Localisation" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method:0 +msgid "Computation method" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,method_time:0 +msgid "Time method" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,active:0 +msgid "Active" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,user_id:0 +msgid "User" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,property_ids:0 +msgid "Asset method name" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,date:0 +#: field:account.asset.property.history,date:0 +msgid "Date" +msgstr "" + +#. module: account_asset +#: field:account.asset.board,value_net:0 +msgid "Net value" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.close,init:0 +#: model:ir.actions.wizard,name:account_asset.wizard_asset_close +msgid "Close asset" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,history_ids:0 +msgid "History" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,account_actif_id:0 +msgid "Depreciation account" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,period_id:0 +#: wizard_field:account.asset.compute,init,period_id:0 +msgid "Period" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_category_form +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_category_form +msgid "Asset Category" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.close,init,end:0 +#: wizard_button:account.asset.compute,init,end:0 +#: wizard_button:account.asset.modify,init,end:0 +msgid "Cancel" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +#: wizard_button:account.asset.compute,asset_compute,end:0 +#: selection:account.asset.property,state:0 +msgid "Close" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,state:0 +msgid "Open" +msgstr "" + +#. module: account_asset +#: constraint:ir.model:0 +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: account_asset +#: model:ir.module.module,shortdesc:account_asset.module_meta_information +msgid "Asset management" +msgstr "" + +#. module: account_asset +#: view:account.asset.board:0 +#: field:account.asset.property,board_ids:0 +#: model:ir.model,name:account_asset.model_account_asset_board +msgid "Asset board" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,state:0 +msgid "Global state" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,method_time:0 +msgid "Delay" +msgstr "" + +#. module: account_asset +#: wizard_view:account.asset.close,init:0 +msgid "General information" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,journal_analytic_id:0 +msgid "Analytic journal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,name:0 +msgid "Method name" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,journal_id:0 +msgid "Journal" +msgstr "" + +#. module: account_asset +#: field:account.asset.property.history,name:0 +msgid "History name" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Close method" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,entry_asset_ids:0 +msgid "Asset Entries" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,category_id:0 +#: view:account.asset.category:0 +#: field:account.asset.category,name:0 +#: model:ir.model,name:account_asset.model_account_asset_category +msgid "Asset category" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "Depreciation" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,code:0 +#: field:account.asset.category,code:0 +msgid "Asset code" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,value_total:0 +msgid "Total value" +msgstr "" + +#. module: account_asset +#: selection:account.asset.asset,state:0 +msgid "View" +msgstr "" + +#. module: account_asset +#: view:account.asset.asset:0 +msgid "General info" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: account_asset +#: field:account.asset.property,value_residual:0 +msgid "Residual value" +msgstr "" + +#. module: account_asset +#: wizard_button:account.asset.close,init,asset_close:0 +msgid "End of asset" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,type:0 +msgid "Direct" +msgstr "" + +#. module: account_asset +#: selection:account.asset.property,type:0 +msgid "Indirect" +msgstr "" + +#. module: account_asset +#: field:account.asset.asset,parent_id:0 +msgid "Parent asset" +msgstr "" + +#. module: account_asset +#: model:ir.actions.act_window,name:account_asset.action_account_asset_asset_tree +#: model:ir.ui.menu,name:account_asset.menu_action_account_asset_asset_tree +msgid "Asset Hierarchy" +msgstr "" diff --git a/addons/account_budget/__openerp__.py b/addons/account_budget/__openerp__.py index 9ff5964637a..e4782ee0d2a 100644 --- a/addons/account_budget/__openerp__.py +++ b/addons/account_budget/__openerp__.py @@ -21,9 +21,9 @@ { - 'name': 'Budget Management', + 'name': 'Budgets', 'version': '1.0', - 'category': 'Finance', + 'category': 'Project Management', 'complexity': "normal", 'description': """ This module allows accountants to manage analytic and crossovered budgets. diff --git a/addons/account_cancel/__openerp__.py b/addons/account_cancel/__openerp__.py index 469033ac56e..ac73a2b8c31 100644 --- a/addons/account_cancel/__openerp__.py +++ b/addons/account_cancel/__openerp__.py @@ -23,7 +23,7 @@ "name" : "Cancel Entries", "version" : "1.1", "author" : "OpenERP SA", - "category": 'Finance', + "category": 'Hidden', 'complexity': "normal", "description": """ Allows cancelling accounting entries. diff --git a/addons/account_chart/__openerp__.py b/addons/account_chart/__openerp__.py index 2b958c4a943..948f13b5dcb 100644 --- a/addons/account_chart/__openerp__.py +++ b/addons/account_chart/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Charts of Accounts', 'version': '1.1', - 'category': 'Finance', + 'category': 'Hidden', 'description': """ Remove minimal account chart. ============================= diff --git a/addons/account_coda/__openerp__.py b/addons/account_coda/__openerp__.py index fb39bc4c5ba..dd604e41aca 100644 --- a/addons/account_coda/__openerp__.py +++ b/addons/account_coda/__openerp__.py @@ -23,7 +23,7 @@ "name" : "Account CODA - import bank statements from coda file", "version" : "1.0", "author" : "OpenERP SA", - "category" : "Finance", + "category" : "Hidden", 'complexity': "normal", "description": """ Module provides functionality to import bank statements from coda files. diff --git a/addons/account_coda/i18n/zh_TW.po b/addons/account_coda/i18n/zh_TW.po new file mode 100644 index 00000000000..bc4288a4c3c --- /dev/null +++ b/addons/account_coda/i18n/zh_TW.po @@ -0,0 +1,259 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 10:40+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: account_coda +#: help:account.coda,journal_id:0 +#: field:account.coda.import,journal_id:0 +msgid "Bank Journal" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda.import,note:0 +msgid "Log" +msgstr "" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_coda_import +msgid "Account Coda Import" +msgstr "" + +#. module: account_coda +#: field:account.coda,name:0 +msgid "Coda file" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Group By..." +msgstr "" + +#. module: account_coda +#: field:account.coda.import,awaiting_account:0 +msgid "Default Account for Unrecognized Movement" +msgstr "" + +#. module: account_coda +#: help:account.coda,date:0 +msgid "Import Date" +msgstr "匯入日期" + +#. module: account_coda +#: field:account.coda,note:0 +msgid "Import log" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Import" +msgstr "匯入" + +#. module: account_coda +#: view:account.coda:0 +msgid "Coda import" +msgstr "" + +#. module: account_coda +#: code:addons/account_coda/account_coda.py:51 +#, python-format +msgid "Coda file not found for bank statement !!" +msgstr "" + +#. module: account_coda +#: help:account.coda.import,awaiting_account:0 +msgid "" +"Set here the default account that will be used, if the partner is found but " +"does not have the bank account, or if he is domiciled" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,company_id:0 +msgid "Company" +msgstr "公司" + +#. module: account_coda +#: help:account.coda.import,def_payable:0 +msgid "" +"Set here the payable account that will be used, by default, if the partner " +"is not found" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Search Coda" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,user_id:0 +msgid "User" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,date:0 +msgid "Date" +msgstr "日期" + +#. module: account_coda +#: model:ir.ui.menu,name:account_coda.menu_account_coda_statement +msgid "Coda Import Logs" +msgstr "" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_coda +msgid "coda for an Account" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,def_payable:0 +msgid "Default Payable Account" +msgstr "" + +#. module: account_coda +#: help:account.coda,name:0 +msgid "Store the detail of bank statements" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Cancel" +msgstr "取消" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Open Statements" +msgstr "" + +#. module: account_coda +#: code:addons/account_coda/wizard/account_coda_import.py:167 +#, python-format +msgid "The bank account %s is not defined for the partner %s.\n" +msgstr "" + +#. module: account_coda +#: model:ir.ui.menu,name:account_coda.menu_account_coda_import +msgid "Import Coda Statements" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +#: model:ir.actions.act_window,name:account_coda.action_account_coda_import +msgid "Import Coda Statement" +msgstr "" + +#. module: account_coda +#: model:ir.module.module,description:account_coda.module_meta_information +msgid "" +"\n" +" Module provides functionality to import\n" +" bank statements from coda files.\n" +" " +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Statements" +msgstr "" + +#. module: account_coda +#: field:account.bank.statement,coda_id:0 +msgid "Coda" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Results :" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Result of Imported Coda Statements" +msgstr "" + +#. module: account_coda +#: help:account.coda.import,def_receivable:0 +msgid "" +"Set here the receivable account that will be used, by default, if the " +"partner is not found" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,coda:0 +#: model:ir.actions.act_window,name:account_coda.act_account_payment_account_bank_statement +msgid "Coda File" +msgstr "" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_bank_statement +msgid "Bank Statement" +msgstr "" + +#. module: account_coda +#: model:ir.actions.act_window,name:account_coda.action_account_coda +msgid "Coda Logs" +msgstr "" + +#. module: account_coda +#: code:addons/account_coda/wizard/account_coda_import.py:311 +#, python-format +msgid "Result" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Click on 'New' to select your file :" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,def_receivable:0 +msgid "Default Receivable Account" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Close" +msgstr "關閉" + +#. module: account_coda +#: field:account.coda,statement_ids:0 +msgid "Generated Bank Statements" +msgstr "" + +#. module: account_coda +#: model:ir.module.module,shortdesc:account_coda.module_meta_information +msgid "Account CODA - import bank statements from coda file" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Configure Your Journal and Account :" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Coda Import" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,journal_id:0 +msgid "Journal" +msgstr "" diff --git a/addons/account_followup/__openerp__.py b/addons/account_followup/__openerp__.py index 8de7468e43a..ca6321d5672 100644 --- a/addons/account_followup/__openerp__.py +++ b/addons/account_followup/__openerp__.py @@ -20,9 +20,9 @@ ############################################################################## { - 'name': 'Reminders', + 'name': 'Followups Management', 'version': '1.0', - 'category': 'Finance', + 'category': 'Accounting & Finance', 'complexity': "normal", 'description': """ Modules to automate letters for unpaid invoices, with multi-level recalls. @@ -52,10 +52,11 @@ Note that if you want to check the followup level for a given partner/account en 'security/ir.model.access.csv', 'wizard/account_followup_print_view.xml', 'report/account_followup_report.xml', + 'account_followup_demo.xml', # Defined by default 'account_followup_view.xml', - 'account_followup_data.xml' + 'account_followup_data.xml', ], - 'demo_xml': ['account_followup_demo.xml'], + 'demo_xml': [], 'test': ['test/account_followup.yml'], 'installable': True, 'active': False, diff --git a/addons/account_followup/account_followup_demo.xml b/addons/account_followup/account_followup_demo.xml index 01b275de306..3799033b24a 100644 --- a/addons/account_followup/account_followup_demo.xml +++ b/addons/account_followup/account_followup_demo.xml @@ -3,7 +3,7 @@ - Default follow-up + Default Follow-Up First letter after 15 net days, 30 net days and 45 days end of month levels. diff --git a/addons/account_followup/account_followup_view.xml b/addons/account_followup/account_followup_view.xml index f99a8b2c060..e6aee02ffdc 100644 --- a/addons/account_followup/account_followup_view.xml +++ b/addons/account_followup/account_followup_view.xml @@ -6,7 +6,7 @@ account_followup.followup.line tree - + @@ -19,7 +19,7 @@ account_followup.followup.line form - + @@ -45,7 +45,7 @@ - + @@ -73,10 +73,6 @@ - - - - @@ -169,6 +165,7 @@ account_followup.followup form form,tree + diff --git a/addons/account_invoice_layout/__openerp__.py b/addons/account_invoice_layout/__openerp__.py index b045b7b0b5d..557f3c2e02c 100644 --- a/addons/account_invoice_layout/__openerp__.py +++ b/addons/account_invoice_layout/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Improve Invoice Layout', 'version': '1.0', - 'category': 'Finance', + 'category': 'Hidden', 'complexity': "easy", 'description': """ This module provides some features to improve the layout of the invoices. diff --git a/addons/account_invoice_layout/account_invoice_layout_view.xml b/addons/account_invoice_layout/account_invoice_layout_view.xml index c8bb5e84031..6bdabae9326 100644 --- a/addons/account_invoice_layout/account_invoice_layout_view.xml +++ b/addons/account_invoice_layout/account_invoice_layout_view.xml @@ -10,7 +10,7 @@ form - + @@ -23,6 +23,7 @@ tree + diff --git a/addons/account_payment/__openerp__.py b/addons/account_payment/__openerp__.py index 8a90a140558..1912dfa5198 100644 --- a/addons/account_payment/__openerp__.py +++ b/addons/account_payment/__openerp__.py @@ -20,10 +20,10 @@ ############################################################################## { - "name": "Payment Management", + "name": "Suppliers Payment Management", "version": "1.1", "author": "OpenERP SA", - "category": "Finance", + "category": "Accounting & Finance", 'complexity': "easy", "description": """ Module to manage invoice payment. diff --git a/addons/account_sequence/__openerp__.py b/addons/account_sequence/__openerp__.py index f7ab18f3e7e..31d4f373e2f 100644 --- a/addons/account_sequence/__openerp__.py +++ b/addons/account_sequence/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Entries Sequence Numbering', 'version': '1.1', - 'category': 'Finance', + 'category': 'Hidden', 'complexity': "easy", 'description': """ This module maintains internal sequence number for accounting entries. diff --git a/addons/account_sequence/account_sequence.py b/addons/account_sequence/account_sequence.py index 1649a8890fa..8b87b3f40ae 100644 --- a/addons/account_sequence/account_sequence.py +++ b/addons/account_sequence/account_sequence.py @@ -35,7 +35,7 @@ class account_move(osv.osv): seq_no = False for move in self.browse(cr, uid, ids, context=context): if move.journal_id.internal_sequence_id: - seq_no = obj_sequence.get_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context) + seq_no = obj_sequence.next_by_id(cr, uid, move.journal_id.internal_sequence_id.id, context=context) if seq_no: self.write(cr, uid, [move.id], {'internal_sequence_number': seq_no}) return res diff --git a/addons/account_sequence/i18n/zh_TW.po b/addons/account_sequence/i18n/zh_TW.po new file mode 100644 index 00000000000..809c641a883 --- /dev/null +++ b/addons/account_sequence/i18n/zh_TW.po @@ -0,0 +1,221 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 11:32+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: account_sequence +#: view:account.sequence.installer:0 +#: model:ir.actions.act_window,name:account_sequence.action_account_seq_installer +msgid "Account Sequence Application Configuration" +msgstr "" + +#. module: account_sequence +#: constraint:account.move:0 +msgid "" +"You cannot create entries on different periods/journals in the same move" +msgstr "" + +#. module: account_sequence +#: help:account.move,internal_sequence_number:0 +#: help:account.move.line,internal_sequence_number:0 +msgid "Internal Sequence Number" +msgstr "內部序列號碼" + +#. module: account_sequence +#: help:account.sequence.installer,number_next:0 +msgid "Next number of this sequence" +msgstr "本序列下個號碼" + +#. module: account_sequence +#: field:account.sequence.installer,number_next:0 +msgid "Next Number" +msgstr "下個號碼" + +#. module: account_sequence +#: field:account.sequence.installer,number_increment:0 +msgid "Increment Number" +msgstr "編號增量" + +#. module: account_sequence +#: model:ir.module.module,description:account_sequence.module_meta_information +msgid "" +"\n" +" This module maintains internal sequence number for accounting entries.\n" +" " +msgstr "" + +#. module: account_sequence +#: model:ir.module.module,shortdesc:account_sequence.module_meta_information +msgid "Entries Sequence Numbering" +msgstr "" + +#. module: account_sequence +#: help:account.sequence.installer,number_increment:0 +msgid "The next number of the sequence will be incremented by this number" +msgstr "序列下個號碼按此數字遞增" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "Configure Your Account Sequence Application" +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,progress:0 +msgid "Configuration Progress" +msgstr "配置進度" + +#. module: account_sequence +#: help:account.sequence.installer,suffix:0 +msgid "Suffix value of the record for the sequence" +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,company_id:0 +msgid "Company" +msgstr "公司" + +#. module: account_sequence +#: help:account.journal,internal_sequence_id:0 +msgid "" +"This sequence will be used to maintain the internal number for the journal " +"entries related to this journal." +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,padding:0 +msgid "Number padding" +msgstr "數字位數" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_move_line +msgid "Journal Items" +msgstr "" + +#. module: account_sequence +#: field:account.move,internal_sequence_number:0 +#: field:account.move.line,internal_sequence_number:0 +msgid "Internal Number" +msgstr "內部號碼" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "Company must be same for its related account and period." +msgstr "" + +#. module: account_sequence +#: help:account.sequence.installer,padding:0 +msgid "" +"OpenERP will automatically adds some '0' on the left of the 'Next Number' to " +"get the required padding size." +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,name:0 +msgid "Name" +msgstr "名稱" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "You can not create move line on closed account." +msgstr "" + +#. module: account_sequence +#: constraint:account.move:0 +msgid "" +"You cannot create more than one move per period on centralized journal" +msgstr "" + +#. module: account_sequence +#: sql_constraint:account.move.line:0 +msgid "Wrong credit or debit value in accounting entry !" +msgstr "" + +#. module: account_sequence +#: field:account.journal,internal_sequence_id:0 +msgid "Internal Sequence" +msgstr "內部序列" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_sequence_installer +msgid "account.sequence.installer" +msgstr "" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "Configure" +msgstr "設定" + +#. module: account_sequence +#: help:account.sequence.installer,prefix:0 +msgid "Prefix value of the record for the sequence" +msgstr "" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_move +msgid "Account Entry" +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,suffix:0 +msgid "Suffix" +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,config_logo:0 +msgid "Image" +msgstr "圖像" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "title" +msgstr "" + +#. module: account_sequence +#: sql_constraint:account.journal:0 +msgid "The name of the journal must be unique per company !" +msgstr "" + +#. module: account_sequence +#: field:account.sequence.installer,prefix:0 +msgid "Prefix" +msgstr "" + +#. module: account_sequence +#: sql_constraint:account.journal:0 +msgid "The code of the journal must be unique per company !" +msgstr "" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "" +"You can not create move line on receivable/payable account without partner" +msgstr "" + +#. module: account_sequence +#: model:ir.model,name:account_sequence.model_account_journal +msgid "Journal" +msgstr "" + +#. module: account_sequence +#: view:account.sequence.installer:0 +msgid "You can enhance the Account Sequence Application by installing ." +msgstr "" + +#. module: account_sequence +#: constraint:account.move.line:0 +msgid "You can not create move line on view account." +msgstr "" diff --git a/addons/account_voucher/__init__.py b/addons/account_voucher/__init__.py index 098d82ea361..9796f81d5e5 100644 --- a/addons/account_voucher/__init__.py +++ b/addons/account_voucher/__init__.py @@ -20,9 +20,8 @@ ############################################################################## import account_voucher -import company import invoice import report import wizard -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index 7b2a293c508..97ac9950efb 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -25,22 +25,15 @@ "author" : 'OpenERP SA', 'complexity': "normal", "description": """ -Account Voucher module offers an easy way to deal with all the basic requirements of Voucher Entries -==================================================================================================== +Account Voucher module includes all the basic requirements of Voucher Entries for Bank, Cash, Sales, Purchase, Expanse, Contra, etc. +==================================================================================================================================== -Its increased usabililty allows you to create easily sales/purchases documents but also to encode payments. -Doing so, you'll be able to see all the open transactions for the selected partner and that will help you -to reconcile your entry with its invoice. - -Account Voucher module multi-currency support -============================================= - -Thanks to the contribution of Camptocamp, the vouchers fully support the multi currency and compute the -currency rate difference besides the write off amount. Of course, the accounting entries are also created -accordingly. + * Voucher Entry + * Voucher Receipt + * Cheque Register """, - "category" : "Finance", - "website" : "http://www.openerp.com", + "category" : "Hidden", + "website" : "http://tinyerp.com", "images" : ["images/customer_payment.jpeg","images/journal_voucher.jpeg","images/sales_receipt.jpeg","images/supplier_voucher.jpeg"], "depends" : ["account"], "init_xml" : [], @@ -55,7 +48,6 @@ accordingly. "wizard/account_voucher_unreconcile_view.xml", "wizard/account_statement_from_invoice_view.xml", "account_voucher_view.xml", - "company_view.xml", "voucher_payment_receipt_view.xml", "voucher_sales_purchase_view.xml", "account_voucher_wizard.xml", @@ -67,12 +59,7 @@ accordingly. "test/account_voucher.yml", "test/sales_receipt.yml", "test/sales_payment.yml", - "test/account_voucher_report.yml", - "test/case1_usd_usd.yml", - "test/case2_usd_eur.yml", - "test/case2_suppl_usd_eur.yml", - "test/case3_eur_eur.yml", - "test/case4_cad_chf.yml", + "test/account_voucher_report.yml" ], 'certificate': '0037580727101', "active": False, diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py index 6e325a2c87e..005e5d9ab46 100644 --- a/addons/account_voucher/account_voucher.py +++ b/addons/account_voucher/account_voucher.py @@ -29,6 +29,17 @@ from tools.translate import _ class account_voucher(osv.osv): + def _check_paid(self, cr, uid, ids, name, args, context=None): + res = {} + for voucher in self.browse(cr, uid, ids, context=context): + ok = True + for line in voucher.move_ids: + if (line.account_id.type, 'in', ('receivable', 'payable')) and not line.reconcile_id: + ok = False + res[voucher.id] = ok + return res + + def _get_type(self, cr, uid, context=None): if context is None: @@ -39,10 +50,7 @@ class account_voucher(osv.osv): if context is None: context = {} if context.get('period_id', False): return context.get('period_id') - if context.get('invoice_id', False): - company_id = self.pool.get('account.invoice').browse(cr, uid, context['invoice_id'], context=context).company_id.id - context.update({'company_id': company_id}) - periods = self.pool.get('account.period').find(cr, uid, context=context) + periods = self.pool.get('account.period').find(cr, uid) return periods and periods[0] or False def _get_journal(self, cr, uid, context=None): @@ -145,102 +153,39 @@ class account_voucher(osv.osv): res['arch'] = etree.tostring(doc) return res - def _check_paid(self, cr, uid, ids, name, args, context=None): - res = {} - for voucher in self.browse(cr, uid, ids, context=context): - ok = True - for line in voucher.move_ids: - if (line.account_id.type, 'in', ('receivable', 'payable')) and not line.reconcile_id: - ok = False - res[voucher.id] = ok - return res - - def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=None): - if context is None: - context = {} - currency_pool = self.pool.get('res.currency') - ctx = context.copy() - voucher_type = context.get('type', False) - counter_for_writeoff = counter_for_currency_diff = real_amount = 0.0 - ctx.update({'date': voucher_date}) + def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount): + debit = credit = 0.0 for l in line_dr_ids: - #compute the amount in voucher currency and in company currency if there aren't set yet - if not l.get('amount_in_company_currency', False): - ctx.update({'date': l['date_original']}) - amount_in_company_currency = currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) - ctx.update({'date': voucher_date}) - else: - amount_in_company_currency = l.get('amount_in_company_currency', 0.0) - if not l.get('amount_in_voucher_currency'): - amount_in_voucher_currency = currency_pool.compute(cr, uid, l['currency_id'], l['voucher_currency_id'], l['amount'], context=ctx) - else: - amount_in_voucher_currency = l.get('amount_in_voucher_currency', 0.0) - real_amount -= amount_in_company_currency - counter_for_writeoff -= l.get('voucher_currency_id') == l.get('currency_id') and l['amount'] or amount_in_voucher_currency - counter_for_currency_diff -= currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) + debit += l['amount'] for l in line_cr_ids: - #compute the amount in voucher currency and in company currency if there aren't set yet - if not l.get('amount_in_company_currency', False): - ctx.update({'date': l['date_original']}) - amount_in_company_currency = currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) - ctx.update({'date': voucher_date}) - else: - amount_in_company_currency = l.get('amount_in_company_currency', 0.0) - if not l.get('amount_in_voucher_currency'): - amount_in_voucher_currency = currency_pool.compute(cr, uid, l['currency_id'], l['voucher_currency_id'], l['amount'], context=ctx) - else: - amount_in_voucher_currency = l.get('amount_in_voucher_currency', 0.0) - real_amount += amount_in_company_currency - counter_for_writeoff += l.get('voucher_currency_id') == l.get('currency_id') and l['amount'] or amount_in_voucher_currency - counter_for_currency_diff += currency_pool.compute(cr, uid, l['currency_id'], l['company_currency_id'], l['amount'], context=ctx) - sign = voucher_type in ['sale','receipt'] and 1 or -1 - writeoff_amount = (sign * amount) - counter_for_writeoff - currency_rate_difference = real_amount - counter_for_currency_diff - return writeoff_amount, currency_rate_difference + credit += l['amount'] + return abs(amount - abs(credit - debit)) - def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, voucher_date, context=None): + def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount, context=None): + context = context or {} if not line_dr_ids and not line_cr_ids: return {'value':{}} line_osv = self.pool.get("account.voucher.line") line_dr_ids = resolve_o2m_operations(cr, uid, line_osv, line_dr_ids, ['amount'], context) line_cr_ids = resolve_o2m_operations(cr, uid, line_osv, line_cr_ids, ['amount'], context) - writeoff_amount, currency_rate_diff = self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount, voucher_date, context=context) - return {'value': {'writeoff_amount': writeoff_amount, 'currency_rate_difference': currency_rate_diff}} + return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount)}} def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None): if not ids: return {} - if context is None: - context = {} - res = {}.fromkeys(ids,{}) - counter_for_writeoff = counter_for_currency_diff = real_amount = 0.0 - currency_pool = self.pool.get('res.currency') - for voucher in self.browse(cr, uid, ids, context=context): - ctx = context.copy() - ctx.update({'date': voucher.date}) - for l in voucher.line_dr_ids: - real_amount -= l.amount_in_company_currency - counter_for_writeoff -= (l.voucher_currency_id.id == l.currency_id.id) and l.amount or l.amount_in_voucher_currency - counter_for_currency_diff -= currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) - for l in voucher.line_cr_ids: - real_amount += l.amount_in_company_currency - counter_for_writeoff += (l.voucher_currency_id.id == l.currency_id.id) and l.amount or l.amount_in_voucher_currency - counter_for_currency_diff += currency_pool.compute(cr, uid, l.currency_id.id, voucher.company_id.currency_id.id, l.amount, context=ctx) - sign = voucher.type in ['sale','receipt'] and 1 or -1 - writeoff_amount = (sign * voucher.amount) - counter_for_writeoff - res[voucher.id]['writeoff_amount'] = writeoff_amount - res[voucher.id]['currency_rate_difference'] = real_amount - counter_for_currency_diff - return res - - def _currency_id(self, cr, uid, ids, name, args, context=None): res = {} + debit = credit = 0.0 for voucher in self.browse(cr, uid, ids, context=context): - currency = voucher.journal_id.currency and voucher.journal_id.currency.id or voucher.company_id.currency_id.id - res[voucher.id] = {'currency_id': currency, 'currency_id2': currency} + for l in voucher.line_dr_ids: + debit += l.amount + for l in voucher.line_cr_ids: + credit += l.amount + res[voucher.id] = abs(voucher.amount - abs(credit - debit)) return res _name = 'account.voucher' _description = 'Accounting Voucher' _order = "date desc, id desc" +# _rec_name = 'number' _columns = { 'type':fields.selection([ ('sale','Sale'), @@ -250,7 +195,7 @@ class account_voucher(osv.osv): ],'Default Type', readonly=True, states={'draft':[('readonly',False)]}), 'name':fields.char('Memo', size=256, readonly=True, states={'draft':[('readonly',False)]}), 'date':fields.date('Date', readonly=True, select=True, states={'draft':[('readonly',False)]}, help="Effective date for accounting entries"), - 'journal_id':fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}, change_default=1), + 'journal_id':fields.many2one('account.journal', 'Journal', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'account_id':fields.many2one('account.account', 'Account', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'line_ids':fields.one2many('account.voucher.line','voucher_id','Voucher Lines', readonly=True, states={'draft':[('readonly',False)]}), 'line_cr_ids':fields.one2many('account.voucher.line','voucher_id','Credits', @@ -259,13 +204,11 @@ class account_voucher(osv.osv): domain=[('type','=','dr')], context={'default_type':'dr'}, readonly=True, states={'draft':[('readonly',False)]}), 'period_id': fields.many2one('account.period', 'Period', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'narration':fields.text('Notes', readonly=True, states={'draft':[('readonly',False)]}), - 'currency_id': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), - #duplicated field for display purposes - 'currency_id2': fields.function(_currency_id, type='many2one', relation='res.currency', string='Currency', store=True, readonly=True, multi="currency"), - 'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True), - 'company_currency': fields.related('company_id','currency_id', type='many2one', relation='res.currency', string='Currency', readonly=True), +# 'currency_id':fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}), + 'currency_id': fields.related('journal_id','currency', type='many2one', relation='res.currency', string='Currency', readonly=True), + 'company_id': fields.many2one('res.company', 'Company', required=True, readonly=True, states={'draft':[('readonly',False)]}), 'state':fields.selection( - [('draft','New'), + [('draft','Draft'), ('proforma','Pro-forma'), ('posted','Posted'), ('cancel','Cancelled') @@ -282,6 +225,7 @@ class account_voucher(osv.osv): 'move_ids': fields.related('move_id','line_id', type='one2many', relation='account.move.line', string='Journal Items', readonly=True), 'partner_id':fields.many2one('res.partner', 'Partner', change_default=1, readonly=True, states={'draft':[('readonly',False)]}), 'audit': fields.related('move_id','to_check', type='boolean', help='Check this box if you are unsure of that journal entry and if you want to note it as \'to be reviewed\' by an accounting expert.', relation='account.move', string='To Review'), + 'paid': fields.function(_check_paid, string='Paid', type='boolean', help="The Voucher has been totally paid."), 'pay_now':fields.selection([ ('pay_now','Pay Directly'), ('pay_later','Pay Later or Group Funds'), @@ -291,14 +235,13 @@ class account_voucher(osv.osv): 'date_due': fields.date('Due Date', readonly=True, select=True, states={'draft':[('readonly',False)]}), 'payment_option':fields.selection([ ('without_writeoff', 'Keep Open'), - ('with_writeoff', 'Reconcile'), + ('with_writeoff', 'Reconcile Payment Balance'), ], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}), - 'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account', readonly=True, states={'draft': [('readonly', False)]}), - 'comment': fields.char('Write-Off Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}), + 'exchange_acc_id': fields.many2one('account.account', 'Exchange Diff. Account', readonly=True, states={'draft': [('readonly', False)]}), + 'writeoff_acc_id': fields.many2one('account.account', 'Counterpart Account', readonly=True, states={'draft': [('readonly', False)]}), + 'comment': fields.char('Counterpart Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}), 'analytic_id': fields.many2one('account.analytic.account','Write-Off Analytic Account', readonly=True, states={'draft': [('readonly', False)]}), - 'writeoff_amount': fields.function(_get_writeoff_amount, string='Write-Off Amount', type='float', readonly=True, multi="writeoff"), - 'currency_rate_difference': fields.function(_get_writeoff_amount, string="Currency Rate Difference", type='float', multi="writeoff"), - 'paid': fields.function(_check_paid, string='Paid', type='boolean', help="The Voucher has been totally paid."), + 'writeoff_amount': fields.function(_get_writeoff_amount, string='Reconcile Amount', type='float', readonly=True), } _defaults = { 'period_id': _get_period, @@ -323,7 +266,7 @@ class account_voucher(osv.osv): tax_pool = self.pool.get('account.tax') partner_pool = self.pool.get('res.partner') position_pool = self.pool.get('account.fiscal.position') - voucher_voucher_line_obj = self.pool.get('account.voucher.line') + voucher_line_pool = self.pool.get('account.voucher.line') voucher_pool = self.pool.get('account.voucher') if context is None: context = {} @@ -332,7 +275,7 @@ class account_voucher(osv.osv): for line in voucher.line_ids: voucher_amount += line.untax_amount or line.amount line.amount = line.untax_amount or line.amount - voucher_voucher_line_obj.write(cr, uid, [line.id], {'amount':line.amount, 'untax_amount':line.untax_amount}) + voucher_line_pool.write(cr, uid, [line.id], {'amount':line.amount, 'untax_amount':line.untax_amount}) if not voucher.tax_id: self.write(cr, uid, [voucher.id], {'amount':voucher_amount, 'tax_amount':0.0}) @@ -360,7 +303,7 @@ class account_voucher(osv.osv): line_total += tax_line.get('price_unit') total_tax += line_tax untax_amount = line.untax_amount or line.amount - voucher_voucher_line_obj.write(cr, uid, [line.id], {'amount':line_total, 'untax_amount':untax_amount}) + voucher_line_pool.write(cr, uid, [line.id], {'amount':line_total, 'untax_amount':untax_amount}) self.write(cr, uid, [voucher.id], {'amount':total, 'tax_amount':total_tax}) return True @@ -370,14 +313,14 @@ class account_voucher(osv.osv): tax_pool = self.pool.get('account.tax') partner_pool = self.pool.get('res.partner') position_pool = self.pool.get('account.fiscal.position') - voucher_line_obj = self.pool.get('account.voucher.line') + line_pool = self.pool.get('account.voucher.line') res = { 'tax_amount': False, 'amount': False, } voucher_total = 0.0 - line_ids = resolve_o2m_operations(cr, uid, voucher_line_obj, line_ids, ["amount"], context) + line_ids = resolve_o2m_operations(cr, uid, line_pool, line_ids, ["amount"], context) total = 0.0 total_tax = 0.0 @@ -466,8 +409,8 @@ class account_voucher(osv.osv): return default - def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, price, voucher_currency_id, ttype, date, context=None): - """price + def onchange_partner_id(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): + """ Returns a dict that contains new values and context @param partner_id: latest value from user input for field partner_id @@ -476,36 +419,43 @@ class account_voucher(osv.osv): @return: Returns a dict which contains new values, and context """ - if not journal_id: - return {} if context is None: context = {} + if not journal_id: + return {} context_multi_currency = context.copy() if date: context_multi_currency.update({'date': date}) + line_pool = self.pool.get('account.voucher.line') + line_ids = ids and line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) or False + if line_ids: + line_pool.unlink(cr, uid, line_ids) + currency_pool = self.pool.get('res.currency') - move_line_obj = self.pool.get('account.move.line') + move_line_pool = self.pool.get('account.move.line') partner_pool = self.pool.get('res.partner') journal_pool = self.pool.get('account.journal') - voucher_line_obj = self.pool.get('account.voucher.line') - #get default values - vals = self.onchange_journal(cr, uid, ids, journal_id, [], False, partner_id, context=context) - vals = vals.get('value',{}) - voucher_currency_id = vals.get('currency_id', voucher_currency_id) - default = { - 'value':{'line_ids':[], 'line_dr_ids':[], 'line_cr_ids':[], 'pre_line': False, 'currency_id': voucher_currency_id}, - } - #drop existing lines - line_ids = ids and voucher_line_obj.search(cr, uid, [('voucher_id', 'in', ids)]) or [] - if line_ids: - voucher_line_obj.unlink(cr, uid, line_ids, context=context) + vals = self.onchange_journal(cr, uid, ids, journal_id, [], False, partner_id, context) + vals = vals.get('value') + + journal = journal_pool.browse(cr, uid, journal_id, context=context) + currency_id = vals.get('currency_id', currency_id) + default = { + 'value':{'line_ids':[], 'line_dr_ids':[], 'line_cr_ids':[], 'pre_line': False, 'currency_id':currency_id}, + } + currency_id = currency_id or journal.company_id.currency_id.id if not partner_id: return default - journal = journal_pool.browse(cr, uid, journal_id, context=context) + if not partner_id and ids: + line_ids = line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) + if line_ids: + line_pool.unlink(cr, uid, line_ids) + return default + partner = partner_pool.browse(cr, uid, partner_id, context=context) account_id = False if journal.type in ('sale','sale_refund'): @@ -520,98 +470,78 @@ class account_voucher(osv.osv): if journal.type not in ('cash', 'bank'): return default + total_credit = 0.0 + total_debit = 0.0 account_type = 'receivable' if ttype == 'payment': account_type = 'payable' + total_debit = price or 0.0 else: + total_credit = price or 0.0 account_type = 'receivable' if not context.get('move_line_ids', False): - ids = move_line_obj.search(cr, uid, [('state','=','valid'), ('account_id.type', '=', account_type), ('reconcile_id', '=', False), ('partner_id', '=', partner_id)], context=context) + ids = move_line_pool.search(cr, uid, [('state','=','valid'), ('account_id.type', '=', account_type), ('reconcile_id', '=', False), ('partner_id', '=', partner_id)], context=context) else: ids = context['move_line_ids'] - - #computation of the assignation of voucher amount on voucher lines - total_credit = account_type == 'receivable' and price or 0.0 - total_debit = account_type == 'payable' and price or 0.0 - moves = move_line_obj.browse(cr, uid, ids, context=context) - company_currency = journal.company_id.currency_id.id - invoice_id = context.get('invoice_id', False) - move_line_found = False - #order the lines by most old first ids.reverse() + moves = move_line_pool.browse(cr, uid, ids, context=context) + + #company_currency = journal.company_id.currency_id.id + #if company_currency != currency_id and ttype == 'payment': + # total_debit = currency_pool.compute(cr, uid, currency_id, company_currency, total_debit, context=context_multi_currency) + #elif company_currency != currency_id and ttype == 'receipt': + # total_credit = currency_pool.compute(cr, uid, currency_id, company_currency, total_credit, context=context_multi_currency) + + company_currency = journal.company_id.currency_id.id + for line in moves: + if line.credit and line.reconcile_partial_id and ttype == 'receipt': + continue + if line.debit and line.reconcile_partial_id and ttype == 'payment': + continue + + if line.currency_id and currency_id==line.currency_id.id: + total_credit += line.amount_currency <0 and -line.amount_currency or 0.0 + total_debit += line.amount_currency >0 and line.amount_currency or 0.0 + else: + total_credit += currency_pool.compute(cr, uid, company_currency, currency_id, line.credit or 0.0) + total_debit += currency_pool.compute(cr, uid, company_currency, currency_id, line.debit or 0.0) for line in moves: if line.credit and line.reconcile_partial_id and ttype == 'receipt': continue if line.debit and line.reconcile_partial_id and ttype == 'payment': continue - if invoice_id: - if line.invoice.id == invoice_id: - #if the invoice linked to the voucher line is equal to the invoice_id in context - #then we assign the amount on that line, whatever the other voucher lines - move_line_found = line.id - break - elif voucher_currency_id == company_currency: - #otherwise treatments is the same but with other field names - if line.amount_residual == price: - #if the amount residual is equal the amount voucher, we assign it to that voucher - #line, whatever the other voucher lines - move_line_found = line.id - break - #otherwise we will split the voucher amount on each line (by most old first) - total_credit += line.credit or 0.0 - total_debit += line.debit or 0.0 - elif voucher_currency_id == line.currency_id.id: - if line.amount_residual_currency == price: - move_line_found = line.id - break - total_credit += line.credit and line.amount_currency or 0.0 - total_debit += line.debit and line.amount_currency or 0.0 - #voucher line creation - for line in moves: - if line.credit and line.reconcile_partial_id and ttype == 'receipt': - continue - if line.debit and line.reconcile_partial_id and ttype == 'payment': - continue - original_amount = line.credit or line.debit or 0.0 - amount_original, amount_unreconciled = voucher_line_obj._get_amounts(cr, uid, line, context=context) - currency_id = line.currency_id and line.currency_id.id or line.company_id.currency_id.id + if line.currency_id and currency_id==line.currency_id.id: + amount_original = abs(line.amount_currency) + amount_unreconciled = abs(line.amount_residual_currency) + else: + amount_original = currency_pool.compute(cr, uid, company_currency, currency_id, line.credit or line.debit or 0.0) + amount_unreconciled = currency_pool.compute(cr, uid, company_currency, currency_id, abs(line.amount_residual)) + + #original_amount = line.credit or line.debit or 0.0 + #amount_unreconciled = currency_pool.compute(cr, uid, line.currency_id and line.currency_id.id or company_currency, currency_id, abs(line.amount_residual_currency), context=context_multi_currency) rs = { 'name':line.move_id.name, 'type': line.credit and 'dr' or 'cr', 'move_line_id':line.id, 'account_id':line.account_id.id, 'amount_original': amount_original, - 'amount': (move_line_found == line.id) and min(price, amount_unreconciled) or 0.0, - 'currency_id': currency_id, - 'voucher_currency_id': voucher_currency_id, 'date_original':line.date, - 'company_currency_id': line.company_id.currency_id.id, 'date_due':line.date_maturity, 'amount_unreconciled': amount_unreconciled, + } - #split voucher amount by most old first - if not move_line_found: - if company_currency == voucher_currency_id: - if line.credit: - amount = min(amount_unreconciled, abs(total_debit)) - rs['amount'] = amount - total_debit -= amount - else: - amount = min(amount_unreconciled, abs(total_credit)) - rs['amount'] = amount - total_credit -= amount - elif voucher_currency_id == line.currency_id.id: - if line.credit: - amount = min(amount_unreconciled, abs(total_debit)) - rs['amount'] = amount - total_debit -= amount - else: - amount = min(amount_unreconciled, abs(total_credit)) - rs['amount'] = amount - total_credit -= amount + + if line.credit: + amount = min(amount_unreconciled, total_debit) + rs['amount'] = amount + total_debit -= amount + else: + amount = min(amount_unreconciled, total_credit) + rs['amount'] = amount + total_credit -= amount default['value']['line_ids'].append(rs) if rs['type'] == 'cr': @@ -623,7 +553,7 @@ class account_voucher(osv.osv): default['value']['pre_line'] = 1 elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0: default['value']['pre_line'] = 1 - default['value']['writeoff_amount'], default['value']['currency_rate_difference'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price, date, context=context) + default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price) return default def onchange_date(self, cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=None): @@ -633,13 +563,9 @@ class account_voucher(osv.osv): @param context: context arguments, like lang, time zone @return: Returns a dict which contains new values, and context """ - if context is None: context = {} period_pool = self.pool.get('account.period') res = self.onchange_partner_id(cr, uid, ids, partner_id, journal_id, price, currency_id, ttype, date, context=context) - if context.get('invoice_id', False): - company_id = self.pool.get('account.invoice').browse(cr, uid, context['invoice_id'], context=context).company_id.id - context.update({'company_id': company_id}) - pids = period_pool.find(cr, uid, date, context=context) + pids = period_pool.search(cr, uid, [('date_start', '<=', date), ('date_stop', '>=', date)]) if pids: if not 'value' in res: res['value'] = {} @@ -647,9 +573,8 @@ class account_voucher(osv.osv): return res def onchange_journal(self, cr, uid, ids, journal_id, line_ids, tax_id, partner_id, context=None): - if context is None: context = {} if not journal_id: - return {} + return False journal_pool = self.pool.get('account.journal') journal = journal_pool.browse(cr, uid, journal_id, context=context) account_id = journal.default_credit_account_id or journal.default_debit_account_id @@ -659,14 +584,10 @@ class account_voucher(osv.osv): vals = self.onchange_price(cr, uid, ids, line_ids, tax_id, partner_id, context) vals['value'].update({'tax_id':tax_id}) - currency_id = journal.company_id.currency_id.id + currency_id = False #journal.company_id.currency_id.id if journal.currency: currency_id = journal.currency.id vals['value'].update({'currency_id':currency_id}) - context.update({'company_id': journal.company_id.id}) - periods = self.pool.get('account.period').find(cr, uid, context=context) - if periods: - vals['value'].update({'period_id':periods[0]}) return vals def proforma_voucher(self, cr, uid, ids, context=None): @@ -707,9 +628,10 @@ class account_voucher(osv.osv): def unlink(self, cr, uid, ids, context=None): for t in self.read(cr, uid, ids, ['state'], context=context): if t['state'] not in ('draft', 'cancel'): - raise osv.except_osv(_('Invalid action !'), _('In order to delete a voucher, you must cancel it!')) + raise osv.except_osv(_('Invalid action !'), _('Cannot delete Voucher(s) which are already opened or paid !')) return super(account_voucher, self).unlink(cr, uid, ids, context=context) + # TODO: may be we can remove this method if not used anyware def onchange_payment(self, cr, uid, ids, pay_now, journal_id, partner_id, ttype='sale'): res = {} if not partner_id: @@ -730,7 +652,6 @@ class account_voucher(osv.osv): return {'value':res} def action_move_line_create(self, cr, uid, ids, context=None): - def _get_payment_term_lines(term_id, amount): term_pool = self.pool.get('account.payment.term') if term_id and amount: @@ -740,44 +661,49 @@ class account_voucher(osv.osv): if context is None: context = {} move_pool = self.pool.get('account.move') - move_line_obj = self.pool.get('account.move.line') + move_line_pool = self.pool.get('account.move.line') currency_pool = self.pool.get('res.currency') tax_obj = self.pool.get('account.tax') seq_obj = self.pool.get('ir.sequence') - for voucher in self.browse(cr, uid, ids, context=context): - if voucher.move_id: + for inv in self.browse(cr, uid, ids, context=context): + if inv.move_id: continue context_multi_currency = context.copy() - context_multi_currency.update({'date': voucher.date}) + context_multi_currency.update({'date': inv.date}) - if voucher.number: - name = voucher.number + if inv.number: + name = inv.number + elif inv.journal_id.sequence_id: + name = seq_obj.next_by_id(cr, uid, inv.journal_id.sequence_id.id) else: - name = seq_obj.get_id(cr, uid, voucher.journal_id.sequence_id.id) - if not voucher.reference: + raise osv.except_osv(_('Error !'), _('Please define a sequence on the journal !')) + if not inv.reference: ref = name.replace('/','') else: - ref = voucher.reference + ref = inv.reference move = { 'name': name, - 'journal_id': voucher.journal_id.id, - 'narration': voucher.narration, - 'date': voucher.date, + 'journal_id': inv.journal_id.id, + 'narration': inv.narration, + 'date': inv.date, 'ref': ref, - 'period_id': voucher.period_id and voucher.period_id.id or False + 'period_id': inv.period_id and inv.period_id.id or False } move_id = move_pool.create(cr, uid, move) #create the first line manually - company_currency = voucher.journal_id.company_id.currency_id.id - voucher_currency = voucher.currency_id.id + company_currency = inv.journal_id.company_id.currency_id.id + current_currency = inv.currency_id.id or company_currency + current_currency_obj = inv.currency_id or inv.journal_id.company_id.currency_id debit = 0.0 credit = 0.0 - if voucher.type in ('purchase', 'payment'): - credit = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.amount, context=context_multi_currency) - elif voucher.type in ('sale', 'receipt'): - debit = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.amount, context=context_multi_currency) + # TODO: is there any other alternative then the voucher type ?? + # -for sale, purchase we have but for the payment and receipt we do not have as based on the bank/cash journal we can not know its payment or receipt + if inv.type in ('purchase', 'payment'): + credit = currency_pool.compute(cr, uid, current_currency, company_currency, inv.amount, context=context_multi_currency) + elif inv.type in ('sale', 'receipt'): + debit = currency_pool.compute(cr, uid, current_currency, company_currency, inv.amount, context=context_multi_currency) if debit < 0: credit = -debit debit = 0.0 @@ -785,71 +711,53 @@ class account_voucher(osv.osv): debit = -credit credit = 0.0 sign = debit - credit < 0 and -1 or 1 - #create the first line of the voucher + #create the first line of the voucher, the payment made move_line = { - 'name': voucher.name or '/', + 'name': inv.name or '/', 'debit': debit, 'credit': credit, - 'account_id': voucher.account_id.id, + 'account_id': inv.account_id.id, 'move_id': move_id, - 'journal_id': voucher.journal_id.id, - 'period_id': voucher.period_id.id, - 'partner_id': voucher.partner_id.id, - 'currency_id': company_currency <> voucher_currency and voucher_currency or False, - 'amount_currency': company_currency <> voucher_currency and sign * voucher.amount or 0.0, - 'date': voucher.date, - 'date_maturity': voucher.date_due + 'journal_id': inv.journal_id.id, + 'period_id': inv.period_id.id, + 'partner_id': inv.partner_id.id, + 'currency_id': company_currency <> current_currency and current_currency or False, + 'amount_currency': company_currency <> current_currency and sign * inv.amount or 0.0, + 'date': inv.date, + 'date_maturity': inv.date_due } - move_line_obj.create(cr, uid, move_line) - - #create the move line for the currency difference - if voucher.currency_rate_difference: - if voucher.currency_rate_difference > 0: - account_id = voucher.company_id.property_expense_currency_exchange - if not account_id: - raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Expense Currency Rate' on the company! ")) - else: - account_id = voucher.company_id.property_income_currency_exchange - if not account_id: - raise osv.except_osv(_('Warning'),_("Unable to create accounting entry for currency rate difference. You have to configure the field 'Income Currency Rate' on the company! ")) - - currency_diff_line = { - 'name': _('Currency Difference'), - 'debit': voucher.currency_rate_difference > 0 and voucher.currency_rate_difference or 0.0, - 'credit': voucher.currency_rate_difference < 0 and -voucher.currency_rate_difference or 0.0, - 'account_id': account_id.id, - 'move_id': move_id, - 'journal_id': voucher.journal_id.id, - 'period_id': voucher.period_id.id, - 'partner_id': voucher.partner_id.id, - 'date': voucher.date, - 'date_maturity': voucher.date_due - } - move_line_obj.create(cr, uid, currency_diff_line, context=context) - + move_line_pool.create(cr, uid, move_line) rec_list_ids = [] - for line in voucher.line_ids: + line_total = debit - credit + if inv.type == 'sale': + line_total = line_total - currency_pool.compute(cr, uid, current_currency, company_currency, inv.tax_amount, context=context_multi_currency) + elif inv.type == 'purchase': + line_total = line_total + currency_pool.compute(cr, uid, current_currency, company_currency, inv.tax_amount, context=context_multi_currency) + + for line in inv.line_ids: #create one move line per voucher line where amount is not 0.0 if not line.amount: continue #we check if the voucher line is fully paid or not and create a move line to balance the payment and initial invoice if needed if line.amount == line.amount_unreconciled: - amount = line.move_line_id.amount_residual #residual amount in company currency + amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=context_multi_currency) + amount_residual = line.move_line_id.amount_residual - amount #residual amount in company currency else: - amount = line.amount_in_company_currency + amount = currency_pool.compute(cr, uid, current_currency, company_currency, line.untax_amount or line.amount, context=context_multi_currency) + amount_residual = 0.0 move_line = { - 'journal_id': voucher.journal_id.id, - 'period_id': voucher.period_id.id, + 'journal_id': inv.journal_id.id, + 'period_id': inv.period_id.id, 'name': line.name or '/', 'account_id': line.account_id.id, 'move_id': move_id, - 'partner_id': voucher.partner_id.id, - 'currency_id': company_currency <> line.currency_id.id and line.currency_id.id or False, + 'partner_id': inv.partner_id.id, + 'currency_id': company_currency <> current_currency and current_currency or False, 'analytic_account_id': line.account_analytic_id and line.account_analytic_id.id or False, 'quantity': 1, 'credit': 0.0, 'debit': 0.0, - 'date': voucher.date + 'date': inv.date } if amount < 0: amount = -amount @@ -858,68 +766,97 @@ class account_voucher(osv.osv): else: line.type = 'dr' if (line.type=='dr'): + line_total += amount move_line['debit'] = amount else: + line_total -= amount move_line['credit'] = amount - if voucher.tax_id and voucher.type in ('sale', 'purchase'): + if inv.tax_id and inv.type in ('sale', 'purchase'): move_line.update({ - 'account_tax_id': voucher.tax_id.id, + 'account_tax_id': inv.tax_id.id, }) if move_line.get('account_tax_id', False): tax_data = tax_obj.browse(cr, uid, [move_line['account_tax_id']], context=context)[0] if not (tax_data.base_code_id and tax_data.tax_code_id): raise osv.except_osv(_('No Account Base Code and Account Tax Code!'),_("You have to configure account base code and account tax code on the '%s' tax!") % (tax_data.name)) sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1 - move_line['amount_currency'] = company_currency <> line.currency_id.id and sign * line.amount or 0.0 - voucher_line = move_line_obj.create(cr, uid, move_line) + move_line['amount_currency'] = company_currency <> current_currency and sign * line.amount or 0.0 + voucher_line = move_line_pool.create(cr, uid, move_line) + rec_ids = [voucher_line, line.move_line_id.id] + + # Change difference entry + if amount_residual: + if not inv.exchange_acc_id.id: + raise osv.except_osv(_('Error!'), _('You must provide an account for the exchange difference.')) + move_line = { + 'journal_id': inv.journal_id.id, + 'period_id': inv.period_id.id, + 'name': _('change')+': '+(line.name or '/'), + 'account_id': line.account_id.id, + 'move_id': move_id, + 'partner_id': inv.partner_id.id, + 'currency_id': company_currency <> current_currency and current_currency or False, + 'amount_currency': 0.0, + 'quantity': 1, + 'credit': amount_residual > 0 and amount_residual or 0.0, + 'debit': amount_residual < 0 and -amount_residual or 0.0, + 'date': inv.date + } + new_id = move_line_pool.create(cr, uid, move_line) + move_line = { + 'journal_id': inv.journal_id.id, + 'period_id': inv.period_id.id, + 'name': _('change')+': '+(line.name or '/'), + 'account_id': inv.exchange_acc_id.id, + 'move_id': move_id, + 'amount_currency': 0.0, + 'partner_id': inv.partner_id.id, + 'currency_id': company_currency <> current_currency and current_currency or False, + 'quantity': 1, + 'debit': amount_residual > 0 and amount_residual or 0.0, + 'credit': amount_residual < 0 and -amount_residual or 0.0, + 'date': inv.date + } + move_line_pool.create(cr, uid, move_line) + rec_ids.append(new_id) + if line.move_line_id.id: - rec_ids = [voucher_line, line.move_line_id.id] rec_list_ids.append(rec_ids) - if not currency_pool.is_zero(cr, uid, voucher.currency_id, voucher.writeoff_amount): - #create one line for the write off if needed - diff = currency_pool.compute(cr, uid, voucher_currency, company_currency, voucher.writeoff_amount, context=context_multi_currency) + if not currency_pool.is_zero(cr, uid, current_currency_obj, line_total): + diff = line_total account_id = False write_off_name = '' - - if voucher.payment_option == 'with_writeoff': - account_id = voucher.writeoff_acc_id.id - write_off_name = voucher.comment - elif voucher.type in ('sale', 'receipt'): - if not voucher.partner_id: - account_id = property_obj.search(cr,uid,[('name','=','property_account_receivable'),('res_id','=',False)]) - else: - account_id = voucher.partner_id.property_account_receivable.id + if inv.payment_option == 'with_writeoff': + account_id = inv.writeoff_acc_id.id + write_off_name = inv.comment + elif inv.type in ('sale', 'receipt'): + account_id = inv.partner_id.property_account_receivable.id else: - if not voucher.partner_id: - account_id = property_obj.search(cr,uid,[('name','=','property_account_payable'),('res_id','=',False)]) - else: - account_id = voucher.partner_id.property_account_payable.id - if not account_id: - raise osv.except_osv(_('Error !'), _('No receivable/payable account defined in properties!')) + account_id = inv.partner_id.property_account_payable.id move_line = { 'name': write_off_name or name, 'account_id': account_id, 'move_id': move_id, - 'partner_id': voucher.partner_id.id, - 'date': voucher.date, - 'debit': diff < 0 and -diff or 0.0, + 'partner_id': inv.partner_id.id, + 'date': inv.date, 'credit': diff > 0 and diff or 0.0, - 'amount_currency': company_currency <> voucher_currency and -voucher.writeoff_amount or 0.0, - 'currency_id': company_currency <> voucher_currency and voucher_currency or False, + 'debit': diff < 0 and -diff or 0.0, + #'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1, context=context_multi_currency) or 0.0, + #'currency_id': company_currency <> current_currency and current_currency or False, } - move_line_obj.create(cr, uid, move_line) - self.write(cr, uid, [voucher.id], { + move_line_pool.create(cr, uid, move_line) + self.write(cr, uid, [inv.id], { 'move_id': move_id, 'state': 'posted', 'number': name, }) - if voucher.journal_id.entry_posted: + if inv.journal_id.entry_posted: move_pool.post(cr, uid, [move_id], context={}) for rec_ids in rec_list_ids: if len(rec_ids) >= 2: - move_line_obj.reconcile_partial(cr, uid, rec_ids) + move_line_pool.reconcile_partial(cr, uid, rec_ids, writeoff_acc_id=inv.exchange_acc_id.id, writeoff_period_id=inv.period_id.id, writeoff_journal_id=inv.journal_id.id) return True def copy(self, cr, uid, id, default={}, context=None): @@ -942,86 +879,45 @@ class account_voucher_line(osv.osv): _description = 'Voucher Lines' _order = "move_line_id" - def _currency_id(self, cr, uid, ids, name, args, context=None): - res = {} - for line in self.browse(cr, uid, ids, context=context): - move_line = line.move_line_id - if move_line: - res[line.id] = move_line.currency_id and move_line.currency_id.id or move_line.company_id.currency_id.id - else: - res[line.id] = line.voucher_id.currency_id.id - return res - - def _get_amounts(self, cr, uid, line_browse_rec, context=None): - if line_browse_rec.currency_id: - amount_original = line_browse_rec.amount_currency or 0.0 - amount_unreconciled = line_browse_rec.amount_residual_currency - elif line_browse_rec.credit > 0: - amount_original = line_browse_rec.credit or 0.0 - amount_unreconciled = line_browse_rec.amount_residual - else: - amount_original = line_browse_rec.debit or 0.0 - amount_unreconciled = line_browse_rec.amount_residual - return amount_original, amount_unreconciled - + # If the payment is in the same currency than the invoice, we keep the same amount + # Otherwise, we compute from company currency to payment currency def _compute_balance(self, cr, uid, ids, name, args, context=None): currency_pool = self.pool.get('res.currency') - res = {} + rs_data = {} for line in self.browse(cr, uid, ids, context=context): - amount_original, amount_unreconciled = self._get_amounts(cr, uid, line.move_line_id, context) - res[line.id] = { - 'amount_original': amount_original, - 'amount_unreconciled': amount_unreconciled, - } + ctx = context.copy() + ctx.update({'date': line.voucher_id.date}) + res = {} + company_currency = line.voucher_id.journal_id.company_id.currency_id.id + voucher_currency = line.voucher_id.currency_id and line.voucher_id.currency_id.id or company_currency + move_line = line.move_line_id or False - return res + if not move_line: + res['amount_original'] = 0.0 + res['amount_unreconciled'] = 0.0 + elif move_line.currency_id and voucher_currency==move_line.currency_id.id: + res['amount_original'] = currency_pool.compute(cr, uid, move_line.currency_id.id, voucher_currency, abs(move_line.amount_currency), context=ctx) + res['amount_unreconciled'] = currency_pool.compute(cr, uid, move_line.currency_id and move_line.currency_id.id or company_currency, voucher_currency, abs(move_line.amount_residual_currency), context=ctx) + elif move_line and move_line.credit > 0: + res['amount_original'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, move_line.credit, context=ctx) + res['amount_unreconciled'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, abs(move_line.amount_residual), context=ctx) + else: + res['amount_original'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, move_line.debit, context=ctx) + res['amount_unreconciled'] = currency_pool.compute(cr, uid, company_currency, voucher_currency, abs(move_line.amount_residual), context=ctx) - def __company_currency_amount(self, cr, uid, line, amount, context=None): - if context is None: - context = {} - ctx = context.copy() - ctx.update({'date': line.date_original}) - currency_pool = self.pool.get('res.currency') - amount_company_cur = currency_pool.compute(cr, uid, line.currency_id.id, line.company_currency_id.id, amount, context=ctx) - ctx.update({'date': line.voucher_id.date}) - amount_voucher_cur = currency_pool.compute(cr, uid, line.currency_id.id, line.voucher_currency_id.id, amount, context=ctx) - return amount_company_cur, amount_voucher_cur - - def onchange_amount(self, cr, uid, ids, amount, context=None): - if not amount or not ids: - return {'value':{'amount_in_company_currency': 0.0, 'amount_in_voucher_currency': 0.0}} - for line in self.browse(cr, uid, ids, context=context): - amount_company_cur, amount_voucher_cur = self.__company_currency_amount(cr, uid, line, amount, context=context) - return {'value': {'amount_in_company_currency': amount_company_cur, 'amount_in_voucher_currency': amount_voucher_cur}} - - def _get_amount_in_company_currency(self, cr, uid, ids, name, args, context=None): - res = {} - for line in self.browse(cr, uid, ids, context=context): - amount_in_company_currency, amount_in_voucher_currency = self.__company_currency_amount(cr, uid, line, line.amount, context=context) - res[line.id] = { - 'amount_in_company_currency': amount_in_company_currency, - 'amount_in_voucher_currency': amount_in_voucher_currency, - } - return res + rs_data[line.id] = res + return rs_data _columns = { 'voucher_id':fields.many2one('account.voucher', 'Voucher', required=1, ondelete='cascade'), - 'move_line_id': fields.many2one('account.move.line', 'Journal Item'), - 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), 'name':fields.char('Description', size=256), 'account_id':fields.many2one('account.account','Account', required=True), - 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), 'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'), 'untax_amount':fields.float('Untax Amount'), - - 'currency_id': fields.function(_currency_id, string='Currency', type='many2one', relation='res.currency'), - 'company_currency_id': fields.related('move_line_id','company_id','currency_id', type='many2one', relation='res.currency', string="Company Currency"), - 'voucher_currency_id': fields.related('voucher_id', 'currency_id', type='many2one', relation='res.currency', string="Voucher Currency"), - 'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')), - 'amount_in_company_currency': fields.function(_get_amount_in_company_currency, string='Amount in Company Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), - 'amount_in_voucher_currency': fields.function(_get_amount_in_company_currency, string='Amount in Voucher Currency', type='float', digits_compute=dp.get_precision('Account'), multi="voucher_line_amount"), - + 'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Dr/Cr'), + 'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'), + 'move_line_id': fields.many2one('account.move.line', 'Journal Item'), 'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1), 'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1), 'amount_original': fields.function(_compute_balance, multi='dc', type='float', string='Original Amount', store=True), @@ -1043,9 +939,9 @@ class account_voucher_line(osv.osv): @return: Returns a dict which contains new values, and context """ res = {} - move_line_obj = self.pool.get('account.move.line') + move_line_pool = self.pool.get('account.move.line') if move_line_id: - move_line = move_line_obj.browse(cr, user, move_line_id, context=context) + move_line = move_line_pool.browse(cr, user, move_line_id, context=context) if move_line.credit: ttype = 'dr' else: @@ -1120,7 +1016,7 @@ class account_bank_statement(osv.osv): bank_st_line_obj = self.pool.get('account.bank.statement.line') st_line = bank_st_line_obj.browse(cr, uid, st_line_id, context=context) if st_line.voucher_id: - voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number, 'date': st_line.date}, context=context) + voucher_obj.write(cr, uid, [st_line.voucher_id.id], {'number': next_number}, context=context) if st_line.voucher_id.state == 'cancel': voucher_obj.action_cancel_draft(cr, uid, [st_line.voucher_id.id], context=context) wf_service.trg_validate(uid, 'account.voucher', st_line.voucher_id.id, 'proforma_voucher', cr) @@ -1130,7 +1026,7 @@ class account_bank_statement(osv.osv): 'move_ids': [(4, v.move_id.id, False)] }) - return move_line_obj.write(cr, uid, [x.id for x in v.move_ids], {'statement_id': st_line.statement_id.id, 'date': st_line.date}, update_check=False, context=context) + return move_line_obj.write(cr, uid, [x.id for x in v.move_ids], {'statement_id': st_line.statement_id.id}, context=context) return super(account_bank_statement, self).create_move_from_st_line(cr, uid, st_line.id, company_currency_id, next_number, context=context) account_bank_statement() diff --git a/addons/account_voucher/account_voucher_pay_invoice.xml b/addons/account_voucher/account_voucher_pay_invoice.xml index fc3ddd96cae..345241cb4ee 100644 --- a/addons/account_voucher/account_voucher_pay_invoice.xml +++ b/addons/account_voucher/account_voucher_pay_invoice.xml @@ -1,28 +1,27 @@ - - account.invoice.customer.pay - account.invoice - form - - - - - - - - account.invoice.supplier.pay - account.invoice - form - - - - - + + account.invoice.customer.pay + account.invoice + form + + + + + + + account.invoice.supplier.pay + account.invoice + form + + + + + diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index a545781b4f2..8f8a0d0854a 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -43,7 +43,7 @@
- + diff --git a/addons/account_voucher/company_view.xml b/addons/account_voucher/company_view.xml deleted file mode 100644 index 97d6edc31b7..00000000000 --- a/addons/account_voucher/company_view.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - res.company.form.inherit - - res.company - form - - - - - - - - - - diff --git a/addons/account_voucher/invoice.py b/addons/account_voucher/invoice.py index b108bc14fe3..0230cac1009 100644 --- a/addons/account_voucher/invoice.py +++ b/addons/account_voucher/invoice.py @@ -45,11 +45,10 @@ class invoice(osv.osv): 'close_after_process': True, 'invoice_type':inv.type, 'invoice_id':inv.id, - 'default_type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment', - 'type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment' + 'default_type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment' } } invoice() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/account_voucher/report/account_voucher_sales_receipt.py b/addons/account_voucher/report/account_voucher_sales_receipt.py index 06511c9a118..b31dedc8aa1 100644 --- a/addons/account_voucher/report/account_voucher_sales_receipt.py +++ b/addons/account_voucher/report/account_voucher_sales_receipt.py @@ -73,7 +73,7 @@ class sale_receipt_report(osv.osv): to_char(av.date, 'MM') as month, to_char(av.date, 'YYYY-MM-DD') as day, av.partner_id as partner_id, - av.currency_id as currency_id, + aj.currency as currency_id, av.journal_id as journal_id, rp.user_id as user_id, av.company_id as company_id, @@ -111,7 +111,7 @@ class sale_receipt_report(osv.osv): to_char(av.date, 'MM'), to_char(av.date, 'YYYY-MM-DD'), av.partner_id, - av.currency_id, + aj.currency, av.journal_id, rp.user_id, av.company_id, diff --git a/addons/account_voucher/test/case1_usd_usd.yml b/addons/account_voucher/test/case1_usd_usd.yml deleted file mode 100755 index dc7654ab9c3..00000000000 --- a/addons/account_voucher/test/case1_usd_usd.yml +++ /dev/null @@ -1,355 +0,0 @@ -- - In order to check the Account_voucher module with multi-currency in OpenERP, - I create 2 Invoices in USD and make 2 Payments in USD based on the currency rating on that particular date -- - I create currency USD in OpenERP for January of 1.333333 Rate -- - !python {model: res.currency.rate}: | - from datetime import datetime - curr_id = self.pool.get('res.currency').search(cr, uid, [('name', '=', 'USD')]) - date = '%s-01-01' %(datetime.now().year) - ids = self.search(cr, uid, [('currency_id','=',curr_id), ('name', '=', date)]) - self.write(cr, uid, ids, {'rate': 1.333333}) -- - I create currency USD in OpenERP for February of 1.250000 Rate -- - !record {model: res.currency.rate, id: feb_usd}: - currency_id: base.USD - name: !eval "'%s-02-01' %(datetime.now().year)" - rate: 1.250000 - -- - I create currency USD in OpenERP for March of 1.111111 Rate -- - !record {model: res.currency.rate, id: mar_usd}: - currency_id: base.USD - name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 1.111111 - -- - I create currency USD in OpenERP for April of 1.052632 Rate -- - !record {model: res.currency.rate, id: apr_usd}: - currency_id: base.USD - name: !eval "'%s-04-01' %(datetime.now().year)" - rate: 1.052632 - -- - I create a bank journal with USD as currency -- - !record {model: account.journal, id: bank_journal_USD}: - name: Bank Journal(USD) - code: BUSD - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.USD - company_id: base.main_company - view_id: account.account_journal_bank_view - -- - I set up some accounts for currency rate expense/income in my company -- - !record {model: res.company, id: base.main_company}: - property_expense_currency_exchange: account.o_expense - property_income_currency_exchange: account.o_income -- - I create new partner Mark Strauss. -- - !record {model: res.partner, id: res_partner_strauss0}: - address: - - city: paris - country_id: base.fr - name: Mark Strauss - street: 1 rue Rockfeller - type: invoice - zip: '75016' - name: Mr. Mark Strauss -- - I create the first invoice on 1st January for 200 USD -- - !record {model: account.invoice, id: account_invoice_jan}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-01-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 200.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_strauss0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_jan} -- - I check that first invoice move is correct for debtor account (debit - credit == 150.0) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 150.0), "Invoice move is not correct for debtors account" -- - I create the second invoice on 1st February for 100 USD -- - !record {model: account.invoice, id: account_invoice_feb}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-02-01' %(datetime.now().year)" - period_id: account.period_2 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 100.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_strauss0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_invoice_feb} -- - I check that second invoice move is correct for debtor account (debit - credit == 80) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_feb")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 80), "Invoice move is not correct for debtors account" - -- - I create the first voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 240.00, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 240.00, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.USD'), - 'journal_id': ref('bank_journal_USD'), - 'partner_id': ref('res_partner_strauss0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-03-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'First payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200.00: - item['amount'] = 180.00 - else: - item['amount'] = 70.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is -10.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -10.0), "Writeoff amount is not -10.0" -- - I check that currency rate difference is -34.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -34.0), "Currency rate difference is not -34.0" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my first voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with -180 and -70 as amount_currency columns and that their credit columns are respectively 135 and 56 -- - I check that my currency rate difference is correct. 34 in credit with no amount_currency -- - I check that my write-off is correct. 9 debit and 10 amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == -180.00: - assert move_line.credit == 135.00, "Debtor account has wrong entry." - elif move_line.amount_currency == -70.00: - assert move_line.credit == 56.00, "Debtor account has wrong entry." - elif move_line.credit == 34.00: - assert move_line.amount_currency == 0.00, "Incorrect currency rate difference." - elif move_line.amount_currency == 10.00: - assert move_line.debit == 9.00, "Writeoff amount is wrong." -- - I check the residual amount of Invoice1, should be 20 in amount_currency and 15 in company currency -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15.0) , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_feb")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 30.0 and move_line.amount_residual == 24.0) , "Residual amount is not correct for first Invoice" -- - I create the second voucher of payment - - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_strauss0"), ref('bank_journal_USD'), 45.00, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 45.00, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.USD'), - 'journal_id': ref('bank_journal_USD'), - 'partner_id': ref('res_partner_strauss0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-04-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'Second payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 20.00: - item['amount'] = 20.00 - else: - item['amount'] = 30.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is -5.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -5.0), "Writeoff amount is not -5.0" -- - I check that currency rate difference is -8.50 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -8.50), "Currency rate difference is not -8.50" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my second voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with -20 and -30 as amount_currency columns and their credit columns are respectively 15 and 24. -- - I check that my currency rate difference is correct. 8.5 in credit with no amount_currency -- - I check that my writeoff is correct. 4.75 debit and 5 amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_strauss0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == -20.00: - assert move_line.credit == 15.00, "Debtor account has wrong entry." - elif move_line.amount_currency == -30.00: - assert move_line.credit == 24.00, "Debtor account has wrong entry." - elif move_line.credit == 8.50: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.amount_currency == 5.00: - assert move_line.debit == 4.75, "Writeoff amount is wrong." -- - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_jan")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_invoice_feb")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case2_suppl_usd_eur.yml b/addons/account_voucher/test/case2_suppl_usd_eur.yml deleted file mode 100644 index 31e756d5355..00000000000 --- a/addons/account_voucher/test/case2_suppl_usd_eur.yml +++ /dev/null @@ -1,328 +0,0 @@ -- - In order to check the Account_voucher module with multi-currency in OpenERP, - I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date -- - I create a bank journal with EUR as currency -- - !record {model: account.journal, id: bank_journal_EUR}: - name: Bank Journal(EUR) - code: BEUR - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.EUR - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I create a bank journal with USD as currency -- - !record {model: account.journal, id: bank_journal_USD}: - name: Bank Journal(USD) - code: BUSD - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.USD - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I create a new partner Robert Clements -- - !record {model: res.partner, id: res_partner_clements0}: - address: - - city: marseille - country_id: base.fr - name: Robert - street: 1 rue Rockfeller - type: invoice - zip: '13016' - name: Mr.Robert Clements -- - I create the first invoice on 1st January for 200 USD -- - !record {model: account.invoice, id: account_first_invoice_jan_suppl}: - account_id: account.a_pay - type : in_invoice - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-01-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_expense - name: '[PC1] Basic PC' - price_unit: 200.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_clements0 - reference_type: none - check_total : 200 -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_suppl} -- - I check that first invoice move is correct for debtor account(debit - credit == -150) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_suppl")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == -150.00), "Invoice move is incorrect for debtors account" -- - I create the second invoice on 1st February for 100 USD -- - !record {model: account.invoice, id: account_second_invoice_feb_suppl}: - account_id: account.a_pay - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-02-01' %(datetime.now().year)" - period_id: account.period_2 - type : in_invoice - invoice_line: - - account_id: account.a_expense - name: '[PC1] Basic PC' - price_unit: 100.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_clements0 - reference_type: none - check_total : 100.0 -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb_suppl} -- - I check that second invoice move is correct for debtor account (debit - credit == -80) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_suppl")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == -80), "Invoice move is incorrect for debtors account" -- - I create the first voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_clements0"), ref('bank_journal_EUR'), 240.0, 2, ttype='payment', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 240.0, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.EUR'), - 'journal_id': ref('bank_journal_EUR'), - 'partner_id': ref('res_partner_clements0'), - 'period_id': ref('account.period_3'), - 'type': 'payment', - 'date': time.strftime("%Y-03-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'First payment', - } - if not res['value']['line_dr_ids']: - res['value']['line_dr_ids'] = [{'type': 'dr', 'account_id': ref('account.a_pay'),}] - for item in res['value']['line_dr_ids']: - if item['amount_unreconciled'] == 200.00: - item['amount'] = 180.00 - else: - item['amount'] = 70.00 - vals['line_dr_ids'] = [(0,0,i) for i in res['value']['line_dr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is -15.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -15.0), "Writeoff amount is not -15.0" -- - I check that currency rate difference is 34.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 34.0), "Currency rate difference is not 34.0" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my creditor account is correct -- - I check that the creditor account has 2 new lines with 180 and 70 in amount_currency columns and their debit columns are respectively 135 and 56 and currency is USD($). -- - I check that my currency rate difference is correct. -34 in credit with no amount_currency -- - I check that my writeoff is correct. -15 in credit with no amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == 180.00: - assert move_line.debit == 135.00, "Creditor account has wrong entry." - elif move_line.amount_currency == 70.00: - assert move_line.debit == 56.00, "Debtor account has wrong entry." - elif move_line.debit == 34.00: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.debit == 15.00: - assert move_line.amount_currency == 0.00, "Writeoff amount is wrong." -- - I check the residual amount of Invoice1, should be 20 in residual currency and 15 in amount_residual -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_suppl")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15) , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_suppl")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 30 and move_line.amount_residual == 24) , "Residual amount is not correct for second Invoice" -- - I create the second voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_clements0"), ref('bank_journal_EUR'), 45.0, 2, ttype='payment', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 45.0, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.USD'), - 'journal_id': ref('bank_journal_USD'), - 'partner_id': ref('res_partner_clements0'), - 'period_id': ref('account.period_3'), - 'type': 'payment', - 'date': time.strftime("%Y-04-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'Second payment', - } - if not res['value']['line_dr_ids']: - res['value']['line_dr_ids'] = [{'type': 'dr', 'account_id': ref('account.a_pay'),}] - for item in res['value']['line_dr_ids']: - if item['amount_unreconciled'] == 20.00: - item['amount'] = 20.00 - else: - item['amount'] = 30.00 - vals['line_dr_ids'] = [(0,0,i) for i in res['value']['line_dr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is -5.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 5.0), "Writeoff amount is not 5.0" -- - I check that currency rate difference is 8.50 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 8.50), "Currency rate difference is not 8.50" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that my voucher state is posted -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" -- - I check that my creditor account is correct -- - I check that the creditor account has 2 new lines with 20 and 30 in amount_currency columns and their debit columns are respectively 15 and 24 and currency is USD($). -- - I check that my currency rate difference is correct. 8.50 in debit with no amount_currency -- - I check that my writeoff is correct. 4.75 in credit and 5 in amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_clements0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == 20.00: - assert move_line.debit == 15.00, "Debtor account has wrong entry." - elif move_line.amount_currency == 30.00: - assert move_line.debit == 24.00, "Debtor account has wrong entry." - elif move_line.debit == 8.50: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.amount_currency == -5.00: - assert move_line.credit == 4.75, "Writeoff amount is wrong." -- - I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_suppl")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" -- - I check the residual amount of invoice 2, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_suppl")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for second Invoice" diff --git a/addons/account_voucher/test/case2_usd_eur.yml b/addons/account_voucher/test/case2_usd_eur.yml deleted file mode 100644 index ded95095e5a..00000000000 --- a/addons/account_voucher/test/case2_usd_eur.yml +++ /dev/null @@ -1,360 +0,0 @@ -- - In order to check the Account_voucher module with multi-currency in OpenERP, - I create 2 Invoices in USD and make 2 Payments one in USD and another in EUR, based on the currency rating on that particular date -- - I create currency USD in OpenERP for January of 1.333333 Rate -- - !python {model: res.currency.rate}: | - from datetime import datetime - curr_id = self.pool.get('res.currency').search(cr, uid, [('name', '=', 'USD')]) - date = '%s-01-01' %(datetime.now().year) - ids = self.search(cr, uid, [('currency_id', '=', curr_id), ('name', '=', date)]) - self.write(cr, uid, ids, {'rate': 1.333333}) -- - I create currency USD in OpenERP for February of 1.250000 Rate -- - !record {model: res.currency.rate, id: febr_usd}: - currency_id: base.USD - name: !eval "'%s-02-01' %(datetime.now().year)" - rate: 1.250000 -- - I create currency USD in OpenERP for March of 1.111111 Rate -- - !record {model: res.currency.rate, id: marc_usd}: - currency_id: base.USD - name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 1.111111 -- - I create currency USD in OpenERP for April of 1.052632 Rate -- - !record {model: res.currency.rate, id: apri_usd}: - currency_id: base.USD - name: !eval "'%s-04-01' %(datetime.now().year)" - rate: 1.052632 -- - I create a bank journal with EUR as currency -- - !record {model: account.journal, id: bank_journal_EUR}: - name: Bank Journal(EUR) - code: BEUR - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.EUR - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I create a bank journal with USD as currency -- - !record {model: account.journal, id: bank_journal_USD}: - name: Bank Journal(USD) - code: BUSD - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.USD - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I set up some accounts for currency rate expense/income in my company -- - !record {model: res.company, id: base.main_company}: - property_expense_currency_exchange: account.o_expense - property_income_currency_exchange: account.o_income -- - I create a new partner Michael Geller -- - !record {model: res.partner, id: res_partner_michael0}: - address: - - city: paris - country_id: base.fr - name: Michael - street: 1 rue Rockfeller - type: invoice - zip: '75016' - name: Mr.Michael Geller -- - I create the first invoice on 1st January for 200 USD -- - !record {model: account.invoice, id: account_first_invoice_jan}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-01-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 200.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_michael0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan} -- - I check that first invoice move is correct for debtor account(debit - credit == 150) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 150.00), "Invoice move is incorrect for debtors account" -- - I create the second invoice on 1st February for 100 USD -- - !record {model: account.invoice, id: account_second_invoice_feb}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.USD - date_invoice: !eval "'%s-02-01' %(datetime.now().year)" - period_id: account.period_2 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 100.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_michael0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb} -- - I check that second invoice move is correct for debtor account (debit - credit == 80) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 80), "Invoice move is incorrect for debtors account" -- - I create the first voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_EUR'), 240.0, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 240.0, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.EUR'), - 'journal_id': ref('bank_journal_EUR'), - 'partner_id': ref('res_partner_michael0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-03-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'First payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200.00: - item['amount'] = 180.00 - else: - item['amount'] = 70.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is 15.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 15.0), "Writeoff amount is not 15.0" -- - I check that currency rate difference is -34.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -34.0), "Currency rate difference is not -34.0" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with -180 and -70 in amount_currency columns and their credit columns are respectively 135 and 56 and currency is USD($). -- - I check that my currency rate difference is correct. 34 in credit with no amount_currency -- - I check that my writeoff is correct. 15 in credit with no amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == -180.00: - assert move_line.credit == 135.00, "Debtor account has wrong entry." - elif move_line.amount_currency == -70.00: - assert move_line.credit == 56.00, "Debtor account has wrong entry." - elif move_line.credit == 34.00: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.credit == 15.00: - assert move_line.amount_currency == 0.00, "Writeoff amount is wrong." -- - I check the residual amount of Invoice1, should be 20 in residual currency and 15 in amount_residual -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 20.0 and move_line.amount_residual == 15) , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2, should be 30 in residual currency and 24 in amount_residual -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 30 and move_line.amount_residual == 24) , "Residual amount is not correct for second Invoice" -- - I create the second voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_michael0"), ref('bank_journal_EUR'), 45.0, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 45.0, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.USD'), - 'journal_id': ref('bank_journal_USD'), - 'partner_id': ref('res_partner_michael0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-04-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'Second payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 20.00: - item['amount'] = 20.00 - else: - item['amount'] = 30.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is -5.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == -5.0), "Writeoff amount is not -5.0" -- - I check that currency rate difference is -8.50 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == -8.50), "Currency rate difference is not -8.50" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that my voucher state is posted -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert voucher_id.state == 'posted', "Voucher state is not posted" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with -20 and -30 in amount_currency columns and their credit columns are respectively 15 and 24 and currency is USD($). -- - I check that my currency rate difference is correct. 8.50 in credit with no amount_currency -- - I check that my writeoff is correct. 4.75 in debit and 5 in amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_michael0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == -20.00: - assert move_line.credit == 15.00, "Debtor account has wrong entry." - elif move_line.amount_currency == -30.00: - assert move_line.credit == 24.00, "Debtor account has wrong entry." - elif move_line.credit == 8.50: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.amount_currency == 5.00: - assert move_line.debit == 4.75, "Writeoff amount is wrong." -- - I check the residual amount of invoice 1, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of invoice 2, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case3_eur_eur.yml b/addons/account_voucher/test/case3_eur_eur.yml deleted file mode 100644 index b35daf49402..00000000000 --- a/addons/account_voucher/test/case3_eur_eur.yml +++ /dev/null @@ -1,331 +0,0 @@ -- - In order to check the Account_voucher module with multi-currency in OpenERP, - I create 2 Invoices in EUR and make 2 Payments in EUR based on the currency rating on that particular date. -- - I create currency EUR in OpenERP for January of 1.000000 Rate -- - !record {model: res.currency.rate, id: jan_eur}: - currency_id: base.EUR - name: !eval "'%s-01-01' %(datetime.now().year)" - rate: 1.000000 -- - I create currency EUR in OpenERP for February of 1.000000 Rate -- - !record {model: res.currency.rate, id: feb_eur}: - currency_id: base.EUR - name: !eval "'%s-02-01' %(datetime.now().year)" - rate: 1.000000 -- - I create currency EUR in OpenERP for March of 1.000000 Rate -- - !record {model: res.currency.rate, id: mar_eur}: - currency_id: base.EUR - name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 1.000000 -- - I create currency EUR in OpenERP for April of 1.000000 Rate -- - !record {model: res.currency.rate, id: apr_eur}: - currency_id: base.EUR - name: !eval "'%s-04-01' %(datetime.now().year)" - rate: 1.000000 -- - I create a bank journal with EUR as currency -- - !record {model: account.journal, id: bank_journal_EUR}: - name: Bank Journal(EUR) - code: BEUR - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.EUR - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I set up some accounts for currency rate expense/income in my company -- - !record {model: res.company, id: base.main_company}: - property_expense_currency_exchange: account.o_expense - property_income_currency_exchange: account.o_income -- - I create a new partner Peter Lawson. -- - !record {model: res.partner, id: res_partner_peter0}: - address: - - city: paris - country_id: base.fr - name: Peter - street: 1 rue Rockfeller - type: invoice - zip: '75016' - name: Mr.Peter Lawson -- - I create the first invoice on 1st January for 150 EUR -- - !record {model: account.invoice, id: account_first_invoice_jan_eur}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.EUR - date_invoice: !eval "'%s-01-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 150.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_peter0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_eur} -- - I check that first invoice move is correct for debtor account(debit - credit == 150) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 150.00), "Invoice move is incorrect for debtors account" -- - I create the second invoice on 1st February for 80 EUR -- - !record {model: account.invoice, id: account_second_invoice_feb_eur}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.EUR - date_invoice: !eval "'%s-02-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 80.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_peter0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_second_invoice_feb_eur} -- - I check that second invoice move is correct for debtor account (debit - credit == 80) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 80.00), "Invoice move is incorrect for debtors account" -- - I create the first voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 120.00, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.EUR'), - 'journal_id': ref('bank_journal_EUR'), - 'partner_id': ref('res_partner_peter0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-03-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'First payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 150.00: - item['amount'] = 100.00 - else: - item['amount'] = 20.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is 0.00 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0.00" -- - I check that currency rate difference is 0.00 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 0.00), "Currency rate difference is not 0.00" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my first voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 20 and 100 respectively -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'),('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.credit == 20.00: - assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - elif move_line.credit == 100.00: - assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." -- - I check the residual amount of Invoice1 is 50 -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 50.0 and move_line.amount_residual == 50.0) , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2 is 60 -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 60.0 and move_line.amount_residual == 60.0) , "Residual amount is not correct for second Invoice" -- - I create the second voucher of payment and check to let open the debtor overpaid amount. - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_peter0"), ref('bank_journal_EUR'), 120.00, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 120.00, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.EUR'), - 'journal_id': ref('bank_journal_EUR'), - 'partner_id': ref('res_partner_peter0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-04-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'Second payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 50.00: - item['amount'] = 50.00 - elif item['amount_unreconciled'] == 60.00: - item['amount'] = 70.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is 0.00 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'),('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 0.00), "Writeoff amount is not 0" -- - I check that currency rate difference is 0.00 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.currency_rate_difference == 0.00), "Currency rate difference is not 0" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my second voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" -- - I check that my debtor account is correct -- - I check that the debtor account has 2 new lines with 0.00 and 0.00 in amount_currency columns and their credit are 70 and 50 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'Second payment'), ('partner_id', '=', ref('res_partner_peter0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.credit == 70.00: - assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." - elif move_line.credit == 50.00: - assert move_line.amount_currency == 0.00, "Debtor account has wrong entry." -- - I check the residual amount of Invoice1 is 0 -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_eur")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0 and move_line.amount_residual == 0) , "Residual amount is not correct for first Invoice" -- - I check the residual amuont of Invoice2 is -10 -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_second_invoice_feb_eur")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == -10.0 and move_line.amount_residual == -10.0) , "Residual amount is not correct for second Invoice" \ No newline at end of file diff --git a/addons/account_voucher/test/case4_cad_chf.yml b/addons/account_voucher/test/case4_cad_chf.yml deleted file mode 100644 index b6ed790dffb..00000000000 --- a/addons/account_voucher/test/case4_cad_chf.yml +++ /dev/null @@ -1,194 +0,0 @@ -- - In order to check the Account_voucher module with multi-currency in OpenERP, - I create an invoice in CAD and make its Payment in CHF based on the currency rating on that particular date. -- - I create currency CAD in OpenERP for January of 1.338800 Rate -- - !record {model: res.currency.rate, id: jan_cad}: - currency_id: base.CAD - name: !eval "'%s-01-01' %(datetime.now().year)" - rate: 1.338800 -- - I create currency CAD in OpenERP for March of 2.000000 Rate -- - !record {model: res.currency.rate, id: mar_cad}: - currency_id: base.CAD - name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 2.000000 -- - I create currency CHF in OpenERP for January of 1.308600 Rate -- - !record {model: res.currency.rate, id: jan_chf}: - currency_id: base.CHF - name: !eval "'%s-01-01' %(datetime.now().year)" - rate: 1.308600 -- - I create currency CHF in OpenERP for March of 1.250000 Rate -- - !record {model: res.currency.rate, id: mar_chf}: - currency_id: base.CHF - name: !eval "'%s-03-01' %(datetime.now().year)" - rate: 1.250000 -- - I create a bank journal with CHF as currency -- - !record {model: account.journal, id: bank_journal_CHF}: - name: Bank Journal(CHF) - code: BCHF - type: bank - analytic_journal_id: account.sit - sequence_id: account.sequence_bank_journal - default_debit_account_id: account.cash - default_credit_account_id: account.cash - currency: base.CHF - company_id: base.main_company - view_id: account.account_journal_bank_view -- - I set up some accounts for currency rate expense/income in my company -- - !record {model: res.company, id: base.main_company}: - property_expense_currency_exchange: account.o_expense - property_income_currency_exchange: account.o_income -- - I create a new partner John Armani. -- - !record {model: res.partner, id: res_partner_john0}: - address: - - city: paris - country_id: base.fr - name: John - street: 1 rue Rockfeller - type: invoice - zip: '75016' - name: Mr.John Armani -- - I create the first invoice on 1st January for 200 CAD -- - !record {model: account.invoice, id: account_first_invoice_jan_cad}: - account_id: account.a_recv - address_contact_id: base.res_partner_address_3000 - address_invoice_id: base.res_partner_address_3000 - company_id: base.main_company - currency_id: base.CAD - date_invoice: !eval "'%s-01-01' %(datetime.now().year)" - period_id: account.period_1 - invoice_line: - - account_id: account.a_sale - name: '[PC1] Basic PC' - price_unit: 200.0 - quantity: 1.0 - product_id: product.product_product_pc1 - uos_id: product.product_uom_unit - journal_id: account.sales_journal - partner_id: res_partner_john0 - reference_type: none -- - I Validate invoice by clicking on Validate button -- - !workflow {model: account.invoice, action: invoice_open, ref: account_first_invoice_jan_cad} -- - I check that first invoice move is correct for debtor account (debit - credit == 149.39) -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_cad")) - assert invoice_id.move_id, "Move not created for open invoice" - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.debit - move_line.credit == 149.39), "Invoice move is incorrect for debtors account" -- - I create the first voucher of payment - -- - !python {model: account.voucher}: | - import netsvc, time - vals = {} - res = self.onchange_partner_id(cr, uid, [], ref("res_partner_john0"), ref('bank_journal_CHF'), 300.00, 2, ttype='receipt', date=False) - vals = { - 'account_id': ref('account.cash'), - 'amount': 300.00, - 'company_id': ref('base.main_company'), - 'currency_id': ref('base.CHF'), - 'journal_id': ref('bank_journal_CHF'), - 'partner_id': ref('res_partner_john0'), - 'period_id': ref('account.period_3'), - 'type': 'receipt', - 'date': time.strftime("%Y-03-01"), - 'payment_option': 'with_writeoff', - 'writeoff_acc_id': ref('account.a_expense'), - 'comment': 'Write Off', - 'name': 'First payment', - } - if not res['value']['line_cr_ids']: - res['value']['line_cr_ids'] = [{'type': 'cr', 'account_id': ref('account.a_recv'),}] - for item in res['value']['line_cr_ids']: - if item['amount_unreconciled'] == 200.00: - item['amount'] = 200.00 - vals['line_cr_ids'] = [(0,0,i) for i in res['value']['line_cr_ids']] - id = self.create(cr, uid, vals) - voucher_id = self.browse(cr, uid, id) - assert (voucher_id.state=='draft'), "Voucher is not in draft state" -- - I check that writeoff amount computed is 175.0 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - assert (voucher_id.writeoff_amount == 175.0), "Writeoff amount is not 175.0" -- - I check that currency rate difference is 49.39 -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - curr_diff = float(str(voucher_id.currency_rate_difference)) - assert (curr_diff == 49.39), "Currency rate difference is not 49.39" -- - I confirm the voucher -- - !python {model: account.voucher}: | - import netsvc - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) - wf_service = netsvc.LocalService("workflow") - wf_service.trg_validate(uid, 'account.voucher', voucher[0], 'proforma_voucher', cr) -- - I check that the move of my voucher is valid -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - assert move_line.state == 'valid', "Voucher move is not valid" - assert voucher_id.state == 'posted', "Voucher state is not posted" -- - I check that my debtor account is correct -- - I check that the debtor account has 1 new line with -200 as amount_currency columns and 149.39 of credit and currency is CAD($). -- - I check that my currency rate difference is correct. 49.39 in debit with no amount_currency -- - I check that my writeoff is correct. 140 credit and -175 amount_currency -- - !python {model: account.voucher}: | - voucher = self.search(cr, uid, [('name', '=', 'First payment'), ('partner_id', '=', ref('res_partner_john0'))]) - voucher_id = self.browse(cr, uid, voucher[0]) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', voucher_id.move_id.id)]) - for move_line in move_line_obj.browse(cr, uid, move_lines): - if move_line.amount_currency == -200: - assert move_line.credit == 149.39, "Debtor account has wrong entry." - elif move_line.debit == 49.39: - assert move_line.amount_currency == 0.00, "Incorrect Currency Difference." - elif move_line.credit == 140.00: - assert move_line.amount_currency == -175.00, "Writeoff amount is wrong." -- - I check the residual amount of Invoice1, should be 0 in residual currency and 0 in amount_residual and paid -- - !python {model: account.invoice}: | - invoice_id = self.browse(cr, uid, ref("account_first_invoice_jan_cad")) - move_line_obj = self.pool.get('account.move.line') - move_lines = move_line_obj.search(cr, uid, [('move_id', '=', invoice_id.move_id.id), ('invoice', '=', invoice_id.id), ('account_id', '=', invoice_id.account_id.id)]) - move_line = move_line_obj.browse(cr, uid, move_lines[0]) - assert (move_line.amount_residual_currency == 0.0 and move_line.amount_residual == 0.0 and invoice_id.state == 'paid') , "Residual amount is not correct for first Invoice" diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml index 2c496933a16..9c8bdffb35d 100644 --- a/addons/account_voucher/voucher_payment_receipt_view.xml +++ b/addons/account_voucher/voucher_payment_receipt_view.xml @@ -74,24 +74,14 @@ - + + - - + - - + - - - - - - - - + + + - + - - - - - - - - - - + + + @@ -159,28 +137,15 @@ - + + - - + @@ -194,37 +159,26 @@ - - + - - - - - - - - + + + - + - - - - - - - - - - + + + @@ -232,26 +186,27 @@ - - - - - + + + + + - + domain="[('type','=','other')]"/> - + attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/> + - + + @@ -318,88 +273,58 @@ id="menu_action_vendor_payment" parent="account.menu_finance_payables"/> - voucher.form.customer.payment + account.voucher.receipt.form account.voucher form - - + + + + - - - - - - - + + + + + - - + + - + - - + - - - - - - - - + + + - + - - - - - - - - - - - - + + + + + @@ -407,22 +332,21 @@ - - - - - + + + + + - + domain="[('type','=','other')]"/> - + attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/> diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml index 6ed381de209..170f8fbcfe0 100644 --- a/addons/account_voucher/voucher_sales_purchase_view.xml +++ b/addons/account_voucher/voucher_sales_purchase_view.xml @@ -83,7 +83,7 @@ - + @@ -210,7 +210,7 @@ - + diff --git a/addons/account_voucher/wizard/account_statement_from_invoice.py b/addons/account_voucher/wizard/account_statement_from_invoice.py index 3509ac846b5..e4d728c8867 100644 --- a/addons/account_voucher/wizard/account_statement_from_invoice.py +++ b/addons/account_voucher/wizard/account_statement_from_invoice.py @@ -75,7 +75,7 @@ class account_statement_from_invoice_lines(osv.osv_memory): statement.currency.id, amount, context=ctx) context.update({'move_line_ids': [line.id]}) - result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), voucher_currency_id= statement.currency.id, ttype=(amount < 0 and 'payment' or 'receipt'), date=line_date, context=context) + result = voucher_obj.onchange_partner_id(cr, uid, [], partner_id=line.partner_id.id, journal_id=statement.journal_id.id, price=abs(amount), currency_id= statement.currency.id, ttype=(amount < 0 and 'payment' or 'receipt'), date=line_date, context=context) voucher_res = { 'type':(amount < 0 and 'payment' or 'receipt'), 'name': line.name, 'partner_id': line.partner_id.id, diff --git a/addons/analytic/__openerp__.py b/addons/analytic/__openerp__.py index 30712a78167..65f6588a1e3 100644 --- a/addons/analytic/__openerp__.py +++ b/addons/analytic/__openerp__.py @@ -24,7 +24,7 @@ "version": "1.1", "author" : "OpenERP SA", "website" : "http://www.openerp.com", - "category" : "Finance", + "category" : "Hidden", "depends" : ["base", "decimal_precision"], "description": """ Module for defining analytic accounting object. diff --git a/addons/analytic_journal_billing_rate/__openerp__.py b/addons/analytic_journal_billing_rate/__openerp__.py index a9241213251..059e85d9367 100644 --- a/addons/analytic_journal_billing_rate/__openerp__.py +++ b/addons/analytic_journal_billing_rate/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Analytic Journal Billing Rate, Define the default invoicing rate for a specific journal', 'version': '1.0', - 'category': 'Human Resources', + 'category': 'Hidden', 'description': """ This module allows you to define what is the default invoicing rate for a specific journal on a given account. ============================================================================================================== diff --git a/addons/analytic_user_function/__openerp__.py b/addons/analytic_user_function/__openerp__.py index 9716495aabc..bb3ca084be7 100644 --- a/addons/analytic_user_function/__openerp__.py +++ b/addons/analytic_user_function/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Human Resources', 'version': '1.0', - 'category': 'Generic Modules/Others', + 'category': 'Hidden', 'description': """ This module allows you to define what is the default function of a specific user on a given account. ==================================================================================================== diff --git a/addons/anonymization/__openerp__.py b/addons/anonymization/__openerp__.py index 842b774eb9c..41e906c078a 100644 --- a/addons/anonymization/__openerp__.py +++ b/addons/anonymization/__openerp__.py @@ -24,7 +24,7 @@ { 'name': 'Database Anonymization', 'version': '1.0', - 'category': 'Tools', + 'category': 'Hidden', 'complexity': "easy", 'description': """ This module allows you to anonymize a database. diff --git a/addons/anonymization/anonymization.py b/addons/anonymization/anonymization.py index 5d1f8a76e1c..4af387a5c02 100644 --- a/addons/anonymization/anonymization.py +++ b/addons/anonymization/anonymization.py @@ -239,7 +239,7 @@ class ir_model_fields_anonymize_wizard(osv.osv_memory): return res _columns = { - 'name': fields.char(size='64', string='File Name'), + 'name': fields.char(size=64, string='File Name'), 'summary': fields.function(_get_summary, type='text', string='Summary'), 'file_export': fields.binary(string='Export'), 'file_import': fields.binary(string='Import'), diff --git a/addons/association/__init__.py b/addons/association/__init__.py index 5b34f17fec9..4716d0d109b 100644 --- a/addons/association/__init__.py +++ b/addons/association/__init__.py @@ -18,6 +18,5 @@ # along with this program. If not, see . # ############################################################################## -import profile_association # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/association/__openerp__.py b/addons/association/__openerp__.py index 51d44bf681d..0251eb68d02 100644 --- a/addons/association/__openerp__.py +++ b/addons/association/__openerp__.py @@ -23,8 +23,7 @@ { 'name': 'Association profile', 'version': '0.1', - 'category': 'General', - 'category': 'Profile', + 'category': 'Vertical Applications', 'complexity': "normal", 'description': """ This module is to configure modules related to an association. diff --git a/addons/association/profile_association.py b/addons/association/profile_association.py deleted file mode 100644 index 0e66af14a1d..00000000000 --- a/addons/association/profile_association.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## -from lxml import etree -from osv import fields, osv - -class profile_association_config_install_modules_wizard(osv.osv_memory): - _inherit = 'base.setup.installer' - - _columns = { - 'hr_expense':fields.boolean('Resources Management: Expenses Tracking', help="Tracks and manages employee expenses, and can " - "automatically re-invoice clients if the expenses are " - "project-related."), - 'event_project':fields.boolean('Event Management: Events', help="Helps you to manage and organize your events."), - 'project_gtd':fields.boolean('Getting Things Done', - help="GTD is a methodology to efficiently organise yourself and your tasks. This module fully integrates GTD principle with OpenERP's project management."), - 'wiki': fields.boolean('Wiki', help="Lets you create wiki pages and page groups in order " - "to keep track of business knowledge and share it with " - "and between your employees."), - } - - # Will be removed when rd-v61-al-config-depends will be done - def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(profile_association_config_install_modules_wizard, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - doc = etree.XML(res['arch']) - for module in ['project_gtd','hr_expense']: - count = 0 - for node in doc.xpath("//field[@name='%s']" % (module)): - count = count + 1 - if count > 1: - node.set('invisible', '1') - res['arch'] = etree.tostring(doc) - return res - -profile_association_config_install_modules_wizard() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/association/profile_association.xml b/addons/association/profile_association.xml index 12222ecbd90..8ce97cb2e43 100644 --- a/addons/association/profile_association.xml +++ b/addons/association/profile_association.xml @@ -1,24 +1,6 @@ - - Association Application Configuration - base.setup.installer - form - - - - - - - - - - - - - - ). +# Copyright (C) 2010-2011 OpenERP s.a. (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -19,27 +19,8 @@ # ############################################################################## -from osv import fields, osv - -class res_company(osv.osv): - _inherit = "res.company" - _columns = { - 'property_income_currency_exchange': fields.property( - 'account.account', - type='many2one', - relation='account.account', - string="Income Currency Rate", - view_load=True, - domain="[('type', '=', 'other')]",), - 'property_expense_currency_exchange': fields.property( - 'account.account', - type='many2one', - relation='account.account', - string="Expense Currency Rate", - view_load=True, - domain="[('type', '=', 'other')]",), - } - -res_company() +import res_users +import controllers # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + diff --git a/addons/marketing/marketing_wizard.py b/addons/auth_openid/__openerp__.py similarity index 54% rename from addons/marketing/marketing_wizard.py rename to addons/auth_openid/__openerp__.py index cedba8151c9..040a96a3995 100644 --- a/addons/marketing/marketing_wizard.py +++ b/addons/auth_openid/__openerp__.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- ############################################################################## -# +# # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). +# Copyright (C) 2010-2011 OpenERP s.a. (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -15,26 +15,33 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## -from osv import fields, osv - -class marketing_installer(osv.osv_memory): - _inherit = 'base.setup.installer' - _columns = { - 'email_template':fields.boolean('Automated E-Mails', - help="Helps you to design templates of emails and integrate them in your different processes."), - 'marketing_campaign':fields.boolean('Marketing Campaigns', - help="Helps you to manage marketing campaigns and automate actions and communication steps."), - 'crm_profiling':fields.boolean('Profiling Tools', - help="Helps you to perform segmentation of partners and design segmentation questionnaires") - } - _defaults = { - 'marketing_campaign': lambda *a: 1, - } - -marketing_installer() +{ + 'name': 'OpenID', + 'version': '2.0', + 'category': 'Hidden', + 'description': """Allow users to login through OpenID.""", + 'author': 'OpenERP s.a.', + 'maintainer': 'OpenERP s.a.', + 'website': 'http://www.openerp.com', + 'depends': ['base'], + 'data': [ + 'res_users.xml', + ], + 'js': [ + 'static/src/js/auth_openid.js', + ], + 'css': [ + 'static/src/css/openid.css', + ], + 'external_dependencies': { + 'python' : ['openid'], + }, + 'installable': True, + 'active': False, +} # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/report_designer/installer.py b/addons/auth_openid/controllers/__init__.py similarity index 52% rename from addons/report_designer/installer.py rename to addons/auth_openid/controllers/__init__.py index e4bbc4ffa93..2d3be24431f 100644 --- a/addons/report_designer/installer.py +++ b/addons/auth_openid/controllers/__init__.py @@ -1,8 +1,7 @@ -# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). +# Copyright (C) 2011 OpenERP SA (). # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as @@ -18,18 +17,4 @@ # along with this program. If not, see . # ############################################################################## -from osv import fields, osv - -class report_designer_installer(osv.osv_memory): - _inherit = 'base.setup.installer' - - _columns = { - # Reporting - 'base_report_designer':fields.boolean('OpenOffice Report Designer',help="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."), - 'base_report_creator':fields.boolean('Query Builder',help="Allows you to create any statistic " - "reports on several objects. It's a SQL query builder and browser for end users."), - } -report_designer_installer() - +import main diff --git a/addons/auth_openid/controllers/main.py b/addons/auth_openid/controllers/main.py new file mode 100644 index 00000000000..78b8609e765 --- /dev/null +++ b/addons/auth_openid/controllers/main.py @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +import logging +import os +import sys +import urllib + +import werkzeug.urls +import werkzeug.exceptions + +from openerp.modules.registry import RegistryManager +import web.common.http as openerpweb + +from openid import oidutil +from openid.store import memstore +#from openid.store import filestore +from openid.consumer import consumer +from openid.cryptutil import randomString +from openid.extensions import ax, sreg + +from .. import utils + + + +_logger = logging.getLogger('web.auth_openid') +oidutil.log = logging.getLogger('openid').debug + + +class GoogleAppsAwareConsumer(consumer.GenericConsumer): + def complete(self, message, endpoint, return_to): + if message.getOpenIDNamespace() == consumer.OPENID2_NS: + server_url = message.getArg(consumer.OPENID2_NS, 'op_endpoint', consumer.no_default) + if server_url.startswith('https://www.google.com/a/'): + # update fields + for attr in ['claimed_id', 'identity']: + value = message.getArg(consumer.OPENID2_NS, attr) + value = 'https://www.google.com/accounts/o8/user-xrds?uri=%s' % urllib.quote_plus(value) + message.setArg(consumer.OPENID2_NS, attr, value) + + # now, resign the message + assoc_handle = message.getArg(consumer.OPENID_NS, 'assoc_handle') + assoc = self.store.getAssociation(server_url, assoc_handle) + message.delArg(consumer.OPENID2_NS, 'sig') + message.delArg(consumer.OPENID2_NS, 'signed') + message = assoc.signMessage(message) + + return super(GoogleAppsAwareConsumer, self).complete(message, endpoint, return_to) + + +class OpenIDController(openerpweb.Controller): + _cp_path = '/auth_openid/login' + + _store = memstore.MemoryStore() # TODO use a filestore + + _REQUIRED_ATTRIBUTES = ['email'] + _OPTIONAL_ATTRIBUTES = 'nickname fullname postcode country language timezone'.split() + + + def _add_extensions(self, request): + """Add extensions to the request""" + + sreg_request = sreg.SRegRequest(required=self._REQUIRED_ATTRIBUTES, + optional=self._OPTIONAL_ATTRIBUTES) + request.addExtension(sreg_request) + + ax_request = ax.FetchRequest() + for alias in self._REQUIRED_ATTRIBUTES: + uri = utils.SREG2AX[alias] + ax_request.add(ax.AttrInfo(uri, required=True, alias=alias)) + for alias in self._OPTIONAL_ATTRIBUTES: + uri = utils.SREG2AX[alias] + ax_request.add(ax.AttrInfo(uri, required=False, alias=alias)) + + request.addExtension(ax_request) + + def _get_attributes_from_success_response(self, success_response): + attrs = {} + + all_attrs = self._REQUIRED_ATTRIBUTES + self._OPTIONAL_ATTRIBUTES + + sreg_resp = sreg.SRegResponse.fromSuccessResponse(success_response) + if sreg_resp: + for attr in all_attrs: + value = sreg_resp.get(attr) + if value is not None: + attrs[attr] = value + + ax_resp = ax.FetchResponse.fromSuccessResponse(success_response) + if ax_resp: + for attr in all_attrs: + value = ax_resp.getSingle(utils.SREG2AX[attr]) + if value is not None: + attrs[attr] = value + return attrs + + def _get_realm(self, req): + return req.httprequest.host_url + + @openerpweb.jsonrequest + def verify(self, req, db, url): + redirect_to = werkzeug.urls.Href(req.httprequest.host_url + 'auth_openid/login/process')(session_id=req.session_id) + realm = self._get_realm(req) + + session = dict(dbname=db, openid_url=url) # TODO add origin page ? + oidconsumer = consumer.Consumer(session, self._store) + + try: + request = oidconsumer.begin(url) + except consumer.DiscoveryFailure, exc: + fetch_error_string = 'Error in discovery: %s' % (str(exc[0]),) + return {'error': fetch_error_string, 'title': 'OpenID Error'} + + if request is None: + return {'error': 'No OpenID services found', 'title': 'OpenID Error'} + + req.session.openid_session = session + self._add_extensions(request) + + if request.shouldSendRedirect(): + redirect_url = request.redirectURL(realm, redirect_to) + return {'action': 'redirect', 'value': redirect_url, 'session_id': req.session_id} + else: + form_html = request.htmlMarkup(realm, redirect_to) + return {'action': 'post', 'value': form_html, 'session_id': req.session_id} + + + @openerpweb.httprequest + def process(self, req, **kw): + session = getattr(req.session, 'openid_session', None) + if not session: + return werkzeug.utils.redirect('/') + + oidconsumer = consumer.Consumer(session, self._store, consumer_class=GoogleAppsAwareConsumer) + + query = req.httprequest.args + info = oidconsumer.complete(query, req.httprequest.base_url) + display_identifier = info.getDisplayIdentifier() + + session['status'] = info.status + user_id = None + + if info.status == consumer.SUCCESS: + dbname = session['dbname'] + with utils.cursor(dbname) as cr: + registry = RegistryManager.get(dbname) + Modules = registry.get('ir.module.module') + + installed = Modules.search_count(cr, 1, ['&', ('name', '=', 'auth_openid'), ('state', '=', 'installed')]) == 1 + if installed: + + Users = registry.get('res.users') + + #openid_url = info.endpoint.canonicalID or display_identifier + openid_url = session['openid_url'] + + attrs = self._get_attributes_from_success_response(info) + attrs['openid_url'] = openid_url + session['attributes'] = attrs + openid_email = attrs.get('email', False) + + domain = [] + if openid_email: + domain += ['|', ('openid_email', '=', False)] + domain += [('openid_email', '=', openid_email)] + + domain += [ + ('openid_url', '=', openid_url), + ('active', '=', True), + ] + ids = Users.search(cr, 1, domain) + assert len(ids) < 2 + if ids: + user_id = ids[0] + login = Users.browse(cr, 1, user_id).login + key = randomString(utils.KEY_LENGTH, '0123456789abcdef') + Users.write(cr, 1, [user_id], {'openid_key': key}) + # TODO fill empty fields with the ones from sreg/ax + cr.commit() + + u = req.session.login(dbname, login, key) + + if not user_id: + session['message'] = 'This OpenID identifier is not associated to any active users' + + + elif info.status == consumer.SETUP_NEEDED: + session['message'] = info.setup_url + elif info.status == consumer.FAILURE and display_identifier: + fmt = "Verification of %s failed: %s" + session['message'] = fmt % (display_identifier, info.message) + else: # FAILURE + # Either we don't understand the code or there is no + # openid_url included with the error. Give a generic + # failure message. The library should supply debug + # information in a log. + session['message'] = 'Verification failed.' + + + fragment = '#loginerror' if not user_id else '' + return werkzeug.utils.redirect('/web/webclient/home?debug=1'+fragment) + + @openerpweb.jsonrequest + def status(self, req): + session = getattr(req.session, 'openid_session', {}) + return {'status': session.get('status'), 'message': session.get('message')} + diff --git a/addons/auth_openid/res_users.py b/addons/auth_openid/res_users.py new file mode 100644 index 00000000000..3278184474c --- /dev/null +++ b/addons/auth_openid/res_users.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp.osv import osv, fields +import openerp.exceptions +import tools + +import utils + +class res_users(osv.osv): + _inherit = 'res.users' + + # TODO create helper fields for autofill openid_url and openid_email -> http://pad.openerp.com/web-openid + + _columns = { + 'openid_url': fields.char('OpenID URL', size=1024), + 'openid_email': fields.char('OpenID Email', size=256, + help="Used for disambiguation in case of a shared OpenID URL"), + 'openid_key': fields.char('OpenID Key', size=utils.KEY_LENGTH, + readonly=True), + } + + def _check_openid_url_email(self, cr, uid, ids, context=None): + return all(self.search_count(cr, uid, [('active', '=', True), ('openid_url', '=', u.openid_url), ('openid_email', '=', u.openid_email)]) == 1 \ + for u in self.browse(cr, uid, ids, context) if u.active and u.openid_url) + + def _check_openid_url_email_msg(self, cr, uid, ids, context): + return "There is already an active user with this OpenID Email for this OpenID URL" + + _constraints = [ + (_check_openid_url_email, lambda self, *a, **kw: self._check_openid_url_email_msg(*a, **kw), ['active', 'openid_url', 'openid_email']), + ] + + def copy(self, cr, uid, rid, defaults=None, context=None): + reset_fields = 'openid_url openid_email'.split() + reset_values = dict.fromkeys(reset_fields, False) + if defaults is None: + defaults = reset_values + else: + defaults = dict(reset_values, **defaults) + + defaults['openid_key'] = False + return super(res_users, self).copy(cr, uid, rid, defaults, context) + + def login(self, db, login, password): + result = super(res_users, self).login(db, login, password) + if result: + return result + else: + with utils.cursor(db) as cr: + cr.execute('UPDATE res_users SET date=now() WHERE login=%s AND openid_key=%s AND active=%s RETURNING id', + (tools.ustr(login), tools.ustr(password), True)) + res = cr.fetchone() + cr.commit() + return res[0] if res else False + + + def check(self, db, uid, passwd): + try: + return super(res_users, self).check(db, uid, passwd) + except openerp.exceptions.AccessDenied: + if not passwd: + raise + with utils.cursor(db) as cr: + cr.execute('''SELECT COUNT(1) + FROM res_users + WHERE id=%s + AND openid_key=%s + AND active=%s''', + (int(uid), passwd, True)) + if not cr.fetchone()[0]: + raise + self._uid_cache.setdefault(db, {})[uid] = passwd + +res_users() + + diff --git a/addons/auth_openid/res_users.xml b/addons/auth_openid/res_users.xml new file mode 100644 index 00000000000..e32c2df26c8 --- /dev/null +++ b/addons/auth_openid/res_users.xml @@ -0,0 +1,20 @@ + + + + + res.users.form + res.users + form + + + + + + + + + + + + + diff --git a/addons/auth_openid/static/src/css/openid.css b/addons/auth_openid/static/src/css/openid.css new file mode 100644 index 00000000000..8763ec31685 --- /dev/null +++ b/addons/auth_openid/static/src/css/openid.css @@ -0,0 +1,64 @@ +input[name='openid_url'] { + background: #fff url(../img/login-bg.gif) no-repeat 1px; + padding-left: 20px; +} + +.auth_choice { + position: static; + display: none; +} + +.openerp .login .oe_forms .oe_box2 td input[name="db"], .oe_forms .oe_box2 td select[name="db"] { + width: 50%; + float: left; + margin-top: 15px; +} + +.openerp .login .oe_login_right_pane { + margin-left: 525px; +} +.openerp .login form { + width: 475px; +} + +.openid_providers { + padding: 0; + list-style: none; + float: right; +} + +.openid_providers li { + display: block; + float: left; + margin: 0 1px 3px 2px; +} + +.openid_providers a { + display: block; + width: 24px; + height: 24px; + border: 1px solid #ddd; + background: #fff url(../img/openid_16.png) no-repeat 50%; + text-indent: -9999px; + overflow: hidden; + text-align: left; +} + +.openid_providers a.selected { + border-color: #9A0404; +} + +.openid_providers a[title="Password"] { background-image: url(../img/textfield_key.png); } +.openid_providers a[title="AOL"] { background-image: url(../img/aol.png); } +.openid_providers a[title="ClaimID"] { background-image: url(../img/claimid.png); } +.openid_providers a[title="Google"] { background-image: url(../img/googlefav.png); } +.openid_providers a[title="Google Apps"] { background-image: url(../img/marketplace.gif); } +.openid_providers a[title="MyOpenID"] { background-image: url(../img/myopenid.png); } +.openid_providers a[title="VeriSign"] { background-image: url(../img/verisign.png); } +.openid_providers a[title="Yahoo!"] { background-image: url(../img/yahoo.png); } +.openid_providers a[title="Launchpad"] { background-image: url(../img/launchpad.png); } + + +tr.auth_choice.selected { + display: table-row; +} diff --git a/addons/auth_openid/static/src/img/aol.png b/addons/auth_openid/static/src/img/aol.png new file mode 100644 index 00000000000..93584e56749 Binary files /dev/null and b/addons/auth_openid/static/src/img/aol.png differ diff --git a/addons/auth_openid/static/src/img/claimid.png b/addons/auth_openid/static/src/img/claimid.png new file mode 100644 index 00000000000..41be7fc8f9e Binary files /dev/null and b/addons/auth_openid/static/src/img/claimid.png differ diff --git a/addons/auth_openid/static/src/img/google.png b/addons/auth_openid/static/src/img/google.png new file mode 100644 index 00000000000..d8b8b2a7abb Binary files /dev/null and b/addons/auth_openid/static/src/img/google.png differ diff --git a/addons/auth_openid/static/src/img/googleapps.gif b/addons/auth_openid/static/src/img/googleapps.gif new file mode 100644 index 00000000000..f86bc8956d2 Binary files /dev/null and b/addons/auth_openid/static/src/img/googleapps.gif differ diff --git a/addons/auth_openid/static/src/img/googlefav.png b/addons/auth_openid/static/src/img/googlefav.png new file mode 100644 index 00000000000..1604ac0baa5 Binary files /dev/null and b/addons/auth_openid/static/src/img/googlefav.png differ diff --git a/addons/auth_openid/static/src/img/launchpad.gif b/addons/auth_openid/static/src/img/launchpad.gif new file mode 100644 index 00000000000..48e7ba4f5b0 Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.gif differ diff --git a/addons/auth_openid/static/src/img/launchpad.png b/addons/auth_openid/static/src/img/launchpad.png new file mode 100644 index 00000000000..7db6e67f8b5 Binary files /dev/null and b/addons/auth_openid/static/src/img/launchpad.png differ diff --git a/addons/auth_openid/static/src/img/login-bg.gif b/addons/auth_openid/static/src/img/login-bg.gif new file mode 100644 index 00000000000..e2d8377db02 Binary files /dev/null and b/addons/auth_openid/static/src/img/login-bg.gif differ diff --git a/addons/auth_openid/static/src/img/marketplace.gif b/addons/auth_openid/static/src/img/marketplace.gif new file mode 100644 index 00000000000..a3e4d2cd606 Binary files /dev/null and b/addons/auth_openid/static/src/img/marketplace.gif differ diff --git a/addons/auth_openid/static/src/img/myopenid.png b/addons/auth_openid/static/src/img/myopenid.png new file mode 100644 index 00000000000..d00ca76543b Binary files /dev/null and b/addons/auth_openid/static/src/img/myopenid.png differ diff --git a/addons/auth_openid/static/src/img/openid.png b/addons/auth_openid/static/src/img/openid.png new file mode 100644 index 00000000000..280ee6ce3b7 Binary files /dev/null and b/addons/auth_openid/static/src/img/openid.png differ diff --git a/addons/auth_openid/static/src/img/openid_16.png b/addons/auth_openid/static/src/img/openid_16.png new file mode 100644 index 00000000000..eadf8e8577f Binary files /dev/null and b/addons/auth_openid/static/src/img/openid_16.png differ diff --git a/addons/auth_openid/static/src/img/textfield_key.png b/addons/auth_openid/static/src/img/textfield_key.png new file mode 100644 index 00000000000..a9d5e4f8cc7 Binary files /dev/null and b/addons/auth_openid/static/src/img/textfield_key.png differ diff --git a/addons/auth_openid/static/src/img/verisign.png b/addons/auth_openid/static/src/img/verisign.png new file mode 100644 index 00000000000..fe890ca7aeb Binary files /dev/null and b/addons/auth_openid/static/src/img/verisign.png differ diff --git a/addons/auth_openid/static/src/img/yahoo.png b/addons/auth_openid/static/src/img/yahoo.png new file mode 100644 index 00000000000..5fbf752d9b5 Binary files /dev/null and b/addons/auth_openid/static/src/img/yahoo.png differ diff --git a/addons/auth_openid/static/src/js/auth_openid.js b/addons/auth_openid/static/src/js/auth_openid.js new file mode 100644 index 00000000000..7399e1fb371 --- /dev/null +++ b/addons/auth_openid/static/src/js/auth_openid.js @@ -0,0 +1,135 @@ + +openerp.auth_openid = function(instance) { + +var QWeb = instance.web.qweb; +QWeb.add_template('/auth_openid/static/src/xml/auth_openid.xml'); + +instance.web.Login = instance.web.Login.extend({ + start: function() { + this._super.apply(this, arguments); + var self = this; + + this.$openid_selected_button = $(); + this.$openid_selected_input = $(); + this.$openid_selected_provider = null; + + + var openIdProvider = null; + if (this.has_local_storage && this.remember_creditentials) { + openIdProvider = localStorage.getItem('openid-provider'); + } + + if (openIdProvider) { + $openid_selected_provider = openIdProvider; + this.do_openid_select('a[href="#' + openIdProvider + '"]', openIdProvider, true); + + if (this.has_local_storage && this.remember_creditentials) { + this.$openid_selected_input.find('input').val(localStorage.getItem('openid-login')); + } + } + else { + this.do_openid_select('a[data-url=""]', 'login,password', true); + } + + this.$element.find('a[data-url]').click(function (event) { + event.preventDefault(); + var selected_oidh = $(this).attr('href').substr(1); + if (selected_oidh != self.$openid_selected_provider) { + self.do_openid_select(this, selected_oidh); + } + }); + + }, + + + do_openid_select: function (button, provider, noautosubmit) { + var self = this; + + self.$openid_selected_button.add(self.$openid_selected_input).removeClass('selected'); + self.$openid_selected_button = self.$element.find(button).addClass('selected'); + + var input = _(provider.split(',')).map(function(p) { return 'tr[data-provider="'+p+'"]'; }).join(','); + self.$openid_selected_input = self.$element.find(input).addClass('selected'); + + self.$openid_selected_input.find('input:first').focus(); + self.$openid_selected_provider = (self.$openid_selected_button.attr('href') || '').substr(1); + + if (self.has_local_storage && self.remember_creditentials) { + localStorage.setItem('openid-provider', self.$openid_selected_provider); + } + + if (!noautosubmit && self.$openid_selected_input.length == 0) { + self.$element.find('form').submit(); + } + + }, + + on_login_invalid: function() { + var self = this; + var fragment = jQuery.deparam.fragment(); + if (fragment.loginerror != undefined) { + this.rpc('/auth_openid/login/status', {}, function(result) { + if (_.contains(['success', 'failure'], result.status) && result.message) { + self.notification.warn('Invalid OpenID Login', result.message); + } + if (result.status === 'setup_needed' && result.message) { + window.location.replace(result.message); + } + }); + } + return this._super(); + }, + + on_submit: function(ev) { + + var dataurl = this.$openid_selected_button.attr('data-url'); + + if(!dataurl) { + // login-password submitted + this._super(ev); + } else { + ev.preventDefault(); + + var id = this.$openid_selected_input.find('input').val(); + if (this.has_local_storage && this.remember_creditentials) { + localStorage.setItem('openid-login', id); + } + + var db = this.$element.find("form [name=db]").val(); + var openid_url = dataurl.replace('{id}', id); + + this.do_openid_login(db, openid_url); + + } + }, + + do_openid_login: function(db, openid_url) { + var self = this; + this.rpc('/auth_openid/login/verify', {'db': db, 'url': openid_url}, function(result) { + if (result.error) { + self.notification.warn(result.title, result.error); + self.on_login_invalid(); + return; + } + if (result.session_id) { + self.session.session_id = result.session_id; + self.session.session_save(); + } + if (result.action === 'post') { + document.open(); + document.write(result.value); + document.close(); + } else if (result.action === 'redirect') { + window.location.replace(result.value); + } else { + // XXX display error ? + } + + }); + }, + + +}); + + +}; diff --git a/addons/auth_openid/static/src/xml/auth_openid.xml b/addons/auth_openid/static/src/xml/auth_openid.xml new file mode 100644 index 00000000000..6fbab72e831 --- /dev/null +++ b/addons/auth_openid/static/src/xml/auth_openid.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + //this.addClass('auth_choice'); // XXX for some reason, not all tr tags are HTMLElement's and thus, jQuery decide to not change the class... + this.attr('class', 'auth_choice'); + this.each(function() { + var $i = $(this); + $i.attr('data-provider', $i.find('input').attr('name')); + }); + + + + diff --git a/addons/auth_openid/utils.py b/addons/auth_openid/utils.py new file mode 100644 index 00000000000..2761f3d0e1d --- /dev/null +++ b/addons/auth_openid/utils.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2010-2011 OpenERP s.a. (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from contextlib import contextmanager +from openerp.modules.registry import RegistryManager + +KEY_LENGTH = 16 + +SREG2AX = { # from http://www.axschema.org/types/#sreg + 'nickname': 'http://axschema.org/namePerson/friendly', + 'email': 'http://axschema.org/contact/email', + 'fullname': 'http://axschema.org/namePerson', + 'dob': 'http://axschema.org/birthDate', + 'gender': 'http://axschema.org/person/gender', + 'postcode': 'http://axschema.org/contact/postalCode/home', + 'country': 'http://axschema.org/contact/country/home', + 'language': 'http://axschema.org/pref/language', + 'timezone': 'http://axschema.org/pref/timezone', +} + + +@contextmanager +def cursor(db): + cr = RegistryManager.get(db).db.cursor() + try: + yield cr + finally: + cr.close() + diff --git a/addons/base_action_rule/__openerp__.py b/addons/base_action_rule/__openerp__.py index 1170557efad..18af8d09459 100644 --- a/addons/base_action_rule/__openerp__.py +++ b/addons/base_action_rule/__openerp__.py @@ -22,9 +22,7 @@ { 'name': 'Action Rule', 'version': '1.0', - 'category': 'Tools', - 'complexity': "expert", - 'category': 'Generic Modules/Others', + 'category': 'Hidden', 'description': """ This module allows to implement action rules for any object. ============================================================ diff --git a/addons/base_action_rule/i18n/da.po b/addons/base_action_rule/i18n/da.po new file mode 100644 index 00000000000..e6c812def10 --- /dev/null +++ b/addons/base_action_rule/i18n/da.po @@ -0,0 +1,502 @@ +# Danish 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-26 15:35+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-27 04:47+0000\n" +"X-Generator: Launchpad (build 14028)\n" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_user:0 +msgid "" +"Check this if you want the rule to send an email to the responsible person." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_partner:0 +msgid "Remind Partner" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_categ_id:0 +msgid "Partner Category" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_watchers:0 +msgid "Mail to Watchers (CC)" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_to:0 +msgid "Button Pressed" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,model_id:0 +msgid "Object" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_email:0 +msgid "Mail to these Emails" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_state:0 +msgid "Set State to" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_from:0 +msgid "Email From" +msgstr "E-mail fra" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Body" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Days" +msgstr "Dage" + +#. module: base_action_rule +#: field:base.action.rule,last_run:0 +msgid "Last Run" +msgstr "" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:313 +#, python-format +msgid "Error!" +msgstr "Fejl!" + +#. module: base_action_rule +#: field:base.action.rule,act_reply_to:0 +msgid "Reply-To" +msgstr "Svar til" + +#. module: base_action_rule +#: help:base.action.rule,act_email_cc:0 +msgid "" +"These people will receive a copy of the future communication between partner " +"and users by email" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Minutes" +msgstr "Minutter" + +#. module: base_action_rule +#: field:base.action.rule,name:0 +msgid "Rule Name" +msgstr "Regel Navn" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_partner:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the partner." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Partner" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Deadline" +msgstr "Deadline" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_id:0 +msgid "Partner" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_subject)s = Object subject" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Reminders" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Special Keywords to Be Used in The Body" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_from:0 +msgid "State" +msgstr "" + +#. module: base_action_rule +#: model:ir.actions.act_window,help:base_action_rule.base_action_rule_act +msgid "" +"Use automated actions to automatically trigger actions for various screens. " +"Example: a lead created by a specific user may be automatically set to a " +"specific sales team, or an opportunity which still has status pending after " +"14 days might trigger an automatic reminder email." +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_email:0 +msgid "Email-id of the persons whom mail is to be sent" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +#: model:ir.module.module,shortdesc:base_action_rule.module_meta_information +msgid "Action Rule" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Fields to Change" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Creation Date" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Last Action Date" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Hours" +msgstr "Timer" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_id)s = Object ID" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Delay After Trigger Date" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_attach:0 +msgid "Remind with Attachment" +msgstr "" + +#. module: base_action_rule +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_user_id:0 +msgid "Set Responsible to" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "None" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_email_to:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'To' field of the header" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_phone)s = Responsible phone" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "" +"The rule uses the AND operator. The model must match all non-empty fields so " +"that the rule executes the action described in the 'Actions' tab." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range_type:0 +msgid "Delay type" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,regex_name:0 +msgid "" +"Regular expression for matching name of the resource\n" +"e.g.: 'urgent.*' will search for records having name starting with the " +"string 'urgent'\n" +"Note: This is case sensitive search." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_method:0 +msgid "Call Object Method" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_to:0 +msgid "Email To" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_watchers:0 +msgid "" +"Check this if you want the rule to mark CC(mail to any other person defined " +"in actions)." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner)s = Partner name" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Note" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_email_from:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'From' field of the header" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range:0 +msgid "Delay after trigger date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,trg_date_range:0 +msgid "" +"Delay After Trigger Date,specifies you can put a negative number. If you " +"need a delay before the trigger date, like sending a reminder 15 minutes " +"before a meeting." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,active:0 +msgid "Active" +msgstr "Aktiv" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:314 +#, python-format +msgid "No E-Mail ID Found for your Company address!" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_user:0 +msgid "Remind Responsible" +msgstr "" + +#. module: base_action_rule +#: model:ir.module.module,description:base_action_rule.module_meta_information +msgid "This module allows to implement action rules for any object." +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,sequence:0 +msgid "Gives the sequence order when displaying a list of rules." +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Months" +msgstr "Måneder" + +#. module: base_action_rule +#: field:base.action.rule,filter_id:0 +msgid "Filter" +msgstr "Filter" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Date" +msgstr "Dato" + +#. module: base_action_rule +#: help:base.action.rule,server_action_id:0 +msgid "" +"Describes the action name.\n" +"eg:on which object which action to be taken on basis of which condition" +msgstr "" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_ir_cron +msgid "ir.cron" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_description)s = Object description" +msgstr "" + +#. module: base_action_rule +#: constraint:base.action.rule:0 +msgid "Error: The mail is not well formated" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Actions" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Information" +msgstr "" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_base_action_rule +msgid "Action Rules" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_body:0 +msgid "Content of mail" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_user_id:0 +msgid "Responsible" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner_email)s = Partner Email" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_date)s = Creation date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_email)s = Responsible Email" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_body:0 +msgid "Mail body" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_user:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the user." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Server Action to be Triggered" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_user:0 +msgid "Mail to Responsible" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_cc:0 +msgid "Add Watchers (Cc)" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Fields" +msgstr "" + +#. module: base_action_rule +#: model:ir.actions.act_window,name:base_action_rule.base_action_rule_act +#: model:ir.ui.menu,name:base_action_rule.menu_base_action_rule_form +msgid "Automated Actions" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,server_action_id:0 +msgid "Server Action" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,regex_name:0 +msgid "Regex on Resource Name" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_attach:0 +msgid "" +"Check this if you want that all documents attached to the object be attached " +"to the reminder email sent." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Timing" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Actions" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the rule " +"without removing it." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user)s = Responsible name" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,create_date:0 +msgid "Create Date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on States" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_type:0 +msgid "Trigger Date" +msgstr "" diff --git a/addons/base_action_rule/i18n/zh_TW.po b/addons/base_action_rule/i18n/zh_TW.po new file mode 100644 index 00000000000..843ebd43833 --- /dev/null +++ b/addons/base_action_rule/i18n/zh_TW.po @@ -0,0 +1,502 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 12:38+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_user:0 +msgid "" +"Check this if you want the rule to send an email to the responsible person." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_partner:0 +msgid "Remind Partner" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_categ_id:0 +msgid "Partner Category" +msgstr "伙伴分類" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_watchers:0 +msgid "Mail to Watchers (CC)" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_to:0 +msgid "Button Pressed" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,model_id:0 +msgid "Object" +msgstr "物件" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_email:0 +msgid "Mail to these Emails" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_state:0 +msgid "Set State to" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_from:0 +msgid "Email From" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Body" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Days" +msgstr "日" + +#. module: base_action_rule +#: field:base.action.rule,last_run:0 +msgid "Last Run" +msgstr "" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:313 +#, python-format +msgid "Error!" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_reply_to:0 +msgid "Reply-To" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_email_cc:0 +msgid "" +"These people will receive a copy of the future communication between partner " +"and users by email" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Minutes" +msgstr "分鐘" + +#. module: base_action_rule +#: field:base.action.rule,name:0 +msgid "Rule Name" +msgstr "規則名稱" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_partner:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the partner." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Partner" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Deadline" +msgstr "最後限期" + +#. module: base_action_rule +#: field:base.action.rule,trg_partner_id:0 +msgid "Partner" +msgstr "伙伴" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_subject)s = Object subject" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Reminders" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Special Keywords to Be Used in The Body" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_state_from:0 +msgid "State" +msgstr "" + +#. module: base_action_rule +#: model:ir.actions.act_window,help:base_action_rule.base_action_rule_act +msgid "" +"Use automated actions to automatically trigger actions for various screens. " +"Example: a lead created by a specific user may be automatically set to a " +"specific sales team, or an opportunity which still has status pending after " +"14 days might trigger an automatic reminder email." +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_email:0 +msgid "Email-id of the persons whom mail is to be sent" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +#: model:ir.module.module,shortdesc:base_action_rule.module_meta_information +msgid "Action Rule" +msgstr "動作規則" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Fields to Change" +msgstr "要變更欄位" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Creation Date" +msgstr "建立日期" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Last Action Date" +msgstr "最後動作日期" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Hours" +msgstr "小時" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_id)s = Object ID" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Delay After Trigger Date" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_attach:0 +msgid "Remind with Attachment" +msgstr "" + +#. module: base_action_rule +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_user_id:0 +msgid "Set Responsible to" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "None" +msgstr "無" + +#. module: base_action_rule +#: help:base.action.rule,act_email_to:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'To' field of the header" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_phone)s = Responsible phone" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "" +"The rule uses the AND operator. The model must match all non-empty fields so " +"that the rule executes the action described in the 'Actions' tab." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range_type:0 +msgid "Delay type" +msgstr "延遲類型" + +#. module: base_action_rule +#: help:base.action.rule,regex_name:0 +msgid "" +"Regular expression for matching name of the resource\n" +"e.g.: 'urgent.*' will search for records having name starting with the " +"string 'urgent'\n" +"Note: This is case sensitive search." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_method:0 +msgid "Call Object Method" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_to:0 +msgid "Email To" +msgstr "電郵至" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_to_watchers:0 +msgid "" +"Check this if you want the rule to mark CC(mail to any other person defined " +"in actions)." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner)s = Partner name" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Note" +msgstr "備註" + +#. module: base_action_rule +#: help:base.action.rule,act_email_from:0 +msgid "" +"Use a python expression to specify the right field on which one than we will " +"use for the 'From' field of the header" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_range:0 +msgid "Delay after trigger date" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions" +msgstr "條件" + +#. module: base_action_rule +#: help:base.action.rule,trg_date_range:0 +msgid "" +"Delay After Trigger Date,specifies you can put a negative number. If you " +"need a delay before the trigger date, like sending a reminder 15 minutes " +"before a meeting." +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,active:0 +msgid "Active" +msgstr "活躍" + +#. module: base_action_rule +#: code:addons/base_action_rule/base_action_rule.py:314 +#, python-format +msgid "No E-Mail ID Found for your Company address!" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_remind_user:0 +msgid "Remind Responsible" +msgstr "" + +#. module: base_action_rule +#: model:ir.module.module,description:base_action_rule.module_meta_information +msgid "This module allows to implement action rules for any object." +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,sequence:0 +msgid "Gives the sequence order when displaying a list of rules." +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_range_type:0 +msgid "Months" +msgstr "月" + +#. module: base_action_rule +#: field:base.action.rule,filter_id:0 +msgid "Filter" +msgstr "" + +#. module: base_action_rule +#: selection:base.action.rule,trg_date_type:0 +msgid "Date" +msgstr "日期" + +#. module: base_action_rule +#: help:base.action.rule,server_action_id:0 +msgid "" +"Describes the action name.\n" +"eg:on which object which action to be taken on basis of which condition" +msgstr "" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_ir_cron +msgid "ir.cron" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_description)s = Object description" +msgstr "" + +#. module: base_action_rule +#: constraint:base.action.rule:0 +msgid "Error: The mail is not well formated" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Actions" +msgstr "電郵動作" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Email Information" +msgstr "電郵資料" + +#. module: base_action_rule +#: model:ir.model,name:base_action_rule.model_base_action_rule +msgid "Action Rules" +msgstr "動作規則" + +#. module: base_action_rule +#: help:base.action.rule,act_mail_body:0 +msgid "Content of mail" +msgstr "郵件內容" + +#. module: base_action_rule +#: field:base.action.rule,trg_user_id:0 +msgid "Responsible" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(partner_email)s = Partner Email" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_date)s = Creation date" +msgstr "%(object_date)s = 建立日期" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user_email)s = Responsible Email" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_body:0 +msgid "Mail body" +msgstr "郵件內文" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_user:0 +msgid "" +"Check this if you want the rule to send a reminder by email to the user." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Server Action to be Triggered" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_mail_to_user:0 +msgid "Mail to Responsible" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,act_email_cc:0 +msgid "Add Watchers (Cc)" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Model Fields" +msgstr "" + +#. module: base_action_rule +#: model:ir.actions.act_window,name:base_action_rule.base_action_rule_act +#: model:ir.ui.menu,name:base_action_rule.menu_base_action_rule_form +msgid "Automated Actions" +msgstr "自動化動作" + +#. module: base_action_rule +#: field:base.action.rule,server_action_id:0 +msgid "Server Action" +msgstr "伺服器動作" + +#. module: base_action_rule +#: field:base.action.rule,regex_name:0 +msgid "Regex on Resource Name" +msgstr "" + +#. module: base_action_rule +#: help:base.action.rule,act_remind_attach:0 +msgid "" +"Check this if you want that all documents attached to the object be attached " +"to the reminder email sent." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on Timing" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Actions" +msgstr "動作" + +#. module: base_action_rule +#: help:base.action.rule,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the rule " +"without removing it." +msgstr "" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "%(object_user)s = Responsible name" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,create_date:0 +msgid "Create Date" +msgstr "建立日期" + +#. module: base_action_rule +#: view:base.action.rule:0 +msgid "Conditions on States" +msgstr "" + +#. module: base_action_rule +#: field:base.action.rule,trg_date_type:0 +msgid "Trigger Date" +msgstr "" diff --git a/addons/base_calendar/__openerp__.py b/addons/base_calendar/__openerp__.py index 6edb978301f..0dd72a17038 100644 --- a/addons/base_calendar/__openerp__.py +++ b/addons/base_calendar/__openerp__.py @@ -34,7 +34,7 @@ It supports: - Recurring events - Invitations to people""", "author" : "OpenERP SA", - 'category': 'Tools', + 'category': 'Hidden', 'website': 'http://www.openerp.com', "init_xml" : [ 'base_calendar_data.xml' diff --git a/addons/base_contact/__openerp__.py b/addons/base_contact/__openerp__.py index 17e7d3a69c8..5537d6f91eb 100644 --- a/addons/base_contact/__openerp__.py +++ b/addons/base_contact/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Base Contact', 'version': '1.0', - 'category': 'Tools', + 'category': 'Hidden', 'complexity': "expert", 'description': """ This module allows you to manage your contacts entirely. diff --git a/addons/base_crypt/__openerp__.py b/addons/base_crypt/__openerp__.py index c9e79688288..025f7db0704 100644 --- a/addons/base_crypt/__openerp__.py +++ b/addons/base_crypt/__openerp__.py @@ -24,7 +24,7 @@ "author" : ['OpenERP SA', "FS3"], "maintainer" : "OpenERP SA", "website" : "http://www.openerp.com", - "category" : "Tools", + "category" : "Hidden", 'complexity': "easy", "description": """ Replaces cleartext passwords in the database with a secure hash diff --git a/addons/base_crypt/i18n/es_CL.po b/addons/base_crypt/i18n/es_CL.po index fafe03b997b..98e08733973 100644 --- a/addons/base_crypt/i18n/es_CL.po +++ b/addons/base_crypt/i18n/es_CL.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-06-06 18:09+0000\n" -"Last-Translator: doingit.cl \n" +"PO-Revision-Date: 2011-10-03 17:17+0000\n" +"Last-Translator: David Acevedo Toledo \n" "Language-Team: Spanish (Chile) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:58+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-10-04 05:02+0000\n" +"X-Generator: Launchpad (build 14071)\n" #. module: base_crypt #: sql_constraint:res.users:0 msgid "You can not have two users with the same login !" -msgstr "" +msgstr "¡No puede tener dos usuarios con el mismo nombre!" #. module: base_crypt #: model:ir.model,name:base_crypt.model_res_users @@ -31,18 +31,19 @@ msgstr "res.users" #: constraint:res.users:0 msgid "The chosen company is not in the allowed companies for this user" msgstr "" -"La compañía seleccionada no está autorizada como compañía para este usuario" +"La compañía seleccionada no está dentro de las compañías autorizadas para " +"este usuario" #. module: base_crypt #: code:addons/base_crypt/crypt.py:132 #, python-format msgid "Please specify the password !" -msgstr "" +msgstr "¡Por favor, escriba una contraseña!" #. module: base_crypt #: model:ir.module.module,shortdesc:base_crypt.module_meta_information msgid "Base - Password Encryption" -msgstr "" +msgstr "Base - Encriptación de la Contraseña" #. module: base_crypt #: code:addons/base_crypt/crypt.py:132 @@ -70,3 +71,19 @@ msgid "" "unless you are using a secure protocol such as XML-RPCS.\n" " " msgstr "" +"Este módulo sustituye la contraseña escrita en texto plano por una " +"codificada,\n" +"previniendo que alguien pueda leer la contraseña original.\n" +"Para un usuario existente, el sustitución de la contraseña en texto plano se " +"realiza la primera vez\n" +"que el usuario se conecte después de instalar base_crypt.\n" +"Después de instalar este módulo los usuarios no podrán recuperar su " +"contraseña olvidada,\n" +"un administrador tendrá que cambiarla por una nueva.\n" +"\n" +"Nota: instalar este módulo no significa que pueda ignorar las medidas " +"básicas de seguridad,\n" +"como la contraseña que es enviada por el cliente que sigue sin ser " +"codificada en la red,\n" +"a menos que utilice un protocolo seguro como XML-RPCS.\n" +" " diff --git a/addons/base_crypt/i18n/sr@latin.po b/addons/base_crypt/i18n/sr@latin.po new file mode 100644 index 00000000000..8b205c0ea97 --- /dev/null +++ b/addons/base_crypt/i18n/sr@latin.po @@ -0,0 +1,85 @@ +# Serbian Latin 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-10-05 13:25+0000\n" +"Last-Translator: Milan Milosevic \n" +"Language-Team: Serbian Latin \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-10-06 04:36+0000\n" +"X-Generator: Launchpad (build 14085)\n" + +#. module: base_crypt +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "Ne možete imati dva korisnika sa istom prijavom!" + +#. 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 "Odabrana firma nije u dozvoljena firmama za ovog korisnika" + +#. module: base_crypt +#: code:addons/base_crypt/crypt.py:132 +#, python-format +msgid "Please specify the password !" +msgstr "Molimo odredite lozinku" + +#. module: base_crypt +#: model:ir.module.module,shortdesc:base_crypt.module_meta_information +msgid "Base - Password Encryption" +msgstr "Baza - Šifrovanje lozinke" + +#. module: base_crypt +#: code:addons/base_crypt/crypt.py:132 +#, python-format +msgid "Error" +msgstr "Greška" + +#. 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 "" +"Ovaj modul zamenjuje vidljivu lozinku u bazi podataka znacima,\n" +"što onemogućava bilo koga da pročita originalnu lozinku.\n" +"Što se tiče Vaše baze podataka, ukidanje vidljive lozinke dešava se prvi put " +"pošto se korisnik prijavi u bazu podataka, po instalaciji base_crypt.\n" +"Po instalaciji ovog modula neće biti moguće izmeniti zaboravljenu lozinku za " +"Vaše korisnike, jedino rešenje će biti da im administrator postavi novu " +"lozinku.\n" +"\n" +"Beleška: Instaliranje ovog modula ne znači da možete ignorisati osnovne " +"sigurnosne mere,\n" +"budući da se lozinka i dalje prenosi nešifrovana u mreži (od strane " +"klijenta),\n" +"ukoliko ne koristite siguran protokol kao XML-RPCS.\n" +" " diff --git a/addons/base_crypt/i18n/zh_TW.po b/addons/base_crypt/i18n/zh_TW.po new file mode 100644 index 00000000000..05f2159e5fa --- /dev/null +++ b/addons/base_crypt/i18n/zh_TW.po @@ -0,0 +1,71 @@ +# Chinese (Traditional) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 13:07+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Traditional) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: base_crypt +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "" + +#. module: base_crypt +#: model:ir.model,name:base_crypt.model_res_users +msgid "res.users" +msgstr "" + +#. module: base_crypt +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: base_crypt +#: code:addons/base_crypt/crypt.py:132 +#, python-format +msgid "Please specify the password !" +msgstr "請指定密碼 !" + +#. module: base_crypt +#: model:ir.module.module,shortdesc:base_crypt.module_meta_information +msgid "Base - Password Encryption" +msgstr "基礎 - 密碼加密" + +#. module: base_crypt +#: code:addons/base_crypt/crypt.py:132 +#, python-format +msgid "Error" +msgstr "" + +#. 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 "" diff --git a/addons/base_iban/__openerp__.py b/addons/base_iban/__openerp__.py index 370ca6c93f2..c9bc3866b4f 100644 --- a/addons/base_iban/__openerp__.py +++ b/addons/base_iban/__openerp__.py @@ -21,7 +21,7 @@ { 'name': 'Create IBAN bank accounts', 'version': '1.0', - 'category': 'Finance', + 'category': 'Hidden', 'complexity': "easy", 'description': """ This module installs the base for IBAN (International Bank Account Number) bank accounts and checks for its validity. diff --git a/addons/base_iban/i18n/sr@latin.po b/addons/base_iban/i18n/sr@latin.po index d1017c9f6ef..f25a93fc270 100644 --- a/addons/base_iban/i18n/sr@latin.po +++ b/addons/base_iban/i18n/sr@latin.po @@ -8,19 +8,19 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-23 15:48+0000\n" -"Last-Translator: OpenERP Administrators \n" +"PO-Revision-Date: 2011-10-05 13:32+0000\n" +"Last-Translator: Milan Milosevic \n" "Language-Team: Serbian latin \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 04:58+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-10-06 04:36+0000\n" +"X-Generator: Launchpad (build 14085)\n" #. module: base_iban #: model:ir.module.module,shortdesc:base_iban.module_meta_information msgid "Create IBAN bank accounts" -msgstr "Kreiraj IBAN nalog banke" +msgstr "Napravi IBAN nalog banke" #. module: base_iban #: code:addons/base_iban/base_iban.py:120 @@ -28,7 +28,7 @@ msgstr "Kreiraj IBAN nalog banke" msgid "" "The IBAN does not seems to be correct. You should have entered something " "like this %s" -msgstr "IBAN izgleda da nije ispravan. TRebas uneti nesto nalik na %s" +msgstr "IBAN izgleda da nije ispravan. Trebalo je uneti nešto kao %s" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_zip_field @@ -43,7 +43,7 @@ msgstr "Međunarodni broj Bankovnog računa" #. module: base_iban #: model:ir.model,name:base_iban.model_res_partner_bank msgid "Bank Accounts" -msgstr "Bankovni Računi" +msgstr "Bankovni računi" #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_country_field @@ -64,7 +64,7 @@ msgstr "iban" #: code:addons/base_iban/base_iban.py:121 #, python-format msgid "The IBAN is invalid, It should begin with the country code" -msgstr "IBAN je neispravan, trebalo bi da pocinje sa kodom zemlje" +msgstr "IBAN je neispravan, trebalo bi da počinje sa kodom zemlje" #. module: base_iban #: field:res.partner.bank,iban:0 @@ -74,7 +74,7 @@ msgstr "IBAN" #. module: base_iban #: model:res.partner.bank.type,name:base_iban.bank_iban msgid "IBAN Account" -msgstr "IBAN konto" +msgstr "IBAN račun" #. module: base_iban #: model:ir.module.module,description:base_iban.module_meta_information @@ -85,11 +85,16 @@ msgid "" "\n" " " msgstr "" +"\n" +"Ovaj modul instalira bazu za IBAN (Međunarodni broj bankovnog računa) " +"bankovne račune i proverava im validnost.\n" +"\n" +" " #. module: base_iban #: model:res.partner.bank.type.field,name:base_iban.bank_acc_number_field msgid "acc_number" -msgstr "Broj konta" +msgstr "acc_number" #~ msgid "Invalid XML for View Architecture!" #~ msgstr "Nevažeći XML za pregled arhitekture" diff --git a/addons/base_module_doc_rst/__openerp__.py b/addons/base_module_doc_rst/__openerp__.py index c2c5ca30a91..41425f77749 100644 --- a/addons/base_module_doc_rst/__openerp__.py +++ b/addons/base_module_doc_rst/__openerp__.py @@ -22,7 +22,7 @@ { 'name': 'Module Technical Guide in Restructured Text ', 'version': '1.0', - 'category': 'Tools', + 'category': 'Hidden', 'description': """ This module generates the Technical Guides of selected modules in Restructured Text format (RST). ================================================================================================= diff --git a/addons/base_module_quality/__openerp__.py b/addons/base_module_quality/__openerp__.py index ec9ec1191d2..af258685629 100644 --- a/addons/base_module_quality/__openerp__.py +++ b/addons/base_module_quality/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Base module quality - To check the quality of other modules' , 'version': '1.0', - 'category': 'Tools', + 'category': 'Hidden', 'description': """ The aim of this module is to check the quality of other modules. ================================================================ diff --git a/addons/base_module_quality/i18n/fr.po b/addons/base_module_quality/i18n/fr.po index 2454964067e..b6f61c74cde 100644 --- a/addons/base_module_quality/i18n/fr.po +++ b/addons/base_module_quality/i18n/fr.po @@ -8,14 +8,15 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-01-12 20:19+0000\n" -"Last-Translator: Quentin THEURET \n" +"PO-Revision-Date: 2011-09-26 12:09+0000\n" +"Last-Translator: Maxime Chambreuil (http://www.savoirfairelinux.com) " +"\n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:42+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-09-27 04:47+0000\n" +"X-Generator: Launchpad (build 14028)\n" #. module: base_module_quality #: code:addons/base_module_quality/object_test/object_test.py:187 @@ -390,7 +391,7 @@ msgstr "Erreur ! Le module n'est pas correctement chargé/installé." #: code:addons/base_module_quality/speed_test/speed_test.py:116 #, python-format msgid "Error in Read method: %s" -msgstr "" +msgstr "Erreur dans la méthode Read : %s" #. module: base_module_quality #: code:addons/base_module_quality/speed_test/speed_test.py:138 diff --git a/addons/base_module_record/__openerp__.py b/addons/base_module_record/__openerp__.py index fdb576e0ddd..3e1cf79792a 100644 --- a/addons/base_module_record/__openerp__.py +++ b/addons/base_module_record/__openerp__.py @@ -23,7 +23,7 @@ { 'name': 'Module Record', 'version': '1.0', - 'category': 'Tools', + 'category': 'Hidden', 'description': """ This module allows you to create a new module without any development. ====================================================================== diff --git a/addons/base_module_record/i18n/sr@latin.po b/addons/base_module_record/i18n/sr@latin.po index 02ad1d3664d..01596dacd24 100644 --- a/addons/base_module_record/i18n/sr@latin.po +++ b/addons/base_module_record/i18n/sr@latin.po @@ -8,24 +8,24 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-23 10:53+0000\n" -"Last-Translator: qdp (OpenERP) \n" +"PO-Revision-Date: 2011-10-05 13:53+0000\n" +"Last-Translator: Milan Milosevic \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-09-05 05:10+0000\n" -"X-Generator: Launchpad (build 13830)\n" +"X-Launchpad-Export-Date: 2011-10-06 04:36+0000\n" +"X-Generator: Launchpad (build 14085)\n" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,category:0 msgid "Category" -msgstr "Категорија" +msgstr "Kategorija" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Information" -msgstr "Informacija" +msgstr "Informacije" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 @@ -34,9 +34,9 @@ msgid "" "publish it on OpenERP.com, in the 'Modules' section. You can do it through " "the website or using features of the 'base_module_publish' module." msgstr "" -"Ako mislite da vas modul moze zainteresovati i druge ljude, mozete ga " -"publikovati na OpenERP.com u sekciji 'Moduli'. To mozete uciniti preko " -"websajta ili koristeci mogucnosti modula 'base_module_publish' ." +"Ako mislite da Vaš modul može zainteresovati i druge ljude, Voleli bismo da " +"ga objabvite na OpenERP.com u sekciji 'Moduli'. To možete učiniti preko " +"vebsajta ili koristeći mogućnosti modula 'base_module_publish' ." #. module: base_module_record #: wizard_button:base_module_record.module_record_data,info,end:0 @@ -48,7 +48,7 @@ msgstr "Kraj" #: wizard_view:base_module_record.module_record_data,init:0 #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Choose objects to record" -msgstr "Izaberi objekat za cuvanje" +msgstr "Izaberi stavke za čuvanje" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,author:0 @@ -58,13 +58,13 @@ msgstr "Autor" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,directory_name:0 msgid "Directory Name" -msgstr "Ime Direktorijuma" +msgstr "Ime fascikle" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,filter_cond:0 #: wizard_field:base_module_record.module_record_objects,init,filter_cond:0 msgid "Records only" -msgstr "Samo Zapisi" +msgstr "Samo zapisi" #. module: base_module_record #: model:ir.model,name:base_module_record.model_ir_module_record @@ -74,12 +74,12 @@ msgstr "ir.module.record" #. module: base_module_record #: selection:base_module_record.module_record_objects,info,data_kind:0 msgid "Demo Data" -msgstr "Demo Podaci" +msgstr "Demo podaci" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_filename:0 msgid "Filename" -msgstr "Ime Fajla" +msgstr "Ime datoteke" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,version:0 @@ -92,7 +92,7 @@ msgstr "Verzija" #: wizard_view:base_module_record.module_record_data,save_yaml:0 #: wizard_view:base_module_record.module_record_objects,init:0 msgid "Objects Recording" -msgstr "Objekti se Snimaju" +msgstr "Zapisi stavki" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,check_date:0 @@ -107,29 +107,29 @@ msgstr "Zapis od Datuma" #: wizard_view:base_module_record.module_record_objects,save:0 #: wizard_view:base_module_record.module_record_objects,save_yaml:0 msgid "Module Recording" -msgstr "Snimanje Modula" +msgstr "Zapisivanje modula" #. module: base_module_record #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_objects #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_objects msgid "Export Customizations As a Module" -msgstr "Izvezi Podesavanja kao Modul" +msgstr "Izvezi podešavanja kao modul" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Thanks in advance for your contribution." -msgstr "Hvala unaprijed na Vašem Doprinosu" +msgstr "Hvala unapred na Vašem doprinosu" #. module: base_module_record #: help:base_module_record.module_record_data,init,objects:0 #: help:base_module_record.module_record_objects,init,objects:0 msgid "List of objects to be recorded" -msgstr "Lista Objekata za zapis" +msgstr "Spisak stavki za zapis" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,description:0 msgid "Full Description" -msgstr "Puni Opis" +msgstr "Puni opis" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,name:0 @@ -140,63 +140,63 @@ msgstr "Naziv Modula" #: wizard_field:base_module_record.module_record_data,init,objects:0 #: wizard_field:base_module_record.module_record_objects,init,objects:0 msgid "Objects" -msgstr "Objekti" +msgstr "Stavka" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,save,module_file:0 #: wizard_field:base_module_record.module_record_objects,save_yaml,yaml_file:0 msgid "Module .zip File" -msgstr ".zip datoteka Modula" +msgstr ".zip datoteka modula" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save:0 msgid "Module successfully created !" -msgstr "Modul uspješno kreiran !" +msgstr "Modul uspešno napravljen !" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,save_yaml:0 msgid "YAML file successfully created !" -msgstr "YAML fajl je uspesno kreiran !" +msgstr "YAML datoteka uspešno napravljena !" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,info:0 #: wizard_view:base_module_record.module_record_data,save_yaml:0 msgid "Result, paste this to your module's xml" -msgstr "Rezultat, zalepi ovo u tvoj xml modul" +msgstr "Rezultat, zalepite ovo u Vaš xml modul" #. module: base_module_record #: selection:base_module_record.module_record_data,init,filter_cond:0 #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Created" -msgstr "Kreirano" +msgstr "Napravljeno" #. module: base_module_record #: wizard_view:base_module_record.module_record_data,end:0 #: wizard_view:base_module_record.module_record_objects,end:0 msgid "Thanks For using Module Recorder" -msgstr "Hvala što ste koristili Snimač Modula" +msgstr "Hvala što ste koristili Zapisivač modula" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,website:0 msgid "Documentation URL" -msgstr "URL Dokumentacije" +msgstr "URL Dokumentacija" #. module: base_module_record #: selection:base_module_record.module_record_data,init,filter_cond:0 #: selection:base_module_record.module_record_objects,init,filter_cond:0 msgid "Modified" -msgstr "Izmenjen" +msgstr "Izmenjeno" #. module: base_module_record #: wizard_button:base_module_record.module_record_data,init,record:0 #: wizard_button:base_module_record.module_record_objects,init,record:0 msgid "Record" -msgstr "Snima" +msgstr "Zapis" #. module: base_module_record #: model:ir.module.module,shortdesc:base_module_record.module_meta_information msgid "Module Record" -msgstr "Snimanje Modula" +msgstr "Zapisivanje modula" #. module: base_module_record #: wizard_button:base_module_record.module_record_objects,info,save:0 @@ -207,13 +207,13 @@ msgstr "Nastavi" #: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_data #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_data msgid "Export Customizations As Data File" -msgstr "Eksportuj POdesavanja kao Data fajl" +msgstr "Izvezi podešavanja kao data datoteku" #. module: base_module_record #: code:addons/base_module_record/wizard/base_module_save.py:129 #, python-format msgid "Error" -msgstr "Greska" +msgstr "Greška" #. module: base_module_record #: selection:base_module_record.module_record_objects,info,data_kind:0 @@ -224,12 +224,12 @@ msgstr "Obični podaci" #: wizard_button:base_module_record.module_record_data,end,end:0 #: wizard_button:base_module_record.module_record_objects,end,end:0 msgid "OK" -msgstr "U redu" +msgstr "OK" #. module: base_module_record #: model:ir.ui.menu,name:base_module_record.menu_wizard_base_mod_rec msgid "Module Creation" -msgstr "Kreacija Modula" +msgstr "Pravljenje Modula" #. module: base_module_record #: wizard_field:base_module_record.module_record_objects,info,data_kind:0 @@ -239,7 +239,7 @@ msgstr "Tip Podataka" #. module: base_module_record #: wizard_view:base_module_record.module_record_objects,info:0 msgid "Module Information" -msgstr "Informacija o Modulu" +msgstr "Informacija o modulu" #. module: base_module_record #: wizard_field:base_module_record.module_record_data,init,info_yaml:0 @@ -296,6 +296,26 @@ msgid "" "module.\n" " " msgstr "" +"\n" +"Ovaj modul omogućava da napravite novi modul bez ikakvog razvoja.\n" +"Zapisuje sve operacije na stavkama za vreme sesija zapisivanaj i\n" +"pravi .ZIP modul. Tako da možete napraviti sopstvene module direknto iz\n" +"OpenERP klijenta.\n" +"\n" +"Ova verzija radi za pravljenje i izmenu postojećih zapisa. Iznova " +"obračunava\n" +"međuzavisnosti i veze između svih tipova vidžeta (man2one, many2many, ...).\n" +"\n" +"Ovo bi trebalo da Vam pomogne da lako pravite ponovo upotrebljive module, " +"koje možete ponovo objaviti,\n" +"za korisnička podešavanja i demo/testiranje podataka.\n" +"\n" +"Kako ga koristiti:\n" +"Pokrenite Administration/Customization/Module Creation/Export Customizations " +"kao pomoćni modul.\n" +"Izaberite datum i vreme kao kriterijume za zapis i stavke za zapis i " +"zapišite modul.\n" +" " #~ msgid "" #~ "The Object name must start with x_ and not contain any special character !" diff --git a/addons/base_report_creator/__openerp__.py b/addons/base_report_creator/__openerp__.py index 6c0a01f78fd..5e8bed72d03 100644 --- a/addons/base_report_creator/__openerp__.py +++ b/addons/base_report_creator/__openerp__.py @@ -21,9 +21,9 @@ { - 'name': 'Statistical Report Creator', + 'name': 'Query Builder', 'version': '1.0', - 'category': 'Tools', + 'category': 'Advanced Reporting', 'complexity': "expert", 'description': """ This module allows you to create any statistic report on several objects. diff --git a/addons/base_report_creator/i18n/zh_HK.po b/addons/base_report_creator/i18n/zh_HK.po new file mode 100644 index 00000000000..3fd9b173e63 --- /dev/null +++ b/addons/base_report_creator/i18n/zh_HK.po @@ -0,0 +1,518 @@ +# Chinese (Hong Kong) 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 , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-09-27 13:44+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Chinese (Hong Kong) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-09-28 05:20+0000\n" +"X-Generator: Launchpad (build 14049)\n" + +#. module: base_report_creator +#: help:base_report_creator.report.filter,expression:0 +msgid "" +"Provide an expression for the field based on which you want to filter the " +"records.\n" +" e.g. res_partner.id=3" +msgstr "" + +#. module: base_report_creator +#: model:ir.model,name:base_report_creator.model_report_menu_create +msgid "Menu Create" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,view_graph_type:0 +msgid "Graph Type" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Used View" +msgstr "" + +#. module: base_report_creator +#: wizard_view:base_report_creator.report_filter.fields,set_value_select_field:0 +msgid "Filter Values" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.fields,graph_mode:0 +msgid "Graph Mode" +msgstr "" + +#. module: base_report_creator +#: code:addons/base_report_creator/base_report_creator.py:310 +#, python-format +msgid "" +"These is/are model(s) (%s) in selection which is/are not related to any " +"other model" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Legend" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Graph View" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.filter,expression:0 +msgid "Value" +msgstr "" + +#. module: base_report_creator +#: model:ir.actions.wizard,name:base_report_creator.wizard_set_filter_fields +msgid "Set Filter Fields" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,calendar_mode:0 +msgid "Ending Date" +msgstr "" + +#. module: base_report_creator +#: model:ir.model,name:base_report_creator.model_base_report_creator_report_filter +msgid "Report Filters" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: field:base_report_creator.report,sql_query:0 +msgid "SQL Query" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: view:report.menu.create:0 +msgid "Create Menu" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Minimum" +msgstr "" + +#. module: base_report_creator +#: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,operator:0 +msgid "Operator" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.filter,condition:0 +#: selection:base_report_creator.report_filter.fields,set_value_select_field,condition:0 +msgid "OR" +msgstr "" + +#. module: base_report_creator +#: model:ir.actions.act_window,name:base_report_creator.base_report_creator_action +msgid "Custom Reports" +msgstr "" + +#. module: base_report_creator +#: code:addons/base_report_creator/base_report_creator.py:310 +#, python-format +msgid "No Related Models!!" +msgstr "" + +#. module: base_report_creator +#: view:report.menu.create:0 +msgid "Menu Information" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Sum" +msgstr "" + +#. module: base_report_creator +#: constraint:base_report_creator.report:0 +msgid "You must have to give calendar view's color,start date and delay." +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,model_ids:0 +msgid "Reported Objects" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Field List" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,type:0 +msgid "Report Type" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Add filter" +msgstr "" + +#. module: base_report_creator +#: model:ir.actions.act_window,name:base_report_creator.action_report_menu_create +msgid "Create Menu for Report" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_type1:0 +#: selection:base_report_creator.report,view_type2:0 +#: selection:base_report_creator.report,view_type3:0 +msgid "Form" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_type2:0 +#: selection:base_report_creator.report,view_type3:0 +#: selection:base_report_creator.report.fields,calendar_mode:0 +#: selection:base_report_creator.report.fields,graph_mode:0 +msgid "/" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: field:base_report_creator.report.fields,report_id:0 +#: field:base_report_creator.report.filter,report_id:0 +#: model:ir.model,name:base_report_creator.model_base_report_creator_report +#: model:ir.model,name:base_report_creator.model_base_report_creator_report_result +msgid "Report" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,calendar_mode:0 +msgid "Starting Date" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Filters on Fields" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,group_ids:0 +msgid "Authorized Groups" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_type1:0 +#: selection:base_report_creator.report,view_type2:0 +#: selection:base_report_creator.report,view_type3:0 +msgid "Tree" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,view_graph_orientation:0 +msgid "Graph Orientation" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Authorized Groups (empty for all)" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Security" +msgstr "保安" + +#. module: base_report_creator +#: field:report.menu.create,menu_name:0 +msgid "Menu Name" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.filter,condition:0 +#: selection:base_report_creator.report_filter.fields,set_value_select_field,condition:0 +msgid "AND" +msgstr "" + +#. module: base_report_creator +#: constraint:base_report_creator.report:0 +msgid "You can not display field which are not stored in Database." +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.fields,calendar_mode:0 +msgid "Calendar Mode" +msgstr "" + +#. module: base_report_creator +#: model:ir.model,name:base_report_creator.model_base_report_creator_report_fields +msgid "Display Fields" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,graph_mode:0 +msgid "Y Axis" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_type1:0 +#: selection:base_report_creator.report,view_type2:0 +#: selection:base_report_creator.report,view_type3:0 +msgid "Calendar" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_type1:0 +#: selection:base_report_creator.report,view_type2:0 +#: selection:base_report_creator.report,view_type3:0 +msgid "Graph" +msgstr "" + +#. module: base_report_creator +#: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,field_id:0 +msgid "Field Name" +msgstr "" + +#. module: base_report_creator +#: wizard_view:base_report_creator.report_filter.fields,set_value_select_field:0 +msgid "Set Filter Values" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_graph_orientation:0 +msgid "Vertical" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,type:0 +msgid "Rows And Columns Report" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "General Configuration" +msgstr "" + +#. module: base_report_creator +#: help:base_report_creator.report.fields,sequence:0 +msgid "Gives the sequence order when displaying a list of fields." +msgstr "" + +#. module: base_report_creator +#: wizard_view:base_report_creator.report_filter.fields,init:0 +msgid "Select Field to filter" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,active:0 +msgid "Active" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_graph_orientation:0 +msgid "Horizontal" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.fields,group_method:0 +msgid "Grouping Method" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.filter,condition:0 +#: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,condition:0 +msgid "Condition" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Count" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,graph_mode:0 +msgid "X Axis" +msgstr "" + +#. module: base_report_creator +#: field:report.menu.create,menu_parent_id:0 +msgid "Parent Menu" +msgstr "" + +#. module: base_report_creator +#: wizard_button:base_report_creator.report_filter.fields,set_value_select_field,set_value:0 +msgid "Confirm Filter" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.filter,name:0 +msgid "Filter Name" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Open Report" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Grouped" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: model:ir.module.module,shortdesc:base_report_creator.module_meta_information +msgid "Report Creator" +msgstr "" + +#. module: base_report_creator +#: wizard_button:base_report_creator.report_filter.fields,init,end:0 +#: wizard_button:base_report_creator.report_filter.fields,set_value_select_field,end:0 +#: view:report.menu.create:0 +msgid "Cancel" +msgstr "" + +#. module: base_report_creator +#: constraint:base_report_creator.report:0 +msgid "You can apply aggregate function to the non calculated field." +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,menu_id:0 +msgid "Menu" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,view_type1:0 +msgid "First View" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,calendar_mode:0 +msgid "Delay" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.fields,field_id:0 +msgid "Field" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,calendar_mode:0 +msgid "Unique Colors" +msgstr "" + +#. module: base_report_creator +#: help:base_report_creator.report,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the report " +"without removing it." +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_graph_type:0 +msgid "Pie Chart" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,view_type3:0 +msgid "Third View" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,calendar_mode:0 +msgid "End Date" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,name:0 +msgid "Report Name" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Fields" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Average" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "Use %(uid)s to filter by the connected user" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report.fields,group_method:0 +msgid "Maximum" +msgstr "" + +#. module: base_report_creator +#: wizard_button:base_report_creator.report_filter.fields,init,set_value_select_field:0 +msgid "Continue" +msgstr "" + +#. module: base_report_creator +#: wizard_field:base_report_creator.report_filter.fields,set_value_select_field,value:0 +msgid "Values" +msgstr "" + +#. module: base_report_creator +#: selection:base_report_creator.report,view_graph_type:0 +msgid "Bar Chart" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report,view_type2:0 +msgid "Second View" +msgstr "" + +#. module: base_report_creator +#: view:report.menu.create:0 +msgid "Create Menu For This Report" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +msgid "View parameters" +msgstr "" + +#. module: base_report_creator +#: field:base_report_creator.report.fields,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: base_report_creator +#: wizard_field:base_report_creator.report_filter.fields,init,field_id:0 +msgid "Filter Field" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: field:base_report_creator.report,field_ids:0 +msgid "Fields to Display" +msgstr "" + +#. module: base_report_creator +#: view:base_report_creator.report:0 +#: field:base_report_creator.report,filter_ids:0 +msgid "Filters" +msgstr "" + +#. module: base_report_creator +#: model:ir.module.module,description:base_report_creator.module_meta_information +msgid "" +"This module allows you to create any statistic\n" +"report on several objects. It's a SQL query builder and browser\n" +"for and users.\n" +"\n" +"After installing the module, it adds a menu to define custom report in\n" +"the \"Dashboard\" menu.\n" +msgstr "" diff --git a/addons/base_report_designer/__openerp__.py b/addons/base_report_designer/__openerp__.py index c5bbbbd34ec..a95235d8017 100644 --- a/addons/base_report_designer/__openerp__.py +++ b/addons/base_report_designer/__openerp__.py @@ -21,9 +21,9 @@ { - 'name': 'OpenOffice Report Designer Interface', + 'name': 'OpenOffice Report Designer', 'version': '0.1', - 'category': 'Tools', + 'category': 'Advanced Reporting', 'complexity': "normal", 'description': """ This module is used along with OpenERP OpenOffice Plugin. diff --git a/addons/base_report_designer/base_report_designer_installer.xml b/addons/base_report_designer/base_report_designer_installer.xml index b943c35c2ef..2774767af26 100644 --- a/addons/base_report_designer/base_report_designer_installer.xml +++ b/addons/base_report_designer/base_report_designer_installer.xml @@ -22,8 +22,8 @@