diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index 1b378e15e93..d1726d164b6 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -98,6 +98,7 @@ module named account_voucher.
'wizard/account_reconcile_view.xml',
'wizard/account_reconcile_partner_process_view.xml',
'wizard/account_automatic_reconcile_view.xml',
+ 'wizard/account_financial_report_view.xml',
'project/wizard/project_account_analytic_line_view.xml',
'account_end_fy.xml',
'account_invoice_view.xml',
diff --git a/addons/account/account.py b/addons/account/account.py
index 39e680fa414..38ed96d4aac 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -139,7 +139,7 @@ class account_account_type(osv.osv):
'Balance' will generally be used for cash accounts.
'Detail' will copy each existing journal item of the previous year, even the reconciled ones.
'Unreconciled' will copy only the journal items that were unreconciled on the first day of the new fiscal year."""),
- 'sign': fields.selection([(-1, 'Negative'), (1, 'Positive')], 'Sign on Reports', required=True, help='Allows you to change the sign of the balance amount displayed in the reports, so that you can see positive figures instead of negative ones in expenses accounts.'),
+ 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'),
'report_type':fields.selection([
('none','/'),
('income','Profit & Loss (Income Accounts)'),
@@ -431,9 +431,16 @@ class account_account(osv.osv):
return False
return True
+ def _check_account_type(self, cr, uid, ids, context=None):
+ for account in self.browse(cr, uid, ids, context=context):
+ if account.type in ('receivable', 'payable') and account.user_type.close_method != 'unreconciled':
+ return False
+ return True
+
_constraints = [
(_check_recursion, 'Error ! You can not create recursive accounts.', ['parent_id']),
- (_check_type, 'Configuration Error! \nYou cannot define children to an account with internal type different of "View"! ', ['type']),
+ (_check_type, 'Configuration Error! \nYou can not define children to an account with internal type different of "View"! ', ['type']),
+ (_check_account_type, 'Configuration Error! \nYou can not select an account type with a deferral method different of "Unreconciled" for accounts with internal type "Payable/Receivable"! ', ['user_type','type']),
]
_sql_constraints = [
('code_company_uniq', 'unique (code,company_id)', 'The code of the account must be unique per company !')
@@ -509,14 +516,14 @@ class account_account(osv.osv):
if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]):
if method == 'write':
- raise osv.except_osv(_('Error !'), _('You cannot deactivate an account that contains account moves.'))
+ raise osv.except_osv(_('Error !'), _('You can not desactivate an account that contains some journal items.'))
elif method == 'unlink':
- raise osv.except_osv(_('Error !'), _('You cannot remove an account which has account entries!. '))
+ raise osv.except_osv(_('Error !'), _('You can not remove an account containing journal items!. '))
#Checking whether the account is set as a property to any Partner or not
value = 'account.account,' + str(ids[0])
partner_prop_acc = self.pool.get('ir.property').search(cr, uid, [('value_reference','=',value)], context=context)
if partner_prop_acc:
- raise osv.except_osv(_('Warning !'), _('You cannot remove/deactivate an account which is set as a property to any Partner.'))
+ raise osv.except_osv(_('Warning !'), _('You can not remove/desactivate an account which is set on a customer or supplier.'))
return True
def _check_allow_type_change(self, cr, uid, ids, new_type, context=None):
@@ -529,15 +536,20 @@ class account_account(osv.osv):
if line_obj.search(cr, uid, [('account_id', 'in', account_ids)]):
#Check for 'Closed' type
if old_type == 'closed' and new_type !='closed':
- raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from 'Closed' to any other type which contains account entries!"))
+ raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from 'Closed' to any other type which contains journal items!"))
#Check for change From group1 to group2 and vice versa
if (old_type in group1 and new_type in group2) or (old_type in group2 and new_type in group1):
- raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from '%s' to '%s' type as it contains account entries!") % (old_type,new_type,))
+ raise osv.except_osv(_('Warning !'), _("You cannot change the type of account from '%s' to '%s' type as it contains journal items!") % (old_type,new_type,))
return True
def write(self, cr, uid, ids, vals, context=None):
+
if context is None:
context = {}
+ if not ids:
+ return True
+ if isinstance(ids, (int, long)):
+ ids = [ids]
# Dont allow changing the company_id when account_move_line already exist
if 'company_id' in vals:
@@ -623,7 +635,7 @@ class account_journal(osv.osv):
'currency': fields.many2one('res.currency', 'Currency', help='The currency used to enter statement'),
'entry_posted': fields.boolean('Skip \'Draft\' State for Manual Entries', help='Check this box if you don\'t want new journal entries to pass through the \'draft\' state and instead goes directly to the \'posted state\' without any manual validation. \nNote that journal entries that are automatically created by the system are always skipping that state.'),
'company_id': fields.many2one('res.company', 'Company', required=True, select=1, help="Company related to this journal"),
- 'allow_date':fields.boolean('Check Date not in the Period', help= 'If set to True then do not accept the entry if the entry date is not into the period dates'),
+ 'allow_date':fields.boolean('Check Date in Period', help= 'If set to True then do not accept the entry if the entry date is not into the period dates'),
}
_defaults = {
@@ -650,11 +662,13 @@ class account_journal(osv.osv):
def write(self, cr, uid, ids, vals, context=None):
if context is None:
context = {}
+ if isinstance(ids, (int, long)):
+ ids = [ids]
for journal in self.browse(cr, uid, ids, context=context):
if 'company_id' in vals and journal.company_id.id != vals['company_id']:
move_lines = self.pool.get('account.move.line').search(cr, uid, [('journal_id', 'in', ids)])
if move_lines:
- raise osv.except_osv(_('Warning !'), _('You cannot modify company of this journal as its related record exist in Entry Lines'))
+ raise osv.except_osv(_('Warning !'), _('You can not modify the company of this journal as its related record exist in journal items'))
return super(account_journal, self).write(cr, uid, ids, vals, context=context)
def create_sequence(self, cr, uid, vals, context=None):
@@ -800,8 +814,8 @@ class account_fiscalyear(osv.osv):
return True
_constraints = [
- (_check_duration, 'Error! The duration of the Fiscal Year is invalid. ', ['date_stop']),
- (_check_fiscal_year, 'Error! You cannot define overlapping fiscal years',['date_start', 'date_stop'])
+ (_check_duration, 'Error! The start date of the fiscal year must be before his end date.', ['date_start','date_stop']),
+ (_check_fiscal_year, 'Error! You can not define overlapping fiscal years for the same company.',['date_start', 'date_stop'])
]
def create_period3(self, cr, uid, ids, context=None):
@@ -879,7 +893,10 @@ class account_period(osv.osv):
'state': 'draft',
}
_order = "date_start, special desc"
-
+ _sql_constraints = [
+ ('name_company_uniq', 'unique(name, company_id)', 'The name of the period must be unique per company!'),
+ ]
+
def _check_duration(self,cr,uid,ids,context=None):
obj_period = self.browse(cr, uid, ids[0], context=context)
if obj_period.date_stop < obj_period.date_start:
@@ -952,7 +969,7 @@ class account_period(osv.osv):
if 'company_id' in vals:
move_lines = self.pool.get('account.move.line').search(cr, uid, [('period_id', 'in', ids)])
if move_lines:
- raise osv.except_osv(_('Warning !'), _('You cannot modify company of this period as its related record exist in Entry Lines'))
+ raise osv.except_osv(_('Warning !'), _('You can not modify company of this period as some journal items exists.'))
return super(account_period, self).write(cr, uid, ids, vals, context=context)
def build_ctx_periods(self, cr, uid, period_from_id, period_to_id):
@@ -1180,10 +1197,10 @@ class account_move(osv.osv):
_constraints = [
(_check_centralisation,
- 'You cannot create more than one move per period on centralized journal',
+ 'You can not create more than one move per period on centralized journal',
['journal_id']),
(_check_period_journal,
- 'You cannot create entries on different periods/journals in the same move',
+ 'You can not create journal items on different periods/journals in the same journal entry',
['line_id']),
]
@@ -1194,7 +1211,7 @@ class account_move(osv.osv):
valid_moves = self.validate(cr, uid, ids, context)
if not valid_moves:
- raise osv.except_osv(_('Integrity Error !'), _('You cannot validate a non-balanced entry !\nMake sure you have configured Payment Term properly !\nIt should contain atleast one Payment Term Line with type "Balance" !'))
+ raise osv.except_osv(_('Integrity Error !'), _('You can not validate a non-balanced entry !\nMake sure you have configured payment terms properly !\nThe latest payment term line should be of the type "Balance" !'))
obj_sequence = self.pool.get('ir.sequence')
for move in self.browse(cr, uid, valid_moves, context=context):
if move.name =='/':
@@ -1230,7 +1247,7 @@ class account_move(osv.osv):
if not top:
top = account2.id
elif top<>account2.id:
- raise osv.except_osv(_('Error !'), _('You cannot validate a Journal Entry unless all journal items are in same chart of accounts !'))
+ raise osv.except_osv(_('Error !'), _('You can not validate a journal entry unless all journal items belongs to the same chart of accounts !'))
return self.post(cursor, user, ids, context=context)
def button_cancel(self, cr, uid, ids, context=None):
@@ -1317,7 +1334,7 @@ class account_move(osv.osv):
for move in self.browse(cr, uid, ids, context=context):
if move['state'] != 'draft':
raise osv.except_osv(_('UserError'),
- _('You can not delete posted movement: "%s"!') % \
+ _('You can not delete a posted journal entry "%s"!') % \
move['name'])
line_ids = map(lambda x: x.id, move.line_id)
context['journal_id'] = move.journal_id.id
@@ -1337,7 +1354,7 @@ class account_move(osv.osv):
def _centralise(self, cr, uid, move, mode, context=None):
assert mode in ('debit', 'credit'), 'Invalid Mode' #to prevent sql injection
- currency_obj = self.pool.get('res.currency')
+ currency_obj = self.pool.get('res.currency')
if context is None:
context = {}
@@ -1599,7 +1616,7 @@ class account_tax_code(osv.osv):
(parent_ids,) + where_params)
res=dict(cr.fetchall())
obj_precision = self.pool.get('decimal.precision')
- res2 = {}
+ res2 = {}
for record in self.browse(cr, uid, ids, context=context):
def _rec_get(record):
amount = res.get(record.id, 0.0)
@@ -1768,6 +1785,9 @@ class account_tax(osv.osv):
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Application', required=True)
}
+ _sql_constraints = [
+ ('name_company_uniq', 'unique(name, company_id)', 'Tax Name must be unique per company!'),
+ ]
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
"""
@@ -2126,7 +2146,11 @@ class account_model(osv.osv):
period_id = period_id[0]
for model in self.browse(cr, uid, ids, context=context):
- entry['name'] = model.name%{'year':time.strftime('%Y'), 'month':time.strftime('%m'), 'date':time.strftime('%Y-%m')}
+ try:
+ entry['name'] = model.name%{'year':time.strftime('%Y'), 'month':time.strftime('%m'), 'date':time.strftime('%Y-%m')}
+ except:
+ raise osv.except_osv(_('Wrong model !'), _('You have a wrong expression "%(...)s" in your model !'))
+
move_id = account_move_obj.create(cr, uid, {
'ref': entry['name'],
'period_id': period_id,
@@ -2198,8 +2222,8 @@ class account_model_line(osv.osv):
}
_order = 'sequence'
_sql_constraints = [
- ('credit_debit1', 'CHECK (credit*debit=0)', 'Wrong credit or debit value in model (Credit Or Debit Must Be "0")!'),
- ('credit_debit2', 'CHECK (credit+debit>=0)', 'Wrong credit or debit value in model (Credit + Debit Must Be greater "0")!'),
+ ('credit_debit1', 'CHECK (credit*debit=0)', 'Wrong credit or debit value in model, they must be positive!'),
+ ('credit_debit2', 'CHECK (credit+debit>=0)', 'Wrong credit or debit value in model, they must be positive!'),
]
account_model_line()
@@ -2365,7 +2389,7 @@ class account_account_template(osv.osv):
_check_recursion = check_cycle
_constraints = [
(_check_recursion, 'Error ! You can not create recursive account templates.', ['parent_id']),
- (_check_type, 'Configuration Error! \nYou cannot define children to an account with internal type different of "View"! ', ['type']),
+ (_check_type, 'Configuration Error!\nYou can not define children to an account with internal type different of "View"! ', ['type']),
]
@@ -2398,7 +2422,7 @@ class account_add_tmpl_wizard(osv.osv_memory):
ptids = tmpl_obj.read(cr, uid, [tids[0]['parent_id'][0]], ['code'])
res = None
if not ptids or not ptids[0]['code']:
- raise osv.except_osv(_('Error !'), _('Cannot locate parent code for template account!'))
+ raise osv.except_osv(_('Error !'), _('I can not locate a parent code for the template account!'))
res = acc_obj.search(cr, uid, [('code','=',ptids[0]['code'])])
return res and res[0] or False
@@ -2613,7 +2637,88 @@ class account_fiscal_position_account_template(osv.osv):
account_fiscal_position_account_template()
- # Multi charts of Accounts wizard
+# ---------------------------------------------------------
+# Account Financial Report
+# ---------------------------------------------------------
+
+class account_financial_report(osv.osv):
+ _name = "account.financial.report"
+ _description = "Account Report"
+
+ def _get_level(self, cr, uid, ids, field_name, arg, context=None):
+ res = {}
+ for report in self.browse(cr, uid, ids, context=context):
+ level = 0
+ if report.parent_id:
+ level = report.parent_id.level + 1
+ res[report.id] = level
+ return res
+
+ def _get_children_by_order(self, cr, uid, ids, context=None):
+ res = []
+ for id in ids:
+ res.append(id)
+ ids2 = self.search(cr, uid, [('parent_id', '=', id)], order='sequence ASC', context=context)
+ res += self._get_children_by_order(cr, uid, ids2, context=context)
+ return res
+
+ def _get_balance(self, cr, uid, ids, name, args, context=None):
+ res = {}
+ res_all = {}
+ for report in self.browse(cr, uid, ids, context=context):
+ balance = 0.0
+ if report.id in res_all:
+ balance = res_all[report.id]
+ elif report.type == 'accounts':
+ # it's the sum of balance of the linked accounts
+ for a in report.account_ids:
+ balance += a.balance
+ elif report.type == 'account_report' and report.account_report_id:
+ # it's the amount of the linked report
+ res2 = self._get_balance(cr, uid, [report.account_report_id.id], 'balance', False, context=context)
+ res_all.update(res2)
+ for key, value in res2.items():
+ balance += value
+ elif report.type == 'sum':
+ # it's the sum of balance of the children of this account.report
+ #for child in report.children_ids:
+ res2 = self._get_balance(cr, uid, [rec.id for rec in report.children_ids], 'balance', False, context=context)
+ res_all.update(res2)
+ for key, value in res2.items():
+ balance += value
+ res[report.id] = balance
+ res_all[report.id] = balance
+ return res
+
+ _columns = {
+ 'name': fields.char('Report Name', size=128, required=True),
+ 'parent_id': fields.many2one('account.financial.report', 'Parent'),
+ 'children_ids': fields.one2many('account.financial.report', 'parent_id', 'Account Report'),
+ 'sequence': fields.integer('Sequence'),
+ 'note': fields.text('Notes'),
+ 'balance': fields.function(_get_balance, 'Balance'),
+ 'level': fields.function(_get_level, string='Level', store=True, type='integer'),
+ 'type': fields.selection([
+ ('sum','View'),
+ ('accounts','Accounts'),
+ ('account_type','Account Type'),
+ ('account_report','Report Value'),
+ ],'Type'),
+ 'account_ids': fields.many2many('account.account', 'account_account_financial_report', 'report_line_id', 'account_id', 'Accounts'),
+ 'display_detail': fields.boolean('Display details', help='Display every account with its balance instead of the sum.'),
+ 'account_report_id': fields.many2one('account.financial.report', 'Report Value'),
+ 'account_type_ids': fields.many2many('account.account.type', 'account_account_financial_report_type', 'report_id', 'account_type_id', 'Account Types'),
+ }
+
+ _defaults = {
+ 'type': 'sum',
+ }
+
+account_financial_report()
+
+# ---------------------------------------------------------
+# Account generation from template wizards
+# ---------------------------------------------------------
class wizard_multi_charts_accounts(osv.osv_memory):
"""
@@ -2706,7 +2811,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
unconfigured_cmp = list(set(company_ids)-set(configured_cmp))
for field in res['fields']:
if field == 'company_id':
- res['fields'][field]['domain'] = unconfigured_cmp
+ res['fields'][field]['domain'] = [('id','in',unconfigured_cmp)]
res['fields'][field]['selection'] = [('', '')]
if unconfigured_cmp:
cmp_select = [(line.id, line.name) for line in self.pool.get('res.company').browse(cr, uid, unconfigured_cmp)]
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 8b0161e7baa..d3386d9ac6d 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -58,13 +58,6 @@ class account_bank_statement(osv.osv):
journal_id = ids[0]
return journal_id
- def _default_balance_start(self, cr, uid, context=None):
- cr.execute('select id from account_bank_statement where journal_id=%s order by date desc limit 1', (1,))
- res = cr.fetchone()
- if res:
- return self.browse(cr, uid, res[0], context=context).balance_end
- return 0.0
-
def _end_balance(self, cursor, user, ids, name, attr, context=None):
res_currency_obj = self.pool.get('res.currency')
res_users_obj = self.pool.get('res.users')
@@ -90,7 +83,8 @@ class account_bank_statement(osv.osv):
res[statement.id] -= res_currency_obj.compute(cursor,
user, company_currency_id, currency_id,
line.credit, context=context)
- if statement.state == 'draft':
+
+ if statement.state in ('draft', 'open'):
for line in statement.line_ids:
res[statement.id] += line.amount
for r in res:
@@ -127,7 +121,7 @@ class account_bank_statement(osv.osv):
_name = "account.bank.statement"
_description = "Bank Statement"
_columns = {
- 'name': fields.char('Name', size=64, required=True, help='if you give the Name other then /, its created Accounting Entries Move will be with same name as statement name. This allows the statement entries to have the same references than the statement itself', states={'confirm': [('readonly', True)]}),
+ 'name': fields.char('Name', size=64, required=True, states={'draft': [('readonly', False)]}, readonly=True, help='if you give the Name other then /, its created Accounting Entries Move will be with same name as statement name. This allows the statement entries to have the same references than the statement itself'), # readonly for account_cash_statement
'date': fields.date('Date', required=True, states={'confirm': [('readonly', True)]}),
'journal_id': fields.many2one('account.journal', 'Journal', required=True,
readonly=True, states={'draft':[('readonly',False)]}),
@@ -136,19 +130,21 @@ class account_bank_statement(osv.osv):
'balance_start': fields.float('Starting Balance', digits_compute=dp.get_precision('Account'),
states={'confirm':[('readonly',True)]}),
'balance_end_real': fields.float('Ending Balance', digits_compute=dp.get_precision('Account'),
- states={'confirm':[('readonly', True)]}),
- 'balance_end': fields.function(_end_balance, string='Balance'),
+ states={'confirm': [('readonly', True)]}),
+ 'balance_end': fields.function(_end_balance, store=True, # store=True for account_cash_statement
+ string="Balance", help='Balance as calculated based on Starting Balance and transaction lines'),
'company_id': fields.related('journal_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, readonly=True),
'line_ids': fields.one2many('account.bank.statement.line',
'statement_id', 'Statement lines',
states={'confirm':[('readonly', True)]}),
'move_line_ids': fields.one2many('account.move.line', 'statement_id',
'Entry lines', states={'confirm':[('readonly',True)]}),
- 'state': fields.selection([('draft', 'New'),('confirm', 'Confirmed')],
- 'State', required=True,
- states={'confirm': [('readonly', True)]}, readonly="1",
- help='When new statement is created the state will be \'Draft\'. \
- \n* And after getting confirmation from the bank it will be in \'Confirmed\' state.'),
+ 'state': fields.selection([('draft', 'New'),
+ ('open','Open'), # used by cash statements
+ ('confirm', 'Closed')],
+ 'State', required=True, readonly="1",
+ help='When new statement is created the state will be \'Draft\'.\n'
+ 'And after getting confirmation from the bank it will be in \'Confirmed\' state.'),
'currency': fields.function(_currency, string='Currency',
type='many2one', relation='res.currency'),
'account_id': fields.related('journal_id', 'default_debit_account_id', type='many2one', relation='account.account', string='Account used in this journal', readonly=True, help='used in statement reconciliation domain, but shouldn\'t be used elswhere.'),
@@ -158,7 +154,6 @@ class account_bank_statement(osv.osv):
'name': "/",
'date': lambda *a: time.strftime('%Y-%m-%d'),
'state': 'draft',
- 'balance_start': _default_balance_start,
'journal_id': _default_journal_id,
'period_id': _get_period,
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.bank.statement',context=c),
@@ -386,7 +381,7 @@ class account_bank_statement(osv.osv):
if t['state'] in ('draft'):
unlink_ids.append(t['id'])
else:
- raise osv.except_osv(_('Invalid action !'), _('Cannot delete bank statement(s) which are already confirmed !'))
+ raise osv.except_osv(_('Invalid action !'), _('In order to delete a bank statement, you must first cancel it to delete related journal items.'))
osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
return True
diff --git a/addons/account/account_cash_statement.py b/addons/account/account_cash_statement.py
index 982383ea2a7..3957e75c860 100644
--- a/addons/account/account_cash_statement.py
+++ b/addons/account/account_cash_statement.py
@@ -119,39 +119,6 @@ class account_cash_statement(osv.osv):
res2[statement.id] = encoding_total
return res2
- def _end_balance(self, cursor, user, ids, name, attr, context=None):
- res_currency_obj = self.pool.get('res.currency')
- res_users_obj = self.pool.get('res.users')
- res = {}
-
- company_currency_id = res_users_obj.browse(cursor, user, user,
- context=context).company_id.currency_id.id
-
- statements = self.browse(cursor, user, ids, context=context)
- for statement in statements:
- res[statement.id] = statement.balance_start
- currency_id = statement.currency.id
- for line in statement.move_line_ids:
- if line.debit > 0:
- if line.account_id.id == \
- statement.journal_id.default_debit_account_id.id:
- res[statement.id] += res_currency_obj.compute(cursor,
- user, company_currency_id, currency_id,
- line.debit, context=context)
- else:
- if line.account_id.id == \
- statement.journal_id.default_credit_account_id.id:
- res[statement.id] -= res_currency_obj.compute(cursor,
- user, company_currency_id, currency_id,
- line.credit, context=context)
-
- if statement.state in ('draft', 'open'):
- for line in statement.line_ids:
- res[statement.id] += line.amount
- for r in res:
- res[r] = round(res[r], 2)
- return res
-
def _get_company(self, cr, uid, context=None):
user_pool = self.pool.get('res.users')
company_pool = self.pool.get('res.company')
@@ -218,18 +185,11 @@ class account_cash_statement(osv.osv):
return res
_columns = {
- 'balance_end_real': fields.float('Closing Balance', digits_compute=dp.get_precision('Account'), states={'confirm': [('readonly', True)]}, help="closing balance entered by the cashbox verifier"),
- 'state': fields.selection(
- [('draft', 'Draft'),
- ('confirm', 'Closed'),
- ('open','Open')], 'State', required=True, states={'confirm': [('readonly', True)]}, readonly="1"),
'total_entry_encoding': fields.function(_get_sum_entry_encoding, store=True, string="Cash Transaction", help="Total cash transactions"),
'closing_date': fields.datetime("Closed On"),
- 'balance_end': fields.function(_end_balance, store=True, string='Balance', help="Closing balance based on Starting Balance and Cash Transactions"),
'balance_end_cash': fields.function(_balance_end_cash, store=True, string='Balance', help="Closing balance based on cashBox"),
'starting_details_ids': fields.one2many('account.cashbox.line', 'starting_id', string='Opening Cashbox'),
'ending_details_ids': fields.one2many('account.cashbox.line', 'ending_id', string='Closing Cashbox'),
- 'name': fields.char('Name', size=64, required=True, states={'draft': [('readonly', False)]}, readonly=True, help='if you give the Name other then /, its created Accounting Entries Move will be with same name as statement name. This allows the statement entries to have the same references than the statement itself'),
'user_id': fields.many2one('res.users', 'Responsible', required=False),
}
_defaults = {
@@ -247,7 +207,7 @@ class account_cash_statement(osv.osv):
]
open_jrnl = self.search(cr, uid, sql)
if open_jrnl:
- raise osv.except_osv(_('Error'), _('You can not have two open register for the same journal'))
+ raise osv.except_osv(_('Error'), _('You can not have two open register for the same journal!'))
if self.pool.get('account.journal').browse(cr, uid, vals['journal_id'], context=context).type == 'cash':
open_close = self._get_cash_open_close_box_lines(cr, uid, context)
diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml
index 151f7bbc0f0..374304135df 100644
--- a/addons/account/account_installer.xml
+++ b/addons/account/account_installer.xml
@@ -23,7 +23,7 @@
23
-
+
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index d440f2efc90..09a90b98686 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -294,7 +294,7 @@
-
+
@@ -355,7 +355,7 @@
search
-
+
@@ -364,16 +364,16 @@
-
-
+
+
-
-
-
+
+
+
diff --git a/addons/account/account_menuitem.xml b/addons/account/account_menuitem.xml
index 062e1f6382b..89538603ae7 100644
--- a/addons/account/account_menuitem.xml
+++ b/addons/account/account_menuitem.xml
@@ -30,6 +30,7 @@
+
diff --git a/addons/account/report/account_tax_code.rml b/addons/account/report/account_tax_code.rml
index 7489ac72a39..10a7c76a821 100644
--- a/addons/account/report/account_tax_code.rml
+++ b/addons/account/report/account_tax_code.rml
@@ -129,10 +129,10 @@
[[ line['name'] ]]
@@ -141,4 +141,4 @@
-
\ No newline at end of file
+
diff --git a/addons/account/report/account_tax_report.rml b/addons/account/report/account_tax_report.rml
index de4aa415fef..f489ee1143e 100644
--- a/addons/account/report/account_tax_report.rml
+++ b/addons/account/report/account_tax_report.rml
@@ -153,7 +153,7 @@
[[ repeatIn(get_lines(data['form']['based_on'], data['form']['company_id']), 'o') ]][[ (o['level']) ]] [[ (len(o['level'])<5 and setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]][[ o['code'] ]] [[ o['name'] ]]
[[ len(o['level'])<5 and setTag('para','para',{'fontName':"Helvetica-Bold"}) or removeParentNode('font')]][[ o['type']=='view' and removeParentNode('font') ]][[ formatLang(o['debit']) ]][[ o['type']<>'view' and removeParentNode('font') ]][[ formatLang(o['debit']) ]]
[[ len(o['level'])<5 and setTag('para','para',{'fontName':"Helvetica-Bold"}) or removeParentNode('font')]][[ o['type']=='view' and removeParentNode('font') ]][[ formatLang(o['credit']) ]][[ o['type']<>'view' and removeParentNode('font') ]][[ formatLang(o['credit'])]]
-
[[ len(o['level'])<5 and setTag('para','para',{'fontName':"Helvetica-Bold"}) or removeParentNode('font')]][[ o['type']=='view' and removeParentNode('font') ]][[ formatLang(o['tax_amount']) ]] [[ company.currency_id.symbol ]][[ o['type']<>'view' and removeParentNode('font') ]][[ formatLang(o['tax_amount']) ]] [[ company.currency_id.symbol ]]
+
[[ len(o['level'])<5 and setTag('para','para',{'fontName':"Helvetica-Bold"}) or removeParentNode('font')]][[ o['type']=='view' and removeParentNode('font') ]][[ formatLang(o['tax_amount'], currency_obj=company.currency_id) ]][[ o['type']<>'view' and removeParentNode('font') ]][[ formatLang(o['tax_amount'], currency_obj=company.currency_id) ]]
diff --git a/addons/account/report/common_report_header.py b/addons/account/report/common_report_header.py
index 48e26e839d3..5769248405f 100644
--- a/addons/account/report/common_report_header.py
+++ b/addons/account/report/common_report_header.py
@@ -94,10 +94,10 @@ class common_report_header(object):
def _get_filter(self, data):
if data.get('form', False) and data['form'].get('filter', False):
if data['form']['filter'] == 'filter_date':
- return _('Date')
+ return 'Date'
elif data['form']['filter'] == 'filter_period':
- return _('Periods')
- return _('No Filter')
+ return 'Periods'
+ return 'No Filter'
def _sum_debit_period(self, period_id, journal_id=None):
journals = journal_id or self.journal_ids
diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv
index cd945a2248d..79e4dbb0c03 100644
--- a/addons/account/security/ir.model.access.csv
+++ b/addons/account/security/ir.model.access.csv
@@ -67,6 +67,7 @@
"access_account_fiscalyear_employee","account.fiscalyear employee","model_account_fiscalyear","base.group_user",1,0,0,0
"access_res_currency_account_manager","res.currency account manager","base.model_res_currency","group_account_manager",1,1,1,1
"access_res_currency_rate_account_manager","res.currency.rate account manager","base.model_res_currency_rate","group_account_manager",1,1,1,1
+"access_res_currency_rate_type_account_manager","res.currency.rate.type account manager","base.model_res_currency_rate_type","group_account_manager",1,1,1,1
"access_account_invoice_user","account.invoice user","model_account_invoice","base.group_user",1,0,0,0
"access_account_invoice_user","account.invoice.line user","model_account_invoice_line","base.group_user",1,0,0,0
"access_account_payment_term_partner_manager","account.payment.term partner manager","model_account_payment_term","base.group_user",1,0,0,0
@@ -127,4 +128,7 @@
"access_account_sequence_fiscal_year_sale_user","account.sequence.fiscalyear.sale.user","model_account_sequence_fiscalyear","base.group_sale_salesman",1,1,1,0
"access_account_sequence_fiscal_year_sale_manager","account.sequence.fiscalyear.sale.manager","model_account_sequence_fiscalyear","base.group_sale_manager",1,1,1,1
"access_account_treasury_report_manager","account.treasury.report.manager","model_account_treasury_report","account.group_account_manager",1,0,0,0
+"access_account_financial_report","account.financial.report","model_account_financial_report","account.group_account_user",1,1,1,1
+"access_account_financial_report_invoice","account.financial.report invoice","model_account_financial_report","account.group_account_invoice",1,0,0,0
+"access_account_financial_report_manager","account.financial.report","model_account_financial_report","account.group_account_manager",1,1,1,1
diff --git a/addons/account/wizard/__init__.py b/addons/account/wizard/__init__.py
index caed6fc3977..d82eff62142 100644
--- a/addons/account/wizard/__init__.py
+++ b/addons/account/wizard/__init__.py
@@ -47,6 +47,7 @@ import account_open_closed_fiscalyear
import account_invoice_state
import account_chart
import account_tax_chart
+import account_financial_report
#TODO: remove this file no moe used
# also remove related view fiel
diff --git a/addons/account/wizard/account_financial_report.py b/addons/account/wizard/account_financial_report.py
new file mode 100644
index 00000000000..de9cae3a00c
--- /dev/null
+++ b/addons/account/wizard/account_financial_report.py
@@ -0,0 +1,86 @@
+# -*- 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 osv import fields, osv
+
+class accounting_report(osv.osv_memory):
+ _name = "accounting.report"
+ _inherit = "account.common.report"
+ _description = "Accounting Report"
+
+ _columns = {
+ 'enable_filter': fields.boolean('Enable Comparison'),
+ 'account_report_id': fields.many2one('account.financial.report', 'Account Reports', required=True),
+ 'label_filter': fields.char('Column Label', size=32, help="This label will be displayed on report to show the balance computed for the given comparison filter."),
+ 'fiscalyear_id_cmp': fields.many2one('account.fiscalyear', 'Fiscal Year', help='Keep empty for all open fiscal year'),
+ 'filter_cmp': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods')], "Filter by", required=True),
+ 'period_from_cmp': fields.many2one('account.period', 'Start Period'),
+ 'period_to_cmp': fields.many2one('account.period', 'End Period'),
+ 'date_from_cmp': fields.date("Start Date"),
+ 'date_to_cmp': fields.date("End Date"),
+ }
+
+ _defaults = {
+ 'filter_cmp': 'filter_no',
+ 'target_move': 'posted',
+ }
+
+ def _build_comparison_context(self, cr, uid, ids, data, context=None):
+ if context is None:
+ context = {}
+ result = {}
+ result['fiscalyear'] = 'fiscalyear_id_cmp' in data['form'] and data['form']['fiscalyear_id_cmp'] or False
+ result['journal_ids'] = 'journal_ids' in data['form'] and data['form']['journal_ids'] or False
+ result['chart_account_id'] = 'chart_account_id' in data['form'] and data['form']['chart_account_id'] or False
+ if data['form']['filter_cmp'] == 'filter_date':
+ result['date_from'] = data['form']['date_from_cmp']
+ result['date_to'] = data['form']['date_to_cmp']
+ elif data['form']['filter_cmp'] == 'filter_period':
+ if not data['form']['period_from_cmp'] or not data['form']['period_to_cmp']:
+ raise osv.except_osv(_('Error'),_('Select a starting and an ending period'))
+ result['period_from'] = data['form']['period_from_cmp']
+ result['period_to'] = data['form']['period_to_cmp']
+ return result
+
+ def check_report(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
+ res = super(accounting_report, self).check_report(cr, uid, ids, context=context)
+ data = {}
+ data['form'] = self.read(cr, uid, ids, ['account_report_id', 'date_from_cmp', 'date_to_cmp', 'fiscalyear_id_cmp', 'journal_ids', 'period_from_cmp', 'period_to_cmp', 'filter_cmp', 'chart_account_id', 'target_move'], context=context)[0]
+ for field in ['fiscalyear_id_cmp', 'chart_account_id', 'period_from_cmp', 'period_to_cmp', 'account_report_id']:
+ if isinstance(data['form'][field], tuple):
+ data['form'][field] = data['form'][field][0]
+ comparison_context = self._build_comparison_context(cr, uid, ids, data, context=context)
+ res['datas']['form']['comparison_context'] = comparison_context
+ return res
+
+ def _print_report(self, cr, uid, ids, data, context=None):
+ data['form'].update(self.read(cr, uid, ids, ['date_from_cmp', 'date_to_cmp', 'fiscalyear_id_cmp', 'period_from_cmp', 'period_to_cmp', 'filter_cmp', 'account_report_id', 'enable_filter', 'label_filter'], context=context)[0])
+ return {
+ 'type': 'ir.actions.report.xml',
+ 'report_name': 'account.financial.report',
+ 'datas': data,
+ }
+
+accounting_report()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/wizard/account_financial_report_view.xml b/addons/account/wizard/account_financial_report_view.xml
new file mode 100644
index 00000000000..1472da4ba87
--- /dev/null
+++ b/addons/account/wizard/account_financial_report_view.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+ Accounting Report
+ accounting.report
+ form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Financial Reports
+ accounting.report
+ ir.actions.act_window
+ form
+ form
+
+ new
+
+
+
+
+
+
diff --git a/addons/account/wizard/account_invoice_refund.py b/addons/account/wizard/account_invoice_refund.py
index 74feaca27be..8de1dc79bfb 100644
--- a/addons/account/wizard/account_invoice_refund.py
+++ b/addons/account/wizard/account_invoice_refund.py
@@ -41,12 +41,16 @@ class account_invoice_refund(osv.osv_memory):
def _get_journal(self, cr, uid, context=None):
obj_journal = self.pool.get('account.journal')
+ user_obj = self.pool.get('res.users')
if context is None:
context = {}
- journal = obj_journal.search(cr, uid, [('type', '=', 'sale_refund')])
- if context.get('type', False):
- if context['type'] in ('in_invoice', 'in_refund'):
- journal = obj_journal.search(cr, uid, [('type', '=', 'purchase_refund')])
+ inv_type = context.get('type', 'out_invoice')
+ company_id = user_obj.browse(cr, uid, uid, context=context).company_id.id
+ type = (inv_type == 'out_invoice') and 'sale_refund' or \
+ (inv_type == 'out_refund') and 'sale' or \
+ (inv_type == 'in_invoice') and 'purchase_refund' or \
+ (inv_type == 'in_refund') and 'purchase'
+ journal = obj_journal.search(cr, uid, [('type', '=', type), ('company_id','=',company_id)], limit=1, context=context)
return journal and journal[0] or False
_defaults = {
@@ -57,15 +61,17 @@ class account_invoice_refund(osv.osv_memory):
def fields_view_get(self, cr, uid, view_id=None, view_type=False, context=None, toolbar=False, submenu=False):
journal_obj = self.pool.get('account.journal')
+ user_obj = self.pool.get('res.users')
res = super(account_invoice_refund,self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
- type = context.get('journal_type', 'sale_refund')
- if type in ('sale', 'sale_refund'):
- type = 'sale_refund'
- else:
- type = 'purchase_refund'
+ type = context.get('type', 'out_invoice')
+ company_id = user_obj.browse(cr, uid, uid, context=context).company_id.id
+ journal_type = (type == 'out_invoice') and 'sale_refund' or \
+ (type == 'out_refund') and 'sale' or \
+ (type == 'in_invoice') and 'purchase_refund' or \
+ (type == 'in_refund') and 'purchase'
for field in res['fields']:
if field == 'journal_id':
- journal_select = journal_obj._name_search(cr, uid, '', [('type', '=', type)], context=context, limit=None, name_get_uid=1)
+ journal_select = journal_obj._name_search(cr, uid, '', [('type', '=', journal_type), ('company_id','child_of',[company_id])], context=context)
res['fields'][field]['selection'] = journal_select
return res
@@ -198,10 +204,10 @@ class account_invoice_refund(osv.osv_memory):
if 'value' in data and data['value']:
inv_obj.write(cr, uid, [inv_id], data['value'])
created_inv.append(inv_id)
- if inv.type in ('out_invoice', 'out_refund'):
- xml_id = 'action_invoice_tree3'
- else:
- xml_id = 'action_invoice_tree4'
+ xml_id = (inv.type == 'out_refund') and 'action_invoice_tree1' or \
+ (inv.type == 'in_refund') and 'action_invoice_tree2' or \
+ (inv.type == 'out_invoice') and 'action_invoice_tree3' or \
+ (inv.type == 'in_invoice') and 'action_invoice_tree4'
result = mod_obj.get_object_reference(cr, uid, 'account', xml_id)
id = result and result[1] or False
result = act_obj.read(cr, uid, id, context=context)
diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py
index 30bac2ae1fd..d03051b2ccb 100644
--- a/addons/account/wizard/account_reconcile.py
+++ b/addons/account/wizard/account_reconcile.py
@@ -110,7 +110,7 @@ class account_move_line_reconcile_writeoff(osv.osv_memory):
It opens the write off wizard form, in that user can define the journal, account, analytic account for reconcile
"""
_name = 'account.move.line.reconcile.writeoff'
- _description = 'Account move line reconcile'
+ _description = 'Account move line reconcile (writeoff)'
_columns = {
'journal_id': fields.many2one('account.journal','Write-Off Journal', required=True),
'writeoff_acc_id': fields.many2one('account.account','Write-Off account', required=True),
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
index 4ee4693abcb..bfb7a892668 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
@@ -11,7 +11,7 @@
[('invoice_id','=',False)]
-
+ Overpassed Accounts
@@ -20,6 +20,6 @@
tree,form,graph[('date','<=',time.strftime('%Y-%m-%d')),('state','=','open')]
-
+
diff --git a/addons/account_analytic_analysis/i18n/mk.po b/addons/account_analytic_analysis/i18n/mk.po
new file mode 100644
index 00000000000..81d5d115207
--- /dev/null
+++ b/addons/account_analytic_analysis/i18n/mk.po
@@ -0,0 +1,296 @@
+# Macedonian 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-14 08:10+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Macedonian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-09-15 04:47+0000\n"
+"X-Generator: Launchpad (build 13921)\n"
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,hours_qtt_invoiced:0
+msgid ""
+"Number of hours that can be invoiced plus those that already have been "
+"invoiced."
+msgstr ""
+"Број на часови кои можат да бидат фактурирани, плус часови кои веќе се "
+"фактурирани."
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,remaining_ca:0
+msgid "Computed using the formula: Max Invoice Price - Invoiced Amount."
+msgstr ""
+"Пресметано според формулата: Максимална фактурирана цена - Фактурирана цена."
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,remaining_hours:0
+msgid "Computed using the formula: Maximum Quantity - Hours Tot."
+msgstr "Пресметано според формулата: Максимална количина - Вкупно часови"
+
+#. module: account_analytic_analysis
+#: code:addons/account_analytic_analysis/account_analytic_analysis.py:532
+#: code:addons/account_analytic_analysis/account_analytic_analysis.py:703
+#, python-format
+msgid "AccessError"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,last_invoice_date:0
+msgid "Date of the last invoice created for this analytic account."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.module.module,description:account_analytic_analysis.module_meta_information
+msgid ""
+"\n"
+"This module is for modifying account analytic view to show\n"
+"important data to project manager of services companies.\n"
+"Adds menu to show relevant information to each manager..\n"
+"\n"
+"You can also view the report of account analytic summary\n"
+"user-wise as well as month wise.\n"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,last_invoice_date:0
+msgid "Last Invoice Date"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,theorical_margin:0
+msgid "Computed using the formula: Theorial Revenue - Total Costs"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,real_margin_rate:0
+msgid "Real Margin Rate (%)"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,ca_theorical:0
+msgid "Theoretical Revenue"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,last_worked_invoiced_date:0
+msgid ""
+"If invoice from the costs, this is the date of the latest work or cost that "
+"have been invoiced."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.ui.menu,name:account_analytic_analysis.menu_invoicing
+msgid "Billing"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,last_worked_date:0
+msgid "Date of Last Cost/Work"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,total_cost:0
+msgid "Total Costs"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,hours_quantity:0
+msgid ""
+"Number of hours you spent on the analytic account (from timesheet). It "
+"computes on all journal of type 'general'."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,remaining_hours:0
+msgid "Remaining Hours"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,theorical_margin:0
+msgid "Theoretical Margin"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,ca_theorical:0
+msgid ""
+"Based on the costs you had on the project, what would have been the revenue "
+"if all these costs have been invoiced at the normal sale price provided by "
+"the pricelist."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,user_ids:0
+#: field:account_analytic_analysis.summary.user,user:0
+msgid "User"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,ca_to_invoice:0
+msgid "Uninvoiced Amount"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,real_margin:0
+msgid "Computed using the formula: Invoiced Amount - Total Costs."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,hours_qtt_non_invoiced:0
+msgid "Uninvoiced Hours"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,last_worked_date:0
+msgid "Date of the latest work done on this account."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.module.module,shortdesc:account_analytic_analysis.module_meta_information
+msgid "report_account_analytic"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.model,name:account_analytic_analysis.model_account_analytic_analysis_summary_user
+msgid "Hours Summary by User"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,ca_invoiced:0
+msgid "Invoiced Amount"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: code:addons/account_analytic_analysis/account_analytic_analysis.py:533
+#: code:addons/account_analytic_analysis/account_analytic_analysis.py:704
+#, python-format
+msgid "You try to bypass an access rule (Document type: %s)."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,last_worked_invoiced_date:0
+msgid "Date of Last Invoiced Cost"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,hours_qtt_invoiced:0
+msgid "Invoiced Hours"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,real_margin:0
+msgid "Real Margin"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: constraint:account.analytic.account:0
+msgid ""
+"Error! The currency has to be the same as the currency of the selected "
+"company"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,ca_invoiced:0
+msgid "Total customer invoiced amount for this account."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.model,name:account_analytic_analysis.model_account_analytic_analysis_summary_month
+msgid "Hours summary by month"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,real_margin_rate:0
+msgid "Computes using the formula: (Real Margin / Total Costs) * 100."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,hours_qtt_non_invoiced:0
+msgid ""
+"Number of hours (from journal of type 'general') that can be invoiced if you "
+"invoice based on analytic account."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: view:account.analytic.account:0
+msgid "Analytic accounts"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,remaining_ca:0
+msgid "Remaining Revenue"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,ca_to_invoice:0
+msgid ""
+"If invoice from analytic account, the remaining amount you can invoice to "
+"the customer based on the total costs."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,revenue_per_hour:0
+msgid "Computed using the formula: Invoiced Amount / Hours Tot."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,revenue_per_hour:0
+msgid "Revenue per Hours (real)"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account_analytic_analysis.summary.month,unit_amount:0
+#: field:account_analytic_analysis.summary.user,unit_amount:0
+msgid "Total Time"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,month_ids:0
+#: field:account_analytic_analysis.summary.month,month:0
+msgid "Month"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account_analytic_analysis.summary.month,account_id:0
+#: field:account_analytic_analysis.summary.user,account_id:0
+#: model:ir.model,name:account_analytic_analysis.model_account_analytic_account
+msgid "Analytic Account"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_overpassed
+#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_managed_overpassed
+msgid "Overpassed Accounts"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: model:ir.actions.act_window,name:account_analytic_analysis.action_hr_tree_invoiced_all
+#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_hr_tree_invoiced_all
+msgid "All Uninvoiced Entries"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: field:account.analytic.account,hours_quantity:0
+msgid "Hours Tot"
+msgstr ""
+
+#. module: account_analytic_analysis
+#: constraint:account.analytic.account:0
+msgid "Error! You can not create recursive analytic accounts."
+msgstr ""
+
+#. module: account_analytic_analysis
+#: help:account.analytic.account,total_cost:0
+msgid ""
+"Total of costs for this account. It includes real costs (from invoices) and "
+"indirect costs, like time spent on timesheets."
+msgstr ""
diff --git a/addons/account_analytic_default/__openerp__.py b/addons/account_analytic_default/__openerp__.py
index c2bea6783df..07cde53d003 100644
--- a/addons/account_analytic_default/__openerp__.py
+++ b/addons/account_analytic_default/__openerp__.py
@@ -39,7 +39,11 @@ Allows to automatically select analytic accounts based on criterions:
'images' : ['images/analytic_defaults.jpeg'],
'depends' : ['sale'],
'init_xml' : [],
- 'update_xml': ['security/ir.model.access.csv', 'account_analytic_default_view.xml'],
+ 'update_xml': [
+ 'security/ir.model.access.csv',
+ 'security/account_analytic_default_security.xml',
+ 'account_analytic_default_view.xml'
+ ],
'demo_xml' : [],
'installable': True,
'active': False,
diff --git a/addons/account_analytic_default/account_analytic_default_view.xml b/addons/account_analytic_default/account_analytic_default_view.xml
index f078ba09c22..753765019f6 100644
--- a/addons/account_analytic_default/account_analytic_default_view.xml
+++ b/addons/account_analytic_default/account_analytic_default_view.xml
@@ -44,7 +44,7 @@
search
-
+
diff --git a/addons/account_analytic_default/security/account_analytic_default_security.xml b/addons/account_analytic_default/security/account_analytic_default_security.xml
new file mode 100644
index 00000000000..7ff68c7d849
--- /dev/null
+++ b/addons/account_analytic_default/security/account_analytic_default_security.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Analytic Default multi company rule
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+
+
+
diff --git a/addons/account_analytic_plans/report/crossovered_analytic.rml b/addons/account_analytic_plans/report/crossovered_analytic.rml
index 6e331ed1b83..f374aa5a2c2 100644
--- a/addons/account_analytic_plans/report/crossovered_analytic.rml
+++ b/addons/account_analytic_plans/report/crossovered_analytic.rml
@@ -240,7 +240,7 @@
[[ formatLang(a['ref_qty']) ]]
+
+
+
+
+
+
+
+
+
+
+
-
@@ -380,7 +378,7 @@
search
-
+
@@ -391,7 +389,7 @@
-
+
@@ -462,8 +460,8 @@
search
-
-
+
+
@@ -482,7 +480,7 @@
sequence="11"
/>
- Salary Rule Categories
+ Salary Rule Categories Hierarchyhr.salary.rule.categorytree
@@ -663,8 +661,8 @@
search
-
-
+
+
@@ -683,6 +681,7 @@
+
@@ -734,7 +733,18 @@
id="act_hr_employee_payslip_list"
groups="base.group_hr_manager"/>
-
+
+
+
diff --git a/addons/hr_payroll/report/report_payslip_details.py b/addons/hr_payroll/report/report_payslip_details.py
index e8df94d3b5a..1e9839eaa6f 100644
--- a/addons/hr_payroll/report/report_payslip_details.py
+++ b/addons/hr_payroll/report/report_payslip_details.py
@@ -43,7 +43,7 @@ class payslip_details_report(report_sxw.rml_parse):
return []
if rule_categories[0].parent_id:
rule_categories.insert(0, rule_categories[0].parent_id)
- self.get_recursive_parent(rule_categories)
+ get_recursive_parent(rule_categories)
return rule_categories
res = []
diff --git a/addons/hr_payroll_account/__init__.py b/addons/hr_payroll_account/__init__.py
index ee7125d5411..ffe4b707ac0 100644
--- a/addons/hr_payroll_account/__init__.py
+++ b/addons/hr_payroll_account/__init__.py
@@ -21,5 +21,6 @@
##############################################################################
import hr_payroll_account
+import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/hr_payroll_account/hr_payroll_account.py b/addons/hr_payroll_account/hr_payroll_account.py
index 1ff19e01bb1..8e4e73458f2 100644
--- a/addons/hr_payroll_account/hr_payroll_account.py
+++ b/addons/hr_payroll_account/hr_payroll_account.py
@@ -39,6 +39,13 @@ class hr_payslip(osv.osv):
'journal_id': fields.many2one('account.journal', 'Expense Journal',states={'draft': [('readonly', False)]}, readonly=True, required=True),
'move_id': fields.many2one('account.move', 'Accounting Entry', readonly=True),
}
+
+ def create(self, cr, uid, vals, context=None):
+ if context is None:
+ context = {}
+ if 'journal_id' in context:
+ vals.update({'journal_id': context.get('journal_id')})
+ return super(hr_payslip, self).create(cr, uid, vals, context=context)
def onchange_contract_id(self, cr, uid, ids, date_from, date_to, employee_id=False, contract_id=False, context=None):
contract_obj = self.pool.get('hr.contract')
@@ -174,5 +181,14 @@ class hr_contract(osv.osv):
}
hr_contract()
+class hr_payslip_run(osv.osv):
+
+ _inherit = 'hr.payslip.run'
+ _description = 'Payslip Run'
+ _columns = {
+ 'journal_id': fields.many2one('account.journal', 'Expense Journal', states={'draft': [('readonly', False)]}, readonly=True, required=True),
+ }
+
+hr_payslip_run()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_payroll_account/hr_payroll_account_view.xml b/addons/hr_payroll_account/hr_payroll_account_view.xml
index 825fac9cab4..667b1308ec5 100644
--- a/addons/hr_payroll_account/hr_payroll_account_view.xml
+++ b/addons/hr_payroll_account/hr_payroll_account_view.xml
@@ -51,6 +51,46 @@
+
+
+
+ hr.payslip.run.search.inherit
+ hr.payslip.run
+ search
+
+
+
+
+
+
+
+
+
+
+ hr.payslip.run.tree.inherit
+ hr.payslip.run
+ tree
+
+
+
+
+
+
+
+
+
+ hr.payslip.run.form.inherit
+ hr.payslip.run
+ form
+
+
+
+
+
+
+
+
+
diff --git a/addons/hr_payroll_account/wizard/__init__.py b/addons/hr_payroll_account/wizard/__init__.py
new file mode 100644
index 00000000000..27128f05597
--- /dev/null
+++ b/addons/hr_payroll_account/wizard/__init__.py
@@ -0,0 +1,25 @@
+#-*- coding:utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved
+# d$
+#
+# 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 hr_payroll_payslips_by_employees
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py
new file mode 100644
index 00000000000..a00ff97ef6b
--- /dev/null
+++ b/addons/hr_payroll_account/wizard/hr_payroll_payslips_by_employees.py
@@ -0,0 +1,40 @@
+# -*- 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 osv import osv
+
+class hr_payslip_employees(osv.osv_memory):
+
+ _inherit ='hr.payslip.employees'
+
+ def compute_sheet(self, cr, uid, ids, context=None):
+ run_pool = self.pool.get('hr.payslip.run')
+ if context is None:
+ context = {}
+ if context and context.get('active_id', False):
+ run_data = run_pool.read(cr, uid, context['active_id'], ['journal_id'])
+ journal_id = run_data.get('journal_id', False)[0]
+ context.update({'journal_id': journal_id})
+ return super(hr_payslip_employees, self).compute_sheet(cr, uid, ids, context=context)
+
+hr_payslip_employees()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file
diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py
index 7fde90dc8e9..9ad7180441c 100644
--- a/addons/hr_recruitment/hr_recruitment.py
+++ b/addons/hr_recruitment/hr_recruitment.py
@@ -87,6 +87,9 @@ class hr_recruitment_degree(osv.osv):
_defaults = {
'sequence': 1,
}
+ _sql_constraints = [
+ ('name_uniq', 'unique (name)', 'The name of the Degree of Recruitment must be unique!')
+ ]
hr_recruitment_degree()
class hr_applicant(crm.crm_case, osv.osv):
@@ -282,7 +285,6 @@ class hr_applicant(crm.crm_case, osv.osv):
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
context = {
- 'default_opportunity_id': opp.id,
'default_partner_id': opp.partner_id and opp.partner_id.id or False,
'default_email_from': opp.email_from,
'default_state': 'open',
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 0477bd1e370..15cf6bcee5d 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -148,11 +148,11 @@
-
+
@@ -166,13 +166,13 @@
-
+
-
+
@@ -185,9 +185,9 @@
name="%(crm.action_crm_add_note)d"
context="{'model': 'crm.lead' }"
icon="terp-document-new" type="action" />
-
+
@@ -244,10 +244,10 @@
-
+
-
+
diff --git a/addons/hr_recruitment/report/hr_recruitment_report_view.xml b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
index 4f39005a3d1..5353a8497ed 100644
--- a/addons/hr_recruitment/report/hr_recruitment_report_view.xml
+++ b/addons/hr_recruitment/report/hr_recruitment_report_view.xml
@@ -59,7 +59,6 @@
help="Recruitment performed in current month"/>
diff --git a/addons/hr_recruitment/security/hr_recruitment_security.xml b/addons/hr_recruitment/security/hr_recruitment_security.xml
index e159be6a9db..570b0f036cd 100644
--- a/addons/hr_recruitment/security/hr_recruitment_security.xml
+++ b/addons/hr_recruitment/security/hr_recruitment_security.xml
@@ -2,6 +2,12 @@
+
+ Applicant multi company rule
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml
index 2092773fad9..710291c8f32 100644
--- a/addons/hr_timesheet/hr_timesheet_view.xml
+++ b/addons/hr_timesheet/hr_timesheet_view.xml
@@ -62,7 +62,7 @@
search
-
+
diff --git a/addons/hr_timesheet/i18n/cs.po b/addons/hr_timesheet/i18n/cs.po
index c6dd897c9a0..089a96b1d85 100644
--- a/addons/hr_timesheet/i18n/cs.po
+++ b/addons/hr_timesheet/i18n/cs.po
@@ -4,45 +4,46 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 5.0.4\n"
+"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-01-11 11:15+0000\n"
-"PO-Revision-Date: 2009-02-03 20:59+0000\n"
-"Last-Translator: Fabien (Open ERP) \n"
-"Language-Team: \n"
+"PO-Revision-Date: 2011-09-20 08:48+0000\n"
+"Last-Translator: Jiří Hajda \n"
+"Language-Team: Czech \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:24+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2011-09-21 04:50+0000\n"
+"X-Generator: Launchpad (build 13996)\n"
+"X-Poedit-Language: Czech\n"
#. module: hr_timesheet
#: model:product.template,name:hr_timesheet.product_consultant_product_template
msgid "Service on Timesheet"
-msgstr ""
+msgstr "SLužby v časovém rozvrhu"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Wed"
-msgstr ""
+msgstr "St"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "(Keep empty for current_time)"
-msgstr ""
+msgstr "(Nechejte prázdné pro aktuální čas)"
#. module: hr_timesheet
#: code:addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py:132
#, python-format
msgid "No employee defined for your user !"
-msgstr ""
+msgstr "Pro vašeho uživatele nebyl určen zaměstnanec !"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Group By..."
-msgstr ""
+msgstr "Seskupit podle..."
#. module: hr_timesheet
#: model:ir.actions.act_window,help:hr_timesheet.action_hr_timesheet_sign_in
@@ -52,16 +53,20 @@ msgid ""
"analytic account. This feature allows to record at the same time the "
"attendance and the timesheet."
msgstr ""
+"Zaměstnanci mohou vkládat své časy strávené na různých projektech. Projekt "
+"je analytický účet a čas strávený na projektu generuje ceny na na "
+"analytickém účtu. Tato funkce umožňuje zaznamenat ve stejný čas docházku a "
+"časový rozvrh."
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Today"
-msgstr ""
+msgstr "Dnes"
#. module: hr_timesheet
#: field:hr.employee,journal_id:0
msgid "Analytic Journal"
-msgstr ""
+msgstr "Analytický deník"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
@@ -72,31 +77,31 @@ msgstr "Ukončit práci"
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_employee
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_timesheet_employee
msgid "Employee Timesheet"
-msgstr ""
+msgstr "Časový rozvrh zaměstnance"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Work done stats"
-msgstr ""
+msgstr "Statistika dokončené práce"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_reporting_timesheet
msgid "Timesheet"
-msgstr ""
+msgstr "Časový rozvrh"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "janvier"
-msgstr ""
+msgstr "leden"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Mon"
-msgstr ""
+msgstr "Po"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
@@ -111,27 +116,31 @@ msgid ""
"project generates costs on the analytic account. This feature allows to "
"record at the same time the attendance and the timesheet."
msgstr ""
+"Zaměstnanci mohou vkládat své časy strávené na různých projektech, ke kterým "
+"jsou přiřazeni. Projekt je analytický účet a čas strávený na projektu "
+"generuje ceny na na analytickém účtu. Tato funkce umožňuje zaznamenat ve "
+"stejný čas docházku a časový rozvrh."
#. module: hr_timesheet
#: field:hr.sign.out.project,analytic_amount:0
msgid "Minimum Analytic Amount"
-msgstr ""
+msgstr "Minimální analytická částka"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
msgid "Monthly Employee Timesheet"
-msgstr ""
+msgstr "Měsíční časový rozvrh zaměstnance"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "Work done in the last period"
-msgstr ""
+msgstr "Dokončená práce v minulém období"
#. module: hr_timesheet
#: constraint:hr.employee:0
msgid ""
"Error ! You cannot select a department for which the employee is the manager."
-msgstr ""
+msgstr "Chyba ! Nemůžete vybrat oddělení, kterého je zaměstnance vedoucí."
#. module: hr_timesheet
#: field:hr.sign.in.project,state:0
@@ -143,39 +152,39 @@ msgstr "Současné datum"
#: field:hr.sign.in.project,name:0
#: field:hr.sign.out.project,name:0
msgid "Employees name"
-msgstr ""
+msgstr "Jméno zaměstnance"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_analytical_timesheet_users
msgid "Print Employees Timesheet"
-msgstr ""
+msgstr "Tisknou časový rozvrh zaměstnance"
#. module: hr_timesheet
#: code:addons/hr_timesheet/hr_timesheet.py:174
#: code:addons/hr_timesheet/hr_timesheet.py:176
#, python-format
msgid "Warning !"
-msgstr ""
+msgstr "Varování !"
#. module: hr_timesheet
#: code:addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py:77
#: code:addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py:132
#, python-format
msgid "UserError"
-msgstr ""
+msgstr "UserError"
#. module: hr_timesheet
#: code:addons/hr_timesheet/wizard/hr_timesheet_sign_in_out.py:77
#, python-format
msgid "No cost unit defined for this employee !"
-msgstr ""
+msgstr "Pro tohoto zaměstnance nebyla určena cenová jednotka !"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Tue"
-msgstr ""
+msgstr "Út"
#. module: hr_timesheet
#: field:hr.sign.out.project,account_id:0
@@ -186,32 +195,32 @@ msgstr "Analytický účet"
#: code:addons/hr_timesheet/wizard/hr_timesheet_print_employee.py:42
#, python-format
msgid "Warning"
-msgstr ""
+msgstr "Varování"
#. module: hr_timesheet
#: model:ir.module.module,shortdesc:hr_timesheet.module_meta_information
msgid "Human Resources (Timesheet encoding)"
-msgstr ""
+msgstr "Lidské zdroje (Kódování časových rozvrhů)"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
#: view:hr.sign.out.project:0
msgid "Sign In/Out By Project"
-msgstr ""
+msgstr "Přihlášení/Odhlášení podle projektu"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Sat"
-msgstr ""
+msgstr "So"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Sun"
-msgstr ""
+msgstr "Ne"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
@@ -222,18 +231,18 @@ msgstr "Tisk"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Timesheet Lines"
-msgstr ""
+msgstr "Řádky časového rozvrhu"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "juillet"
-msgstr ""
+msgstr "červenec"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.users:0
msgid "Monthly Employees Timesheet"
-msgstr ""
+msgstr "Měsíční časový rozvrh zaměstnance"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -242,7 +251,7 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "July"
-msgstr ""
+msgstr "Červenec"
#. module: hr_timesheet
#: field:hr.sign.in.project,date:0
@@ -253,13 +262,13 @@ msgstr "Počáteční datum"
#. module: hr_timesheet
#: view:hr.employee:0
msgid "Categories"
-msgstr ""
+msgstr "Kategorie"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "novembre"
-msgstr ""
+msgstr "listopad"
#. module: hr_timesheet
#: model:ir.actions.act_window,help:hr_timesheet.act_hr_timesheet_line_evry1_all_form
@@ -267,6 +276,8 @@ msgid ""
"Through Working Hours you can register your working hours by project every "
"day."
msgstr ""
+"Pomocí pracovních hodin můžete každý den registrovat vaše pracovní hodiny "
+"podle projektu."
#. module: hr_timesheet
#: model:ir.module.module,description:hr_timesheet.module_meta_information
@@ -283,6 +294,18 @@ msgid ""
"to set up a management by affair.\n"
" "
msgstr ""
+"\n"
+"Tento modul realizuje systém časového rozvrhu. Každý zaměstnanec může "
+"zadávat a\n"
+"sledovat svůj čas strávený na různých projektech. Projekt je \n"
+"analytický účet a čas strávený na projektu generuje ceny na\n"
+"analytickém účtu.\n"
+"\n"
+"Je poskytováno mnoho vykazování nad časem a sledováním zaměstnanců.\n"
+"\n"
+"Je celkově integrováno s module účtování cen. Umožňuje vám\n"
+"nastavit správu podle poměru.\n"
+" "
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -291,18 +314,18 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "March"
-msgstr ""
+msgstr "Březen"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Total cost"
-msgstr ""
+msgstr "Celková cena"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "décembre"
-msgstr ""
+msgstr "prosinec"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -311,22 +334,22 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "September"
-msgstr ""
+msgstr "Září"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_analytic_timesheet
msgid "Timesheet Line"
-msgstr ""
+msgstr "Řádek časového rozvrhu"
#. module: hr_timesheet
#: field:hr.analytical.timesheet.users,employee_ids:0
msgid "employees"
-msgstr ""
+msgstr "zaměstnanci"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Stats by month"
-msgstr ""
+msgstr "Statistika podle měsíce"
#. module: hr_timesheet
#: view:account.analytic.account:0
@@ -343,25 +366,25 @@ msgstr "Popis práce"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "To be invoiced"
-msgstr ""
+msgstr "K fakturaci"
#. module: hr_timesheet
#: model:ir.actions.report.xml,name:hr_timesheet.report_user_timesheet
msgid "Employee timesheet"
-msgstr ""
+msgstr "Časový rozvrh zaměstnance"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_sign_in
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_sign_out
msgid "Sign in / Sign out by project"
-msgstr ""
+msgstr "Přihlášení / Odhlášení podle projektu"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Fri"
-msgstr ""
+msgstr "Pá"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
@@ -375,27 +398,29 @@ msgid ""
"Analytic journal is not defined for employee %s \n"
"Define an employee for the selected user and assign an analytic journal!"
msgstr ""
+"Pro zaměstnance %s není určen Analytický deník \n"
+"Určete zaměstnance pro vybraného uživatele a přiřaďte analxtický deník!"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
msgid "(Keep empty for current time)"
-msgstr ""
+msgstr "(Nechejte prázdné pro aktuální čas)"
#. module: hr_timesheet
#: view:hr.employee:0
msgid "Timesheets"
-msgstr ""
+msgstr "Časové rozvrhy"
#. module: hr_timesheet
#: help:hr.employee,product_id:0
msgid "Specifies employee's designation as a product with type 'service'."
-msgstr ""
+msgstr "Určuje zařazení zaměstnance jako výrobek s typem 'služba'."
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "août"
-msgstr ""
+msgstr "srpen"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -404,7 +429,7 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "August"
-msgstr ""
+msgstr "Srpen"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -413,23 +438,23 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "June"
-msgstr ""
+msgstr "Červen"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
msgid "Print My Timesheet"
-msgstr ""
+msgstr "Tisknout můj časový rozvrh"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "mars"
-msgstr ""
+msgstr "březen"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Date"
-msgstr ""
+msgstr "Datum"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -438,12 +463,12 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "November"
-msgstr ""
+msgstr "Listopad"
#. module: hr_timesheet
#: constraint:hr.employee:0
msgid "Error ! You cannot create recursive Hierarchy of Employees."
-msgstr ""
+msgstr "Chyba ! Nemůžete vytvořit rekurzivní Hierarchii zaměstnanců"
#. module: hr_timesheet
#: field:hr.sign.out.project,date:0
@@ -457,7 +482,7 @@ msgstr "Koncové datum"
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "October"
-msgstr ""
+msgstr "Říjen"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -466,35 +491,35 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "January"
-msgstr ""
+msgstr "Leden"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Key dates"
-msgstr ""
+msgstr "Klíčové dny"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:43
#: code:addons/hr_timesheet/report/users_timesheet.py:77
#, python-format
msgid "Thu"
-msgstr ""
+msgstr "Čt"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Analysis stats"
-msgstr ""
+msgstr "Statistiká analýza"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_analytical_timesheet_employee
msgid "Print Employee Timesheet & Print My Timesheet"
-msgstr ""
+msgstr "Tisknout Časový rozvrh zaměstnance & Tisknou můj časový rozvrh"
#. module: hr_timesheet
#: field:hr.sign.in.project,emp_id:0
#: field:hr.sign.out.project,emp_id:0
msgid "Employee ID"
-msgstr ""
+msgstr "ID zaměstnance"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
@@ -504,12 +529,12 @@ msgstr "Obecné informace"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_my
msgid "My Timesheet"
-msgstr ""
+msgstr "Moje časové rozvrhy"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Analysis summary"
-msgstr ""
+msgstr "Souhrn analýzy"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -518,7 +543,7 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "December"
-msgstr ""
+msgstr "Prosinec"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
@@ -526,7 +551,7 @@ msgstr ""
#: view:hr.sign.in.project:0
#: view:hr.sign.out.project:0
msgid "Cancel"
-msgstr "Storno"
+msgstr "Zrušit"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.action_hr_timesheet_users
@@ -534,30 +559,30 @@ msgstr "Storno"
#: model:ir.actions.wizard,name:hr_timesheet.wizard_hr_timesheet_users
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_timesheet_users
msgid "Employees Timesheet"
-msgstr ""
+msgstr "Časové rozvrhy zaměstnanců"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "février"
-msgstr ""
+msgstr "únor"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Information"
-msgstr ""
+msgstr "Informace"
#. module: hr_timesheet
#: field:hr.analytical.timesheet.employee,employee_id:0
#: model:ir.model,name:hr_timesheet.model_hr_employee
msgid "Employee"
-msgstr ""
+msgstr "Zaměstnanec"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "avril"
-msgstr ""
+msgstr "duben"
#. module: hr_timesheet
#: field:hr.sign.in.project,server_date:0
@@ -568,23 +593,23 @@ msgstr "Současné datum"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Anlytic account"
-msgstr ""
+msgstr "Analytický účet"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.employee:0
msgid "This wizard will print monthly timesheet"
-msgstr ""
+msgstr "Tento průvodce bude tisknout měsíční časový rozvrh"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
#: field:hr.employee,product_id:0
msgid "Product"
-msgstr ""
+msgstr "Výrobek"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Invoicing"
-msgstr ""
+msgstr "Fakturace"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -593,34 +618,34 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "May"
-msgstr ""
+msgstr "Květen"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Total time"
-msgstr ""
+msgstr "Celkový čas"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "juin"
-msgstr ""
+msgstr "červen"
#. module: hr_timesheet
#: view:hr.sign.in.project:0
msgid "(local time on the server side)"
-msgstr "(lokální čas na serveru)"
+msgstr "(místní čas na straně serveru)"
#. module: hr_timesheet
#: model:ir.actions.act_window,name:hr_timesheet.act_hr_timesheet_line_evry1_all_form
#: model:ir.ui.menu,name:hr_timesheet.menu_hr_working_hours
msgid "Working Hours"
-msgstr ""
+msgstr "Pracovní hodiny"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_sign_in_project
msgid "Sign In By Project"
-msgstr ""
+msgstr "Přihlášení podle projektu"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -629,28 +654,28 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "February"
-msgstr ""
+msgstr "Únor"
#. module: hr_timesheet
#: field:hr.analytic.timesheet,line_id:0
msgid "Analytic line"
-msgstr ""
+msgstr "Analytický řádek"
#. module: hr_timesheet
#: model:ir.model,name:hr_timesheet.model_hr_sign_out_project
msgid "Sign Out By Project"
-msgstr ""
+msgstr "Odhlášení podle projektu"
#. module: hr_timesheet
#: view:hr.analytical.timesheet.users:0
msgid "Employees"
-msgstr ""
+msgstr "Zaměstnanci"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "octobre"
-msgstr ""
+msgstr "říjen"
#. module: hr_timesheet
#: code:addons/hr_timesheet/report/user_timesheet.py:40
@@ -659,7 +684,7 @@ msgstr ""
#: selection:hr.analytical.timesheet.users,month:0
#, python-format
msgid "April"
-msgstr ""
+msgstr "Duben"
#. module: hr_timesheet
#: code:addons/hr_timesheet/hr_timesheet.py:176
@@ -668,12 +693,14 @@ msgid ""
"No analytic account defined on the project.\n"
"Please set one or we can not automatically fill the timesheet."
msgstr ""
+"U projektu nebyl určen analytický účet.\n"
+"Prosíme nastavte jej nebo nemůžeme automaticky vyplnit časový rozvrh."
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "mai"
-msgstr ""
+msgstr "květen"
#. module: hr_timesheet
#: view:account.analytic.account:0
@@ -689,13 +716,13 @@ msgstr "Začít pracovat"
#. module: hr_timesheet
#: view:account.analytic.account:0
msgid "Stats by user"
-msgstr ""
+msgstr "Statistiky podle uživatele"
#. module: hr_timesheet
#: code:addons/hr_timesheet/wizard/hr_timesheet_print_employee.py:42
#, python-format
msgid "No employee defined for this user"
-msgstr ""
+msgstr "Pro tohoto uživatele nebyl určen zaměstnanec"
#. module: hr_timesheet
#: field:hr.analytical.timesheet.employee,year:0
@@ -706,23 +733,23 @@ msgstr "Rok"
#. module: hr_timesheet
#: view:hr.analytic.timesheet:0
msgid "Accounting"
-msgstr ""
+msgstr "Účetnictví"
#. module: hr_timesheet
#: field:hr.analytic.timesheet,partner_id:0
msgid "Partner Id"
-msgstr ""
+msgstr "Id partnera"
#. module: hr_timesheet
#: view:hr.sign.out.project:0
msgid "Change Work"
-msgstr ""
+msgstr "Změnit práci"
#. module: hr_timesheet
#: selection:hr.analytical.timesheet.employee,month:0
#: selection:hr.analytical.timesheet.users,month:0
msgid "septembre"
-msgstr ""
+msgstr "září"
#~ msgid "Choose Users"
#~ msgstr "Uživatelé"
diff --git a/addons/hr_timesheet/report/user_timesheet.py b/addons/hr_timesheet/report/user_timesheet.py
index 737652fbccd..533989210d6 100644
--- a/addons/hr_timesheet/report/user_timesheet.py
+++ b/addons/hr_timesheet/report/user_timesheet.py
@@ -67,7 +67,7 @@ class report_custom(report_rml):
if user_id:
# Computing the attendence by analytical account
cr.execute(
- "select line.date, (unit_amount * unit.factor) as amount, account_id, account.name "\
+ "select line.date, (unit_amount / unit.factor) as amount, account_id, account.name "\
"from account_analytic_line as line, hr_analytic_timesheet as hr, "\
"account_analytic_account as account, product_uom as unit "\
"where hr.line_id=line.id and line.account_id=account.id "\
diff --git a/addons/hr_timesheet/report/users_timesheet.py b/addons/hr_timesheet/report/users_timesheet.py
index fac92d6a322..4c619721329 100644
--- a/addons/hr_timesheet/report/users_timesheet.py
+++ b/addons/hr_timesheet/report/users_timesheet.py
@@ -37,7 +37,7 @@ def lengthmonth(year, month):
def emp_create_xml(cr, id, som, eom, emp):
# Computing the attendence by analytical account
cr.execute(
- "select line.date, (unit_amount * unit.factor) as amount "\
+ "select line.date, (unit_amount / unit.factor) as amount "\
"from account_analytic_line as line, hr_analytic_timesheet as hr, "\
"product_uom as unit "\
"where hr.line_id=line.id "\
diff --git a/addons/hr_timesheet/security/ir.model.access.csv b/addons/hr_timesheet/security/ir.model.access.csv
index 3cf9505b60b..2b2064a89b4 100644
--- a/addons/hr_timesheet/security/ir.model.access.csv
+++ b/addons/hr_timesheet/security/ir.model.access.csv
@@ -10,4 +10,5 @@
"access_account_fiscalyear_hr_user","account.account.fiscalyear.user","account.model_account_fiscalyear","base.group_hr_user",1,1,1,1
"hr.access_account_journal_view_hruser","account.journal.view hruser","account.model_account_journal_view","base.group_hr_user",1,0,0,0
"hr.access_account_journal_column_hruser","account.journal.column hruser","account.model_account_journal_column","base.group_hr_user",1,0,0,0
-"access_hr_analytic_timesheet_user","hr.analytic.timesheet.user","model_hr_analytic_timesheet","base.group_user",1,0,0,0
+"access_hr_analytic_timesheet_user","hr.analytic.timesheet.user","model_hr_analytic_timesheet","base.group_user",1,1,1,0
+"access_account_analytic_journal_user","account.account.analytic.journal.user","account.model_account_analytic_journal","base.group_user",1,0,0,0
diff --git a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
index d9314690ce7..87fb6064a04 100644
--- a/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
+++ b/addons/hr_timesheet_invoice/hr_timesheet_invoice.py
@@ -116,7 +116,7 @@ class account_analytic_line(osv.osv):
for line in self.browse(cr, uid, select):
if line.invoice_id:
raise osv.except_osv(_('Error !'),
- _('You can not modify an invoiced analytic line!'))
+ _('You cannot modify an invoiced analytic line!'))
return True
def copy(self, cursor, user, obj_id, default=None, context=None):
diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
index daeabfdaeee..e4226feb2f3 100644
--- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
+++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
@@ -46,7 +46,7 @@
search
-
+
@@ -56,7 +56,6 @@
help="Timesheet lines in this month"/>
@@ -70,7 +69,7 @@
-
+
@@ -162,14 +161,14 @@
search
-
+
-
-
-
+
+
+
@@ -218,9 +217,9 @@
-
-
-
+
+
+
@@ -298,15 +297,15 @@
search
-
+
-
-
-
-
+
+
+
+
@@ -369,18 +368,18 @@
report_timesheet.accountsearch
-
-
+
+
-
-
-
-
+
+
+
+
-
+
diff --git a/addons/hr_timesheet_invoice/report/report_analytic_view.xml b/addons/hr_timesheet_invoice/report/report_analytic_view.xml
index ed3c86939cd..c196beae880 100644
--- a/addons/hr_timesheet_invoice/report/report_analytic_view.xml
+++ b/addons/hr_timesheet_invoice/report/report_analytic_view.xml
@@ -113,14 +113,14 @@
search
-
+
-
-
-
-
+
+
+
+
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index 4e1eebb5f4c..8f5c9638a53 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -167,33 +167,33 @@ class hr_timesheet_sheet(osv.osv):
ids_signout = self.pool.get('hr.attendance').search(cr,uid,[('sheet_id', '=', sheet_id),('action','=','sign_out')])
if len(ids_signin) != len(ids_signout):
- raise osv.except_osv(('Warning !'),_('The timesheet cannot be validated as it does not contain equal no. of sign ins and sign outs!'))
+ raise osv.except_osv(('Warning !'),_('The timesheet cannot be validated as it does not contain an equal number of sign ins and sign outs!'))
return True
def copy(self, cr, uid, ids, *args, **argv):
- raise osv.except_osv(_('Error !'), _('You cannot duplicate a timesheet !'))
+ raise osv.except_osv(_('Error !'), _('You cannot duplicate a timesheet!'))
def create(self, cr, uid, vals, *args, **argv):
if 'employee_id' in vals:
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must assign it to a user!'))
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any product defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must link the employee to a product, like \'Consultant\'!'))
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any analytic journal defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must assign the employee to an analytic journal, like \'Timesheet\'!'))
return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv)
def write(self, cr, uid, ids, vals, *args, **argv):
if 'employee_id' in vals:
new_user_id = self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id.id or False
if not new_user_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must assign it to a user!'))
if not self._sheet_date(cr, uid, ids, forced_user_id=new_user_id):
- raise osv.except_osv(_('Error !'), _('You can not have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.'))
+ raise osv.except_osv(_('Error !'), _('You cannot have 2 timesheets that overlaps!\nYou should use the menu \'My Timesheet\' to avoid this problem.'))
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).product_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any product defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must link the employee to a product!'))
if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).journal_id:
- raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any analytic journal defined !'))
+ raise osv.except_osv(_('Error !'), _('In order to create a timesheet for this employee, you must assign the employee to an analytic journal!'))
return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv)
def button_confirm(self, cr, uid, ids, context=None):
@@ -355,7 +355,7 @@ class hr_timesheet_sheet(osv.osv):
_constraints = [
- (_sheet_date, 'You can not have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.', ['date_from','date_to']),
+ (_sheet_date, 'You cannot have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.', ['date_from','date_to']),
(_date_current_check, 'You must select a Current date which is in the timesheet dates !', ['date_current']),
]
@@ -377,9 +377,9 @@ class hr_timesheet_sheet(osv.osv):
sheets = self.read(cr, uid, ids, ['state','total_attendance'], context=context)
for sheet in sheets:
if sheet['state'] in ('confirm', 'done'):
- raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which are already confirmed !'))
+ raise osv.except_osv(_('Invalid action !'), _('You cannot delete a timesheet which is already confirmed!'))
elif sheet['total_attendance'] <> 0.00:
- raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which have attendance entries encoded !'))
+ raise osv.except_osv(_('Invalid action !'), _('You cannot delete a timesheet which have attendance entries!'))
return super(hr_timesheet_sheet, self).unlink(cr, uid, ids, context=context)
hr_timesheet_sheet()
@@ -490,7 +490,7 @@ class hr_timesheet_line(osv.osv):
return True
_constraints = [
- (_check_sheet_state, 'You can not modify an entry in a Confirmed/Done timesheet !.', ['state']),
+ (_check_sheet_state, 'You cannot modify an entry in a Confirmed/Done timesheet !.', ['state']),
]
def unlink(self, cr, uid, ids, *args, **kwargs):
@@ -612,7 +612,7 @@ class hr_attendance(osv.osv):
if 'sheet_id' in context:
ts = self.pool.get('hr_timesheet_sheet.sheet').browse(cr, uid, context['sheet_id'], context=context)
if ts.state not in ('draft', 'new'):
- raise osv.except_osv(_('Error !'), _('You cannot modify an entry in a confirmed timesheet !'))
+ raise osv.except_osv(_('Error !'), _('You cannot modify an entry in a confirmed timesheet!'))
res = super(hr_attendance,self).create(cr, uid, vals, context=context)
if 'sheet_id' in context:
if context['sheet_id'] != self.browse(cr, uid, res, context=context).sheet_id.id:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 28c0808a993..81b682a25dd 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -33,7 +33,7 @@
search
-
+
@@ -159,11 +159,11 @@
search
-
+
-
+ search
-
+ search
-
+
diff --git a/addons/html_view/i18n/mk.po b/addons/html_view/i18n/mk.po
new file mode 100644
index 00000000000..dd98a0f9818
--- /dev/null
+++ b/addons/html_view/i18n/mk.po
@@ -0,0 +1,63 @@
+# Macedonian 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:15+0000\n"
+"PO-Revision-Date: 2011-09-14 08:15+0000\n"
+"Last-Translator: FULL NAME \n"
+"Language-Team: Macedonian \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-09-15 04:47+0000\n"
+"X-Generator: Launchpad (build 13921)\n"
+
+#. module: html_view
+#: field:html.view,name:0
+msgid "Name"
+msgstr "Име"
+
+#. module: html_view
+#: field:html.view,comp_id:0
+msgid "Company"
+msgstr "Компанија"
+
+#. module: html_view
+#: model:ir.actions.act_window,name:html_view.action_html_view_form
+#: model:ir.ui.menu,name:html_view.html_form
+msgid "Html Test"
+msgstr "Html тест"
+
+#. module: html_view
+#: view:html.view:0
+msgid "Html Example"
+msgstr "Html пример"
+
+#. module: html_view
+#: model:ir.module.module,shortdesc:html_view.module_meta_information
+msgid "Html View"
+msgstr "Html преглед"
+
+#. module: html_view
+#: field:html.view,bank_ids:0
+msgid "Banks"
+msgstr "Банки"
+
+#. module: html_view
+#: model:ir.module.module,description:html_view.module_meta_information
+msgid ""
+"\n"
+" This is the test module which shows html tag supports in normal xml form "
+"view.\n"
+" "
+msgstr ""
+
+#. module: html_view
+#: model:ir.model,name:html_view.model_html_view
+msgid "html.view"
+msgstr "html.view"
diff --git a/addons/idea/idea.py b/addons/idea/idea.py
index c6238e6bb13..7645b17a348 100644
--- a/addons/idea/idea.py
+++ b/addons/idea/idea.py
@@ -64,7 +64,7 @@ class idea_category(osv.osv):
_order = 'parent_id,name asc'
_constraints = [
- (osv.osv._check_recursion, 'Error ! You can not create recursive categories.', ['parent_id'])
+ (osv.osv._check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
]
idea_category()
diff --git a/addons/idea/idea_view.xml b/addons/idea/idea_view.xml
index 69175004385..58adad9239d 100644
--- a/addons/idea/idea_view.xml
+++ b/addons/idea/idea_view.xml
@@ -8,12 +8,12 @@
search
-
+
-
+
@@ -169,12 +169,12 @@
search
-
+
-
+
@@ -288,17 +288,17 @@
search
-
+
-
-
-
+
+
+
-
+
diff --git a/addons/idea/report/report_vote_view.xml b/addons/idea/report/report_vote_view.xml
index 26608a71301..eb5cfe3c28b 100644
--- a/addons/idea/report/report_vote_view.xml
+++ b/addons/idea/report/report_vote_view.xml
@@ -37,14 +37,12 @@
help="Idea Vote created in current month"/>
@@ -64,7 +62,7 @@
-
+
diff --git a/addons/knowledge/i18n/lo.po b/addons/knowledge/i18n/lo.po
new file mode 100644
index 00000000000..e611649b996
--- /dev/null
+++ b/addons/knowledge/i18n/lo.po
@@ -0,0 +1,164 @@
+# Lao 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:15+0000\n"
+"PO-Revision-Date: 2011-09-19 09:09+0000\n"
+"Last-Translator: Phoxaysy \n"
+"Language-Team: Lao \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2011-09-20 04:54+0000\n"
+"X-Generator: Launchpad (build 13980)\n"
+
+#. module: knowledge
+#: model:ir.ui.menu,name:knowledge.menu_document
+msgid "Knowledge"
+msgstr "ການຄຸ້ມຄອງເອກະສານ"
+
+#. module: knowledge
+#: help:knowledge.installer,wiki_quality_manual:0
+msgid "Creates an example skeleton for a standard quality manual."
+msgstr "ສ້າງໂຄງຮ່າງຕົວຢ່າງເພື່ອຄູ່ມືທີ່່ມີມາດຕະຖານ"
+
+#. module: knowledge
+#: view:knowledge.installer:0
+msgid "Share information within the company with these specific Addons."
+msgstr "ນຳໃຊ້ຂໍ້ມູນຮ່ວມກັນໄພໃນບໍລິສັດກັບ Addons ເຫລົ່ານີ້."
+
+#. module: knowledge
+#: field:knowledge.installer,document_ftp:0
+msgid "Shared Repositories (FTP)"
+msgstr "ເກັບຂໍ້ມູນທີ່ໃຊ້ຮ່ວມກັນ(FTP)"
+
+#. module: knowledge
+#: model:ir.module.module,shortdesc:knowledge.module_meta_information
+msgid "Knowledge Management System"
+msgstr "ລະບົບການຄຸ້ມຄອງເອກະສານ"
+
+#. module: knowledge
+#: field:knowledge.installer,wiki:0
+msgid "Collaborative Content (Wiki)"
+msgstr "ເນື່ອໃນການເຮັດວຽກຮ່ວມກັນ(wiki)"
+
+#. module: knowledge
+#: help:knowledge.installer,document_ftp:0
+msgid ""
+"Provides an FTP access to your OpenERP's Document Management System. It lets "
+"you access attachments and virtual documents through a standard FTP client."
+msgstr ""
+"ນຳໃຊ້ໂປລແກລມ FTP ເຂົ້າຫາລະບົບການຄູ້ມຄອງອກະສານ OpenERP ຂອງທ່ານ. "
+"ມັນຊ່ວຍໃຫ້ທ່ານເຂົ້າຫາຂໍ້ມູນ ແລະ ເອກະສານຕ່າງໆຄືກັນກັບທ່ານຢູ່ໃນໜ່ວຍ computer "
+"ຂອງທ່ານເອງ"
+
+#. module: knowledge
+#: help:knowledge.installer,document_webdav:0
+msgid ""
+"Provides a WebDAV access to your OpenERP's Document Management System. Lets "
+"you access attachments and virtual documents through your standard file "
+"browser."
+msgstr ""
+"ນຳໃຊ້ໂປລແກລມ WebDAV ເຂົ້າຫາລະບົບການຄູ້ມຄອງອກະສານ OpenERP ຂອງທ່ານ. "
+"ມັນຊ່ວຍໃຫ້ທ່ານເຂົ້າຫາຂໍ້ມູນ ແລະ ເອກະສານຕ່າງໆຜ່ານ Browser ທີ່ມີມາດຕະຖານ."
+
+#. module: knowledge
+#: view:knowledge.installer:0
+msgid "Configure"
+msgstr "ສ້ອມຕັ້້ງ"
+
+#. module: knowledge
+#: view:knowledge.installer:0
+msgid "title"
+msgstr "ຫົວຂໍ້:"
+
+#. module: knowledge
+#: model:ir.module.module,description:knowledge.module_meta_information
+msgid ""
+"Installer for knowledge-based tools\n"
+" "
+msgstr ""
+"ຕິດຕັ້ງເຄື່ອງມືພື້ນຖານຂອງການຸ້ມຄອງເອກະສານ\n"
+" "
+
+#. module: knowledge
+#: model:ir.ui.menu,name:knowledge.menu_document_configuration
+msgid "Configuration"
+msgstr "ການກໍານົດຄ່າ"
+
+#. module: knowledge
+#: model:ir.actions.act_window,name:knowledge.action_knowledge_installer
+msgid "Knowledge Modules Installation"
+msgstr "ການຕິດຕັ້ງໂມດຸນຂອງການຄຸ້ມຄອງເອກະສານ"
+
+#. module: knowledge
+#: field:knowledge.installer,wiki_quality_manual:0
+msgid "Quality Manual"
+msgstr "ຄູ່ມືຄຸນນະພາບ"
+
+#. module: knowledge
+#: field:knowledge.installer,document_webdav:0
+msgid "Shared Repositories (WebDAV)"
+msgstr "ເກັບຄືນຂໍ້ມູນທີ່ໃຊ້ຮ່ວມກັນ(WebDAV)"
+
+#. module: knowledge
+#: field:knowledge.installer,progress:0
+msgid "Configuration Progress"
+msgstr "ຄວາມຕໍ່ເນື່ອງໃນການກຳນົດຄ່າ"
+
+#. module: knowledge
+#: help:knowledge.installer,wiki_faq:0
+msgid ""
+"Creates a skeleton internal FAQ pre-filled with documentation about "
+"OpenERP's Document Management System."
+msgstr ""
+"ສ້າງໂຄງຮ່າງຂ້າງໃນFAQ ກ່ອນທີ່ເຕັມດ້ວຍເອກະສານກ່ຽວກັບການຈັດການເອກະສານ ERP"
+
+#. module: knowledge
+#: field:knowledge.installer,wiki_faq:0
+msgid "Internal FAQ"
+msgstr "ຂ້າງໃນFAQ"
+
+#. module: knowledge
+#: model:ir.ui.menu,name:knowledge.menu_document2
+msgid "Collaborative Content"
+msgstr "ເນື້ອໃນການເຮັດວຽກຮ່ວມກັນ"
+
+#. module: knowledge
+#: field:knowledge.installer,config_logo:0
+msgid "Image"
+msgstr "ຮູບພາບ"
+
+#. module: knowledge
+#: model:ir.actions.act_window,name:knowledge.action_knowledge_installer
+#: view:knowledge.installer:0
+msgid "Knowledge Application Configuration"
+msgstr "ການນຳໃຊ້ການຕັ້ງຄ່າເອກະສານ"
+
+#. module: knowledge
+#: model:ir.model,name:knowledge.model_knowledge_installer
+msgid "knowledge.installer"
+msgstr "ການຕິດຕັ້ງເອກະສານ"
+
+#. module: knowledge
+#: view:knowledge.installer:0
+msgid "Configure Your Knowledge Application"
+msgstr "ຕັ້ງຄ່າການນຳໃຊ້ເອກະສານຂອງທ່ານ"
+
+#. module: knowledge
+#: help:knowledge.installer,wiki:0
+msgid ""
+"Lets you create wiki pages and page groups in order to keep track of "
+"business knowledge and share it with and between your employees."
+msgstr ""
+"ສ້າງໜ້າWiki ແລະ ໜ້າກູ່ມເພື່ອຕິດຕາມເອກະສານທາງທລະກິດ ແລະ ລະຫວ່າງພະນັກງານຂອງທ່ານ"
+
+#. module: knowledge
+#: view:knowledge.installer:0
+msgid "Content templates"
+msgstr "ເນື້ອໃນແມ່ແບບ"
diff --git a/addons/hr_payroll_l10n_be/__init__.py b/addons/l10n_be_hr_payroll/__init__.py
similarity index 86%
rename from addons/hr_payroll_l10n_be/__init__.py
rename to addons/l10n_be_hr_payroll/__init__.py
index 61db034b52c..fb327bcb6c4 100644
--- a/addons/hr_payroll_l10n_be/__init__.py
+++ b/addons/l10n_be_hr_payroll/__init__.py
@@ -1,8 +1,8 @@
# -*- encoding: 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
@@ -15,9 +15,7 @@
# 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
#
##############################################################################
-import hr_payroll_l10n_be
-import hr_contract
-import hr_payroll
+import l10n_be_hr_payroll
diff --git a/addons/hr_payroll_l10n_be/__openerp__.py b/addons/l10n_be_hr_payroll/__openerp__.py
similarity index 80%
rename from addons/hr_payroll_l10n_be/__openerp__.py
rename to addons/l10n_be_hr_payroll/__openerp__.py
index b9f887f3ff8..ca0851ed9eb 100644
--- a/addons/hr_payroll_l10n_be/__openerp__.py
+++ b/addons/l10n_be_hr_payroll/__openerp__.py
@@ -1,8 +1,8 @@
# -*- encoding: 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
@@ -15,19 +15,18 @@
# 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 .
#
##############################################################################
{
- 'name': 'hr_payroll_l10n_be',
+ 'name': 'Belgian Payroll Rules',
'category': 'payroll',
- 'init_xml':[],
- 'author': 'OpenERP',
+ 'author': 'OpenERP SA',
'depends': ['hr_payroll','hr_contract'],
'version': '1.0',
'description': """
-Belgian Payroll system.
-=======================
+Belgian Payroll Rules
+=====================
* Employee Details
* Employee Contracts
@@ -41,12 +40,12 @@ Belgian Payroll system.
""",
'active': False,
- 'demo_xml': [
- 'hr_payroll_l10n_be_demo.xml',
+ 'demo': [
+ 'l10n_be_hr_payroll_demo.xml',
],
- 'update_xml':[
- 'hr_payroll_l10n_be_view.xml',
- 'hr_payroll_l10n_be_data.xml',
+ 'data':[
+ 'l10n_be_hr_payroll_view.xml',
+ 'l10n_be_hr_payroll_data.xml',
'data/hr.salary.rule.csv',
],
'installable': True
diff --git a/addons/hr_payroll_l10n_be/data/hr.salary.rule.csv b/addons/l10n_be_hr_payroll/data/hr.salary.rule.csv
similarity index 100%
rename from addons/hr_payroll_l10n_be/data/hr.salary.rule.csv
rename to addons/l10n_be_hr_payroll/data/hr.salary.rule.csv
diff --git a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be.py b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
similarity index 90%
rename from addons/hr_payroll_l10n_be/hr_payroll_l10n_be.py
rename to addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
index 3c98e99cd71..761374da283 100644
--- a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be.py
+++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll.py
@@ -2,8 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved
-# d$
+# Copyright (C) 2011 OpenERP SA (). All Rights Reserved
#
# 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
@@ -20,18 +19,7 @@
#
##############################################################################
-import time
-from datetime import date
-from datetime import datetime
-from datetime import timedelta
-
-import netsvc
from osv import fields, osv
-import tools
-from tools.translate import _
-import decimal_precision as dp
-
-
class hr_contract_be(osv.osv):
_inherit = 'hr.contract'
diff --git a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be_data.xml b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml
similarity index 100%
rename from addons/hr_payroll_l10n_be/hr_payroll_l10n_be_data.xml
rename to addons/l10n_be_hr_payroll/l10n_be_hr_payroll_data.xml
diff --git a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be_demo.xml b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_demo.xml
similarity index 90%
rename from addons/hr_payroll_l10n_be/hr_payroll_l10n_be_demo.xml
rename to addons/l10n_be_hr_payroll/l10n_be_hr_payroll_demo.xml
index f40e4c4dc84..c9e284f8e9b 100644
--- a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be_demo.xml
+++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_demo.xml
@@ -4,7 +4,7 @@
- Bonamy's Contract (C.P.218)
+ Bonamy's Contract (Belgium payroll C.P. 218)
diff --git a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be_view.xml b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml
similarity index 76%
rename from addons/hr_payroll_l10n_be/hr_payroll_l10n_be_view.xml
rename to addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml
index 2b5264dbc96..c4dca86166d 100644
--- a/addons/hr_payroll_l10n_be/hr_payroll_l10n_be_view.xml
+++ b/addons/l10n_be_hr_payroll/l10n_be_hr_payroll_view.xml
@@ -9,17 +9,15 @@
-
+
-
-
-
-
-
+
+
+
@@ -29,9 +27,6 @@
-
-
-
@@ -48,17 +43,6 @@
-
- hr.contract.struc
- hr.contract
-
- form
-
-
-
-
-
-
hr.hr.employee.view.forhr.employee
diff --git a/addons/hr_payroll_l10n_be/security/hr.salary.rule.csv b/addons/l10n_be_hr_payroll/security/hr.salary.rule.csv
similarity index 100%
rename from addons/hr_payroll_l10n_be/security/hr.salary.rule.csv
rename to addons/l10n_be_hr_payroll/security/hr.salary.rule.csv
diff --git a/addons/l10n_fr/fr_tax_demo.xml b/addons/l10n_fr/fr_tax_demo.xml
index 154765e9365..37ff4157c99 100644
--- a/addons/l10n_fr/fr_tax_demo.xml
+++ b/addons/l10n_fr/fr_tax_demo.xml
@@ -18,7 +18,7 @@
-
+
@@ -79,7 +79,7 @@
sale
-
+
diff --git a/addons/l10n_syscohada/i18n/es.po b/addons/l10n_syscohada/i18n/es.po
new file mode 100644
index 00000000000..381414d791f
--- /dev/null
+++ b/addons/l10n_syscohada/i18n/es.po
@@ -0,0 +1,151 @@
+# Spanish 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: 2010-05-09 10:31+0000\n"
+"PO-Revision-Date: 2011-09-17 23:20+0000\n"
+"Last-Translator: mgaja (GrupoIsep.com) \n"
+"Language-Team: Spanish \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-19 04:41+0000\n"
+"X-Generator: Launchpad (build 13955)\n"
+
+#. module: l10n_syscohada
+#: model:ir.actions.todo,note:l10n_syscohada.config_call_account_template_syscohada
+msgid ""
+"Generate Chart of Accounts from a Chart Template. You will be asked to pass "
+"the name of the company, the chart template to follow, the no. of digits to "
+"generate the code for your accounts and Bank account, currency to create "
+"Journals. Thus,the pure copy of chart Template is generated.\n"
+"\tThis is the same wizard that runs from Financial "
+"Management/Configuration/Financial Accounting/Financial Accounts/Generate "
+"Chart of Accounts from a Chart Template."
+msgstr ""
+"Generar el plan contable a partir de una plantilla de plan contable. Se le "
+"pedirá el nombre de la compañía, la plantilla de plan contable a utilizar, "
+"el número de dígitos para generar el código de las cuentas y de la cuenta "
+"bancaria, la moneda para crear los diarios. Así pues, se genere una copia "
+"exacta de la plantilla de plan contable.\n"
+"\tEste es el mismo asistente que se ejecuta desde Contabilidad y finanzas / "
+"Configuración / Contabilidad financiera / Cuentas financieras / Generar el "
+"plan contable a partir de una plantilla de plan contable."
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_asset
+msgid "Asset"
+msgstr "Activo"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_income
+msgid "Income"
+msgstr "Ingreso"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_payable
+msgid "Payable"
+msgstr "A pagar"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_stocks
+msgid "Actif circulant"
+msgstr "Activo circulante"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_dettes
+msgid "Dettes long terme"
+msgstr "Deudas a largo plazo"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_tax
+msgid "Tax"
+msgstr "Impuestos"
+
+#. module: l10n_syscohada
+#: constraint:account.account.template:0
+msgid "Error ! You can not create recursive account templates."
+msgstr "¡ Error ! No puede crear plantillas de cuentas recursivas."
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_provision
+msgid "Provisions"
+msgstr "Provisiones"
+
+#. module: l10n_syscohada
+#: constraint:account.tax.code.template:0
+msgid "Error ! You can not create recursive Tax Codes."
+msgstr "¡ Error ! No puede crear códigos de impuestos recursivos."
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_commitment
+msgid "Engagements"
+msgstr "Compromisos"
+
+#. module: l10n_syscohada
+#: model:ir.module.module,description:l10n_syscohada.module_meta_information
+msgid "This module implementes the accounting chart for OHADA area."
+msgstr ""
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_expense
+msgid "Expense"
+msgstr "Gastos"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_receivable
+msgid "Receivable"
+msgstr "A cobrar"
+
+#. module: l10n_syscohada
+#: constraint:ir.model:0
+msgid ""
+"The Object name must start with x_ and not contain any special character !"
+msgstr ""
+"¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
+"especial!"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_immobilisations
+msgid "Immobilisations"
+msgstr "Inmobilizaciones"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_equity
+msgid "Equity"
+msgstr "Patrimonio"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_stock
+msgid "Stocks"
+msgstr "Estocs"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_cash
+msgid "Cash"
+msgstr "Efectivo"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_special
+msgid "Comptes spéciaux"
+msgstr "Cuentas especiales"
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_view
+msgid "View"
+msgstr "Ver"
+
+#. module: l10n_syscohada
+#: model:ir.module.module,shortdesc:l10n_syscohada.module_meta_information
+msgid "OHADA - Plan comptable général"
+msgstr ""
+
+#. module: l10n_syscohada
+#: model:account.account.type,name:l10n_syscohada.account_type_cloture
+msgid "Cloture"
+msgstr "Cierre"
diff --git a/addons/l10n_uk/__init__.py b/addons/l10n_uk/__init__.py
index c417d8b0478..a95e47ee5d2 100644
--- a/addons/l10n_uk/__init__.py
+++ b/addons/l10n_uk/__init__.py
@@ -1,34 +1,22 @@
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
##############################################################################
#
-# Copyright (c) 2004-2009 Seath Solutions Ltd. All Rights Reserved.
-# Geoff Gardiner, Seath Solutions Ltd (http://www.seathsolutions.com/)
-# $Id$
+# Copyright (C) 2011 Smartmode LTD ().
#
+# 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.
#
-# WARNING: This program as such is intended to be used by professional
-# programmers who take the whole responsability of assessing all potential
-# consequences resulting from its eventual inadequacies and bugs
-# End users who are looking for a ready-to-use solution with commercial
-# garantees and support are strongly adviced to contract a Free Software
-# Service Company
+# 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.
#
-# This program is Free Software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
#
##############################################################################
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/addons/l10n_uk/__openerp__.py b/addons/l10n_uk/__openerp__.py
index b87352e2c02..58a687e4be9 100644
--- a/addons/l10n_uk/__openerp__.py
+++ b/addons/l10n_uk/__openerp__.py
@@ -1,8 +1,7 @@
-# -*- coding: utf-8 -*-
+# -*- encoding: utf-8 -*-
##############################################################################
#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
+# Copyright (C) 2011 Smartmode LTD ().
#
# 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,68 +18,32 @@
#
##############################################################################
-#
-# This module provides a minimal UK chart of accounts for building upon further
-# OpenERP's default currency and accounts are remapped to this chart
-#
-# This module works for OpenERP 4.1.0 (and, assumed, onwards).
-# This module does not work for OpenERP 4.0.2 and before.
-#
-# VAT is structured thus:
-# - the user company is assumed to be non-VAT exempt (easy to modify, however)
-# - categories OVATS (Standard), OVATR (Reduced), OVATZ (Zero) should be
-# assigned to the customer taxes section of products (depending on the product)
-# - categories IVATS (Standard), IVATR (Reduced), IVATZ (Zero) should be
-# assigned to the supplier taxes section of products (depending on the product)
-# - categories OVATX (eXempt), OVATO (Out of scope), or nothing at all should be
-# assigned to default tax field of customers (depending on the customer)
-# - customer categorization trumps product categorization (unchanged Tiny functionality)
-# - on purchases, upon invoicing
-# - the base amount (ex-VAT) appears in the appropriate input base category (S, R, Z)
-# - the VAT amount appears in the appropriate input VAT category (S, R)
-# - invoice lines can be traced in these VAT categories
-# - refunds of invoices are deducted from the input category
-# - on sales, upon invoicing
-# - the base amount (ex-VAT) appears in the appropriate output base category (S, R, Z, X, O)
-# - the VAT amount appears in the appropriate output VAT category (S, R)
-# - invoice lines can be traced in these VAT categories
-# - refunds of invoices are deducted from the output category
-#
-# This forms a basis for accrual tax accounting
-# Cash tax accounting can be accommodated with further processing in OpenERP
-#
-# Status beta 0.92 - tested on OpenERP 4.1.0
-# Status beta 0.93 - tested on OpenERP 4.1.0
-# - trivial change to depend only on 'account'
-# (seemed to be important for importing with no demo data)
-# Status 1.0 - tested on OpenERP 4.1.0, 4.0.3
-# - COGS account type fixed
-#
{
- 'name': 'United Kingdom - minimal',
- 'version': '1.1',
- 'category': 'Finance',
- 'description': """
-This is the base module to manage the accounting chart for United Kingdom in OpenERP.
-=====================================================================================
-
-British accounting chart and localization.
- """,
- 'author': 'Seath Solutions Ltd',
- 'website': 'http://www.seathsolutions.com',
+ 'name': 'UK Chart of Accounts - latest (Smartode/CT600)',
+ 'version': '1.0',
+ 'category': 'Localisation/Account Charts',
+ 'description': """This is the latest UK OpenERP localisation necesary to run OpenERP accounting for UK SME's with:
+ - a CT600-ready chart of accounts
+ - VAT100-ready tax structure
+ - InfoLogic UK counties listing
+ - a few other adaptations""",
+ 'author': 'SmartMode LTD',
+ 'website': 'http://www.smartmode.co.uk',
'depends': ['base_iban', 'base_vat', 'account_chart'],
'init_xml': [],
'update_xml': [
- 'l10n_uk_types.xml',
- 'l10n_uk_chart.xml',
- 'l10n_uk_tax.xml',
- 'l10n_uk_wizard.xml'
+ 'data/account.account.type.csv',
+ 'data/account.account.template.csv',
+ 'data/account.tax.code.template.csv',
+ 'data/account.chart.template.csv',
+ 'data/account.tax.template.csv',
+ 'data/res.country.state.csv',
+ 'l10n_uk_wizard.xml',
],
- 'demo_xml': [],
- 'installable': True,
- 'active': False,
- 'certificate': '008956603329629',
- 'images': ['images/config_chart_l10n_uk.jpeg','images/l10n_uk_chart.jpeg'],
+ 'demo_xml' : [
+ 'demo/demo.xml'
+ ],
+ 'installable': 'True'
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/l10n_uk/data/account.account.template.csv b/addons/l10n_uk/data/account.account.template.csv
new file mode 100644
index 00000000000..d07693fd022
--- /dev/null
+++ b/addons/l10n_uk/data/account.account.template.csv
@@ -0,0 +1,139 @@
+"id","code","name","parent_id:id","type","user_type:id","reconcile"
+"UK0","0","Company",,"view","account_type_view","FALSE"
+"BAL","BAL","Balance Sheet","UK0","view","account_type_view","FALSE"
+"A000","A000","Fixed assets","BAL","view","account_type_view","FALSE"
+"A010","A010","Intangible assets","A000","view","account_type_view","FALSE"
+"0010","0010","Software","A010","other","account_type_fixed_assets","FALSE"
+"0011","0011","Software Depreciation","A010","other","account_type_fixed_assets","FALSE"
+"0020","0020","Patents & Trademarks","A010","other","account_type_fixed_assets","FALSE"
+"0021","0021","Patents & Trademarks Depreciation","A010","other","account_type_fixed_assets","FALSE"
+"A020","A020","Tangible assets","A000","view","account_type_view","FALSE"
+"0030","0030","Fixtures and fittings","A020","other","account_type_fixed_assets","FALSE"
+"0031","0031","Fixtures and fittings Depreciation","A020","other","account_type_fixed_assets","FALSE"
+"0040","0040","Land and buildings","A020","other","account_type_fixed_assets","FALSE"
+"0041","0041","Land and buildings Depreciation","A020","other","account_type_fixed_assets","FALSE"
+"0050","0050","Motor vehicles","A020","other","account_type_fixed_assets","FALSE"
+"0051","0051","Motor vehicles Depreciation","A020","other","account_type_fixed_assets","FALSE"
+"0060","0060","Office equipment (inc computer equipment)","A020","other","account_type_fixed_assets","FALSE"
+"0061","0061","Office equipment (inc computer equipment) Depreciation","A020","other","account_type_fixed_assets","FALSE"
+"0070","0070","Plant and machinery","A020","other","account_type_fixed_assets","FALSE"
+"0071","0071","Plant and machinery Depreciation","A020","other","account_type_fixed_assets","FALSE"
+"A030","A030","Investments","A000","view","account_type_view","FALSE"
+"B000","B000","Current assets","BAL","view","account_type_view","FALSE"
+"B010","B010","Stocks & WIP","B000","view","account_type_view","FALSE"
+"1001","1001","Stock","B010","other","account_type_current_assets","TRUE"
+"1002","1002","Work in Progress","B010","other","account_type_current_assets","FALSE"
+"1003","1003","Finished Goods","B010","other","account_type_current_assets","FALSE"
+"B020","B020","Trade Debtors","B000","view","account_type_view","FALSE"
+"1100","1100","Debtors Control Account","B020","receivable","account_type_receivable","TRUE"
+"1101","1101","Sundry Debtors","B020","receivable","account_type_receivable","TRUE"
+"1102","1102","Other Debtors","B020","other","account_type_current_assets","FALSE"
+"B030","B030","Investment current assets","B000","view","account_type_view","FALSE"
+"B040","B040","Cash at bank and in hand","B000","view","account_type_view","FALSE"
+"1200","1200","Bank Accounts","B040","liquidity","account_type_current_assets","TRUE"
+"1240","1240","Company Credit Card","B040","liquidity","account_type_current_assets","TRUE"
+"B050","B050","Prepayments and accrued income","B000","view","account_type_view","FALSE"
+"1103","1103","Prepayments","B050","other","account_type_current_assets","FALSE"
+"C000","C000","Current Liabilities","BAL","view","account_type_view","FALSE"
+"C010","C010","Creditors due within one year","C000","view","account_type_view","FALSE"
+"2100","2100","Creditors Control Account","C010","payable","account_type_payable","TRUE"
+"2101","2101","Sundry Creditors","C010","other","account_type_current_liabilities","FALSE"
+"2102","2102","Other Creditors","C010","other","account_type_current_liabilities","FALSE"
+"2200","2200","Sales Tax Control Account","C010","other","account_type_output_tax","FALSE"
+"2201","2201","Purchase Tax Control Account","C010","other","account_type_input_tax","FALSE"
+"2202","2202","HMRC - VAT Account","C010","payable","account_type_payable","TRUE"
+"2204","2204","Manual Adjustments ヨ VAT","C010","other","account_type_current_liabilities","FALSE"
+"2210","2210","P.A.Y.E. & NI","C010","payable","account_type_payable","TRUE"
+"2220","2220","Net Wages","C010","payable","account_type_payable","TRUE"
+"2230","2230","Pension Fund","C010","payable","account_type_payable","TRUE"
+"C020","C020","Provisions for liabilities and charges","C000","view","account_type_view","FALSE"
+"2150","2150","Bad debt provision","C020","other","account_type_current_liabilities","FALSE"
+"C030","C030","Accruals and deferred income","C000","view","account_type_view","FALSE"
+"2109","2109","Accruals","C030","other","account_type_current_liabilities","FALSE"
+"2320","2320","Corporation Tax","C030","payable","account_type_payable","TRUE"
+"D000","D000","Non Current Liabilities","BAL","view","account_type_view","FALSE"
+"D010","D010","Creditors due after one year","D000","view","account_type_view","FALSE"
+"2300","2300","Loans","D010","other","account_type_current_liabilities","FALSE"
+"2310","2310","Hire Purchase","D010","other","account_type_current_liabilities","FALSE"
+"2330","2330","Mortgages","D010","other","account_type_current_liabilities","FALSE"
+"E000","E000","Capital & Reserves","BAL","view","account_type_view","FALSE"
+"3000","3000","Called up share capital","E000","other","account_type_equity","FALSE"
+"3010","3010","Share premium account","E000","other","account_type_equity","FALSE"
+"3020","3020","Revaluation reserve","E000","other","account_type_equity","FALSE"
+"3030","3030","Other reserves","E000","other","account_type_equity","FALSE"
+"3200","3200","Profit and loss account","E000","other","account_type_profit_and_loss","FALSE"
+"PNL","PNL","Profit and Loss","UK0","view","account_type_view","FALSE"
+"F000","F000","Turnover","PNL","view","account_type_view","FALSE"
+"4000","4000","Sales category 1","F000","other","account_type_income","FALSE"
+"4001","4001","Sales category 2","F000","other","account_type_income","FALSE"
+"4002","4002","Sales category 3","F000","other","account_type_income","FALSE"
+"4003","4003","Sales category 4","F000","other","account_type_income","FALSE"
+"G000","G000","Cost of sales","PNL","view","account_type_view","FALSE"
+"5000","5000","Cost of sales 1","G000","other","account_type_expense","FALSE"
+"5001","5001","Cost of sales 2","G000","other","account_type_expense","FALSE"
+"5002","5002","Cost of sales 3","G000","other","account_type_expense","FALSE"
+"5003","5003","Cost of sales 4","G000","other","account_type_expense","FALSE"
+"H000","H000","Distribution costs","PNL","view","account_type_view","FALSE"
+"H010","H010","Advertising and promotions","H000","view","account_type_view","FALSE"
+"6000","6000","Marketing, POS","H010","other","account_type_expense","FALSE"
+"6001","6001","Exhibitions and events","H010","other","account_type_expense","FALSE"
+"6002","6002","PR","H010","other","account_type_expense","FALSE"
+"6010","6010","Distribution vehicles","H000","other","account_type_expense","FALSE"
+"6020","6020","Distribution salaries and wages","H000","other","account_type_expense","FALSE"
+"6030","6030","Shipping","H000","other","account_type_expense","FALSE"
+"I000","I000","Administrative expenses","PNL","view","account_type_view","FALSE"
+"I010","I010","Salaries & wages","I000","view","account_type_view","FALSE"
+"7000","7000","Directors pension","I010","other","account_type_expense","FALSE"
+"7001","7001","Directors remuneration","I010","other","account_type_expense","FALSE"
+"7010","7010","Admin gross salaries","I010","other","account_type_expense","FALSE"
+"7011","7011","Management gross salaries","I010","other","account_type_expense","FALSE"
+"7012","7012","Employers NIC","I010","other","account_type_expense","FALSE"
+"7020","7020","Subcontractors payments","I010","other","account_type_expense","FALSE"
+"I020","I020","Legal and professional costs","I000","view","account_type_view","FALSE"
+"7610","7610","Consultancy","I020","other","account_type_expense","FALSE"
+"7620","7620","Legal and professional charges","I020","other","account_type_expense","FALSE"
+"I025","I025","Accountancy and audit","I000","view","account_type_view","FALSE"
+"7601","7601","Accounting","I025","other","account_type_expense","FALSE"
+"7602","7602","Auditing","I025","other","account_type_expense","FALSE"
+"I030","I030","Property costs","I000","view","account_type_view","FALSE"
+"7110","7110","Light, heat and power","I030","other","account_type_expense","FALSE"
+"7100","7100","Rent and rates","I030","other","account_type_expense","FALSE"
+"7120","7120","Repairs, renewals and maintenance","I030","other","account_type_expense","FALSE"
+"I040","I040","Vehicle expenses","I000","view","account_type_view","FALSE"
+"7300","7300","Car hire","I040","other","account_type_expense","FALSE"
+"7301","7301","Car fuel","I040","other","account_type_expense","FALSE"
+"7302","7302","Car maintenance","I040","other","account_type_expense","FALSE"
+"I050","I050","Administration and office expenses","I000","view","account_type_view","FALSE"
+"7502","7502","Telephone","I050","other","account_type_expense","FALSE"
+"7503","7503","Internet & hosting","I050","other","account_type_expense","FALSE"
+"7504","7504","Mobiles","I050","other","account_type_expense","FALSE"
+"7505","7505","Stationery","I050","other","account_type_expense","FALSE"
+"7506","7506","Office consumables","I050","other","account_type_expense","FALSE"
+"7507","7507","Postage and Carriage","I050","other","account_type_expense","FALSE"
+"7508","7508","Books","I050","other","account_type_expense","FALSE"
+"7509","7509","Network costs","I050","other","account_type_expense","FALSE"
+"7510","7510","Software expenses","I050","other","account_type_expense","FALSE"
+"7511","7511","Other computer costs","I050","other","account_type_expense","FALSE"
+"7512","7512","Recruitment fees","I050","other","account_type_expense","FALSE"
+"7513","7513","Other admin expenses","I050","other","account_type_expense","FALSE"
+"I060","I060","Sundry expenses","I000","view","account_type_view","FALSE"
+"7700","7700","Exchange gains/losses","I060","other","account_type_expense","FALSE"
+"7710","7710","Other sundry expenses","I060","other","account_type_expense","FALSE"
+"7850","7850","Bad debts","I060","other","account_type_expense","FALSE"
+"7910","7910","Bank, credit card and other financial charges","I060","other","account_type_expense","FALSE"
+"I070","I070","Depreciation expense","I000","view","account_type_view","FALSE"
+"8000","8000","Intangible assets depn","I070","other","account_type_expense","FALSE"
+"8001","8001","Tangible assets depn","I070","other","account_type_expense","FALSE"
+"8200","8200","Donations","I060","other","account_type_expense","FALSE"
+"8300","8300","Entertaining","I060","other","account_type_expense","FALSE"
+"8400","8400","Insurance","I060","other","account_type_expense","FALSE"
+"8500","8500","Travel and subsistence","I050","other","account_type_expense","FALSE"
+"J000","J000","Other operating income","PNL","view","account_type_view","FALSE"
+"9000","9000","Profits/Losses on disposals of assets","J000","other","account_type_income","FALSE"
+"K000","K000","Interest receivable and similar income:","PNL","view","account_type_view","FALSE"
+"4900","4900","Bank Interest received","K000","other","account_type_income","FALSE"
+"4910","4910","Investment Interest received","K000","other","account_type_income","FALSE"
+"l000","l000","Interest payable and similar charges","PNL","view","account_type_view","FALSE"
+"7900","7900","Interest paid","l000","other","account_type_expense","FALSE"
+"M000","M000","Tax on profit or loss on ordinary activities","PNL","view","account_type_view","FALSE"
+"8800","8800","Corporation tax expense","M000","other","account_type_expense","FALSE"
diff --git a/addons/l10n_uk/data/account.account.type.csv b/addons/l10n_uk/data/account.account.type.csv
new file mode 100644
index 00000000000..0827975b22f
--- /dev/null
+++ b/addons/l10n_uk/data/account.account.type.csv
@@ -0,0 +1,13 @@
+"id","name","code","report_type","close_method"
+"account_type_current_assets","Current Assets","Current Assets","asset","Balance"
+"account_type_current_liabilities","Current Liabilities","Current Liabilities","liability","Balance"
+"account_type_equity","Equity","Equity","liability","Balance"
+"account_type_expense","Expense","Expense","expense","None"
+"account_type_fixed_assets","Fixed Assets","Fixed Assets","asset","Balance"
+"account_type_income","Income","Income","income","None"
+"account_type_payable","Payable","Payable","liability","Unreconciled"
+"account_type_receivable","Receivable","Receivable","asset","Unreconciled"
+"account_type_output_tax","Output Tax","Output Tax","liability","Unreconciled"
+"account_type_input_tax","Input Tax","Input Tax","asset","Unreconciled"
+"account_type_profit_and_loss","Profit and Loss","Profit and Loss","none","None"
+"account_type_view","View","view",,"None"
diff --git a/addons/l10n_uk/data/account.chart.template.csv b/addons/l10n_uk/data/account.chart.template.csv
new file mode 100644
index 00000000000..9d1812a8df4
--- /dev/null
+++ b/addons/l10n_uk/data/account.chart.template.csv
@@ -0,0 +1,2 @@
+"id","name","account_root_id:id","tax_code_root_id:id","bank_account_view_id:id","property_account_receivable:id","property_account_payable:id","property_account_expense_categ:id","property_account_income_categ:id","property_reserve_and_surplus_account:id"
+"l10n_uk","UK Tax and Account Chart Template (by SmartMode)","UK0","0","1200","1100","2100","5000","4000","3200"
diff --git a/addons/l10n_uk/data/account.tax.code.template.csv b/addons/l10n_uk/data/account.tax.code.template.csv
new file mode 100644
index 00000000000..eba760226e1
--- /dev/null
+++ b/addons/l10n_uk/data/account.tax.code.template.csv
@@ -0,0 +1,10 @@
+"id","name","code","parent_id:id","notprintable","sign"
+0,"UK HMRC VAT",0,,,1
+4,"Net VAT to be paid/reclaimed",5,0,"FALSE",1
+5,"Total value of sales ex VAT (box 8 included)",6,0,"FALSE",0
+6,"Total value of purchases ex VAT",7,0,"FALSE",0
+8,"Total value of EC purchases, ex VAT",9,0,"FALSE",0
+1,"VAT on Sales and other outputs",1,4,"FALSE",1
+2,"VAT on acquisitions from other EC Member states",2,4,"FALSE",1
+3,"VAT reclaimed on purchases (EC included)",4,4,"FALSE",-1
+7,"Total value of EC sales, ex VAT",8,5,"FALSE",1
diff --git a/addons/l10n_uk/data/account.tax.template.csv b/addons/l10n_uk/data/account.tax.template.csv
new file mode 100644
index 00000000000..2455b382818
--- /dev/null
+++ b/addons/l10n_uk/data/account.tax.template.csv
@@ -0,0 +1,14 @@
+"id","description","chart_template_id:id","type_tax_use","name","type","amount","account_collected_id:id","account_paid_id:id","base_code_id:id","tax_code_id:id","ref_base_code_id:id","ref_tax_code_id:id","tax_sign","base_sign","ref_base_sign","ref_tax_sign","parent_id:id"
+"ST0","ST0","l10n_uk","sale","Zero rated sales","percent",0,2200,2200,5,1,5,1,1,1,-1,-1,
+"ST1","ST1","l10n_uk","sale","Standard rate sales (17.5%)","percent",0.175,2200,2200,5,1,5,1,1,1,-1,-1,
+"ST2","ST2","l10n_uk","sale","Exempt sales","percent",0,2200,2200,5,1,5,1,1,1,-1,-1,
+"PT0","PT0","l10n_uk","purchase","Zero rated purchases","percent",0,2201,2201,6,3,6,3,1,1,-1,-1,
+"PT1","PT1","l10n_uk","purchase","Standard rate purchases (17.5%)","percent",0.175,2201,2201,6,3,6,3,1,1,-1,-1,
+"PT2","PT2","l10n_uk","purchase","Exempt purchases","percent",0,2201,2201,6,3,6,3,1,1,-1,-1,
+"PT8","PT8","l10n_uk","purchase","Standard rated purchases from EC","percent",0.175,2201,2201,8,2,8,2,1,1,-1,-1,
+"PT8R","PT8R","l10n_uk","purchase","Reverse EC Purchase VAT","percent",-1,2201,2201,,3,3,,-1,-1,1,1,"PT8"
+"PT5","PT5","l10n_uk","purchase","Lower rate purchases (5%)","percent",0.05,2201,2201,6,3,6,3,1,1,-1,-1,
+"ST4","ST4","l10n_uk","sale","Sales to customers in EC","percent",0,2200,2200,7,,7,,1,1,-1,-1,
+"PT7","PT7","l10n_uk","purchase","Zero rated purchases from EC","percent",0,2201,2201,8,,8,,1,1,-1,-1,
+"ST11","ST11","l10n_uk","sale","Standard rate sales (20%)","percent",0.2,2200,2200,5,1,5,1,1,1,-1,-1,
+"PT11","PT11","l10n_uk","purchase","Standard rate purchases (20%)","percent",0.2,2201,2201,6,3,6,3,1,1,-1,-1,
diff --git a/addons/l10n_uk/data/res.country.state.csv b/addons/l10n_uk/data/res.country.state.csv
new file mode 100644
index 00000000000..bce2f3c9f36
--- /dev/null
+++ b/addons/l10n_uk/data/res.country.state.csv
@@ -0,0 +1,120 @@
+"id","country_id:id","code","name"
+"state_uk_1","base.uk","A1","Aberdeenshire"
+"state_uk_2","base.uk","A5","Angus"
+"state_uk_3","base.uk","A7","Argyll"
+"state_uk_4","base.uk","A9","Avon"
+"state_uk_5","base.uk","B1","Ayrshire"
+"state_uk_6","base.uk","B3","Banffshire"
+"state_uk_7","base.uk","B5","Bedfordshire"
+"state_uk_8","base.uk","B7","Berkshire"
+"state_uk_9","base.uk","B9","Berwickshire"
+"state_uk_10","base.uk","C1","Buckinghamshire"
+"state_uk_11","base.uk","C3","Caithness"
+"state_uk_12","base.uk","C5","Cambridgeshire"
+"state_uk_13","base.uk","C6","Channel Islands"
+"state_uk_14","base.uk","C7","Cheshire"
+"state_uk_15","base.uk","C9","Clackmannanshire"
+"state_uk_16","base.uk","D1","Cleveland"
+"state_uk_17","base.uk","D3","Clwyd"
+"state_uk_18","base.uk","D5","County Antrim"
+"state_uk_19","base.uk","D7","County Armagh"
+"state_uk_20","base.uk","D9","County Down"
+"state_uk_21","base.uk","E1","County Durham"
+"state_uk_22","base.uk","E3","County Fermanagh"
+"state_uk_23","base.uk","E5","County Londonderry"
+"state_uk_24","base.uk","E7","County Tyrone"
+"state_uk_25","base.uk","E9","Cornwall"
+"state_uk_26","base.uk","F1","Cumbria"
+"state_uk_27","base.uk","F3","Derbyshire"
+"state_uk_28","base.uk","F5","Devon"
+"state_uk_29","base.uk","F7","Dorset"
+"state_uk_30","base.uk","F9","Dumfriesshire"
+"state_uk_31","base.uk","G1","Dunbartonshire"
+"state_uk_32","base.uk","G3","Dyfed"
+"state_uk_33","base.uk","G5","East Lothian"
+"state_uk_34","base.uk","G7","East Sussex"
+"state_uk_35","base.uk","G9","Essex"
+"state_uk_36","base.uk","H1","Fife"
+"state_uk_37","base.uk","H3","Gloucestershire"
+"state_uk_38","base.uk","H7","Gwent"
+"state_uk_39","base.uk","H9","Gwynedd"
+"state_uk_40","base.uk","I1","Hampshire"
+"state_uk_41","base.uk","I3","Herefordshire"
+"state_uk_42","base.uk","I5","Hertfordshire"
+"state_uk_43","base.uk","I7","Inverness-Shire"
+"state_uk_44","base.uk","I9","Isle of Arran"
+"state_uk_45","base.uk","J1","Isle of Barra"
+"state_uk_46","base.uk","J3","Isle of Benbecula"
+"state_uk_47","base.uk","J5","Isle of Bute"
+"state_uk_48","base.uk","J7","Isle of Canna"
+"state_uk_49","base.uk","J9","Isle of Coll"
+"state_uk_50","base.uk","K1","Isle of Colonsay"
+"state_uk_51","base.uk","K3","Isle of Cumbrae"
+"state_uk_52","base.uk","K5","Isle of Eigg"
+"state_uk_53","base.uk","K7","Isle of Gigha"
+"state_uk_54","base.uk","K9","Isle of Harris"
+"state_uk_55","base.uk","L1","Isle of Iona"
+"state_uk_56","base.uk","L2","Isle of Islay"
+"state_uk_57","base.uk","L5","Isle of Jura"
+"state_uk_58","base.uk","L7","Isle of Lewis"
+"state_uk_59","base.uk","L9","Isle of Man"
+"state_uk_60","base.uk","M1","Isle of Mull"
+"state_uk_61","base.uk","M3","Isle of North Uist"
+"state_uk_62","base.uk","M7","Isle of Rhum"
+"state_uk_63","base.uk","M9","Isle of Scalpay"
+"state_uk_64","base.uk","N1","Shetland Islands"
+"state_uk_65","base.uk","N3","Isle of Skye"
+"state_uk_66","base.uk","N5","Isle of South Uist"
+"state_uk_67","base.uk","N7","Isle of Tiree"
+"state_uk_68","base.uk","N9","Isle of Wight"
+"state_uk_69","base.uk","O5","Kent"
+"state_uk_70","base.uk","O7","Kincardineshire"
+"state_uk_71","base.uk","O9","Kinross-Shire"
+"state_uk_72","base.uk","P1","Kirkcudbrightshire"
+"state_uk_73","base.uk","P5","Lancashire"
+"state_uk_74","base.uk","P7","Leicestershire"
+"state_uk_75","base.uk","P9","Lincolnshire"
+"state_uk_76","base.uk","Q3","Merseyside"
+"state_uk_77","base.uk","Q5","Mid Glamorgan"
+"state_uk_78","base.uk","Q9","Middlesex"
+"state_uk_79","base.uk","R1","Morayshire"
+"state_uk_80","base.uk","R3","Nairnshire"
+"state_uk_81","base.uk","R7","North Humberside"
+"state_uk_82","base.uk","R9","North Yorkshire"
+"state_uk_83","base.uk","S1","Northamptonshire"
+"state_uk_84","base.uk","S3","Northumberland"
+"state_uk_85","base.uk","S5","Nottinghamshire"
+"state_uk_86","base.uk","S7","Oxfordshire"
+"state_uk_87","base.uk","S9","Peeblesshire"
+"state_uk_88","base.uk","T1","Perthshire"
+"state_uk_89","base.uk","T3","Powys"
+"state_uk_90","base.uk","T5","Renfrewshire"
+"state_uk_91","base.uk","T7","Ross-Shire"
+"state_uk_92","base.uk","T9","Roxburghshire"
+"state_uk_93","base.uk","U3","Selkirkshire"
+"state_uk_94","base.uk","U5","Shropshire"
+"state_uk_95","base.uk","U7","Somerset"
+"state_uk_96","base.uk","U9","South Glamorgan"
+"state_uk_97","base.uk","V1","South Humberside"
+"state_uk_98","base.uk","V3","South Yorkshire"
+"state_uk_99","base.uk","V5","Staffordshire"
+"state_uk_100","base.uk","V7","Stirlingshire"
+"state_uk_101","base.uk","V9","Suffolk"
+"state_uk_102","base.uk","W1","Surrey"
+"state_uk_103","base.uk","W3","Sutherland"
+"state_uk_104","base.uk","W5","Tyne and Wear"
+"state_uk_105","base.uk","W7","Warwickshire"
+"state_uk_106","base.uk","W9","West Glamorgan"
+"state_uk_107","base.uk","X1","West Lothian"
+"state_uk_108","base.uk","X3","West Midlands"
+"state_uk_109","base.uk","X5","West Sussex"
+"state_uk_110","base.uk","X7","West Yorkshire"
+"state_uk_111","base.uk","X9","Wigtownshire"
+"state_uk_112","base.uk","Y1","Wiltshire"
+"state_uk_113","base.uk","Y3","Worcestershire"
+"state_uk_114","base.uk","M5","Orkney"
+"state_uk_115","base.uk","O1","Isles of Scilly"
+"state_uk_116","base.uk","P3","Lanarkshire"
+"state_uk_117","base.uk","Q1","London"
+"state_uk_118","base.uk","Q7","Midlothian"
+"state_uk_119","base.uk","R5","Norfolk"
diff --git a/addons/l10n_uk/demo/demo.xml b/addons/l10n_uk/demo/demo.xml
new file mode 100644
index 00000000000..b23cd76ec6d
--- /dev/null
+++ b/addons/l10n_uk/demo/demo.xml
@@ -0,0 +1,24 @@
+
+
+
+ UK OpenERP Partner
+ smartmode
+ http://www.smartmode.co.uk
+ SmartMode LTD
+
+
+
+ 08455274653
+ Vadim Chobanu
+ HA4 7JW
+ Ruislip
+
+
+ vadim@smartmode.co.uk
+ +44 (0) 8456434548
+ 12, Hill Lane
+ 1
+ default
+
+
+
diff --git a/addons/l10n_uk/l10n_uk_chart.xml b/addons/l10n_uk/l10n_uk_chart.xml
deleted file mode 100644
index d82f9d40fde..00000000000
--- a/addons/l10n_uk/l10n_uk_chart.xml
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
-
-
-
- 0
- Account Chart UK
-
- view
-
-
-
-
-
- 1
- Balance Sheet
-
- view
-
-
-
-
- Liabilities
- 11
- view
-
-
-
-
-
-
- 110
- Current Liabilities
-
- view
-
-
-
-
- 1111
- Creditors
-
- payable
-
-
-
-
-
- 1112
- Input VAT
-
- other
-
-
-
-
- 1113
- Reserve and Profit/Loss Account
-
- other
-
-
-
-
- Assets
- 10
- view
-
-
-
-
-
-
- 100
- Fixed Assets
-
- view
-
-
-
-
- 1000
- Fixed Asset Account
-
- other
-
-
-
-
- 101
- Net Current Assets
-
- view
-
-
-
-
- 1100
- Current Assets
-
- view
-
-
-
-
- 11001
- Purchased Stocks
-
- other
-
-
-
-
- 11002
- Debtors
-
- receivable
-
-
-
-
-
- 11003
- Output VAT
-
- other
-
-
-
-
- 11004
- Bank Current Account
-
- view
-
-
-
-
- 11005
- Cash
-
- liquidity
-
-
-
-
-
-
- 2
- Profit and Loss
-
- view
-
-
-
-
- Income
- 20
- view
-
-
-
-
-
-
- Foreign Exchange Gain
- X201
- other
-
-
-
-
-
-
- 200
- Revenue
-
- view
-
-
-
-
- 2001
- Product Sales
-
- other
-
-
-
-
- Expense
- 21
- view
-
-
-
-
-
-
- 210
- Cost of Sales
-
- view
-
-
-
-
- 2100
- Cost of Goods Sold
-
- other
-
-
-
-
- 211
- Overheads
-
- view
-
-
-
-
- 2110
- Expenses
-
- other
-
-
-
-
- Foreign Exchange Loss
- 2111
- other
-
-
-
-
-
-
- 2112
- Salary Expenses
-
- other
-
-
-
-
diff --git a/addons/l10n_uk/l10n_uk_tax.xml b/addons/l10n_uk/l10n_uk_tax.xml
deleted file mode 100644
index 4d2206cdbc7..00000000000
--- a/addons/l10n_uk/l10n_uk_tax.xml
+++ /dev/null
@@ -1,260 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- Plan Fees UK
-
-
-
- VAT Balance to Pay
-
-
-
-
- Input VAT
-
-
-
-
-
- Input VAT Rate S (15%)
-
-
-
-
- Input VAT Rate R (5%)
-
-
-
-
-
-
- Output VAT
-
-
-
-
- Output VAT Rate S (15%)
-
-
-
-
- Output VAT Rate R (5%)
-
-
-
-
-
-
-
-
- Tax Bases
-
-
-
-
- Taxable Purchases Base
-
-
-
-
- Taxable Purchases Rated S (15%)
-
-
-
-
- Taxable Purchases Rated R (5%)
-
-
-
-
- Taxable Purchases Rated Z (0%)
-
-
-
-
- Taxable Purchases Type X (Exempt)
-
-
-
-
- Taxable Purchases Type O (Out of scope)
-
-
-
-
-
-
- Base of Taxable Sales
-
-
-
-
- Taxable Sales Rated S (15%)
-
-
-
-
- Taxable Sales Rated R (5%)
-
-
-
-
- Taxable Sales Rated Z (0%)
-
-
-
-
- Taxable Sales Type X (Exempt)
-
-
-
-
- Taxable Sales Type O (Out of scope)
-
-
-
-
-
-
- UK Minimal Account Chart Template
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- IVAT S
-
- percent
-
-
-
-
-
-
- purchase
-
-
-
-
- IVAT R
-
- percent
-
-
-
-
-
-
- purchase
-
-
-
-
- IVAT Z
-
- percent
-
-
- purchase
-
-
-
-
- IVAT X
-
- percent
-
-
- purchase
-
-
-
-
- IVAT O
-
- percent
-
-
- purchase
-
-
-
-
-
-
- OVAT S
-
- percent
-
-
-
-
-
-
- sale
-
-
-
-
- OVAT R
-
- percent
-
-
-
-
-
-
- sale
-
-
-
-
- OVAT Z
-
- percent
-
-
- sale
-
-
-
-
- OVAT X
-
- percent
-
-
- sale
-
-
-
-
- OVAT O
-
- percent
-
-
- sale
-
-
-
-
diff --git a/addons/l10n_uk/l10n_uk_types.xml b/addons/l10n_uk/l10n_uk_types.xml
deleted file mode 100644
index d9bfb5344ad..00000000000
--- a/addons/l10n_uk/l10n_uk_types.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
-
- Receivable
- receivable
- income
- unreconciled
-
-
-
- Payable
- payable
- expense
- unreconciled
-
-
-
- View
- view
- none
-
-
-
- Income View
- view
- income
-
-
-
- Expense View
- expense
- expense
-
-
-
- Asset View
- asset
- asset
-
-
-
- Liability View
- liability
- liability
-
-
-
- Income
- income
- none
- income
-
-
-
- Expense
- expense
- none
- expense
-
-
-
- Tax
- tax
- liability
- unreconciled
-
-
-
- Cash
- cash
- asset
- balance
-
-
-
- Liability
- liability
- balance
- liability
-
-
-
- Asset
- asset
- balance
- asset
-
-
-
- Equity
- equity
- asset
- balance
-
-
-
-
diff --git a/addons/l10n_uk/l10n_uk_wizard.xml b/addons/l10n_uk/l10n_uk_wizard.xml
index 42b23bbf054..b7da2ee5c6b 100644
--- a/addons/l10n_uk/l10n_uk_wizard.xml
+++ b/addons/l10n_uk/l10n_uk_wizard.xml
@@ -1,14 +1,42 @@
-
-
-
-
- Generate Chart of Accounts from a Chart Template
- Generate Chart of Accounts from a Chart Template. You will be asked to pass the name of the company, the chart template to follow, the no. of digits to generate the code for your accounts and Bank account, currency to create Journals. Thus,the pure copy of chart Template is generated.
- This is the same wizard that runs from Financial Management/Configuration/Financial Accounting/Financial Accounts/Generate Chart of Accounts from a Chart Template.
-
- automatic
-
-
-
-
-
+
+
+
+
+
+ Generate Chart of Accounts from a Chart Template
+ wizard.multi.charts.accounts
+ form
+
+
+
+
+
+ Generate Your UK Accounting Chart from a Chart Template
+
+
+
+ SELECT 4 DIGIT ACCOUNTS. This is the same wizard that runs from Financial Management/Configuration/Financial Accounting/ Financial Accounts/Generate Chart of Accounts from a Chart Template.
+
+
+
+
+
+
+ Generate UK Chart of Accounts from a Chart Template
+ ir.actions.act_window
+ wizard.multi.charts.accounts
+
+ form
+ form
+ new
+
+
+
+
+ 10
+ onskip
+ open
+
+
+
+
diff --git a/addons/lunch/lunch_view.xml b/addons/lunch/lunch_view.xml
index 100380d34c4..0b2cdf04e89 100644
--- a/addons/lunch/lunch_view.xml
+++ b/addons/lunch/lunch_view.xml
@@ -87,7 +87,7 @@
-
+
@@ -194,7 +194,7 @@
-
+
@@ -380,16 +380,15 @@
help="Box amount in current month"/>
-
-
-
+
+
+
-
+
diff --git a/addons/lunch/report/report_lunch_order_view.xml b/addons/lunch/report/report_lunch_order_view.xml
index d65b8b01c1e..5dd25322d47 100644
--- a/addons/lunch/report/report_lunch_order_view.xml
+++ b/addons/lunch/report/report_lunch_order_view.xml
@@ -35,12 +35,11 @@
help="Tasks performed in last 30 days"/>
-
+
@@ -66,4 +65,4 @@
-
\ No newline at end of file
+
diff --git a/addons/marketing/marketing_view.xml b/addons/marketing/marketing_view.xml
index b4539cfef33..9f70651e5ab 100644
--- a/addons/marketing/marketing_view.xml
+++ b/addons/marketing/marketing_view.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml
index c1028e3f3e1..a60b3943a41 100644
--- a/addons/marketing_campaign/marketing_campaign_view.xml
+++ b/addons/marketing_campaign/marketing_campaign_view.xml
@@ -95,10 +95,10 @@
-
-
+
+
-
+
@@ -200,12 +200,12 @@
-
-
-
-
+
+
+
+
-
+
@@ -397,7 +397,7 @@
search
-
+
@@ -412,7 +412,7 @@
-
+
diff --git a/addons/marketing_campaign/report/campaign_analysis_view.xml b/addons/marketing_campaign/report/campaign_analysis_view.xml
index 745dd4047e5..653cc5c553d 100644
--- a/addons/marketing_campaign/report/campaign_analysis_view.xml
+++ b/addons/marketing_campaign/report/campaign_analysis_view.xml
@@ -59,7 +59,7 @@
-
+
diff --git a/addons/membership/membership.py b/addons/membership/membership.py
index 6384a255ac3..09d9d34f973 100644
--- a/addons/membership/membership.py
+++ b/addons/membership/membership.py
@@ -379,7 +379,7 @@ class Partner(osv.osv):
return True
_constraints = [
- (_check_recursion, 'Error ! You can not create recursive associated members.', ['associate_member'])
+ (_check_recursion, 'Error ! You cannot create recursive associated members.', ['associate_member'])
]
def copy(self, cr, uid, id, default=None, context=None):
@@ -570,4 +570,4 @@ class account_invoice_line(osv.osv):
account_invoice_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/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml
index 463436439c6..0e6ddc630f6 100644
--- a/addons/membership/report/report_membership_view.xml
+++ b/addons/membership/report/report_membership_view.xml
@@ -35,7 +35,7 @@
search
-
+
-
+
-
+
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index 3053b8de448..b1d79d66cf8 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -79,13 +79,13 @@
search
-
+
-
+
@@ -183,7 +183,7 @@
search
-
+
@@ -191,7 +191,7 @@
-
+
@@ -289,7 +289,7 @@
-
+
@@ -420,14 +420,14 @@
search
-
+
-
+
@@ -796,7 +796,7 @@
search
-
+
@@ -817,7 +817,7 @@
-
+
diff --git a/addons/mrp/procurement.py b/addons/mrp/procurement.py
index 41a9d7993a2..4086a401f56 100644
--- a/addons/mrp/procurement.py
+++ b/addons/mrp/procurement.py
@@ -100,8 +100,9 @@ class procurement_order(osv.osv):
bom_result = production_obj.action_compute(cr, uid,
[produce_id], properties=[x.id for x in procurement.property_ids])
wf_service.trg_validate(uid, 'mrp.production', produce_id, 'button_confirm', cr)
- move_obj.write(cr, uid, [res_id],
- {'location_id': procurement.location_id.id})
+ if res_id:
+ move_obj.write(cr, uid, [res_id],
+ {'location_id': procurement.location_id.id})
return res
procurement_order()
diff --git a/addons/mrp/report/mrp_production_order_view.xml b/addons/mrp/report/mrp_production_order_view.xml
index f14825e1d16..dfcf41d9333 100644
--- a/addons/mrp/report/mrp_production_order_view.xml
+++ b/addons/mrp/report/mrp_production_order_view.xml
@@ -47,7 +47,7 @@
search
-
+
@@ -57,13 +57,12 @@
help="Production performed during current month"/>
-
+
diff --git a/addons/mrp/security/mrp_security.xml b/addons/mrp/security/mrp_security.xml
index 94f79769268..fb83f8c4a62 100644
--- a/addons/mrp/security/mrp_security.xml
+++ b/addons/mrp/security/mrp_security.xml
@@ -37,5 +37,19 @@
['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
+
+ mrp_routing multi-company
+
+
+ ['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
+
+
+
+ mrp_routing_workcenter multi-company
+
+
+ ['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
+
+
diff --git a/addons/mrp/stock.py b/addons/mrp/stock.py
index 0c1454edf98..6e66fb57f25 100644
--- a/addons/mrp/stock.py
+++ b/addons/mrp/stock.py
@@ -112,6 +112,7 @@ class StockMove(osv.osv):
production_obj = self.pool.get('mrp.production')
wf_service = netsvc.LocalService("workflow")
for move in self.browse(cr, uid, ids):
+ move.action_confirm(context)
new_moves = super(StockMove, self).action_consume(cr, uid, [move.id], product_qty, location_id, context=context)
production_ids = production_obj.search(cr, uid, [('move_lines', 'in', [move.id])])
for prod in production_obj.browse(cr, uid, production_ids, context=context):
diff --git a/addons/mrp_operations/mrp_operations.py b/addons/mrp_operations/mrp_operations.py
index fe926d30ac1..4e665b3f9dc 100644
--- a/addons/mrp_operations/mrp_operations.py
+++ b/addons/mrp_operations/mrp_operations.py
@@ -131,7 +131,7 @@ class mrp_production_workcenter_line(osv.osv):
elif prod_obj.state =='in_production':
return
else:
- raise osv.except_osv(_('Error!'),_('Production Order Cannot start in [%s] state') % (prod_obj.state,))
+ raise osv.except_osv(_('Error!'),_('Manufacturing order cannot start in state "%s"!') % (prod_obj.state,))
else:
oper_ids = self.search(cr,uid,[('production_id','=',prod_obj.id)])
obj = self.browse(cr,uid,oper_ids)
@@ -458,30 +458,30 @@ class mrp_operations_operation(osv.osv):
code_lst.append(oper.code_id.start_stop)
if code.start_stop=='start':
if 'start' in code_lst:
- raise osv.except_osv(_('Sorry!'),_('Operation has already started !' 'You can either Pause /Finish/Cancel the operation'))
+ raise osv.except_osv(_('Sorry!'),_('Operation has already started !' 'Youcan either Pause/Finish/Cancel the operation'))
return False
if code.start_stop=='pause':
if code_lst[len(code_lst)-1]!='resume' and code_lst[len(code_lst)-1]!='start':
- raise osv.except_osv(_('Error!'),_('You cannot Pause the Operation other then Start/Resume state !'))
+ raise osv.except_osv(_('Error!'),_('In order to Pause the operation, it must be in the Start or Resume state!'))
return False
if code.start_stop=='resume':
if code_lst[len(code_lst)-1]!='pause':
- raise osv.except_osv(_('Error!'),_(' You cannot Resume the operation other then Pause state !'))
+ raise osv.except_osv(_('Error!'),_('In order to Resume the operation, it must be in the Pause state!'))
return False
if code.start_stop=='done':
if code_lst[len(code_lst)-1]!='start' and code_lst[len(code_lst)-1]!='resume':
- raise osv.except_osv(_('Sorry!'),_('You cannot finish the operation without Starting/Resuming it !'))
+ raise osv.except_osv(_('Sorry!'),_('In order to Finish the operation, it must be in the Start or Resume state!'))
return False
if 'cancel' in code_lst:
- raise osv.except_osv(_('Sorry!'),_('Operation is Already Cancelled !'))
+ raise osv.except_osv(_('Sorry!'),_('Operation is Already Cancelled!'))
return False
if code.start_stop=='cancel':
if not 'start' in code_lst :
- raise osv.except_osv(_('Error!'),_('There is no Operation to be cancelled !'))
+ raise osv.except_osv(_('Error!'),_('There is no Operation to be cancelled!'))
return False
if 'done' in code_lst:
- raise osv.except_osv(_('Error!'),_('Operation is already finished !'))
+ raise osv.except_osv(_('Error!'),_('Operation is already finished!'))
return False
return True
diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml
index 92faddc66b0..a80a1a41a9c 100644
--- a/addons/mrp_operations/mrp_operations_view.xml
+++ b/addons/mrp_operations/mrp_operations_view.xml
@@ -17,7 +17,7 @@
-
+
@@ -35,7 +35,7 @@
-
+
@@ -63,7 +63,7 @@
-
+
@@ -117,7 +117,7 @@
-
+
@@ -131,7 +131,7 @@
search
-
+
-
+
diff --git a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
index d25ec5132f6..a9cf0cbb718 100644
--- a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
+++ b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml
@@ -46,7 +46,7 @@
search
-
+
@@ -56,13 +56,12 @@
help="Work orders made during current month"/>
-
+
diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml
index 16cdfc86b3d..69782e00ec3 100644
--- a/addons/mrp_repair/mrp_repair_view.xml
+++ b/addons/mrp_repair/mrp_repair_view.xml
@@ -179,7 +179,7 @@
search
-
+
@@ -192,7 +192,7 @@
-
+
diff --git a/addons/mrp_subproduct/mrp_subproduct_view.xml b/addons/mrp_subproduct/mrp_subproduct_view.xml
index 9fc5955a18b..70b3ea8efaa 100644
--- a/addons/mrp_subproduct/mrp_subproduct_view.xml
+++ b/addons/mrp_subproduct/mrp_subproduct_view.xml
@@ -7,7 +7,7 @@
form
-
+
diff --git a/addons/multi_company/res_company_view.xml b/addons/multi_company/res_company_view.xml
index 42b60e13729..b246a1914d7 100644
--- a/addons/multi_company/res_company_view.xml
+++ b/addons/multi_company/res_company_view.xml
@@ -49,10 +49,10 @@
-
-
-
-
+
+
+
+
diff --git a/addons/point_of_sale/account_statement_view.xml b/addons/point_of_sale/account_statement_view.xml
index 45f89c5062c..d6bfa4eda66 100644
--- a/addons/point_of_sale/account_statement_view.xml
+++ b/addons/point_of_sale/account_statement_view.xml
@@ -39,7 +39,7 @@
search
-
+
@@ -64,7 +64,7 @@
search
-
+
diff --git a/addons/point_of_sale/point_of_sale.py b/addons/point_of_sale/point_of_sale.py
index 31c580ba506..04610463203 100644
--- a/addons/point_of_sale/point_of_sale.py
+++ b/addons/point_of_sale/point_of_sale.py
@@ -114,10 +114,18 @@ class pos_order(osv.osv):
if date_p:
res[order.id] = date_p
return res
- cr.execute(" SELECT MAX(l.date) "
- " FROM account_move_line l, account_move m, account_invoice i, account_move_reconcile r, pos_order o "
- " WHERE i.move_id = m.id AND l.move_id = m.id AND l.reconcile_id = r.id AND o.id = %s AND o.invoice_id = i.id",
- (order.id,))
+ if order.invoice_id:
+ cr.execute(" SELECT MAX(l.date) "
+ " FROM account_move_line l, account_move m, account_invoice i, account_move_reconcile r, pos_order o "
+ " WHERE i.move_id = m.id AND l.move_id = m.id AND l.reconcile_id = r.id AND o.id = %s AND o.invoice_id = i.id",
+ (order.id,))
+ else:
+ cr.execute("SELECT MAX(l.date) from account_move_line l "
+ "left join account_bank_statement abs on (l.statement_id=abs.id)"
+ "left join account_bank_statement_line absl on (absl.statement_id=abs.id) "
+ "left join pos_order p on (p.id=absl.pos_statement_id) "
+ "left join account_account a on (a.id=absl.account_id) "
+ "where p.id=%s and l.reconcile_id is not NULL and a.reconcile=True", (order.id,))
val = cr.fetchone()
val = val and val[0] or None
if val:
@@ -209,7 +217,8 @@ class pos_order(osv.osv):
'picking_id': False,
'statement_ids': [],
'nb_print': 0,
- 'pickings': []
+ 'pickings': [],
+ 'name': self.pool.get('ir.sequence').get(cr, uid, 'pos.order'),
})
return super(pos_order, self).copy(cr, uid, id, default, context=context)
@@ -1170,6 +1179,15 @@ class pos_order_line(osv.osv):
if 'product_id' in values and not values['product_id']:
return False
return super(pos_order_line, self).write(cr, user, ids, values, context=context)
+
+ def copy_data(self, cr, uid, id, default=None, context=None):
+ if not default:
+ default = {}
+ default.update({
+ 'prodlot_id': False,
+ 'name': self.pool.get('ir.sequence').get(cr, uid, 'pos.order.line')
+ })
+ return super(pos_order_line, self).copy_data(cr, uid, id, default, context=context)
def _scan_product(self, cr, uid, ean, qty, order):
# search pricelist_id
diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml
index 233bb019443..a8552cddc15 100644
--- a/addons/point_of_sale/point_of_sale_view.xml
+++ b/addons/point_of_sale/point_of_sale_view.xml
@@ -140,7 +140,7 @@
-
+
diff --git a/addons/point_of_sale/report/pos_order_report_view.xml b/addons/point_of_sale/report/pos_order_report_view.xml
index c72a6b6d415..8b18bf0b57a 100644
--- a/addons/point_of_sale/report/pos_order_report_view.xml
+++ b/addons/point_of_sale/report/pos_order_report_view.xml
@@ -46,14 +46,12 @@
help="POS ordered created during current month"/>
@@ -78,7 +76,7 @@
-
+
diff --git a/addons/point_of_sale/report/report_cash_register_view.xml b/addons/point_of_sale/report/report_cash_register_view.xml
index 167851986cb..8e42a9a5ce0 100644
--- a/addons/point_of_sale/report/report_cash_register_view.xml
+++ b/addons/point_of_sale/report/report_cash_register_view.xml
@@ -35,14 +35,12 @@
help="Cash Analysis created in current month"/>
@@ -61,7 +59,7 @@
-
+
diff --git a/addons/point_of_sale/test/point_of_sale_test.yml b/addons/point_of_sale/test/point_of_sale_test.yml
index 18498cb40c1..6165e993240 100644
--- a/addons/point_of_sale/test/point_of_sale_test.yml
+++ b/addons/point_of_sale/test/point_of_sale_test.yml
@@ -227,29 +227,14 @@
!record {model: product.category, id: product_category_services0}:
name: Mobile Services
-
- I create product template .
+ I create product Samsung Mobile.
-
- !record {model: product.template, id: product_template_lgviewtysmart0}:
+ !record {model: product.product, id: product_product_samsungmobile0}:
categ_id: product_category_allproductssellable0
cost_method: standard
list_price: 170.0
mes_type: fixed
- name: LG Viewty Smart
- procure_method: make_to_order
- standard_price: 160.0
- supply_method: produce
- type: product
- uom_id: product.product_uom_unit
- uom_po_id: product.product_uom_unit
--
- I create product LG Viewty Smart.
--
- !record {model: product.product, id: product_product_lgviewtysmart0}:
- categ_id: product_category_allproductssellable0
- cost_method: standard
- list_price: 170.0
- mes_type: fixed
- name: LG Viewty Smart
+ name: Samsung Mobile
procure_method: make_to_order
property_account_expense: account_pos_account_payable
property_account_income: account_pos_account_receivable
@@ -285,7 +270,7 @@
property_account_expense: account_pos_account_payable
property_account_income: account_pos_account_receivable
-
- I create New Order by adding the details of Salesman and "Product" as LG Viewty Smart Quantity as 10.
+ I create New Order by adding the details of Salesman and "Product" as Samsung Mobile Quantity as 10.
-
!record {model: pos.order, id: pos_order_pos0}:
company_id: base.main_company
@@ -295,7 +280,7 @@
- company_id: base.main_company
name: Order Line/01
notice: No Discount
- product_id: product_product_lgviewtysmart0
+ product_id: product_product_samsungmobile0
qty: 10.0
qty_rfd: 0.0
partner_id: base.res_partner_agrolait
diff --git a/addons/portal/i18n/es.po b/addons/portal/i18n/es.po
index 68040630e8c..f4fca48ead1 100644
--- a/addons/portal/i18n/es.po
+++ b/addons/portal/i18n/es.po
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME \n"
"POT-Creation-Date: 2011-07-04 14:16+0000\n"
-"PO-Revision-Date: 2011-07-11 09:51+0000\n"
-"Last-Translator: FULL NAME \n"
+"PO-Revision-Date: 2011-09-17 23:24+0000\n"
+"Last-Translator: mgaja (GrupoIsep.com) \n"
"Language-Team: Spanish \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:59+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2011-09-19 04:41+0000\n"
+"X-Generator: Launchpad (build 13955)\n"
#. module: portal
#: code:addons/portal/wizard/share_wizard.py:55
@@ -32,7 +32,7 @@ msgstr ""
#. module: portal
#: field:res.portal,group_id:0
msgid "Group"
-msgstr ""
+msgstr "Grupo"
#. module: portal
#: help:res.portal,other_group_ids:0
@@ -43,7 +43,7 @@ msgstr ""
#: view:share.wizard:0
#: field:share.wizard,group_ids:0
msgid "Existing groups"
-msgstr ""
+msgstr "Grupos existentes"
#. module: portal
#: model:ir.model,name:portal.model_res_portal_wizard_user
@@ -63,7 +63,7 @@ msgstr ""
#. module: portal
#: field:res.portal.wizard.user,user_email:0
msgid "E-mail"
-msgstr ""
+msgstr "Correo electrónico"
#. module: portal
#: view:res.portal:0
@@ -74,12 +74,14 @@ msgstr ""
#: constraint:res.users:0
msgid "The chosen company is not in the allowed companies for this user"
msgstr ""
+"La compañía seleccionada no está en las compañías permitidas para este "
+"usuario"
#. module: portal
#: view:res.portal:0
#: field:res.portal,widget_ids:0
msgid "Widgets"
-msgstr ""
+msgstr "Widgets"
#. module: portal
#: model:ir.module.module,description:portal.module_meta_information
@@ -108,7 +110,7 @@ msgstr ""
#. module: portal
#: view:res.portal.wizard:0
msgid "Send Invitations"
-msgstr ""
+msgstr "Enviar invitaciones"
#. module: portal
#: help:res.portal,url:0
@@ -118,7 +120,7 @@ msgstr ""
#. module: portal
#: field:res.portal.widget,widget_id:0
msgid "Widget"
-msgstr ""
+msgstr "Widget"
#. module: portal
#: help:res.portal.wizard,message:0
@@ -153,12 +155,12 @@ msgstr ""
#. module: portal
#: field:res.portal,menu_action_id:0
msgid "Menu Action"
-msgstr ""
+msgstr "Acción de menú"
#. module: portal
#: field:res.portal.wizard.user,name:0
msgid "User Name"
-msgstr ""
+msgstr "Nombre de usuario"
#. module: portal
#: model:ir.model,name:portal.model_res_portal_widget
@@ -185,7 +187,7 @@ msgstr ""
#: code:addons/portal/portal.py:184
#, python-format
msgid "%s Menu"
-msgstr ""
+msgstr "Menú de %s"
#. module: portal
#: help:res.portal.wizard,portal_id:0
@@ -207,12 +209,12 @@ msgstr ""
#: view:share.wizard:0
#: field:share.wizard,user_ids:0
msgid "Existing users"
-msgstr ""
+msgstr "Usuarios existentes"
#. module: portal
#: field:res.portal.wizard.user,wizard_id:0
msgid "Wizard"
-msgstr ""
+msgstr "Asistente"
#. module: portal
#: help:res.portal.wizard.user,user_email:0
@@ -224,12 +226,12 @@ msgstr ""
#. module: portal
#: field:res.portal.wizard.user,lang:0
msgid "Language"
-msgstr ""
+msgstr "Idioma"
#. module: portal
#: field:res.portal,url:0
msgid "URL"
-msgstr ""
+msgstr "URL"
#. module: portal
#: view:res.portal:0
@@ -249,7 +251,7 @@ msgstr "Cancelar"
#. module: portal
#: view:res.portal:0
msgid "Website"
-msgstr ""
+msgstr "Sitio web"
#. module: portal
#: view:res.portal:0
@@ -266,17 +268,17 @@ msgstr ""
#: code:addons/portal/wizard/portal_wizard.py:135
#, python-format
msgid "Email required"
-msgstr ""
+msgstr "Correo electrónico requerido"
#. module: portal
#: model:ir.model,name:portal.model_res_users
msgid "res.users"
-msgstr ""
+msgstr "res.usuarios"
#. module: portal
#: constraint:res.portal.wizard.user:0
msgid "Invalid email address"
-msgstr ""
+msgstr "Dirección email invalida"
#. module: portal
#: code:addons/portal/wizard/portal_wizard.py:136
@@ -288,7 +290,7 @@ msgstr ""
#. module: portal
#: model:ir.model,name:portal.model_ir_ui_menu
msgid "ir.ui.menu"
-msgstr ""
+msgstr "ir.ui.menu"
#. module: portal
#: help:res.portal,group_id:0
@@ -300,7 +302,7 @@ msgstr ""
#: view:res.portal.wizard:0
#: field:res.portal.wizard,user_ids:0
msgid "Users"
-msgstr ""
+msgstr "Usuarios"
#. module: portal
#: field:res.portal,other_group_ids:0
@@ -323,7 +325,7 @@ msgstr ""
#. module: portal
#: field:res.portal.widget,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Secuencia"
#. module: portal
#: field:res.users,partner_id:0
@@ -338,13 +340,13 @@ msgstr ""
#. module: portal
#: 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 identificador de usuario!"
#. module: portal
#: view:res.portal.wizard:0
#: field:res.portal.wizard,message:0
msgid "Invitation message"
-msgstr ""
+msgstr "Mensaje de invitación"
#. module: portal
#: code:addons/portal/wizard/portal_wizard.py:36
@@ -386,7 +388,7 @@ msgstr ""
#. module: portal
#: field:res.portal.wizard.user,partner_id:0
msgid "Partner"
-msgstr ""
+msgstr "Empresa"
#. module: portal
#: model:ir.actions.act_window,help:portal.portal_list_action
@@ -402,4 +404,4 @@ msgstr ""
#. module: portal
#: model:ir.model,name:portal.model_share_wizard
msgid "Share Wizard"
-msgstr ""
+msgstr "Asistente de compartición"
diff --git a/addons/process/process_view.xml b/addons/process/process_view.xml
index d158dd83425..de92b9c6c60 100644
--- a/addons/process/process_view.xml
+++ b/addons/process/process_view.xml
@@ -108,12 +108,12 @@
search
-
+
-
+
@@ -213,13 +213,13 @@
search
-
+
-
+
@@ -302,7 +302,7 @@
search
-
+
diff --git a/addons/procurement/i18n/da.po b/addons/procurement/i18n/da.po
new file mode 100644
index 00000000000..8f52d25c29a
--- /dev/null
+++ b/addons/procurement/i18n/da.po
@@ -0,0 +1,890 @@
+# 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:15+0000\n"
+"PO-Revision-Date: 2011-09-18 16:11+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-19 04:41+0000\n"
+"X-Generator: Launchpad (build 13955)\n"
+
+#. module: procurement
+#: view:make.procurement:0
+msgid "Ask New Products"
+msgstr ""
+
+#. module: procurement
+#: model:ir.ui.menu,name:procurement.menu_stock_sched
+msgid "Schedulers"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_make_procurement
+msgid "Make Procurements"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order.compute.all,automatic:0
+msgid ""
+"Triggers an automatic procurement for all products that have a virtual stock "
+"under 0. You should probably not use this option, we suggest using a MTO "
+"configuration on products."
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Group By..."
+msgstr "Gruppér efter..."
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,procurement_draft_ids:0
+msgid "Draft procurement of the product and location of that orderpoint"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:288
+#, python-format
+msgid "No supplier defined for this product !"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,uom_id:0
+msgid "Unit of Measure"
+msgstr "Måleenhed"
+
+#. module: procurement
+#: field:procurement.order,procure_method:0
+msgid "Procurement Method"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:304
+#, python-format
+msgid "No address defined for the supplier"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.action_procurement_compute
+msgid "Compute Stock Minimum Rules Only"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,company_id:0
+#: field:stock.warehouse.orderpoint,company_id:0
+msgid "Company"
+msgstr "Virksomhed"
+
+#. module: procurement
+#: field:procurement.order,product_uos_qty:0
+msgid "UoS Quantity"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+#: field:procurement.order,name:0
+msgid "Reason"
+msgstr "Årsag"
+
+#. module: procurement
+#: view:procurement.order.compute:0
+msgid "Compute Procurements"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,message:0
+msgid "Latest error"
+msgstr ""
+
+#. module: procurement
+#: help:mrp.property,composition:0
+msgid "Not used in computations, for information purpose only."
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,procurement_id:0
+msgid "Latest procurement"
+msgstr "Seneste indkøb"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Notes"
+msgstr "Noter"
+
+#. module: procurement
+#: selection:procurement.order,procure_method:0
+msgid "on order"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,message:0
+msgid "Exception occurred while computing procurement orders."
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,state:0
+msgid ""
+"When a procurement is created the state is set to 'Draft'.\n"
+" If the procurement is confirmed, the state is set to 'Confirmed'. "
+" \n"
+"After confirming the state is set to 'Running'.\n"
+" If any exception arises in the order then the state is set to 'Exception'.\n"
+" Once the exception is removed the state becomes 'Ready'.\n"
+" It is in 'Waiting'. state when the procurement is waiting for another one "
+"to finish."
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Minimum Stock Rules Search"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,product_min_qty:0
+msgid ""
+"When the virtual stock goes belong the Min Quantity, OpenERP generates a "
+"procurement to bring the virtual stock to the Max Quantity."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute.all:0
+msgid "Scheduler Parameters"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_move
+msgid "Stock Move"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Planification"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Ready"
+msgstr "Klar"
+
+#. module: procurement
+#: field:procurement.order.compute.all,automatic:0
+msgid "Automatic orderpoint"
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,composition:0
+msgid "Properties composition"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Confirmed"
+msgstr "Bekræftet"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Retry"
+msgstr "Forsøg igen"
+
+#. module: procurement
+#: view:procurement.order.compute:0
+#: view:procurement.orderpoint.compute:0
+msgid "Parameters"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Confirm"
+msgstr "Bekræft"
+
+#. module: procurement
+#: help:procurement.order,origin:0
+msgid ""
+"Reference of the document that created this Procurement.\n"
+"This is automatically completed by OpenERP."
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Procurement Orders to Process"
+msgstr ""
+
+#. module: procurement
+#: constraint:res.company:0
+msgid "Error! You can not create recursive companies."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,priority:0
+msgid "Priority"
+msgstr "Prioritet"
+
+#. module: procurement
+#: view:procurement.order:0
+#: field:procurement.order,state:0
+msgid "State"
+msgstr "Stat"
+
+#. module: procurement
+#: field:procurement.order,location_id:0
+#: view:stock.warehouse.orderpoint:0
+#: field:stock.warehouse.orderpoint,location_id:0
+msgid "Location"
+msgstr "Placering"
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_picking
+msgid "Picking List"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,warehouse_id:0
+#: view:stock.warehouse.orderpoint:0
+#: field:stock.warehouse.orderpoint,warehouse_id:0
+msgid "Warehouse"
+msgstr "Varehus"
+
+#. module: procurement
+#: selection:stock.warehouse.orderpoint,logic:0
+msgid "Best price (not yet active!)"
+msgstr "Bedst pris (endnu ikke aktiv!)"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Product & Location"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order_compute
+msgid "Compute Procurement"
+msgstr ""
+
+#. module: procurement
+#: model:ir.module.module,shortdesc:procurement.module_meta_information
+#: field:stock.move,procurements:0
+msgid "Procurements"
+msgstr "Indkøb"
+
+#. module: procurement
+#: field:res.company,schedule_range:0
+msgid "Scheduler Range Days"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.procurement_action
+msgid ""
+"A procurement order is used to record a need for a specific product at a "
+"specific location. A procurement order is usually created automatically from "
+"sales orders, a Pull Logistics rule or Minimum Stock Rules. When the "
+"procurement order is confirmed, it automatically creates the necessary "
+"operations to fullfil the need: purchase order proposition, manufacturing "
+"order, etc."
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,date_planned:0
+msgid "Planned Date"
+msgstr "Planlagt dato"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Group By"
+msgstr "Gruppér efter"
+
+#. module: procurement
+#: field:make.procurement,qty:0
+#: field:procurement.order,product_qty:0
+msgid "Quantity"
+msgstr "Mængde"
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:377
+#, python-format
+msgid "Not enough stock and no minimum orderpoint rule defined."
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:137
+#, python-format
+msgid "Invalid action !"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "References"
+msgstr ""
+
+#. module: procurement
+#: view:res.company:0
+msgid "Configuration"
+msgstr "Indstillinger"
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,qty_multiple:0
+msgid "Qty Multiple"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,procure_method:0
+msgid ""
+"If you encode manually a Procurement, you probably want to use a make to "
+"order method."
+msgstr ""
+
+#. module: procurement
+#: model:ir.ui.menu,name:procurement.menu_stock_procurement
+msgid "Automatic Procurements"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,product_max_qty:0
+msgid "Max Quantity"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order
+#: model:process.process,name:procurement.process_process_procurementprocess0
+#: view:procurement.order:0
+msgid "Procurement"
+msgstr "Indkøb"
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.procurement_action
+msgid "Procurement Orders"
+msgstr "Indkøbs ordre"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "To Fix"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Exceptions"
+msgstr "Undtagelser"
+
+#. module: procurement
+#: model:process.node,note:procurement.process_node_serviceonorder0
+msgid "Assignment from Production or Purchase Order."
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_mrp_property
+msgid "Property"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.act_make_procurement
+#: view:make.procurement:0
+msgid "Procurement Request"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.orderpoint.compute:0
+msgid "Compute Stock"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Late"
+msgstr ""
+
+#. module: procurement
+#: model:process.process,name:procurement.process_process_serviceproductprocess0
+msgid "Service"
+msgstr ""
+
+#. module: procurement
+#: model:ir.module.module,description:procurement.module_meta_information
+msgid ""
+"\n"
+" This is the module for computing Procurements.\n"
+" "
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,procurement_draft_ids:0
+msgid "Related Procurement Orders"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.orderpoint.compute:0
+msgid ""
+"Wizard checks all the stock minimum rules and generate procurement order."
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,product_min_qty:0
+msgid "Min Quantity"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Urgent"
+msgstr "Haster"
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "plus"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:325
+#, python-format
+msgid ""
+"Please check the Quantity in Procurement Order(s), it should not be less "
+"than 1!"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,active:0
+msgid ""
+"If the active field is set to False, it will allow you to hide the "
+"orderpoint without removing it."
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,product_max_qty:0
+msgid ""
+"When the virtual stock goes belong the Max Quantity, OpenERP generates a "
+"procurement to bring the virtual stock to the Max Quantity."
+msgstr ""
+
+#. module: procurement
+#: help:procurement.orderpoint.compute,automatic:0
+msgid "If the stock of a product is under 0, it will act like an orderpoint"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Procurement Lines"
+msgstr "Indkøbs linier"
+
+#. module: procurement
+#: view:procurement.order.compute.all:0
+msgid ""
+"This wizard allows you to run all procurement, production and/or purchase "
+"orders that should be processed based on their configuration. By default, "
+"the scheduler is launched automatically every night by OpenERP. You can use "
+"this menu to force it to be launched now. Note that it runs in the "
+"background, you may have to wait for a few minutes until it has finished "
+"computing."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+#: field:procurement.order,note:0
+msgid "Note"
+msgstr "Notat"
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order.compute:0
+msgid "This wizard will schedule procurements."
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Status"
+msgstr "Status"
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Normal"
+msgstr "Normal"
+
+#. module: procurement
+#: constraint:stock.move:0
+msgid "You try to assign a lot which is not from the same product"
+msgstr ""
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,active:0
+msgid "Active"
+msgstr "Aktiv"
+
+#. module: procurement
+#: model:process.node,name:procurement.process_node_procureproducts0
+msgid "Procure Products"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,date_planned:0
+msgid "Scheduled date"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Exception"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:179
+#, python-format
+msgid "Automatic OP: %s"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_orderpoint_compute
+msgid "Automatic Order Point"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_stock_warehouse_orderpoint
+msgid "Minimum Inventory Rule"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_res_company
+msgid "Companies"
+msgstr "Virksomheder"
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Extra Information"
+msgstr ""
+
+#. module: procurement
+#: help:procurement.order,name:0
+msgid "Procurement name."
+msgstr ""
+
+#. module: procurement
+#: constraint:stock.move:0
+msgid "You must assign a production lot for this product"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Procurement Reason"
+msgstr ""
+
+#. module: procurement
+#: sql_constraint:stock.warehouse.orderpoint:0
+msgid "Qty Multiple must be greater than zero."
+msgstr ""
+
+#. module: procurement
+#: selection:stock.warehouse.orderpoint,logic:0
+msgid "Order to Max"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,date_close:0
+msgid "Date Closed"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:372
+#, python-format
+msgid "Procurement '%s' is in exception: not enough stock."
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:138
+#, python-format
+msgid "Cannot delete Procurement Order(s) which are in %s State!"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:324
+#, python-format
+msgid "Data Insufficient !"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_mrp_property_group
+#: field:mrp.property,group_id:0
+#: field:mrp.property.group,name:0
+msgid "Property Group"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Misc"
+msgstr "Diverse"
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Locations"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,procure_method:0
+msgid "from stock"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "General Information"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Run Procurement"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Done"
+msgstr ""
+
+#. module: procurement
+#: help:stock.warehouse.orderpoint,qty_multiple:0
+msgid "The procurement quantity will by rounded up to this multiple."
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+#: view:procurement.order:0
+#: selection:procurement.order,state:0
+#: view:procurement.order.compute:0
+#: view:procurement.order.compute.all:0
+#: view:procurement.orderpoint.compute:0
+msgid "Cancel"
+msgstr "Annullér"
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,logic:0
+msgid "Reordering Mode"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,origin:0
+msgid "Source Document"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Not urgent"
+msgstr ""
+
+#. module: procurement
+#: model:ir.model,name:procurement.model_procurement_order_compute_all
+msgid "Compute all schedulers"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Current"
+msgstr "Nuværende"
+
+#. module: procurement
+#: view:board.board:0
+msgid "Procurements in Exception"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Details"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.procurement_action5
+#: model:ir.actions.act_window,name:procurement.procurement_action_board
+#: model:ir.actions.act_window,name:procurement.procurement_exceptions
+#: model:ir.ui.menu,name:procurement.menu_stock_procurement_action
+msgid "Procurement Exceptions"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.act_procurement_2_stock_warehouse_orderpoint
+#: model:ir.actions.act_window,name:procurement.act_product_product_2_stock_warehouse_orderpoint
+#: model:ir.actions.act_window,name:procurement.act_stock_warehouse_2_stock_warehouse_orderpoint
+#: model:ir.actions.act_window,name:procurement.action_orderpoint_form
+#: model:ir.ui.menu,name:procurement.menu_stock_order_points
+#: view:stock.warehouse.orderpoint:0
+msgid "Minimum Stock Rules"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,close_move:0
+msgid "Close Move at end"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Scheduled Date"
+msgstr ""
+
+#. module: procurement
+#: field:make.procurement,product_id:0
+#: view:procurement.order:0
+#: field:procurement.order,product_id:0
+#: field:stock.warehouse.orderpoint,product_id:0
+msgid "Product"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Temporary"
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,description:0
+#: field:mrp.property.group,description:0
+msgid "Description"
+msgstr ""
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "min"
+msgstr ""
+
+#. module: procurement
+#: view:stock.warehouse.orderpoint:0
+msgid "Quantity Rules"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Running"
+msgstr "Kører"
+
+#. module: procurement
+#: field:stock.warehouse.orderpoint,product_uom:0
+msgid "Product UOM"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,name:procurement.process_node_serviceonorder0
+msgid "Make to Order"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "UOM"
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,state:0
+msgid "Waiting"
+msgstr "Venter"
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.action_orderpoint_form
+msgid ""
+"You can define your minimum stock rules, so that OpenERP will automatically "
+"create draft manufacturing orders or purchase quotations according to the "
+"stock level. Once the virtual stock of a product (= stock on hand minus all "
+"confirmed orders and reservations) is below the minimum quantity, OpenERP "
+"will generate a procurement request to increase the stock up to the maximum "
+"quantity."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,move_id:0
+msgid "Reservation"
+msgstr ""
+
+#. module: procurement
+#: model:process.node,note:procurement.process_node_procureproducts0
+msgid "The way to procurement depends on the product type."
+msgstr ""
+
+#. module: procurement
+#: view:make.procurement:0
+msgid ""
+"This wizard will plan the procurement for this product. This procurement may "
+"generate task, production orders or purchase orders."
+msgstr ""
+
+#. module: procurement
+#: view:res.company:0
+msgid "MRP & Logistics Scheduler"
+msgstr ""
+
+#. module: procurement
+#: field:mrp.property,name:0
+#: field:stock.warehouse.orderpoint,name:0
+msgid "Name"
+msgstr "Navn"
+
+#. module: procurement
+#: selection:mrp.property,composition:0
+msgid "max"
+msgstr "maks"
+
+#. module: procurement
+#: field:procurement.order,product_uos:0
+msgid "Product UoS"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/procurement.py:353
+#, python-format
+msgid "from stock: products assigned."
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,name:procurement.action_compute_schedulers
+#: model:ir.ui.menu,name:procurement.menu_stock_proc_schedulers
+#: view:procurement.order.compute.all:0
+msgid "Compute Schedulers"
+msgstr ""
+
+#. module: procurement
+#: model:ir.actions.act_window,help:procurement.procurement_exceptions
+msgid ""
+"Procurement Orders represent the need for a certain quantity of products, at "
+"a given time, in a given location. Sales Orders are one typical source of "
+"Procurement Orders (but these are distinct documents). Depending on the "
+"procurement parameters and the product configuration, the procurement engine "
+"will attempt to satisfy the need by reserving products from stock, ordering "
+"products from a supplier, or passing a manufacturing order, etc. A "
+"Procurement Exception occurs when the system cannot find a way to fulfill a "
+"procurement. Some exceptions will resolve themselves automatically, but "
+"others require manual intervention (those are identified by a specific error "
+"message)."
+msgstr ""
+
+#. module: procurement
+#: field:procurement.order,product_uom:0
+msgid "Product UoM"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Search Procurement"
+msgstr "Søg indkøb"
+
+#. module: procurement
+#: help:res.company,schedule_range:0
+msgid ""
+"This is the time frame analysed by the scheduler when computing "
+"procurements. All procurements that are not between today and today+range "
+"are skipped for future computation."
+msgstr ""
+
+#. module: procurement
+#: selection:procurement.order,priority:0
+msgid "Very Urgent"
+msgstr ""
+
+#. module: procurement
+#: field:procurement.orderpoint.compute,automatic:0
+msgid "Automatic Orderpoint"
+msgstr ""
+
+#. module: procurement
+#: view:procurement.order:0
+msgid "Procurement Details"
+msgstr ""
+
+#. module: procurement
+#: code:addons/procurement/schedulers.py:180
+#, python-format
+msgid "SCHEDULER"
+msgstr ""
diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml
index 09dd890970a..b2f5e13b756 100644
--- a/addons/procurement/procurement_view.xml
+++ b/addons/procurement/procurement_view.xml
@@ -100,7 +100,7 @@
search
-
+
-
+
@@ -181,7 +181,7 @@
search
-
+
@@ -189,7 +189,7 @@
-
+
diff --git a/addons/procurement/schedulers.py b/addons/procurement/schedulers.py
index 3a6e3336472..d72651ed55a 100644
--- a/addons/procurement/schedulers.py
+++ b/addons/procurement/schedulers.py
@@ -77,7 +77,7 @@ class procurement_order(osv.osv):
report_later += 1
for proc in procurement_obj.browse(cr, uid, ids, context=context):
if proc.state == 'exception':
- report.append('PROC %d: on order - %3.2f %-5s - %s' % \
+ report.append(_('PROC %d: on order - %3.2f %-5s - %s') % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name))
report_except += 1
@@ -100,7 +100,7 @@ class procurement_order(osv.osv):
report_total += 1
for proc in procurement_obj.browse(cr, uid, report_ids, context=context):
if proc.state == 'exception':
- report.append('PROC %d: from stock - %3.2f %-5s - %s' % \
+ report.append(_('PROC %d: from stock - %3.2f %-5s - %s') % \
(proc.id, proc.product_qty, proc.product_uom.name,
proc.product_id.name,))
report_except += 1
@@ -111,15 +111,15 @@ class procurement_order(osv.osv):
end_date = time.strftime('%Y-%m-%d, %Hh %Mm %Ss')
if uid:
request = self.pool.get('res.request')
- summary = '''Here is the procurement scheduling report.
+ summary = _("""Here is the procurement scheduling report.
- Start Time: %s
- End Time: %s
- Total Procurements processed: %d
- Procurements with exceptions: %d
- Skipped Procurements (scheduled date outside of scheduler range) %d
+ Start Time: %s
+ End Time: %s
+ Total Procurements processed: %d
+ Procurements with exceptions: %d
+ Skipped Procurements (scheduled date outside of scheduler range) %d
- Exceptions:\n'''% (start_date, end_date, report_total, report_except, report_later)
+ Exceptions:\n""") % (start_date, end_date, report_total, report_except, report_later)
summary += '\n'.join(report)
request.create(cr, uid,
{'name': "Procurement Processing Report.",
diff --git a/addons/product/product.py b/addons/product/product.py
index b81fdc0bad1..863081a8155 100644
--- a/addons/product/product.py
+++ b/addons/product/product.py
@@ -121,8 +121,7 @@ class product_uom(osv.osv):
}
_sql_constraints = [
- ('factor_gt_zero', 'CHECK (factor!=0)', 'The conversion ratio for a unit of measure cannot be 0!'),
- ('factor_category_id_uniq', 'unique (category_id, factor)', 'You can not have more than one UOM with same factor for same UOM category'),
+ ('factor_gt_zero', 'CHECK (factor!=0)', 'The conversion ratio for a unit of measure cannot be 0!')
]
def _compute_qty(self, cr, uid, from_uom_id, qty, to_uom_id=False):
@@ -230,7 +229,7 @@ class product_category(osv.osv):
return True
_constraints = [
- (_check_recursion, 'Error ! You can not create recursive categories.', ['parent_id'])
+ (_check_recursion, 'Error ! You cannot create recursive categories.', ['parent_id'])
]
def child_get(self, cr, uid, ids):
return [ids]
@@ -276,8 +275,8 @@ class product_template(osv.osv):
'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Sale Price'), help="Base price for computing the customer price. Sometimes called the catalog price."),
'standard_price': fields.float('Cost Price', required=True, digits_compute=dp.get_precision('Purchase Price'), help="Product's cost for accounting stock valuation. It is the base price for the supplier price."),
'volume': fields.float('Volume', help="The volume in m3."),
- 'weight': fields.float('Gross weight', help="The gross weight in Kg."),
- 'weight_net': fields.float('Net weight', help="The net weight in Kg."),
+ 'weight': fields.float('Gross weight', digits_compute=dp.get_precision('Stock Weight'), help="The gross weight in Kg."),
+ 'weight_net': fields.float('Net weight', digits_compute=dp.get_precision('Stock Weight'), help="The net weight in Kg."),
'cost_method': fields.selection([('standard','Standard Price'), ('average','Average Price')], 'Costing Method', required=True,
help="Standard Price: the cost price is fixed and recomputed periodically (usually at the end of the year), Average Price: the cost price is recomputed at each reception of products."),
'warranty': fields.float('Warranty (months)'),
diff --git a/addons/product/product_demo.xml b/addons/product/product_demo.xml
index d8c1e29749b..3aebec13715 100644
--- a/addons/product/product_demo.xml
+++ b/addons/product/product_demo.xml
@@ -129,7 +129,7 @@
300.0
- 2.0
+ 7.0Basic PCproduct
@@ -154,7 +154,7 @@
600.0
- 3.0
+ 7.0Medium PCproduct
@@ -178,7 +178,7 @@
54.0
- 1.0
+ 7.0Mainboard ASUStek A7N8Xproduct
@@ -189,7 +189,7 @@
180.0
- 1.0
+ 7.0Mainboard ASUStek A7V8X-Xproduct
@@ -201,7 +201,7 @@
50.0
- 1.0
+ 7.0Processor AMD Athlon XP 1800+product
@@ -212,7 +212,7 @@
100.0
- 1.0
+ 7.0Processor AMD Athlon XP 2200+product
@@ -223,7 +223,7 @@
40.0
- 1.0
+ 7.0HDD Seagate 7200.8 80GBproduct
@@ -234,7 +234,7 @@
60.0
- 1.0
+ 7.0HDD Seagate 7200.8 120GBproduct
@@ -246,7 +246,7 @@
make_to_order
- 1.0
+ 7.0HDD Seagate 7200.8 160GBproduct
@@ -257,7 +257,7 @@
5.0
- 1.0
+ 7.0Regular case fan 80mmproduct
@@ -268,7 +268,7 @@
10.0
- 1.0
+ 7.0Silent fanproduct
@@ -280,7 +280,7 @@
200.0
- 1.0
+ 7.0Regular processor configmake_to_orderproduct
@@ -292,7 +292,7 @@
40.0
- 1.0
+ 7.0DDR 256MB PC400product
@@ -303,7 +303,7 @@
60.0
- 1.0
+ 7.0DDR 512MB PC400product
@@ -316,7 +316,7 @@
make_to_order
- 1.0
+ 7.0High speed processor configproduct
@@ -327,7 +327,7 @@
25.0
- 1.0
+ 7.0ATX Mid-size Towerproduct
@@ -340,7 +340,7 @@
make_to_order
- 1.0
+ 7.0HDD on demandproduct
@@ -449,7 +449,7 @@
Wood 2mm
-
+ product
@@ -515,7 +515,7 @@
Rear Panel SHE100
-
+ product
@@ -528,7 +528,7 @@
Rear Panel SHE200
-
+ product
@@ -541,7 +541,7 @@
Side Panel
-
+ product
@@ -554,7 +554,7 @@
Rack 100cm
-
+ product
@@ -567,7 +567,7 @@
Rack 200cm
-
+ product
@@ -593,7 +593,7 @@
Wood Lintel 4m
-
+ product
@@ -605,7 +605,7 @@
Metal Cleats
-
+ product
@@ -736,21 +736,21 @@
11
- 10
+ 511
- 10
+ 511
- 10
+ 5
@@ -758,7 +758,7 @@
15
- 10
+ 5
@@ -766,7 +766,7 @@
15
- 10
+ 5
@@ -774,7 +774,7 @@
15
- 10
+ 5
+
+ product_pulled_flow multi-company
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+
+
+ stock_location_path multi-company
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+
+
+
diff --git a/addons/stock_planning/__openerp__.py b/addons/stock_planning/__openerp__.py
index bb726d1013b..eb3cb385078 100644
--- a/addons/stock_planning/__openerp__.py
+++ b/addons/stock_planning/__openerp__.py
@@ -20,94 +20,129 @@
##############################################################################
{
- "name":"Master Procurement Schedule",
- "version":"1.1",
- "author":["OpenERP SA", "Grzegorz Grzelak (Cirrus)"],
- "category":"Warehouse",
- "images":["images/master_procurement_schedule.jpeg","images/sales_forecast.jpeg","images/stock_planning_line.jpeg","images/stock_sales_period.jpeg"],
- "depends":["hr","stock","sale"],
+ "name": "Master Procurement Schedule",
+ "version": "1.2",
+ "author": "OpenERP SA and Grzegorz Grzelak (OpenGLOBE)",
+ "category": "Warehouse",
+ "images": ["images/master_procurement_schedule.jpeg","images/sales_forecast.jpeg","images/stock_planning_line.jpeg","images/stock_sales_period.jpeg"],
+ "depends": ["crm", "stock","sale"],
+ "complexity": "expert",
"description": """
-Purpose of MPS is to allow create a manual procurement apart of MRP scheduler (which works automatically on minimum stock rules).
-=================================================================================================================================
+MPS allows to create a manual procurement plan apart of the normal MRP scheduling, which works automatically based on minimum stock rules
+=========================================================================================================================================
-This module is based on original OpenERP SA module stock_planning version 1.0 of the same name Master Procurement Schedule.
-Terms used in the module:
-- Stock and Sales Period - is the time (between Start Date and End Date) for which you plan Stock and Sales Forecast and make Procurement Planning.
-- Stock and Sales Forecast - is the quantity of products you plan to sell in the Period.
-- Stock Planning - is the quantity of products you plan to purchase or produce for the Period.
+Quick Glossary
+--------------
+- Stock Period - the time boundaries (between Start Date and End Date) for your Sales and Stock forecasts and planning
+- Sales Forecast - the quantity of products you plan to sell during the related Stock Period.
+- Stock Planning - the quantity of products you plan to purchase or produce for the related Stock Period.
-Because we have another module sale_forecast which uses terms "Sales Forecast" and "Planning" as amount values we will use terms "Stock and Sales Forecast" and "Stock Planning" to emphasize that we use quantity values.
+To avoid confusion with the terms used by the ``sale_forecast`` module, ("Sales Forecast" and "Planning" are amounts) we use terms "Stock and Sales Forecast" and "Stock Planning" to emphasize that we use quantity values.
-Activity with this module is divided to three steps:
-- Creating Periods. Mandatory step.
-- Creating Sale Forecasts and entering quantities to them. Optional step but useful for further planning.
-- Creating Planning lines, entering quantities to them and making Procurement. Making procurement is the final step for the Period.
+Where to begin
+--------------
+Using this module is done in three steps:
-Periods
--------
-You have two menu items for Periods in "Sales Management - Configuration". There are:
-- "Create Sales Periods" - Which automates creating daily, weekly or monthly periods.
-- "Stock and sales Periods" - Which allows to create any type of periods, change the dates and change the State of period.
+ * Create Stock Periods via the Warehouse>Configuration>Stock Periods menu (Mandatory step)
+ * Create Sale Forecasts fill them with forecast quantities, via the Sales>Sales Forecast menu. (Optional step but useful for further planning)
+ * Create the actual MPS plan, check the balance and trigger the procurements as required. The actual procurement is the final step for the Stock Period.
-Creating periods is the first step you have to do to use modules features. You can create custom periods using "New" button in "Stock and Sales Periods" form or view but it is recommended to use automating tool.
+Stock Period configuration
+--------------------------
+You have two menu items for Periods in "Warehouse > Configuration > Stock Periods". There are:
-Remarks:
-- These periods (officially Stock and Sales Periods) are separated of Financial or other periods in the system.
-- Periods are not assigned to companies (when you use multicompany feature at all). Module suppose that you use the same periods across companies. If you wish to use different periods for different companies define them as you wish (they can overlap). Later on in this text will be indications how to use such periods.
-- When periods are created automatically their start and finish dates are with start hour 00:00:00 and end hour 23:59:00. when you create daily periods they will have start date 31.01.2010 00:00:00 and end date 31.01.2010 23:59:00. It works only in automatic creation of periods. When you create periods manually you have to take care about hours because you can have incorrect values form sales or stock.
-- If you use overlapping periods for the same product, warehouse and company results can be unpredictable.
-- If current date doesn't belong to any period or you have holes between periods results can be unpredictable.
+ * "Create Stock Periods" - can automatically creating daily, weekly or monthly periods.
+ * "Stock Periods" - allows to create any type of periods, change the dates and change the state of period.
-Sales Forecasts
----------------
-You have few menus for Sales forecast in "Sales Management - Sales Forecasts".
-- "Create Sales Forecasts for Sales Periods" - which automates creating forecasts lines according to some parameters.
-- "Sales Forecasts" - few menus for working with forecasts lists and forms.
-
-Menu "Create Sales Forecasts for Sales Periods" creates Forecasts for products from selected Category, for selected Period and for selected Warehouse. It is an option "Copy Last Forecast" to copy forecast and other settings of period before this one to created one.
-
-Remarks:
-- This tool doesn't create lines, if relevant lines (for the same Product, Period, Warehouse and validated or created by you) already exists. If you wish to create another forecast, if relevant lines exists you have to do it manually using menus described bellow.
-- When created lines are validated by someone else you can use this tool to create another lines for the same Period, Product and Warehouse.
-- When you choose "Copy Last Forecast" created line takes quantity and some settings from your (validated by you or created by you if not validated yet) forecast which is for last period before period of created forecast. If there are few your forecasts for period before this one (it is possible) system takes one of them (no rule which of them).
-
-
-Menus "Sales Forecasts"
-On "Sales Forecast" form mainly you have to enter a forecast quantity in "Product Quantity". Further calculation can work for draft forecasts. But validation can save your data against any accidental changes. You can click "Validate" button but it is not mandatory.
-
-Instead of forecast quantity you can enter amount of forecast sales in field "Product Amount". System will count quantity from amount according to Sale price of the Product.
-
-All values on the form are expressed in unit of measure selected on form. You can select one of unit of measure from default category or from second category. When you change unit of measure the quanities will be recalculated according to new UoM: editable values (blue fields) immediately, non edited fields after clicking of "Calculate Planning" button.
-
-To find proper value for Sale Forecast you can use "Sales History" table for this product. You have to enter parameters to the top and left of this table and system will count sale quantities according to these parameters. So you can select your department (at the top) then (to the left): last period, period before last and period year ago.
+Creating periods is the first step. You can create custom periods using the "New" button in "Stock Periods", but it is recommended to use the automatic assistant "Create Stock Periods".
Remarks:
+ - These periods (Stock Periods) are completely distinct from Financial or other periods in the system.
+ - Periods are not assigned to companies (when you use multicompany). Module suppose that you use the same periods across companies. If you wish to use different periods for different companies define them as you wish (they can overlap). Later on in this text will be indications how to use such periods.
+ - When periods are created automatically their start and finish dates are with start hour 00:00:00 and end hour 23:59:00. When you create daily periods they will have start date 31.01.2010 00:00:00 and end date 31.01.2010 23:59:00. It works only in automatic creation of periods. When you create periods manually you have to take care about hours because you can have incorrect values form sales or stock.
+ - If you use overlapping periods for the same product, warehouse and company results can be unpredictable.
+ - If current date doesn't belong to any period or you have holes between periods results can be unpredictable.
-Procurement Planning
---------------------
-Menu for Planning you can find in "Warehouse - Stock Planning".
-- "Create Stock Planning Lines" - allows you to automate creating planning lines according to some parameters.
-- "Master Procurement Scheduler" - is the most important menu of the module which allows to create procurement.
+Sales Forecasts configuration
+-----------------------------
+You have few menus for Sales forecast in "Sales > Sales Forecasts":
-As Sales forecast is phase of planning sales. The Procurement Planning (Planning) is the phase of scheduling Purchasing or Producing. You can create Procurement Planning quickly using tool from menu "Create Stock Planning Lines", then you can review created planning and make procurement using menu "Master Procurement Schedule".
+ - "Create Sales Forecasts" - can automatically create forecast lines according to your needs
+ - "Sales Forecasts" - for managing the Sales forecasts
-Menu "Create Stock Planning Lines" allows you to create quickly Planning lines for products from selected Category, for selected Period, and for selected Warehouse. When you check option "All Products with Forecast" system creates lines for all products having forecast for selected Period and Warehouse. Selected Category will be ignored in this case.
+Menu "Create Sales Forecasts" creates Forecasts for products from selected Category, for selected Period and for selected Warehouse.
+It is also possible to copy the previous forecast.
-Under menu "Master Procurement Scheduler" you can generally change the values "Planned Out" and "Planned In" to observe the field "Stock Simulation" and decide if this value would be accurate for end of the Period.
-"Planned Out" can be based on "Warehouse Forecast" which is the sum of all forecasts for Period and Warehouse. But your planning can be based on any other information you have. It is not necessary to have any forecast.
-"Planned In" quantity is used to calculate field "Incoming Left" which is the quantity to be procured to make stock as indicated in "Stock Simulation" at the end of Period. You can compare "Stock Simulation" quantity to minimum stock rules visible on the form. But you can plan different quantity than in Minimum Stock Rules. Calculation is made for whole Warehouse by default. But if you want to see values for Stock location of calculated warehouse you can use check box "Stock Location Only".
+Remarks:
-If after few tries you decide that you found correct quantities for "Planned Out" and "Planned In" and you are satisfied with end of period stock calculated in "Stock Simulation" you can click "Procure Incoming Left" button to procure quantity of field "Incoming Left" into the Warehouse. System creates appropriate Procurement Order. You can decide if procurement will be made to Stock or Input location of calculated Warehouse.
+ - This tool doesn't duplicate lines if you already have an entry for the same Product, Period, Warehouse, created or validated by the same user. If you wish to create another forecast, if relevant lines exists you have to do it manually as described below.
+ - When created lines are validated by someone else you can use this tool to create another line for the same Period, Product and Warehouse.
+ - When you choose "Copy Last Forecast", created line take quantity and other settings from your (validated by you or created by you if not validated yet) forecast which is for last period before period of created forecast.
-If you don't want to Produce or Buy the product but just pick calculated quantity from another warehouse you can click "Supply from Another Warehouse" (instead of "Procure Incoming Left"). System creates pick list with move from selected source Warehouse to calculated Warehouse (as destination). You can also decide if this pick should be done from Stock or Output location of source warehouse. Destination location (Stock or Input) of destination warehouse will be used as set for "Procure Incoming Left".
+On "Sales Forecast" form mainly you have to enter a forecast quantity in "Product Quantity".
+Further calculation can work for draft forecasts. But validation can save your data against any accidental changes.
+You can click "Validate" button but it is not mandatory.
-To see proper quantities in fields "Confirmed In", "Confirmed Out", "Confirmed In Before", "Planned Out Before" and "Stock Simulation" you have to click button "Calculate Planning".
+Instead of forecast quantity you may enter the amount of forecast sales via the "Product Amount" field.
+The system will count quantity from amount according to Sale price of the Product.
-All values on the form are expressed in unit of measure selected on form. You can select one of unit of measure from default category or from second category. When you change unit of measure the quanities will be recalculated according to new UoM: editable values (blue fields) immediately, non edited fields after clicking of "Calculate Planning" button.
+All values on the form are expressed in unit of measure selected on form.
+You can select a unit of measure from the default category or from secondary category.
+When you change unit of measure the forecast product quantity will be re-computed according to new UoM.
-How Stock Simulation field is calculated:
-Generally Stock Simulation shows the stock for end of the calculated period according to some planned or confirmed stock moves. Calculation always starts with quantity of real stock of beginning of current period. Then calculation adds or subtracts quantities of calculated period or periods before calculated.
+To work out your Sale Forecast you can use the "Sales History" of the product.
+You have to enter parameters to the top and left of this table and system will count sale quantities according to these parameters.
+So you can get results for a given sales team or period.
+
+
+MPS or Procurement Planning
+---------------------------
+An MPS planning consists in Stock Planning lines, used to analyze and possibly drive the procurement of
+products for each relevant Stock Period and Warehouse.
+The menu is located in "Warehouse > Schedulers > Master Procurement Schedule":
+
+ - "Create Stock Planning Lines" - a wizard to help automatically create many planning lines
+ - "Master Procurement Schedule" - management of your planning lines
+
+Similarly to the way Sales forecast serves to define your sales planning, the MPS lets you plan your procurements (Purchase/Manufacturing).
+You can quickly populate the MPS with the "Create Stock Planning Lines" wizard, and then proceed to review them via the "Master Procurement Schedule" menu.
+
+The "Create Stock Planning Lines" wizard lets you to quickly create all MPS lines for a given Product Category, and a given Period and Warehouse.
+When you enable the "All Products with Forecast" option of the wizard, the system creates lines for all products having sales forecast for selected
+Period and Warehouse (the selected Category will be ignored in this case).
+
+Under menu "Master Procurement Schedule" you will usually change the "Planned Out" and "Planned In" quantities and observe the resulting "Stock Simulation" value
+to decide if you need to procure more products for the given Period.
+"Planned Out" will be initially based on "Warehouse Forecast" which is the sum of all outgoing stock moves already planned for the Period and Warehouse.
+Of course you can alter this value to provide your own quantities. It is not necessary to have any forecast.
+"Planned In" quantity is used to calculate field "Incoming Left" which is the quantity to be procured to reach the "Stock Simulation" at the end of Period.
+You can compare "Stock Simulation" quantity to minimum stock rules visible on the form.
+And you can plan different quantity than in Minimum Stock Rules. Calculations are done for whole Warehouse by default,
+if you want to see values for Stock location of calculated warehouse you can check "Stock Location Only".
+
+When you are satisfied with the "Planned Out", "Planned In" and end of period "Stock Simulation",
+you can click on "Procure Incoming Left" to create a procurement for the "Incoming Left" quantity.
+You can decide if procurement will go to the to Stock or Input location of the Warehouse.
+
+If you don't want to Produce or Buy the product but just transfer the calculated quantity from another warehouse
+you can click "Supply from Another Warehouse" (instead of "Procure Incoming Left") and the system will
+create the appropriate picking list (stock moves).
+You can choose to take the goods from the Stock or the Output location of the source warehouse.
+Destination location (Stock or Input) in the destination warehouse will be taken as for the procurement case.
+
+To see update the quantities of "Confirmed In", "Confirmed Out", "Confirmed In Before", "Planned Out Before"
+and "Stock Simulation" you can press "Calculate Planning".
+
+All values on the form are expressed in unit of measure selected on form.
+You can select one of unit of measure from default category or from secondary category.
+When you change unit of measure the editable quantities will be re-computed according to new UoM. The others will be updated after pressing "Calculate Planning".
+
+Computation of Stock Simulation quantities
+------------------------------------------
+The Stock Simulation value is the estimated stock quantity at the end of the period.
+The calculation always starts with the real stock on hand at the beginning of the current period, then
+adds or subtracts the computed quantities.
When you are in the same period (current period is the same as calculated) Stock Simulation is calculated as follows:
Stock Simulation =
@@ -124,9 +159,12 @@ Stock Simulation =
- Planned Out of calculated Period
+ Planned In of calculated Period .
-As you see calculated Period is taken the same way like in case above. But calculation of current Period are made a little bit different. First you should note that system takes for current Period only Confirmed In moves. It means that you have to make planning and procurement for current Period before this calculation (for Period next to current).
+As you see the calculated Period is taken the same way as in previous case, but the calculation in the current
+Period is a little bit different. First you should note that system takes for only Confirmed moves for the
+current period. This means that you should complete the planning and procurement of the current Period before
+going to the next one.
-When you calculate Period ahead:
+When you plan for future Periods:
Stock Simulation =
Stock of beginning of current Period
@@ -135,15 +173,23 @@ Stock Simulation =
- Planned Out of calculated Period
+ Planned In of calculated Period.
-Periods before calculated means periods starting from current till period before calculated.
+Here "Periods before calculated" designates all periods starting with the current until the period before the one being calculated.
Remarks:
-- Remember to make planning for all periods before calculated because omitting these quantities and procurements can cause wrong suggestions for procurements few periods ahead.
-- If you made planning few periods ahead and you find that real Confirmed Out is bigger than Planned Out in some periods before you can repeat Planning and make another procurement. You should do it in the same planning line. If you create another planning line the suggestions can be wrong.
-- When you wish to work with different periods for some part of products define two kinds of periods (fe. Weekly and Monthly) and use them for different products. Example: If you use always Weekly periods for Products A, and Monthly periods for Products B your all calculations will work correctly. You can also use different kind of periods for the same products from different warehouse or companies. But you cannot use overlapping periods for the same product, warehouse and company because results can be unpredictable. The same apply to Forecasts lines.
+
+ - Remember to make the proceed with the planning of each period in chronological order, otherwise the numbers will not reflect the
+ reality
+ - If you planned for future periods and find that real Confirmed Out is larger than Planned Out in some periods before,
+ you can repeat Planning and make another procurement. You should do it in the same planning line.
+ If you create another planning line the suggestions can be wrong.
+ - When you wish to work with different periods for some products, define two kinds of periods (e.g. Weekly and Monthly) and use
+ them for different products. Example: If you use always Weekly periods for Product A, and Monthly periods for Product B
+ all calculations will work correctly. You can also use different kind of periods for the same product from different warehouse
+ or companies. But you cannot use overlapping periods for the same product, warehouse and company because results
+ can be unpredictable. The same applies to Forecasts lines.
""",
- "demo_xml":[],
- "update_xml": [
+ "data": [
+ "security/stock_planning_security.xml",
"security/ir.model.access.csv",
"stock_planning_view.xml",
"wizard/stock_planning_create_periods_view.xml",
diff --git a/addons/stock_planning/security/stock_planning_security.xml b/addons/stock_planning/security/stock_planning_security.xml
new file mode 100644
index 00000000000..62f15e005bb
--- /dev/null
+++ b/addons/stock_planning/security/stock_planning_security.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+ stock_planning multi-company
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+
+
+ stock_sale_forecast multi-company
+
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+
+
+
diff --git a/addons/stock_planning/stock_planning.py b/addons/stock_planning/stock_planning.py
index 7e9342292b9..fe0b2f8f3ce 100644
--- a/addons/stock_planning/stock_planning.py
+++ b/addons/stock_planning/stock_planning.py
@@ -26,6 +26,10 @@ from dateutil.relativedelta import relativedelta
from osv import osv, fields
import netsvc
from tools.translate import _
+import logging
+
+_logger = logging.getLogger('mps')
+
def rounding(fl, round_value):
if not round_value:
@@ -37,6 +41,7 @@ def rounding(fl, round_value):
class stock_period(osv.osv):
_name = "stock.period"
_description = "stock period"
+ _order = "date_start"
_columns = {
'name': fields.char('Period Name', size=64, required=True),
'date_start': fields.datetime('Start Date', required=True),
@@ -75,16 +80,16 @@ class stock_sale_forecast(osv.osv):
help = 'Shows which period this forecast concerns.'),
'product_id': fields.many2one('product.product', 'Product', readonly=True, required=True, states={'draft':[('readonly',False)]}, \
help = 'Shows which product this forecast concerns.'),
- 'product_qty': fields.float('Product Quantity', required=True, readonly=True, states={'draft':[('readonly',False)]}, \
- help= 'Forecasted quantity.'),
+ 'product_qty': fields.float('Forecast Quantity', required=True, readonly=True, states={'draft':[('readonly',False)]}, \
+ help= 'Forecast Product quantity.'),
'product_amt': fields.float('Product Amount', readonly=True, states={'draft':[('readonly',False)]}, \
help='Forecast value which will be converted to Product Quantity according to prices.'),
'product_uom_categ': fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uom domain
'product_uom': fields.many2one('product.uom', 'Product UoM', required=True, readonly=True, states={'draft':[('readonly',False)]}, \
- help = "Unit of Measure used to show the quanities of stock calculation." \
+ help = "Unit of Measure used to show the quantities of stock calculation." \
"You can use units form default category or from second category (UoS category)."),
'product_uos_categ' : fields.many2one('product.uom.categ', 'Product UoS Category'), # Invisible field for product_uos domain
-# Field used in onchange_uom to check what uom was before change and recalculate quantities acording to old uom (active_uom) and new uom.
+# Field used in onchange_uom to check what uom was before change and recalculate quantities according to old uom (active_uom) and new uom.
'active_uom': fields.many2one('product.uom', string = "Active UoM"),
'state': fields.selection([('draft','Draft'),('validated','Validated')],'State',readonly=True),
'analyzed_period1_id': fields.many2one('stock.period', 'Period1', readonly=True, states={'draft':[('readonly',False)]},),
@@ -93,7 +98,7 @@ class stock_sale_forecast(osv.osv):
'analyzed_period4_id': fields.many2one('stock.period', 'Period4', readonly=True, states={'draft':[('readonly',False)]},),
'analyzed_period5_id': fields.many2one('stock.period' , 'Period5', readonly=True, states={'draft':[('readonly',False)]},),
'analyzed_user_id': fields.many2one('res.users', 'This User', required=False, readonly=True, states={'draft':[('readonly',False)]},),
- 'analyzed_dept_id': fields.many2one('hr.department', 'This Department', required=False, \
+ 'analyzed_team_id': fields.many2one('crm.case.section', 'Sales Team', required=False, \
readonly=True, states={'draft':[('readonly',False)]},),
'analyzed_warehouse_id': fields.many2one('stock.warehouse' , 'This Warehouse', required=False, \
readonly=True, states={'draft':[('readonly',False)]}),
@@ -114,7 +119,7 @@ class stock_sale_forecast(osv.osv):
'analyzed_period3_per_warehouse': fields.float('This Warehouse Period3', readonly=True),
'analyzed_period4_per_warehouse': fields.float('This Warehouse Period4', readonly=True),
'analyzed_period5_per_warehouse': fields.float('This Warehouse Period5', readonly=True),
- 'analyzed_period1_per_company': fields.float('This Copmany Period1', readonly=True),
+ 'analyzed_period1_per_company': fields.float('This Company Period1', readonly=True),
'analyzed_period2_per_company': fields.float('This Company Period2', readonly=True),
'analyzed_period3_per_company': fields.float('This Company Period3', readonly=True),
'analyzed_period4_per_company': fields.float('This Company Period4', readonly=True),
@@ -137,7 +142,7 @@ class stock_sale_forecast(osv.osv):
if t['state'] in ('draft'):
unlink_ids.append(t['id'])
else:
- raise osv.except_osv(_('Invalid action !'), _('Cannot delete Validated Sale Forecasts !'))
+ raise osv.except_osv(_('Invalid action !'), _('Cannot delete a validated sales forecast!'))
osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
return True
@@ -147,7 +152,7 @@ class stock_sale_forecast(osv.osv):
return result
result['warehouse_id'] = False
result['analyzed_user_id'] = False
- result['analyzed_dept_id'] = False
+ result['analyzed_team_id'] = False
result['analyzed_warehouse_id'] = False
return {'value': result}
@@ -196,7 +201,7 @@ class stock_sale_forecast(osv.osv):
uom = uom_obj.browse(cr, uid, uom_id, context=context)
coef = uom.factor
if uom.category_id.id <> product.uom_id.category_id.id:
- coef = coef / product.uos_coeff
+ coef = coef * product.uos_coeff
return product.uom_id.factor / coef
def _from_default_uom_factor(self, cr, uid, product_id, uom_id, context=None):
@@ -206,7 +211,7 @@ class stock_sale_forecast(osv.osv):
uom = uom_obj.browse(cr, uid, uom_id, context=context)
res = uom.factor
if uom.category_id.id <> product.uom_id.category_id.id:
- res = res / product.uos_coeff
+ res = res * product.uos_coeff
return res / product.uom_id.factor, uom.rounding
def _sales_per_users(self, cr, uid, so, so_line, company, users):
@@ -237,35 +242,24 @@ class stock_sale_forecast(osv.osv):
so_line_obj = self.pool.get('sale.order.line')
so_line_product_ids = so_line_obj.search(cr, uid, [('product_id','=', obj.product_id.id)], context = context)
if so_line_product_ids:
- so_line_product_set = ','.join(map(str,so_line_product_ids))
+ shops = users = None
if obj.analyzed_warehouse_id:
shops = self.pool.get('sale.shop').search(cr, uid,[('warehouse_id','=', obj.analyzed_warehouse_id.id)], context = context)
- shops_set = ','.join(map(str,shops))
- else:
- shops = False
- if obj.analyzed_dept_id:
- dept_obj = self.pool.get('hr.department')
- dept_id = obj.analyzed_dept_id.id and [obj.analyzed_dept_id.id] or []
- dept_ids = dept_obj.search(cr,uid,[('parent_id','child_of',dept_id)])
- cr.execute("SELECT user_id FROM resource_resource rsc, hr_employee emp WHERE (emp.resource_id = rsc.id and emp.department_id IN %s)" ,(tuple(dept_ids),))
- dept_users = [x for x, in cr.fetchall()]
- dept_users_set = map(str,dept_users)
- else:
- dept_users = False
- factor, round_value = self._from_default_uom_factor(cr, uid, obj.product_id.id, obj.product_uom.id, context=context)
+ if obj.analyzed_team_id:
+ users = [u.id for u in obj.analyzed_team_id.member_ids]
+ factor, _ = self._from_default_uom_factor(cr, uid, obj.product_id.id, obj.product_uom.id, context=context)
for i, period in enumerate(periods):
if period:
so_period_ids = so_obj.search(cr, uid, [('date_order','>=',period.date_start),('date_order','<=',period.date_stop) ], context = context)
if so_period_ids:
if obj.analyzed_user_id:
- user_set = str(obj.analyzed_user_id.id)
- sales[i][0] = self._sales_per_users(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, user_set)
+ sales[i][0] = self._sales_per_users(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, [obj.analyzed_user_id.id])
sales[i][0] *= factor
- if dept_users:
- sales[i][1] = self._sales_per_users(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, dept_users_set)
+ if users:
+ sales[i][1] = self._sales_per_users(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, users)
sales[i][1] *= factor
if shops:
- sales[i][2] = self._sales_per_warehouse(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, shops_set)
+ sales[i][2] = self._sales_per_warehouse(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, shops)
sales[i][2] *= factor
if obj.analyze_company:
sales[i][3] = self._sales_per_company(cr, uid, so_period_ids, so_line_product_ids, obj.company_id.id, )
@@ -343,13 +337,20 @@ class stock_planning(osv.osv):
GROUP BY planning.product_uom", \
(date_start, date_stop, val.product_id.id, val.company_id.id,))
planning_qtys = cr.fetchall()
- res = self._to_planning_uom(cr, uid, val, planning_qtys, context)
+ res = self._to_default_uom(cr, uid, val, planning_qtys, context)
return res
- def _to_planning_uom(self, cr, uid, val, qtys, context=None):
+ def _to_default_uom(self, cr, uid, val, qtys, context=None):
+ res_qty = 0
+ if qtys:
+ for qty, prod_uom in qtys:
+ coef = self._to_default_uom_factor(cr, uid, val.product_id.id, prod_uom, context=context)
+ res_qty += qty * coef
+ return res_qty
+
+ def _to_form_uom(self, cr, uid, val, qtys, context=None):
res_qty = 0
if qtys:
- uom_obj = self.pool.get('product.uom')
for qty, prod_uom in qtys:
coef = self._to_default_uom_factor(cr, uid, val.product_id.id, prod_uom, context=context)
res_coef, round_value = self._from_default_uom_factor(cr, uid, val.product_id.id, val.product_uom.id, context=context)
@@ -369,7 +370,7 @@ class stock_planning(osv.osv):
'GROUP BY product_uom', \
(val.product_id.id,val.period_id.id, val.company_id.id))
company_qtys = cr.fetchall()
- res[val.id]['company_forecast'] = self._to_planning_uom(cr, uid, val, company_qtys, context)
+ res[val.id]['company_forecast'] = self._to_form_uom(cr, uid, val, company_qtys, context)
cr.execute('SELECT sum(product_qty), product_uom \
FROM stock_sale_forecast \
@@ -377,8 +378,8 @@ class stock_planning(osv.osv):
'GROUP BY product_uom', \
(val.product_id.id,val.period_id.id, val.warehouse_id.id))
warehouse_qtys = cr.fetchall()
- res[val.id]['warehouse_forecast'] = self._to_planning_uom(cr, uid, val, warehouse_qtys, context)
- res[val.id]['warehouse_forecast'] = rounding(res[val.id]['warehouse_forecast'], val.product_id.uom_id.rounding)
+ res[val.id]['warehouse_forecast'] = self._to_form_uom(cr, uid, val, warehouse_qtys, context)
+# res[val.id]['warehouse_forecast'] = rounding(res[val.id]['warehouse_forecast'], val.product_id.uom_id.rounding)
return res
def _get_stock_start(self, cr, uid, val, date, context=None):
@@ -419,7 +420,7 @@ class stock_planning(osv.osv):
res_coef, round_value = self._from_default_uom_factor(cr, uid, val.product_id.id, val.product_uom.id, context=context)
coef = coef * res_coef
res[val.id]['minimum_op'] = rounding(ret[0]*coef, round_value)
- res[val.id]['maximum_op'] = ret[1]*coef
+ res[val.id]['maximum_op'] = rounding(ret[1]*coef, round_value)
return res
def onchange_company(self, cr, uid, ids, company_id=False):
@@ -451,11 +452,11 @@ class stock_planning(osv.osv):
'warehouse_id': fields.many2one('stock.warehouse','Warehouse', required=True),
'product_id': fields.many2one('product.product' , 'Product', required=True, help = 'Product which this planning is created for.'),
'product_uom_categ' : fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uom domain
- 'product_uom': fields.many2one('product.uom', 'UoM', required=True, help = "Unit of Measure used to show the quanities of stock calculation." \
- "You can use units form default category or from second category (UoS category)."),
+ 'product_uom': fields.many2one('product.uom', 'UoM', required=True, help = "Unit of Measure used to show the quantities of stock calculation." \
+ "You can use units from default category or from second category (UoS category)."),
'product_uos_categ': fields.many2one('product.uom.categ', 'Product UoM Category'), # Invisible field for product_uos domain
-# Field used in onchange_uom to check what uom was before change to recalculate quantities acording to old uom (active_uom) and new uom.
- 'active_uom': fields.many2one('product.uom', string = "Active UoM"),
+# Field used in onchange_uom to check what uom was before change to recalculate quantities according to old uom (active_uom) and new uom.
+ 'active_uom': fields.many2one('product.uom', string = "Active UoM"), # It works only in Forecast
'planned_outgoing': fields.float('Planned Out', required=True, \
help = 'Enter planned outgoing quantity from selected Warehouse during the selected Period of selected Product. '\
'To plan this value look at Confirmed Out or Sales Forecasts. This value should be equal or greater than Confirmed Out.'),
@@ -475,16 +476,16 @@ class stock_planning(osv.osv):
help = 'Quantity left to Planned incoming quantity. This is calculated difference between Planned In and Confirmed In. ' \
'For current period Already In is also calculated. This value is used to create procurement for lacking quantity.'),
'outgoing_left': fields.float('Expected Out', readonly=True, \
- help = 'Quantity expected to go out in selected period. As a difference between Planned Out and Confirmed Out. ' \
+ help = 'Quantity expected to go out in selected period besides Confirmed Out. As a difference between Planned Out and Confirmed Out. ' \
'For current period Already Out is also calculated'),
'to_procure': fields.float(string='Planned In', required=True, \
help = 'Enter quantity which (by your plan) should come in. Change this value and observe Stock simulation. ' \
'This value should be equal or greater than Confirmed In.'),
- 'line_time': fields.function(_get_past_future,type='char', string='Past/Future'),
+ 'line_time': fields.function(_get_past_future, type='char', string='Past/Future'),
'minimum_op': fields.function(_get_op, type='float', string = 'Minimum Rule', multi= 'minimum', \
- help = 'Minimum quantity set in Minimum Stock Rules for this Warhouse'),
+ help = 'Minimum quantity set in Minimum Stock Rules for this Warehouse'),
'maximum_op': fields.function(_get_op, type='float', string = 'Maximum Rule', multi= 'maximum', \
- help = 'Maximum quantity set in Minimum Stock Rules for this Warhouse'),
+ help = 'Maximum quantity set in Minimum Stock Rules for this Warehouse'),
'outgoing_before': fields.float('Planned Out Before', readonly=True, \
help= 'Planned Out in periods before calculated. '\
'Between start date of current period and one day before start of calculated period.'),
@@ -499,18 +500,18 @@ class stock_planning(osv.osv):
help= 'Quantity which is already picked up to this warehouse in current period.'),
'stock_only': fields.boolean("Stock Location Only", help = "Check to calculate stock location of selected warehouse only. " \
"If not selected calculation is made for input, stock and output location of warehouse."),
- "procure_to_stock": fields.boolean("Procure To Stock Location", help = "Chect to make procurement to stock location of selected warehouse. " \
+ "procure_to_stock": fields.boolean("Procure To Stock Location", help = "Check to make procurement to stock location of selected warehouse. " \
"If not selected procurement will be made into input location of warehouse."),
"confirmed_forecasts_only": fields.boolean("Validated Forecasts", help = "Check to take validated forecasts only. " \
"If not checked system takes validated and draft forecasts."),
- 'supply_warehouse_id': fields.many2one('stock.warehouse','Source Warehouse', help = "Warehouse used as source in supply pick move created by 'Supply from Another Warhouse'."),
+ 'supply_warehouse_id': fields.many2one('stock.warehouse','Source Warehouse', help = "Warehouse used as source in supply pick move created by 'Supply from Another Warehouse'."),
"stock_supply_location": fields.boolean("Stock Supply Location", help = "Check to supply from Stock location of Supply Warehouse. " \
- "If not checked supply will be made from Output location of Supply Warehouse. Used in 'Supply from Another Warhouse' with Supply Warehouse."),
+ "If not checked supply will be made from Output location of Supply Warehouse. Used in 'Supply from Another Warehouse' with Supply Warehouse."),
}
_defaults = {
- 'state': lambda *args: 'draft' ,
+ 'state': 'draft' ,
'to_procure': 0.0,
'planned_outgoing': 0.0,
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.planning', context=c),
@@ -525,7 +526,7 @@ class stock_planning(osv.osv):
uom = uom_obj.browse(cr, uid, uom_id, context=context)
coef = uom.factor
if uom.category_id.id != product.uom_id.category_id.id:
- coef = coef / product.uos_coeff
+ coef = coef * product.uos_coeff
return product.uom_id.factor / coef
@@ -536,19 +537,22 @@ class stock_planning(osv.osv):
uom = uom_obj.browse(cr, uid, uom_id, context=context)
res = uom.factor
if uom.category_id.id != product.uom_id.category_id.id:
- res = res / product.uos_coeff
+ res = res * product.uos_coeff
return res / product.uom_id.factor, uom.rounding
def calculate_planning(self, cr, uid, ids, context, *args):
- one_minute = relativedelta(minutes=1)
- current_date_beginning_c = datetime.today()
- current_date_end_c = current_date_beginning_c + relativedelta(days=1, minutes=-1) # to get hour 23:59:00
+ one_second = relativedelta(seconds=1)
+ today = datetime.today()
+ current_date_beginning_c = datetime(today.year, today.month, today.day)
+ current_date_end_c = current_date_beginning_c + relativedelta(days=1, seconds=-1) # to get hour 23:59:59
current_date_beginning = current_date_beginning_c.strftime('%Y-%m-%d %H:%M:%S')
current_date_end = current_date_end_c.strftime('%Y-%m-%d %H:%M:%S')
+ _logger.debug("Calculate Planning: current date beg: %s and end: %s", current_date_beginning, current_date_end)
for val in self.browse(cr, uid, ids, context=context):
day = datetime.strptime(val.period_id.date_start, '%Y-%m-%d %H:%M:%S')
- dbefore = datetime(day.year, day.month, day.day) - one_minute
+ dbefore = datetime(day.year, day.month, day.day) - one_second
day_before_calculated_period = dbefore.strftime('%Y-%m-%d %H:%M:%S') # one day before start of calculated period
+ _logger.debug("Day before calculated period: %s ", day_before_calculated_period)
cr.execute("SELECT date_start \
FROM stock_period AS period \
LEFT JOIN stock_planning AS planning \
@@ -558,10 +562,10 @@ class stock_planning(osv.osv):
date = cr.fetchone()
start_date_current_period = date and date[0] or False
start_date_current_period = start_date_current_period or current_date_beginning
-
day = datetime.strptime(start_date_current_period, '%Y-%m-%d %H:%M:%S')
- dbefore = datetime(day.year, day.month, day.day) - one_minute
+ dbefore = datetime(day.year, day.month, day.day) - one_second
date_for_start = dbefore.strftime('%Y-%m-%d %H:%M:%S') # one day before current period
+ _logger.debug("Date for start: %s", date_for_start)
already_out = self._get_in_out(cr, uid, val, start_date_current_period, current_date_end, direction='out', done=True, context=context),
already_in = self._get_in_out(cr, uid, val, start_date_current_period, current_date_end, direction='in', done=True, context=context),
outgoing = self._get_in_out(cr, uid, val, val.period_id.date_start, val.period_id.date_stop, direction='out', done=False, context=context),
@@ -623,7 +627,7 @@ class stock_planning(osv.osv):
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
proc_id = self.pool.get('procurement.order').create(cr, uid, {
'company_id' : obj.company_id.id,
- 'name': _('Manual planning for %s') %(obj.period_id.name),
+ 'name': _('MPS planning for %s') %(obj.period_id.name),
'origin': _('MPS(%s) %s') %(user.login, obj.period_id.name),
'date_planned': obj.period_id.date_start,
'product_id': obj.product_id.id,
@@ -633,7 +637,7 @@ class stock_planning(osv.osv):
'product_uos': uos,
'location_id': obj.procure_to_stock and obj.warehouse_id.lot_stock_id.id or obj.warehouse_id.lot_input_id.id,
'procure_method': 'make_to_order',
- 'note' : _(' Procurement created in MPS by user: %s Creation Date: %s \
+ 'note' : _(' Procurement created by MPS for user: %s Creation Date: %s \
\n For period: %s \
\n according to state: \
\n Warehouse Forecast: %s \
@@ -653,7 +657,7 @@ class stock_planning(osv.osv):
self.calculate_planning(cr, uid, ids, context)
prev_text = obj.history or ""
self.write(cr, uid, ids, {
- 'history': _('%s Requisition (%s, %s) %s %s \n') % (prev_text, user.login, time.strftime('%Y.%m.%d %H:%M'),
+ 'history': _('%s Procurement (%s, %s) %s %s \n') % (prev_text, user.login, time.strftime('%Y.%m.%d %H:%M'),
obj.incoming_left, obj.product_uom.name)
})
diff --git a/addons/stock_planning/stock_planning_view.xml b/addons/stock_planning/stock_planning_view.xml
index 9995752cb03..3cbee4d53d8 100644
--- a/addons/stock_planning/stock_planning_view.xml
+++ b/addons/stock_planning/stock_planning_view.xml
@@ -2,8 +2,8 @@
+ name="Stock Periods"
+ parent="stock.menu_stock_configuration" sequence="20"/>
@@ -12,7 +12,7 @@
stock.periodform
-
+
@@ -46,7 +46,7 @@
stock.periodsearch
-
+
@@ -58,11 +58,13 @@
- Stock and Sales Periods
+ Stock Periodsstock.periodformtree,form
+ Stock periods are used for stock planning. Stock periods are independent of account periods. You can use wizard for creating periods and review them here.
+
-
+
@@ -190,14 +192,14 @@
search
-
+
-
+
@@ -215,7 +217,7 @@
formtree,form,graph{"search_default_create_uid":uid}
-
+ This quantity sales forecast is an indication for Stock Planner to make procurement manually or to complement automatic procurement. You can use manual procurement with this forecast when some periods are exceptional for usual minimum stock rules.
-
+ stock.planning.form
@@ -247,6 +249,7 @@
+
@@ -283,7 +286,7 @@
-
+
@@ -295,13 +298,13 @@
search
-
+
-
+
@@ -338,12 +341,14 @@
ir.actions.act_windowformtree,form
-
+ The Master Procurement Schedule can be the main driver for warehouse replenishment, or can complement the automatic MRP scheduling (minimum stock rules, etc.).
+Each MPS line gives you a pre-computed overview of the incoming and outgoing quantities of a given product for a given Stock Period in a given Warehouse, based on the current and future stock levels,
+as well as the planned stock moves. The forecast quantities can be altered manually, and when satisfied with resulting (simulated) Stock quantity, you can trigger the procurement of what is missing to reach your desired quantities
diff --git a/addons/stock_planning/test/stock_planning.yml b/addons/stock_planning/test/stock_planning.yml
index eb0ccbd20ef..77f1d5a427d 100644
--- a/addons/stock_planning/test/stock_planning.yml
+++ b/addons/stock_planning/test/stock_planning.yml
@@ -96,7 +96,7 @@
!python {model: stock.sale.forecast}: |
forecast_ids = self.search(cr, uid, [('product_id','=',ref('product.product_product_pc1'))])
write_dict = {'product_qty': 30.0,
- 'analyzed_dept_id': ref("hr.dep_sales"),
+ 'analyzed_section_id': ref("crm.section_sales_department"),
'analyzed_period1_id': ref("stock_period_03"),
'analyzed_user_id': ref("base.user_root"),
'analyzed_warehouse_id': ref("stock.warehouse0")}
diff --git a/addons/stock_planning/wizard/stock_planning_create_periods.py b/addons/stock_planning/wizard/stock_planning_create_periods.py
index 7d4012453de..05f8aa925a9 100644
--- a/addons/stock_planning/wizard/stock_planning_create_periods.py
+++ b/addons/stock_planning/wizard/stock_planning_create_periods.py
@@ -52,8 +52,6 @@ class stock_period_createlines(osv.osv_memory):
}
def create_stock_periods(self, cr, uid, ids, context=None):
- if context is None:
- context = {}
interval = context.get('interval',0)
name = context.get('name','Daily')
period_obj = self.pool.get('stock.period')
@@ -106,7 +104,7 @@ class stock_period_createlines(osv.osv_memory):
return {
'domain': "[('id','in', ["+','.join(map(str, lines))+"])]",
'view_type': 'form',
- "view_mode": 'tree, form',
+ "view_mode": 'tree,form',
'res_model': 'stock.period',
'type': 'ir.actions.act_window',
}
diff --git a/addons/stock_planning/wizard/stock_planning_create_periods_view.xml b/addons/stock_planning/wizard/stock_planning_create_periods_view.xml
index 35b55b8f4e7..42730dc8ace 100644
--- a/addons/stock_planning/wizard/stock_planning_create_periods_view.xml
+++ b/addons/stock_planning/wizard/stock_planning_create_periods_view.xml
@@ -8,8 +8,7 @@
stock.period.createlinesform
-
-
+
@@ -24,16 +23,17 @@
- Stock and Sales Planning Periods
+ Stock Periodsstock.period.createlinesformform
+ This wizard helps with the creation of stock planning periods. These periods are independent of financial periods. If you need periods other than day-, week- or month-based, you may also add then manually.new
diff --git a/addons/stock_planning/wizard/stock_planning_createlines.py b/addons/stock_planning/wizard/stock_planning_createlines.py
index 7abb15b6e7d..a6e12ad4bc7 100644
--- a/addons/stock_planning/wizard/stock_planning_createlines.py
+++ b/addons/stock_planning/wizard/stock_planning_createlines.py
@@ -127,16 +127,13 @@ class stock_planning_createlines(osv.osv_memory):
'stock_supply_location': stock_supply_location,
}))
- result = mod_obj._get_id(cr, uid, 'stock_planning', 'view_stock_planning_filter')
- id = mod_obj.read(cr, uid, result, ['res_id'], context=context)
return {
'domain': "[('id','in', ["+','.join(map(str, planning_lines))+"])]",
'view_type': 'form',
- "view_mode": 'tree, form',
+ "view_mode": 'tree,form',
'res_model': 'stock.planning',
'type': 'ir.actions.act_window',
- 'search_view_id': id['res_id'],
}
stock_planning_createlines()
diff --git a/addons/stock_planning/wizard/stock_planning_createlines_view.xml b/addons/stock_planning/wizard/stock_planning_createlines_view.xml
index 7dc4504daef..b0da05b24ab 100644
--- a/addons/stock_planning/wizard/stock_planning_createlines_view.xml
+++ b/addons/stock_planning/wizard/stock_planning_createlines_view.xml
@@ -1,24 +1,18 @@
-
-
stock.planning.createlines.formstock.planning.createlinesform
-
+
-
-
-
-
@@ -30,15 +24,17 @@
Create Stock Planning Linesstock.planning.createlines
+ stock.planningformform
+ This wizard helps create MPS planning lines for a given selected period and warehouse, so you don't have to create them one by one. The wizard doesn't duplicate lines if they already exist for this selection.new
-
+
-
-
-
-
@@ -34,12 +29,10 @@
formnew
+ This wizard helps create many forecast lines at once. After creating them you only have to fill in the forecast quantities. The wizard doesn't duplicate the line when another one exist for the same selection.
-
-
-
diff --git a/addons/subscription/subscription.py b/addons/subscription/subscription.py
index 4f40ea25c35..0f2630ffbb5 100644
--- a/addons/subscription/subscription.py
+++ b/addons/subscription/subscription.py
@@ -136,6 +136,12 @@ class subscription_subscription(osv.osv):
self.write(cr, uid, [row['id']], {'state':state})
return True
+ def unlink(self, cr, uid, ids, context=None):
+ for record in self.browse(cr, uid, ids, context or {}):
+ if record.state=="running":
+ raise osv.except_osv(_('Error !'),_('You cannot delete an active subscription !'))
+ return super(subscription_subscription, self).unlink(cr, uid, ids, context)
+
def set_done(self, cr, uid, ids, context=None):
res = self.read(cr,uid, ids, ['cron_id'])
ids2 = [x['cron_id'][0] for x in res if x['id']]
diff --git a/addons/subscription/subscription_view.xml b/addons/subscription/subscription_view.xml
index b3c39962190..550240d522e 100644
--- a/addons/subscription/subscription_view.xml
+++ b/addons/subscription/subscription_view.xml
@@ -75,7 +75,7 @@
search
-
+
@@ -85,11 +85,11 @@
domain="[('date_init','<', time.strftime('%%Y-%%m-%%d 23:59:59')), ('date_init','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]"/>
-
+
-
+
@@ -169,7 +169,7 @@
search
-
+
diff --git a/addons/survey/survey.py b/addons/survey/survey.py
index 8cdc1ffb704..8bce83380b6 100644
--- a/addons/survey/survey.py
+++ b/addons/survey/survey.py
@@ -88,7 +88,7 @@ class survey(osv.osv):
def survey_cancel(self, cr, uid, ids, arg):
self.write(cr, uid, ids, {'state': 'cancel' })
return True
-
+
def copy(self, cr, uid, ids, default=None, context=None):
vals = {}
current_rec = self.read(cr, uid, ids, context=context)
@@ -177,9 +177,7 @@ class survey_page(osv.osv):
if context is None:
context = {}
data = super(survey_page, self).default_get(cr, uid, fields, context)
- if context.get('line_order',False):
- if len(context['line_order'][-1]) > 2 and type(context['line_order'][-1][2]) == type({}) and context['line_order'][-1][2].has_key('sequence'):
- data['sequence'] = context['line_order'][-1][2]['sequence'] + 1
+ self.pool.get('survey.question').data_get(cr,uid,data,context)
if context.has_key('survey_id'):
data['survey_id'] = context.get('survey_id', False)
return data
@@ -500,14 +498,21 @@ class survey_question(osv.osv):
'context': context
}
+ def data_get(self, cr, uid, data, context):
+ if data and context:
+ if context.get('line_order', False):
+ lines = context.get('line_order')
+ seq = data.get('sequence', 0)
+ for line in lines:
+ seq = seq + 1
+ data.update({'sequence': seq})
+ return data
+
def default_get(self, cr, uid, fields, context=None):
if context is None:
context = {}
data = super(survey_question, self).default_get(cr, uid, fields, context)
- if context.get('line_order',False):
- if len(context['line_order'][-1]) > 2 and type(context['line_order'][-1][2]) == type({}) and context['line_order'][-1][2].has_key('sequence'):
- data['sequence'] = context['line_order'][-1][2]['sequence'] + 1
-
+ self.data_get(cr,uid,data,context)
if context.has_key('page_id'):
data['page_id']= context.get('page_id', False)
return data
@@ -600,9 +605,7 @@ class survey_answer(osv.osv):
if context is None:
context = {}
data = super(survey_answer, self).default_get(cr, uid, fields, context)
- if context.get('line_order', False):
- if len(context['line_order'][-1]) > 2 and type(context['line_order'][-1][2]) == type({}) and context['line_order'][-1][2].has_key('sequence'):
- data['sequence'] = context['line_order'][-1][2]['sequence'] + 1
+ self.pool.get('survey.question').data_get(cr,uid,data,context)
return data
survey_answer()
diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml
index b130227adf4..d0f08dc58e4 100644
--- a/addons/survey/survey_view.xml
+++ b/addons/survey/survey_view.xml
@@ -258,17 +258,17 @@
search
-
+
-
-
-
+
+
+
-
+
@@ -474,7 +474,7 @@
-
+
@@ -681,7 +681,7 @@
-
+
@@ -1093,18 +1093,18 @@
search
-
+
-
-
-
+
+
+
-
+
diff --git a/addons/survey/wizard/survey_answer.xml b/addons/survey/wizard/survey_answer.xml
index db2eb1073d9..b5485bf6370 100644
--- a/addons/survey/wizard/survey_answer.xml
+++ b/addons/survey/wizard/survey_answer.xml
@@ -23,7 +23,7 @@
search
-
+
diff --git a/addons/survey/wizard/survey_selection.py b/addons/survey/wizard/survey_selection.py
index 8d613c74bd0..c6eebd62a67 100644
--- a/addons/survey/wizard/survey_selection.py
+++ b/addons/survey/wizard/survey_selection.py
@@ -64,7 +64,7 @@ class survey_name_wiz(osv.osv_memory):
survey_user_group_id = self.pool.get('res.groups').search(cr, uid, [('name', '=', 'Survey / User')])
group_id = self.pool.get('res.groups').search(cr, uid, [('name', 'in', ('Tools / Manager','Tools / User','Survey / User'))])
user_obj = self.pool.get('res.users')
- user_rec = user_obj.read(cr, uid, uid)
+ user_rec = user_obj.read(cr, uid, uid, [])
if survey_user_group_id:
if survey_user_group_id == user_rec['groups_id']:
for sur in surv_obj.browse(cr, uid, surv_obj.search(cr, uid, [])):
diff --git a/addons/wiki/i18n/hr.po b/addons/wiki/i18n/hr.po
index d1bb1e3f456..62023e0099d 100644
--- a/addons/wiki/i18n/hr.po
+++ b/addons/wiki/i18n/hr.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:16+0000\n"
-"PO-Revision-Date: 2010-10-30 12:31+0000\n"
-"Last-Translator: OpenERP Administrators \n"
+"PO-Revision-Date: 2011-09-20 02:17+0000\n"
+"Last-Translator: wooer \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-05 05:38+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
+"X-Launchpad-Export-Date: 2011-09-21 04:50+0000\n"
+"X-Generator: Launchpad (build 13996)\n"
#. module: wiki
#: field:wiki.groups,template:0
@@ -30,7 +30,7 @@ msgstr "Wiki stranice"
#. module: wiki
#: field:wiki.groups,method:0
msgid "Display Method"
-msgstr ""
+msgstr "Način prikaza"
#. module: wiki
#: view:wiki.wiki:0
@@ -57,7 +57,7 @@ msgstr "Odlomak"
#. module: wiki
#: help:wiki.wiki,toc:0
msgid "Indicates that this pages have a table of contents or not"
-msgstr ""
+msgstr "Ukazuje da li ove stranice imaju tablicu sadržaja ili ne"
#. module: wiki
#: model:ir.model,name:wiki.model_wiki_wiki_history
@@ -90,7 +90,7 @@ msgstr ""
#: view:wiki.wiki:0
#: field:wiki.wiki,write_uid:0
msgid "Last Contributor"
-msgstr ""
+msgstr "Zadnji suradnik"
#. module: wiki
#: field:wiki.create.menu,menu_parent_id:0
@@ -117,7 +117,7 @@ msgstr "Naslov"
#. module: wiki
#: model:ir.model,name:wiki.model_wiki_create_menu
msgid "Wizard Create Menu"
-msgstr ""
+msgstr "Čarobnjak za stvaranje izbornika"
#. module: wiki
#: field:wiki.wiki,history_id:0
@@ -127,13 +127,13 @@ msgstr "Redovi povijesti"
#. module: wiki
#: view:wiki.wiki:0
msgid "Page Content"
-msgstr ""
+msgstr "Sadržaj stranice"
#. module: wiki
#: code:addons/wiki/wiki.py:236
#, python-format
msgid "Warning !"
-msgstr ""
+msgstr "Upozorenje !"
#. module: wiki
#: code:addons/wiki/wiki.py:236
@@ -159,7 +159,7 @@ msgstr "Opis"
#. module: wiki
#: field:wiki.wiki,review:0
msgid "Needs Review"
-msgstr ""
+msgstr "Potrebno pregledati"
#. module: wiki
#: help:wiki.wiki,review:0
@@ -167,6 +167,7 @@ msgid ""
"Indicates that this page should be reviewed, raising the attention of other "
"contributors"
msgstr ""
+"Ukazuje da ovu stranicu treba pregledati, skrećući pozornost drugih suradnika"
#. module: wiki
#: view:wiki.create.menu:0
@@ -177,7 +178,7 @@ msgstr "Informacije o izborniku"
#. module: wiki
#: model:ir.actions.act_window,name:wiki.act_wiki_wiki_history
msgid "Page History"
-msgstr ""
+msgstr "Povijest stranice"
#. module: wiki
#: selection:wiki.groups,method:0
diff --git a/addons/wiki/wiki_view.xml b/addons/wiki/wiki_view.xml
index ef801704037..98e44ae669d 100644
--- a/addons/wiki/wiki_view.xml
+++ b/addons/wiki/wiki_view.xml
@@ -163,14 +163,14 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
+