[MERGE] trunk
bzr revid: abo@openerp.com-20121001083814-6lr5kbr1cxk1twzp
This commit is contained in:
commit
240118d67c
|
@ -31,7 +31,7 @@ import decimal_precision as dp
|
|||
from tools.translate import _
|
||||
from tools.float_utils import float_round
|
||||
from openerp import SUPERUSER_ID
|
||||
|
||||
import tools
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -227,7 +227,7 @@ class account_account(osv.osv):
|
|||
while pos < len(args):
|
||||
|
||||
if args[pos][0] == 'code' and args[pos][1] in ('like', 'ilike') and args[pos][2]:
|
||||
args[pos] = ('code', '=like', str(args[pos][2].replace('%', ''))+'%')
|
||||
args[pos] = ('code', '=like', tools.ustr(args[pos][2].replace('%', ''))+'%')
|
||||
if args[pos][0] == 'journal_id':
|
||||
if not args[pos][2]:
|
||||
del args[pos]
|
||||
|
@ -682,7 +682,7 @@ class account_journal_view(osv.osv):
|
|||
_name = "account.journal.view"
|
||||
_description = "Journal View"
|
||||
_columns = {
|
||||
'name': fields.char('Journal View', size=64, required=True),
|
||||
'name': fields.char('Journal View', size=64, required=True, translate=True),
|
||||
'columns_id': fields.one2many('account.journal.column', 'view_id', 'Columns')
|
||||
}
|
||||
_order = "name"
|
||||
|
@ -1908,7 +1908,7 @@ class account_tax(osv.osv):
|
|||
'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
|
||||
'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True),
|
||||
'description': fields.char('Tax Code',size=32),
|
||||
'description': fields.char('Tax Code'),
|
||||
'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."),
|
||||
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Application', required=True)
|
||||
|
||||
|
@ -2518,7 +2518,7 @@ class account_account_template(osv.osv):
|
|||
'reconcile': fields.boolean('Allow Reconciliation', help="Check this option if you want the user to reconcile entries in this account."),
|
||||
'shortcut': fields.char('Shortcut', size=12),
|
||||
'note': fields.text('Note'),
|
||||
'parent_id': fields.many2one('account.account.template', 'Parent Account Template', ondelete='cascade'),
|
||||
'parent_id': fields.many2one('account.account.template', 'Parent Account Template', ondelete='cascade', domain=[('type','=','view')]),
|
||||
'child_parent_ids':fields.one2many('account.account.template', 'parent_id', 'Children'),
|
||||
'tax_ids': fields.many2many('account.tax.template', 'account_account_template_tax_rel', 'account_id', 'tax_id', 'Default Taxes'),
|
||||
'nocreate': fields.boolean('Optional create', help="If checked, the new chart of accounts will not contain this by default."),
|
||||
|
@ -2536,20 +2536,6 @@ class account_account_template(osv.osv):
|
|||
(_check_recursion, 'Error!\nYou cannot create recursive account templates.', ['parent_id']),
|
||||
]
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
if 'parent_id' in vals:
|
||||
parent = self.read(cr, uid, [vals['parent_id']], ['type'])
|
||||
if parent and parent[0]['type'] != 'view':
|
||||
raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
|
||||
return super(account_account_template, self).create(cr, uid, vals, context=context)
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
if 'parent_id' in vals:
|
||||
parent = self.read(cr, uid, [vals['parent_id']], ['type'])
|
||||
if parent and parent[0]['type'] != 'view':
|
||||
raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
|
||||
return super(account_account_template, self).write(cr, uid, ids, vals, context=context)
|
||||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
if not ids:
|
||||
return []
|
||||
|
@ -2828,7 +2814,7 @@ class account_tax_template(osv.osv):
|
|||
'ref_base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."),
|
||||
'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
|
||||
'include_base_amount': fields.boolean('Include in Base Amount', help="Set if the amount of tax must be included in the base amount before computing the next taxes."),
|
||||
'description': fields.char('Internal Name', size=32),
|
||||
'description': fields.char('Internal Name'),
|
||||
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Use In', required=True,),
|
||||
'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."),
|
||||
}
|
||||
|
|
|
@ -457,6 +457,8 @@ class account_bank_statement(osv.osv):
|
|||
return res and res[0] or 0.0
|
||||
|
||||
def onchange_journal_id(self, cr, uid, statement_id, journal_id, context=None):
|
||||
if not journal_id:
|
||||
return {}
|
||||
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
|
||||
|
||||
journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['default_debit_account_id', 'company_id'], context=context)
|
||||
|
|
|
@ -508,8 +508,10 @@ class account_invoice(osv.osv):
|
|||
if journal_id:
|
||||
journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
|
||||
currency_id = journal.currency and journal.currency.id or journal.company_id.currency_id.id
|
||||
company_id = journal.company_id.id
|
||||
result = {'value': {
|
||||
'currency_id': currency_id,
|
||||
'company_id': company_id,
|
||||
}
|
||||
}
|
||||
return result
|
||||
|
@ -1371,7 +1373,10 @@ class account_invoice_line(osv.osv):
|
|||
'partner_id': fields.related('invoice_id','partner_id',type='many2one',relation='res.partner',string='Partner',store=True)
|
||||
}
|
||||
|
||||
def _default_account_id(self, cr, uid, ids, context=None):
|
||||
def _default_account_id(self, cr, uid, context=None):
|
||||
# XXX this gets the default account for the user's company,
|
||||
# it should get the default account for the invoice's company
|
||||
# however, the invoice's company does not reach this point
|
||||
prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category', context=context)
|
||||
return prop and prop.id or False
|
||||
|
||||
|
@ -1401,7 +1406,7 @@ class account_invoice_line(osv.osv):
|
|||
context = {}
|
||||
company_id = company_id if company_id != None else context.get('company_id',False)
|
||||
context = dict(context)
|
||||
context.update({'company_id': company_id})
|
||||
context.update({'company_id': company_id, 'force_company': company_id})
|
||||
if not partner_id:
|
||||
raise osv.except_osv(_('No Partner Defined !'),_("You must first select a partner !") )
|
||||
if not product:
|
||||
|
@ -1556,16 +1561,19 @@ class account_invoice_line(osv.osv):
|
|||
def onchange_account_id(self, cr, uid, ids, product_id, partner_id, inv_type, fposition_id, account_id):
|
||||
if not account_id:
|
||||
return {}
|
||||
taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids
|
||||
unique_tax_ids = []
|
||||
fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False
|
||||
tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
|
||||
|
||||
product_change_result = self.product_id_change(cr, uid, ids, product_id, False, type=inv_type,
|
||||
partner_id=partner_id, fposition_id=fposition_id)
|
||||
unique_tax_ids = set(tax_ids)
|
||||
if product_change_result and 'value' in product_change_result and 'invoice_line_tax_id' in product_change_result['value']:
|
||||
unique_tax_ids |= set(product_change_result['value']['invoice_line_tax_id'])
|
||||
return {'value':{'invoice_line_tax_id': list(unique_tax_ids)}}
|
||||
account = self.pool.get('account.account').browse(cr, uid, account_id)
|
||||
if not product_id:
|
||||
taxes = account.tax_ids
|
||||
unique_tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
|
||||
else:
|
||||
product_change_result = self.product_id_change(cr, uid, ids, product_id, False, type=inv_type,
|
||||
partner_id=partner_id, fposition_id=fposition_id,
|
||||
company_id=account.company_id.id)
|
||||
if product_change_result and 'value' in product_change_result and 'invoice_line_tax_id' in product_change_result['value']:
|
||||
unique_tax_ids = product_change_result['value']['invoice_line_tax_id']
|
||||
return {'value':{'invoice_line_tax_id': unique_tax_ids}}
|
||||
|
||||
account_invoice_line()
|
||||
|
||||
|
@ -1650,14 +1658,13 @@ class account_invoice_tax(osv.osv):
|
|||
|
||||
for line in inv.invoice_line:
|
||||
for tax in tax_obj.compute_all(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0)), line.quantity, line.product_id, inv.partner_id)['taxes']:
|
||||
tax['price_unit'] = cur_obj.round(cr, uid, cur, tax['price_unit'])
|
||||
val={}
|
||||
val['invoice_id'] = inv.id
|
||||
val['name'] = tax['name']
|
||||
val['amount'] = tax['amount']
|
||||
val['manual'] = False
|
||||
val['sequence'] = tax['sequence']
|
||||
val['base'] = tax['price_unit'] * line['quantity']
|
||||
val['base'] = cur_obj.round(cr, uid, cur, tax['price_unit'] * line['quantity'])
|
||||
|
||||
if inv.type in ('out_invoice','in_invoice'):
|
||||
val['base_code_id'] = tax['base_code_id']
|
||||
|
|
|
@ -300,8 +300,8 @@
|
|||
<button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/>
|
||||
<button name="invoice_open" states="proforma2" string="Validate"/>
|
||||
<button name="invoice_proforma2" states="draft" string="PRO-FORMA" groups="account.group_proforma_invoices"/>
|
||||
<button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='paid'/>
|
||||
<button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/>
|
||||
<button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='open,proforma2,paid'/>
|
||||
<button name="invoice_cancel" states="draft,proforma2,open" string="Cancel" groups="base.group_no_one"/>
|
||||
<button name="action_cancel_draft" states="cancel" string="Reset to Draft" type="object"/>
|
||||
<button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','<>','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/>
|
||||
<!--button name="%(account_invoices)d" string="Print Invoice" type="action" states="open,paid,proforma,sale,proforma2"/-->
|
||||
|
|
|
@ -562,6 +562,7 @@ class account_move_line(osv.osv):
|
|||
'journal_id': lambda self, cr, uid, c: c.get('journal_id', False),
|
||||
'credit': 0.0,
|
||||
'debit': 0.0,
|
||||
'amount_currency': 0.0,
|
||||
'account_id': lambda self, cr, uid, c: c.get('account_id', False),
|
||||
'period_id': lambda self, cr, uid, c: c.get('period_id', False),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.move.line', context=c)
|
||||
|
@ -1193,12 +1194,12 @@ class account_move_line(osv.osv):
|
|||
jour_period_obj = self.pool.get('account.journal.period')
|
||||
cr.execute('SELECT state FROM account_journal_period WHERE journal_id = %s AND period_id = %s', (journal_id, period_id))
|
||||
result = cr.fetchall()
|
||||
journal = journal_obj.browse(cr, uid, journal_id, context=context)
|
||||
period = period_obj.browse(cr, uid, period_id, context=context)
|
||||
for (state,) in result:
|
||||
if state == 'done':
|
||||
raise osv.except_osv(_('Error!'), _('You cannot add/modify entries in a closed journal.'))
|
||||
raise osv.except_osv(_('Error !'), _('You can not add/modify entries in a closed period %s of journal %s.' % (period.name,journal.name)))
|
||||
if not result:
|
||||
journal = journal_obj.browse(cr, uid, journal_id, context=context)
|
||||
period = period_obj.browse(cr, uid, period_id, context=context)
|
||||
jour_period_obj.create(cr, uid, {
|
||||
'name': (journal.code or journal.name)+':'+(period.name or ''),
|
||||
'journal_id': journal.id,
|
||||
|
|
|
@ -1305,16 +1305,6 @@
|
|||
Account.Entry Edition
|
||||
-->
|
||||
|
||||
<record id="account_move_graph" model="ir.ui.view">
|
||||
<field name="name">account.move.graph</field>
|
||||
<field name="model">account.move</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Account Statistics" type="bar">
|
||||
<field name="period_id"/>
|
||||
<field name="amount" operator="+"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_move_tree" model="ir.ui.view">
|
||||
<field name="name">account.move.tree</field>
|
||||
<field name="model">account.move</field>
|
||||
|
@ -1338,8 +1328,8 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Account Entry" version="7.0">
|
||||
<header>
|
||||
<button name="button_validate" states="draft" string="Post" type="object" class="oe_highlight"/>
|
||||
<button name="button_cancel" states="posted" string="Cancel" type="object"/>
|
||||
<button name="button_validate" states="draft" string="Post" type="object" class="oe_highlight" groups="account.group_account_invoice"/>
|
||||
<button name="button_cancel" states="posted" string="Cancel" type="object" groups="account.group_account_invoice"/>
|
||||
<field name="state" widget="statusbar"/>
|
||||
</header>
|
||||
<sheet string="Journal Entries" >
|
||||
|
@ -1488,7 +1478,7 @@
|
|||
<field name="name">Journal Entries</field>
|
||||
<field name="res_model">account.move</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_move_tree"/>
|
||||
<field name="search_view_id" ref="view_account_move_filter"/>
|
||||
<field name="help" type="html">
|
||||
|
@ -2037,7 +2027,7 @@
|
|||
src_model="account.journal"/>
|
||||
|
||||
<act_window
|
||||
context="{'search_default_reconcile_id':False, 'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
|
||||
context="{'search_default_unreconciled':True, 'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
|
||||
domain="[('account_id.reconcile', '=', True),('account_id.type', 'in', ['receivable', 'payable'])]"
|
||||
id="act_account_partner_account_move_all"
|
||||
name="Receivables & Payables"
|
||||
|
@ -2073,7 +2063,7 @@
|
|||
id="account_template_folder"
|
||||
name="Templates"
|
||||
parent="menu_finance_accounting"
|
||||
groups="base.group_multi_company"/>
|
||||
groups="account.group_account_manager"/>
|
||||
<menuitem
|
||||
id="account_template_taxes"
|
||||
name="Taxes"
|
||||
|
|
|
@ -44,17 +44,17 @@ class account_fiscal_position(osv.osv):
|
|||
return []
|
||||
if not fposition_id:
|
||||
return map(lambda x: x.id, taxes)
|
||||
result = []
|
||||
result = set()
|
||||
for t in taxes:
|
||||
ok = False
|
||||
for tax in fposition_id.tax_ids:
|
||||
if tax.tax_src_id.id == t.id:
|
||||
if tax.tax_dest_id:
|
||||
result.append(tax.tax_dest_id.id)
|
||||
result.add(tax.tax_dest_id.id)
|
||||
ok=True
|
||||
if not ok:
|
||||
result.append(t.id)
|
||||
return result
|
||||
result.add(t.id)
|
||||
return list(result)
|
||||
|
||||
def map_account(self, cr, uid, fposition_id, account_id, context=None):
|
||||
if not fposition_id:
|
||||
|
@ -77,6 +77,12 @@ class account_fiscal_position_tax(osv.osv):
|
|||
'tax_dest_id': fields.many2one('account.tax', 'Replacement Tax')
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
('tax_src_dest_uniq',
|
||||
'unique (position_id,tax_src_id,tax_dest_id)',
|
||||
'A tax fiscal position could be defined only once time on same taxes.')
|
||||
]
|
||||
|
||||
account_fiscal_position_tax()
|
||||
|
||||
class account_fiscal_position_account(osv.osv):
|
||||
|
@ -89,6 +95,12 @@ class account_fiscal_position_account(osv.osv):
|
|||
'account_dest_id': fields.many2one('account.account', 'Account Destination', domain=[('type','<>','view')], required=True)
|
||||
}
|
||||
|
||||
_sql_constraints = [
|
||||
('account_src_dest_uniq',
|
||||
'unique (position_id,account_src_id,account_dest_id)',
|
||||
'An account fiscal position could be defined only once time on same accounts.')
|
||||
]
|
||||
|
||||
account_fiscal_position_account()
|
||||
|
||||
class res_partner(osv.osv):
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
|
||||
src_model="res.partner"
|
||||
view_type="form"
|
||||
view_mode="tree,form,graph,calendar"/>
|
||||
view_mode="tree,form,calendar"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -73,7 +73,7 @@
|
|||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">account.analytic.account</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph,form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_account_analytic_account_tree"/>
|
||||
<field name="search_view_id" ref="account.view_account_analytic_account_search"/>
|
||||
</record>
|
||||
|
@ -114,9 +114,6 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem groups="analytic.group_analytic_accounting" id="next_id_40"
|
||||
name="Analytic" parent="account.menu_finance_generic_reporting"
|
||||
sequence="4"/>
|
||||
|
||||
<record id="view_account_analytic_line_form" model="ir.ui.view">
|
||||
<field name="name">account.analytic.line.form</field>
|
||||
|
@ -351,15 +348,6 @@
|
|||
# Reporting
|
||||
#
|
||||
|
||||
<record id="action_account_analytic_journal_tree" model="ir.actions.act_window">
|
||||
<field name="name">Print Analytic Journals</field>
|
||||
<field name="res_model">account.analytic.journal</field>
|
||||
<field name="view_type">tree</field>
|
||||
<field name="help">To print an analytics (or costs) journal for a given period. The report give code, move name, account number, general amount and analytic amount.</field>
|
||||
</record>
|
||||
<menuitem groups="analytic.group_analytic_accounting"
|
||||
action="action_account_analytic_journal_tree"
|
||||
id="account_analytic_journal_print" parent="account.next_id_40"/>
|
||||
|
||||
<record id="view_account_journal_1" model="ir.ui.view">
|
||||
<field name="name">account.journal.form.1</field>
|
||||
|
@ -372,16 +360,5 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record id="analytic_accounts_graph" model="ir.ui.view">
|
||||
<field name="name">analytic.accounts.graph</field>
|
||||
<field name="model">account.analytic.account</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Analytic Account Statistics" type="bar">
|
||||
<field name="complete_name"/>
|
||||
<field name="balance" operator="+"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -29,6 +29,7 @@ class account_analytic_journal_report(osv.osv_memory):
|
|||
_columns = {
|
||||
'date1': fields.date('Start of period', required=True),
|
||||
'date2': fields.date('End of period', required=True),
|
||||
'analytic_account_journal_id': fields.many2many('account.analytic.journal', 'account_analytic_journal_name', 'journal_line_id', 'journal_print_id', 'Analytic Journals', required=True),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
|
@ -40,8 +41,15 @@ class account_analytic_journal_report(osv.osv_memory):
|
|||
if context is None:
|
||||
context = {}
|
||||
data = self.read(cr, uid, ids)[0]
|
||||
ids_list = []
|
||||
if context.get('active_id',False):
|
||||
ids_list.append(context.get('active_id',False))
|
||||
else:
|
||||
record = self.browse(cr,uid,ids[0],context=context)
|
||||
for analytic_record in record.analytic_account_journal_id:
|
||||
ids_list.append(analytic_record.id)
|
||||
datas = {
|
||||
'ids': context.get('active_ids',[]),
|
||||
'ids': ids_list,
|
||||
'model': 'account.analytic.journal',
|
||||
'form': data
|
||||
}
|
||||
|
@ -50,6 +58,14 @@ class account_analytic_journal_report(osv.osv_memory):
|
|||
'report_name': 'account.analytic.journal',
|
||||
'datas': datas,
|
||||
}
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
res = super(account_analytic_journal_report, self).default_get(cr, uid, fields, context=context)
|
||||
if 'analytic_account_journal_id' in fields:
|
||||
res.update({'analytic_account_journal_id': context.get('active_ids',[])})
|
||||
return res
|
||||
|
||||
account_analytic_journal_report()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -7,15 +7,16 @@
|
|||
<field name="model">account.analytic.journal.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Select Period" version="7.0">
|
||||
<header>
|
||||
<button name="check_report" string="Print" type="object" class="oe_highlight"/>
|
||||
or
|
||||
<button string="Cancel" class="oe_link" special="cancel"/>
|
||||
</header>
|
||||
<group col="4">
|
||||
<field name="date1"/>
|
||||
<field name="date2"/>
|
||||
<field name="analytic_account_journal_id" widget="many2many_tags" class="oe_inline" required="1"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="check_report" string="Print" type="object" class="oe_highlight"/>
|
||||
or
|
||||
<button string="Cancel" class="oe_link" special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -38,6 +39,13 @@
|
|||
<field name="key">action</field>
|
||||
<field name="model">account.analytic.journal</field>
|
||||
</record>
|
||||
|
||||
<menuitem groups="analytic.group_analytic_accounting" id="next_id_40"
|
||||
name="Analytic" parent="account.menu_finance_generic_reporting"
|
||||
sequence="4"/>
|
||||
<menuitem groups="analytic.group_analytic_accounting"
|
||||
action="account.action_account_analytic_journal"
|
||||
id="account_analytic_journal_print" parent="account.next_id_40"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -32,11 +32,11 @@ class account_invoice_refund(osv.osv_memory):
|
|||
_name = "account.invoice.refund"
|
||||
_description = "Invoice Refund"
|
||||
_columns = {
|
||||
'date': fields.date('Operation Date', help='This date will be used as the invoice date for credit note and period will be chosen accordingly!'),
|
||||
'date': fields.date('Date', help='This date will be used as the invoice date for credit note and period will be chosen accordingly!'),
|
||||
'period': fields.many2one('account.period', 'Force period'),
|
||||
'journal_id': fields.many2one('account.journal', 'Refund Journal', help='You can select here the journal to use for the credit note that will be created. If you leave that field empty, it will use the same journal as the current invoice.'),
|
||||
'description': fields.char('Description', size=128, required=True),
|
||||
'filter_refund': fields.selection([('refund', 'Create a draft refund'), ('cancel', 'Cancel: create credit note and reconcile'),('modify', 'Modify: create credit note, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Credit note base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
|
||||
'description': fields.char('Reason', size=128, required=True),
|
||||
'filter_refund': fields.selection([('refund', 'Create a draft credit note'), ('cancel', 'Cancel: create credit note and reconcile'),('modify', 'Modify: create credit note, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Credit note base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
|
||||
}
|
||||
|
||||
def _get_journal(self, cr, uid, context=None):
|
||||
|
|
|
@ -7,19 +7,40 @@
|
|||
<field name="model">account.invoice.refund</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Credit Note" version="7.0">
|
||||
<separator string="Credit Note Options"/>
|
||||
<group col="4">
|
||||
<field name="description"/>
|
||||
<field name="journal_id" widget='selection'/>
|
||||
<field name="date"/>
|
||||
<field name="period"/>
|
||||
<field name="filter_refund"/>
|
||||
<group>
|
||||
<group colspan="2">
|
||||
<label for="filter_refund"/>
|
||||
<div>
|
||||
<field name="filter_refund" class="oe_inline"/>
|
||||
<p attrs="{'invisible':[('filter_refund','<>','refund')]}" class="oe_grey">
|
||||
You will be able to edit and validate this
|
||||
credit note directly or keep it draft,
|
||||
waiting for the document to be issued by
|
||||
your supplier/customer.
|
||||
</p>
|
||||
<p attrs="{'invisible':[('filter_refund','<>','cancel')]}" class="oe_grey">
|
||||
Use this option if you want to cancel an invoice you should not
|
||||
have issued. The credit note will be created, validated and reconciled
|
||||
with the invoice. You will not be able to modify the credit note.
|
||||
</p>
|
||||
<p attrs="{'invisible':[('filter_refund','<>','modify')]}" class="oe_grey">
|
||||
Use this option if you want to cancel an invoice and create a new
|
||||
one. The credit note will be created, validated and reconciled
|
||||
with the current invoice. A new, draft, invoice will be created
|
||||
so that you can edit it.
|
||||
</p>
|
||||
</div>
|
||||
</group>
|
||||
<group>
|
||||
<field name="description"/>
|
||||
<field name="journal_id" widget='selection'/>
|
||||
</group><group>
|
||||
<field name="date"/>
|
||||
<field name="period"/>
|
||||
</group>
|
||||
</group>
|
||||
<label string="Modify Invoice: Cancels the current invoice and creates a new copy of it ready for editing."/>
|
||||
<label string="Credit Note: Creates the credit note, ready for editing."/>
|
||||
<label string="Cancel Invoice: Creates the credit note, validate and reconcile it to cancel the current invoice."/>
|
||||
<footer>
|
||||
<button string='Refund' name="invoice_refund" type="object" class="oe_highlight"/>
|
||||
<button string='Create Credit Note' name="invoice_refund" type="object" class="oe_highlight"/>
|
||||
or
|
||||
<button string="Cancel" class="oe_link" special="cancel"/>
|
||||
</footer>
|
||||
|
@ -28,7 +49,7 @@
|
|||
</record>
|
||||
|
||||
<record id="action_account_invoice_refund" model="ir.actions.act_window">
|
||||
<field name="name">Refund</field>
|
||||
<field name="name">Refund Invoice</field>
|
||||
<field name="res_model">account.invoice.refund</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
|
|
|
@ -23,6 +23,7 @@ import time
|
|||
|
||||
from osv import fields, osv
|
||||
from tools.translate import _
|
||||
import decimal_precision as dp
|
||||
|
||||
class account_move_line_reconcile(osv.osv_memory):
|
||||
"""
|
||||
|
@ -32,9 +33,9 @@ class account_move_line_reconcile(osv.osv_memory):
|
|||
_description = 'Account move line reconcile'
|
||||
_columns = {
|
||||
'trans_nbr': fields.integer('# of Transaction', readonly=True),
|
||||
'credit': fields.float('Credit amount', readonly=True),
|
||||
'debit': fields.float('Debit amount', readonly=True),
|
||||
'writeoff': fields.float('Write-Off amount', readonly=True),
|
||||
'credit': fields.float('Credit amount', readonly=True, digits_compute=dp.get_precision('Account')),
|
||||
'debit': fields.float('Debit amount', readonly=True, digits_compute=dp.get_precision('Account')),
|
||||
'writeoff': fields.float('Write-Off amount', readonly=True, digits_compute=dp.get_precision('Account')),
|
||||
}
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
|
|
|
@ -48,7 +48,7 @@
|
|||
<field name="name">Contracts to Renew</field>
|
||||
<field name="res_model">account.analytic.account</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{'search_default_user_id':uid, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1, 'search_default_renew':1}</field>
|
||||
<field name="domain">[('type','=','contract')]</field>
|
||||
<field name="search_view_id" ref="view_account_analytic_account_overdue_search"/>
|
||||
|
@ -72,7 +72,7 @@
|
|||
<field name="name">Contracts</field>
|
||||
<field name="res_model">account.analytic.account</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="context">{'default_type':'contract', 'search_default_open':1, 'search_default_pending':1}</field>
|
||||
<field name="domain">[('type','=','contract')]</field>
|
||||
<field name="search_view_id" ref="view_account_analytic_account_overdue_search"/>
|
||||
|
|
|
@ -350,7 +350,7 @@ class account_asset_depreciation_line(osv.osv):
|
|||
'amount': fields.float('Depreciation Amount', required=True),
|
||||
'remaining_value': fields.float('Amount to Depreciate', required=True),
|
||||
'depreciated_value': fields.float('Amount Already Depreciated', required=True),
|
||||
'depreciation_date': fields.char('Depreciation Date', size=64, select=1),
|
||||
'depreciation_date': fields.date('Depreciation Date', select=1),
|
||||
'move_id': fields.many2one('account.move', 'Depreciation Entry'),
|
||||
'move_check': fields.function(_get_move_check, method=True, type='boolean', string='Posted', store=True)
|
||||
}
|
||||
|
@ -368,7 +368,7 @@ class account_asset_depreciation_line(osv.osv):
|
|||
for line in self.browse(cr, uid, ids, context=context):
|
||||
if currency_obj.is_zero(cr, uid, line.asset_id.currency_id, line.remaining_value):
|
||||
can_close = True
|
||||
depreciation_date = line.asset_id.prorata and line.asset_id.purchase_date or time.strftime('%Y-%m-%d')
|
||||
depreciation_date = time.strftime('%Y-%m-%d')
|
||||
period_ids = period_obj.find(cr, uid, depreciation_date, context=context)
|
||||
company_currency = line.asset_id.company_id.currency_id.id
|
||||
current_currency = line.asset_id.currency_id.id
|
||||
|
|
|
@ -57,6 +57,7 @@ class account_invoice_line(osv.osv):
|
|||
'partner_id': line.invoice_id.partner_id.id,
|
||||
'company_id': line.invoice_id.company_id.id,
|
||||
'currency_id': line.invoice_id.currency_id.id,
|
||||
'purchase_date' : line.invoice_id.date_invoice,
|
||||
}
|
||||
changed_vals = asset_obj.onchange_category_id(cr, uid, [], vals['category_id'], context=context)
|
||||
vals.update(changed_vals['value'])
|
||||
|
|
|
@ -50,7 +50,7 @@ class asset_asset_report(osv.osv):
|
|||
select
|
||||
min(dl.id) as id,
|
||||
dl.name as name,
|
||||
to_date(dl.depreciation_date, 'YYYY-MM-DD') as depreciation_date,
|
||||
dl.depreciation_date as depreciation_date,
|
||||
a.purchase_date as purchase_date,
|
||||
(CASE WHEN (select min(d.id) from account_asset_depreciation_line as d
|
||||
left join account_asset_asset as ac ON (ac.id=d.asset_id)
|
||||
|
@ -77,7 +77,7 @@ class asset_asset_report(osv.osv):
|
|||
from account_asset_depreciation_line dl
|
||||
left join account_asset_asset a on (dl.asset_id=a.id)
|
||||
group by
|
||||
dl.amount,dl.asset_id,to_date(dl.depreciation_date, 'YYYY-MM-DD'),dl.name,
|
||||
dl.amount,dl.asset_id,dl.depreciation_date,dl.name,
|
||||
a.purchase_date, dl.move_check, a.state, a.category_id, a.partner_id, a.company_id,
|
||||
a.purchase_value, a.id, a.salvage_value
|
||||
)""")
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
<field name="ref" readonly="1"/>
|
||||
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
|
||||
<field name="type" on_change="onchange_type(partner_id, type)"/>
|
||||
<field name="account_id" domain="[('journal_id','=',parent.journal_id)]"/>
|
||||
<field name="account_id" domain="[('journal_id','=',journal_id)]"/>
|
||||
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', parent.company_id), ('type', '<>', 'view')]"/>
|
||||
<field name="amount" readonly="1" sum="Total Amount"/>
|
||||
<field name="globalisation_id" string="Glob. Id"/>
|
||||
|
@ -100,7 +100,7 @@
|
|||
<field name="ref" readonly="0"/>
|
||||
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
|
||||
<field name="type" on_change="onchange_type(partner_id, type)"/>
|
||||
<field domain="[('journal_id', '=', parent.journal_id), ('type', '<>', 'view')]" name="account_id"/>
|
||||
<field domain="[('journal_id', '=', journal_id), ('type', '<>', 'view')]" name="account_id"/>
|
||||
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', parent.company_id), ('type', '<>', 'view')]"/>
|
||||
<field name="amount"/>
|
||||
<field name="globalisation_id"/>
|
||||
|
|
|
@ -88,7 +88,7 @@ class payment_order_create(osv.osv_memory):
|
|||
'partner_id': line.partner_id and line.partner_id.id or False,
|
||||
'communication': line.ref or '/',
|
||||
'date': date_to_pay,
|
||||
'currency': line.invoice and line.invoice.currency_id.id or False,
|
||||
'currency': (line.invoice and line.invoice.currency_id.id) or line.journal_id.currency.id or line.journal_id.company_id.currency_id.id,
|
||||
}, context=context)
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
|
@ -120,4 +120,4 @@ class payment_order_create(osv.osv_memory):
|
|||
|
||||
payment_order_create()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -32,11 +32,11 @@ class res_company(osv.osv):
|
|||
_columns = {
|
||||
'income_currency_exchange_account_id': fields.many2one(
|
||||
'account.account',
|
||||
string="Income Currency Rate",
|
||||
string="Gain Exchange Rate Account",
|
||||
domain="[('type', '=', 'other')]",),
|
||||
'expense_currency_exchange_account_id': fields.many2one(
|
||||
'account.account',
|
||||
string="Expense Currency Rate",
|
||||
string="Loss Exchange Rate Account",
|
||||
domain="[('type', '=', 'other')]",),
|
||||
}
|
||||
|
||||
|
@ -957,11 +957,11 @@ class account_voucher(osv.osv):
|
|||
if amount_residual > 0:
|
||||
account_id = line.voucher_id.company_id.expense_currency_exchange_account_id
|
||||
if not account_id:
|
||||
raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Income Currency Rate' on the company, then create accounting entry for currency rate difference."))
|
||||
raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Expense Currency Rate' on the company, then create accounting entry for currency rate difference."))
|
||||
else:
|
||||
account_id = line.voucher_id.company_id.income_currency_exchange_account_id
|
||||
if not account_id:
|
||||
raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Expense Currency Rate' on the company, then create accounting entry for currency rate difference."))
|
||||
raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Income Currency Rate' on the company, then create accounting entry for currency rate difference."))
|
||||
# Even if the amount_currency is never filled, we need to pass the foreign currency because otherwise
|
||||
# the receivable/payable account may have a secondary currency, which render this field mandatory
|
||||
account_currency_id = company_currency <> current_currency and current_currency or False
|
||||
|
|
|
@ -442,11 +442,13 @@ class audittrail_objects_proxy(object_proxy):
|
|||
|
||||
# if at least one modification has been found
|
||||
for model_id, resource_id in lines:
|
||||
name = pool.get(model.model).name_get(cr, uid, [resource_id])[0][1]
|
||||
vals = {
|
||||
'method': method,
|
||||
'object_id': model_id,
|
||||
'user_id': uid,
|
||||
'res_id': resource_id,
|
||||
'name': name,
|
||||
}
|
||||
if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
|
||||
# the resource was not existing so we are forcing the method to 'create'
|
||||
|
@ -484,7 +486,7 @@ class audittrail_objects_proxy(object_proxy):
|
|||
if len(rule['user_id']) == 0 or uid in rule['user_id']:
|
||||
if rule.get('log_'+method,0):
|
||||
return True
|
||||
elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'):
|
||||
elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create', 'read_group', 'import_data'):
|
||||
if rule['log_action']:
|
||||
return True
|
||||
|
||||
|
|
|
@ -180,8 +180,8 @@ class CompanyLDAP(osv.osv):
|
|||
"""
|
||||
|
||||
user_id = False
|
||||
login = tools.ustr(login)
|
||||
cr.execute("SELECT id, active FROM res_users WHERE login=%s", (login,))
|
||||
login = tools.ustr(login.lower())
|
||||
cr.execute("SELECT id, active FROM res_users WHERE lower(login)=%s", (login,))
|
||||
res = cr.fetchone()
|
||||
if res:
|
||||
if res[1]:
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
<field name="ldap_server"/>
|
||||
<field name="ldap_server_port"/>
|
||||
<field name="ldap_binddn"/>
|
||||
<field name="ldap_password"/>
|
||||
<field name="ldap_password" password="True"/>
|
||||
<field name="ldap_base"/>
|
||||
<field name="ldap_filter"/>
|
||||
<field name="create_user"/>
|
||||
|
|
|
@ -971,8 +971,8 @@ class calendar_event(osv.osv):
|
|||
event = datas['id']
|
||||
if datas.get('interval', 0) < 0:
|
||||
raise osv.except_osv(_('Warning!'), _('Interval cannot be negative.'))
|
||||
if datas.get('count', 0) < 0:
|
||||
raise osv.except_osv(_('Warning!'), _('Count cannot be negative.'))
|
||||
if datas.get('count', 0) <= 0:
|
||||
raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0.'))
|
||||
if datas['recurrency']:
|
||||
result[event] = self.compute_rule_string(datas)
|
||||
else:
|
||||
|
@ -1113,6 +1113,16 @@ rule or repeating pattern of time to exclude from the recurring rule."),
|
|||
'user_id': lambda self, cr, uid, ctx: uid,
|
||||
'organizer': default_organizer,
|
||||
}
|
||||
|
||||
def _check_closing_date(self, cr, uid, ids, context=None):
|
||||
for event in self.browse(cr, uid, ids, context=context):
|
||||
if event.date_deadline < event.date:
|
||||
return False
|
||||
return True
|
||||
|
||||
_constraints = [
|
||||
(_check_closing_date, 'Error ! End date cannot be set before start date.', ['date_deadline']),
|
||||
]
|
||||
|
||||
def get_recurrent_ids(self, cr, uid, select, domain, limit=100, context=None):
|
||||
"""Gives virtual event ids for recurring events based on value of Recurrence Rule
|
||||
|
|
|
@ -182,13 +182,14 @@
|
|||
<button name="do_tentative"
|
||||
states="needs-action,declined,accepted"
|
||||
string="Uncertain" type="object"
|
||||
icon="terp-crm"
|
||||
/>
|
||||
<button name="do_accept" string="Accept"
|
||||
states="needs-action,tentative,declined"
|
||||
type="object" />
|
||||
type="object" icon="gtk-apply"/>
|
||||
<button name="do_decline" string="Decline"
|
||||
states="needs-action,tentative,accepted"
|
||||
type="object" />
|
||||
type="object" icon="gtk-cancel"/>
|
||||
</tree>
|
||||
<form string="Invitation details" version="7.0">
|
||||
<header>
|
||||
|
|
|
@ -61,10 +61,6 @@
|
|||
on_change="onchange_partner_id(partner_id, email_from)"
|
||||
/>
|
||||
<field name="email_from"/>
|
||||
<button name="remind_partner"
|
||||
states="open,pending"
|
||||
string="Send Reminder" type="object"
|
||||
icon="gtk-go-forward" />
|
||||
</group>
|
||||
<group string="Categorization">
|
||||
<field name="priority"/>
|
||||
|
|
|
@ -230,6 +230,10 @@
|
|||
<field name="carrier_tracking_ref"/>
|
||||
<field name="number_of_packages"/>
|
||||
</field>
|
||||
<field name="company_id" position="before">
|
||||
<field name="weight"/>
|
||||
<field name="weight_net" groups="base.group_no_one"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
@ -307,13 +311,26 @@
|
|||
<record id="view_delivery_order_inherit_stock" model="ir.ui.view">
|
||||
<field name="name">stock.picking.out.form</field>
|
||||
<field name="model">stock.picking.out</field>
|
||||
<field name="inherit_id" ref="stock.view_picking_out_form"/>
|
||||
<field name="inherit_id" ref="stock.view_picking_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/header//button[@string='Create Invoice/Refund']" position="after">
|
||||
<button name="%(report_shipping)d" string="Delivery Order" states="done" type="action" icon="gtk-print"/>
|
||||
<xpath expr="/form/header//button[@name='action_process']" position="after">
|
||||
<button name="%(report_shipping)d" string="Print Delivery Order" states="confirmed,assigned" type="action"/>
|
||||
<button name="%(report_shipping)d" string="Print Delivery Order" states="done" type="action" class="oe_highlight"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_picking_withcarrier_in_form" model="ir.ui.view">
|
||||
<field name="name">delivery.stock.picking_withcarrier.in.form.view</field>
|
||||
<field name="type">form</field>
|
||||
<field name="model">stock.picking.in</field>
|
||||
<field name="inherit_id" ref="stock.view_picking_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="company_id" position="before">
|
||||
<field name="weight"/>
|
||||
<field name="weight_net" groups="base.group_no_one"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -202,5 +202,30 @@ class stock_picking_out(osv.osv):
|
|||
'carrier_tracking_ref': fields.char('Carrier Tracking Ref', size=32),
|
||||
'number_of_packages': fields.integer('Number of Packages'),
|
||||
}
|
||||
stock_picking_out()
|
||||
|
||||
class stock_picking_in(osv.osv):
|
||||
_inherit = 'stock.picking.in'
|
||||
|
||||
def _cal_weight(self, cr, uid, ids, name, args, context=None):
|
||||
return self.pool.get('stock.picking')._cal_weight(cr, uid, ids, name, args, context=context)
|
||||
|
||||
def _get_picking_line(self, cr, uid, ids, context=None):
|
||||
return self.pool.get('stock.picking')._get_picking_line(cr, uid, ids, context=context)
|
||||
|
||||
_columns = {
|
||||
'weight': fields.function(_cal_weight, type='float', string='Weight', digits_compute= dp.get_precision('Stock Weight'), multi='_cal_weight',
|
||||
store={
|
||||
'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
|
||||
'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20),
|
||||
}),
|
||||
'weight_net': fields.function(_cal_weight, type='float', string='Net Weight', digits_compute= dp.get_precision('Stock Weight'), multi='_cal_weight',
|
||||
store={
|
||||
'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
|
||||
'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20),
|
||||
}),
|
||||
}
|
||||
stock_picking_in()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ class document_ftp_browse(osv.osv_memory):
|
|||
data_pool = self.pool.get('ir.model.data')
|
||||
aid = data_pool._get_id(cr, uid, 'document_ftp', 'action_document_browse')
|
||||
aid = data_pool.browse(cr, uid, aid, context=context).res_id
|
||||
ftp_url = self.pool.get('ir.actions.url').browse(cr, uid, aid, context=context)
|
||||
ftp_url = self.pool.get('ir.actions.act_url').browse(cr, uid, aid, context=context)
|
||||
url = ftp_url.url and ftp_url.url.split('ftp://') or []
|
||||
if url:
|
||||
url = url[1]
|
||||
|
|
|
@ -44,7 +44,7 @@ class document_ftp_configuration(osv.osv_memory):
|
|||
# Update the action for FTP browse.
|
||||
aid = data_pool._get_id(cr, uid, 'document_ftp', 'action_document_browse')
|
||||
aid = data_pool.browse(cr, uid, aid, context=context).res_id
|
||||
self.pool.get('ir.actions.url').write(cr, uid, [aid],
|
||||
self.pool.get('ir.actions.act_url').write(cr, uid, [aid],
|
||||
{'url': 'ftp://'+(conf.host or 'localhost:8021')+'/' + cr.dbname+'/'})
|
||||
|
||||
document_ftp_configuration()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record model="ir.actions.url" id="action_document_browse">
|
||||
<record model="ir.actions.act_url" id="action_document_browse">
|
||||
<field name="name">Browse Files</field>
|
||||
<field name="url">ftp://localhost:8021/</field>
|
||||
</record>
|
||||
|
|
|
@ -195,7 +195,7 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
|
|||
strip_attachments=(not server.attach),
|
||||
context=context)
|
||||
if res_id and server.action_id:
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)})
|
||||
imap_server.store(num, '+FLAGS', '\\Seen')
|
||||
cr.commit()
|
||||
count += 1
|
||||
|
@ -220,7 +220,7 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
|
|||
strip_attachments=(not server.attach),
|
||||
context=context)
|
||||
if res_id and server.action_id:
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)})
|
||||
pop_server.dele(num)
|
||||
cr.commit()
|
||||
_logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name)
|
||||
|
|
|
@ -205,25 +205,6 @@
|
|||
</field>
|
||||
</record>
|
||||
|
||||
<record id="open_view_employee_list_my_kanban" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="0"/>
|
||||
<field name="view_mode">kanban</field>
|
||||
<field name="act_window_id" ref="open_view_employee_list_my"/>
|
||||
</record>
|
||||
<record id="open_view_employee_list_my_tree2" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_employee_tree"/>
|
||||
<field name="act_window_id" ref="open_view_employee_list_my"/>
|
||||
</record>
|
||||
|
||||
<record id="open_view_employee_list_my_form2" model="ir.actions.act_window.view">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_employee_form"/>
|
||||
<field name="act_window_id" ref="open_view_employee_list_my"/>
|
||||
</record>
|
||||
|
||||
<menuitem action="open_view_employee_list_my" id="menu_open_view_employee_list_my" sequence="3" parent="menu_hr_main"/>
|
||||
|
||||
<record id="ir_ui_view_sc_employee" model="ir.ui.view_sc">
|
||||
|
|
|
@ -178,7 +178,7 @@
|
|||
<field nolabel="1" name="survey_request_ids">
|
||||
<form string="Interview Appraisal" version="7.0">
|
||||
<div class="oe_right oe_button_box">
|
||||
<button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer,done,cancel" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response,'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
|
||||
<button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response,'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
|
||||
<button name="%(survey.survey_browse_response)d" string="Print Interview" type="action" states="done" icon="gtk-print" context="{'survey_id': survey_id, 'response_id' : [response], 'response_no':0,}" attrs="{'readonly':[('response','=',False)]}" />
|
||||
</div>
|
||||
<group>
|
||||
|
@ -333,7 +333,7 @@
|
|||
<field name="user_id" string="Interviewer"/>
|
||||
<field name="user_to_review_id"/>
|
||||
<field name="response" readonly="1" invisible="True"/>
|
||||
<button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer,done,cancel" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response, 'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
|
||||
<button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response, 'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
|
||||
<button name="action_print_survey" string="Print Survey" type="object" icon="gtk-print" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0}" attrs="{'readonly':[('survey_id','=',False)]}"/>
|
||||
<button name="%(mail.action_email_compose_message_wizard)d" string="Send Reminder Email" icon="terp-mail-message-new" type="action" states="waiting_answer"/>
|
||||
<field name="state"/>
|
||||
|
|
|
@ -317,7 +317,10 @@ class hr_payslip(osv.osv):
|
|||
'company_id': company_id,
|
||||
'period_id': False,
|
||||
'basic_before_leaves': 0.0,
|
||||
'basic_amount': 0.0
|
||||
'basic_amount': 0.0,
|
||||
'number': '',
|
||||
'payslip_run_id': False,
|
||||
'paid': False,
|
||||
})
|
||||
return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@
|
|||
</h2>
|
||||
</div>
|
||||
<group col="4">
|
||||
<field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
|
||||
<field name="contract_id" domain="[('employee_id','=',employee_id),('date_start','<=',date_to),'|',('date_end','>=',date_from),('date_end','=',False)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
|
||||
<field name="number"/>
|
||||
<field name="struct_id" attrs="{'required':[('contract_id','<>',False)]}"/>
|
||||
<field name="name"/>
|
||||
|
|
|
@ -116,10 +116,12 @@
|
|||
<field name="search_view_id" ref="hr_timesheet_line_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to your timesheets.
|
||||
Click to record your timesheets.
|
||||
</p><p>
|
||||
Through this menu you can register and follow your workings
|
||||
hours by project every day.
|
||||
You can register and track your workings hours by project every
|
||||
day. Every time spent on a project will become a cost in the
|
||||
analytic accounting and can be re-invoiced to customers if
|
||||
required.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_hr_analytic_timesheet,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_hr_user,1,1,1,1
|
||||
access_hr_analytic_timesheet_employee,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_user,1,1,1,0
|
||||
access_hr_analytic_timesheet_employee,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_user,1,1,1,1
|
||||
access_hr_account_analytic_line,account.account.analytic.line,account.model_account_analytic_line,base.group_hr_user,1,1,1,1
|
||||
access_hr_account_analytic_line_employee,account.account.analytic.line employee,account.model_account_analytic_line,base.group_user,1,1,1,0
|
||||
access_hr_account_analytic_line_employee,account.account.analytic.line employee,account.model_account_analytic_line,base.group_user,1,1,1,1
|
||||
access_account_analytic_journal,account.account.analytic.journal,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
|
||||
access_product_product_user,product.product user,product.model_product_product,base.group_hr_user,1,1,1,1
|
||||
access_product_template_hr_timesheet,product.template.hr.timesheet,product.model_product_template,base.group_hr_user,1,1,1,1
|
||||
|
|
|
|
@ -79,17 +79,24 @@ class account_analytic_line(osv.osv):
|
|||
curr_invoice = {
|
||||
'name': time.strftime('%d/%m/%Y')+' - '+account.name,
|
||||
'partner_id': account.partner_id.id,
|
||||
'company_id': account.company_id.id,
|
||||
'payment_term': partner.property_payment_term.id or False,
|
||||
'account_id': partner.property_account_receivable.id,
|
||||
'currency_id': account.pricelist_id.currency_id.id,
|
||||
'date_due': date_due,
|
||||
'fiscal_position': account.partner_id.property_account_position.id
|
||||
}
|
||||
last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context)
|
||||
invoices.append(last_invoice)
|
||||
|
||||
|
||||
context2 = context.copy()
|
||||
context2['lang'] = partner.lang
|
||||
# set company_id in context, so the correct default journal will be selected
|
||||
context2['force_company'] = curr_invoice['company_id']
|
||||
# set force_company in context so the correct product properties are selected (eg. income account)
|
||||
context2['company_id'] = curr_invoice['company_id']
|
||||
|
||||
last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context2)
|
||||
invoices.append(last_invoice)
|
||||
|
||||
cr.execute("SELECT product_id, to_invoice, sum(unit_amount), product_uom_id, name " \
|
||||
"FROM account_analytic_line as line " \
|
||||
"WHERE account_id = %s " \
|
||||
|
@ -115,11 +122,11 @@ class account_analytic_line(osv.osv):
|
|||
else:
|
||||
price = 0.0
|
||||
|
||||
general_account = product.product_tmpl_id.property_account_income or product.categ_id.property_account_income_categ
|
||||
if not general_account:
|
||||
raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name)
|
||||
taxes = product.taxes_id
|
||||
tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes)
|
||||
account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
|
||||
if not account_id:
|
||||
raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name)
|
||||
curr_line = {
|
||||
'price_unit': price,
|
||||
'quantity': qty,
|
||||
|
@ -130,7 +137,7 @@ class account_analytic_line(osv.osv):
|
|||
'product_id': product_id,
|
||||
'invoice_line_tax_id': [(6,0,tax)],
|
||||
'uos_id': uom,
|
||||
'account_id': account_id,
|
||||
'account_id': general_account.id,
|
||||
'account_analytic_id': account.id,
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ from dateutil import *
|
|||
from pytz import timezone
|
||||
from datetime import datetime
|
||||
import time
|
||||
import base64
|
||||
from osv import *
|
||||
from tools.translate import _
|
||||
|
||||
|
@ -282,7 +283,7 @@ class google_import(import_framework):
|
|||
self.contact = self.gd_client.GetContactsFeed()
|
||||
while self.contact:
|
||||
for entry in self.contact.entry:
|
||||
data = {}
|
||||
data = {}
|
||||
data['id'] = entry.id.text
|
||||
name = tools.ustr(entry.title.text)
|
||||
if name == "None":
|
||||
|
@ -290,6 +291,8 @@ class google_import(import_framework):
|
|||
data['name'] = name or _('Unknown')
|
||||
emails = ','.join(email.address for email in entry.email)
|
||||
data['email'] = emails
|
||||
if self.gd_client.GetPhoto(entry):
|
||||
data['image'] = base64.encodestring(self.gd_client.GetPhoto(entry))
|
||||
if table == 'Contact':
|
||||
data.update({'customer': str(self.context.get('customer')),
|
||||
'supplier': str(self.context.get('supplier'))})
|
||||
|
@ -322,6 +325,12 @@ class google_import(import_framework):
|
|||
'name': value('company', fallback='name'),
|
||||
'customer': 'customer',
|
||||
'supplier': 'supplier',
|
||||
'city': 'city',
|
||||
'phone': 'phone',
|
||||
'mobile': 'mobile',
|
||||
'email': 'email',
|
||||
'image': 'image',
|
||||
'fax': 'fax',
|
||||
'child_ids/id': ref(self.TABLE_ADDRESS, 'id'),
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ class partner_vat(osv.osv_memory):
|
|||
FROM account_move_line l
|
||||
LEFT JOIN res_partner p ON l.partner_id = p.id
|
||||
LEFT JOIN account_tax_code c ON l.tax_code_id = c.id
|
||||
WHERE c.code IN ('01','02','03','45','49')
|
||||
WHERE c.code IN ('00','01','02','03','45','49')
|
||||
AND l.partner_id IN %s
|
||||
AND l.period_id IN %s
|
||||
GROUP BY l.partner_id, p.name, p.vat) AS sub1
|
||||
|
|
|
@ -48,7 +48,7 @@ class ResPartnerBank(osv.osv):
|
|||
'dta_code': fields.char('DTA code', size=5),
|
||||
'print_bank': fields.boolean('Print Bank on BVR'),
|
||||
'print_account': fields.boolean('Print Account Number on BVR'),
|
||||
'acc_number': fields.char('Account/IBAN Number', size=64),
|
||||
'acc_number': fields.char('Account Number', size=64),
|
||||
'my_bank': fields.boolean('Use my account to print BVR ?', help="Check to print BVR invoices"),
|
||||
}
|
||||
|
||||
|
|
|
@ -277,7 +277,7 @@
|
|||
<field name="type">view</field>
|
||||
<field name="user_type" ref="account.data_account_type_liability"/>
|
||||
<field name="reconcile" eval="False"/>
|
||||
<field name="parent_id" ref="a1"/>
|
||||
<field name="parent_id" ref="a20"/>
|
||||
</record>
|
||||
|
||||
<!-- <record model="account.account.template" id="290">
|
||||
|
|
|
@ -3955,11 +3955,13 @@
|
|||
<field name="code">4a</field>
|
||||
<field name="parent_id" ref="btw_code_vanuit_buitenland"/>
|
||||
<field name="name">Leveringen uit landen buiten de EU (invoer) (BTW)</field>
|
||||
<field name="sign" eval="-1" />
|
||||
</record>
|
||||
<record id="btw_code_4b" model="account.tax.code.template">
|
||||
<field name="code">4b</field>
|
||||
<field name="parent_id" ref="btw_code_vanuit_buitenland"/>
|
||||
<field name="name">Verwerving van goederen uit landen binnen de EU (BTW)</field>
|
||||
<field name="sign" eval="-1" />
|
||||
</record>
|
||||
<!-- 5. Voorbelasting, kleineondernemersregeling, schatting en eindtotaal -->
|
||||
<record id="btw_code_voorbelasting" model="account.tax.code.template">
|
||||
|
@ -4100,6 +4102,7 @@
|
|||
<field name="property_account_payable" ref="a_pay"/> <!-- crediteuren -->
|
||||
<field name="property_account_expense_categ" ref="a_expense"/><!-- aankoop grondstoffen -->
|
||||
<field name="property_account_income_categ" ref="a_sale"/> <!-- verkoop rekening -->
|
||||
<field name="property_reserve_and_surplus_account" ref="a_9999"/>
|
||||
</record>
|
||||
|
||||
<!-- BTW Template
|
||||
|
@ -4325,7 +4328,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_6_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU laag(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_6"/>
|
||||
<field name="account_collected_id" ref="vat_payable6"/>
|
||||
|
@ -4337,7 +4340,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_6_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU laag(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_6"/>
|
||||
<field name="account_collected_id" ref="vat_refund6"/>
|
||||
|
@ -4360,7 +4363,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_19_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU hoog(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_19"/>
|
||||
<field name="account_collected_id" ref="vat_payable19"/>
|
||||
|
@ -4372,7 +4375,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_19_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU hoog(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_19"/>
|
||||
<field name="account_collected_id" ref="vat_refund19"/>
|
||||
|
@ -4395,7 +4398,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_overig_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU overig(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_overig"/>
|
||||
<field name="account_collected_id" ref="vat_payable19"/>
|
||||
|
@ -4407,7 +4410,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_I_overig_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import binnen EU overig(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_I_overig"/>
|
||||
<field name="account_collected_id" ref="vat_refund19"/>
|
||||
|
@ -4458,7 +4461,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E1_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU laag(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E1"/>
|
||||
<field name="account_collected_id" ref="vat_payable6"/>
|
||||
|
@ -4470,7 +4473,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E1_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU laag(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E1"/>
|
||||
<field name="account_collected_id" ref="vat_refund6"/>
|
||||
|
@ -4493,7 +4496,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E2_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU hoog(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E2"/>
|
||||
<field name="account_collected_id" ref="vat_payable19"/>
|
||||
|
@ -4505,7 +4508,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E2_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU hoog(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E2"/>
|
||||
<field name="account_collected_id" ref="vat_refund19"/>
|
||||
|
@ -4528,7 +4531,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E_overig_1" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU overig(1)</field>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E_overig"/>
|
||||
<field name="account_collected_id" ref="vat_payable19"/>
|
||||
|
@ -4540,7 +4543,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
|
|||
<record id="btw_E_overig_2" model="account.tax.template">
|
||||
<field name="chart_template_id" ref="l10nnl_chart_template"/>
|
||||
<field name="name">Inkopen import buiten EU overig(2)</field>
|
||||
<field eval="-1.00" name="amount"/>
|
||||
<field eval="1.00" name="amount"/>
|
||||
<field name="type">percent</field>
|
||||
<field name="parent_id" ref="btw_E_overig"/>
|
||||
<field name="account_collected_id" ref="vat_refund19"/>
|
||||
|
|
|
@ -76,13 +76,6 @@
|
|||
<field name="view_mode">tree,form</field>
|
||||
<field name="search_view_id" ref="view_message_search"/>
|
||||
</record>
|
||||
|
||||
<act_window domain="[('partner_id', '=', active_id), ('email_from', '!=', False)]"
|
||||
context="{'default_partner_id': active_id}"
|
||||
id="act_res_partner_emails" name="Emails"
|
||||
res_model="mail.message"
|
||||
src_model="res.partner"
|
||||
view_id="view_message_tree"/>
|
||||
|
||||
<!-- Add menu entry in Settings/Email -->
|
||||
<menuitem name="Messages" id="menu_mail_message" parent="base.menu_email" action="action_view_mail_message"/>
|
||||
|
|
|
@ -29,7 +29,13 @@ class res_partner(osv.osv):
|
|||
'partner_id', 'Workitems',
|
||||
readonly=True),
|
||||
}
|
||||
|
||||
|
||||
def copy(self, cr, uid, id, default={}, context=None):
|
||||
default.update({
|
||||
'workitem_ids': [],
|
||||
})
|
||||
return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
|
||||
|
||||
res_partner()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -106,6 +106,7 @@ class mrp_routing_workcenter(osv.osv):
|
|||
"""
|
||||
_name = 'mrp.routing.workcenter'
|
||||
_description = 'Work Center Usage'
|
||||
_order = 'sequence'
|
||||
_columns = {
|
||||
'workcenter_id': fields.many2one('mrp.workcenter', 'Work Center', required=True),
|
||||
'name': fields.char('Name', size=64, required=True),
|
||||
|
@ -226,6 +227,7 @@ class mrp_bom(osv.osv):
|
|||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),
|
||||
}
|
||||
_order = "sequence"
|
||||
_parent_name = "bom_id"
|
||||
_sql_constraints = [
|
||||
('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
|
||||
'You should install the mrp_subproduct module if you want to manage extra products on BoMs !'),
|
||||
|
@ -671,7 +673,7 @@ class mrp_production(osv.osv):
|
|||
|
||||
for (production_id,name) in self.name_get(cr, uid, ids):
|
||||
production = self.browse(cr, uid, production_id)
|
||||
if production.move_prod_id:
|
||||
if production.move_prod_id and production.move_prod_id.location_id.id != production.location_dest_id.id:
|
||||
move_obj.write(cr, uid, [production.move_prod_id.id],
|
||||
{'location_id': production.location_dest_id.id})
|
||||
self.action_ready_send_note(cr, uid, [production_id], context)
|
||||
|
@ -829,7 +831,8 @@ class mrp_production(osv.osv):
|
|||
'ref': wc.code,
|
||||
'product_id': wc.product_id.id,
|
||||
'unit_amount': wc_line.hour,
|
||||
'product_uom_id': wc.product_id.uom_id.id
|
||||
'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False
|
||||
|
||||
} )
|
||||
if wc.costs_journal_id and wc.costs_general_account_id:
|
||||
value = wc_line.cycle * wc.costs_cycle
|
||||
|
@ -845,7 +848,8 @@ class mrp_production(osv.osv):
|
|||
'ref': wc.code,
|
||||
'product_id': wc.product_id.id,
|
||||
'unit_amount': wc_line.cycle,
|
||||
'product_uom_id': wc.product_id.uom_id.id
|
||||
'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False
|
||||
|
||||
} )
|
||||
return amount
|
||||
|
||||
|
|
|
@ -545,9 +545,7 @@
|
|||
<field name="name">Bill of Materials Structure</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">mrp.bom</field>
|
||||
<field name="domain">[('id','in',active_ids)]</field>
|
||||
<field name="view_type">tree</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="domain">[('bom_id', '=',active_ids)]</field>
|
||||
<field name="view_id" ref="mrp_bom_tree_view"/>
|
||||
</record>
|
||||
<record id="ir_BOM_structure" model="ir.values">
|
||||
|
@ -676,7 +674,7 @@
|
|||
<field name="product_id"/>
|
||||
<field name="product_qty" string="Quantity"/>
|
||||
<field name="product_uom" string="Unit of Measure" groups="product.group_uom"/>
|
||||
<field name="prodlot_id" groups="stock.group_production_lot"/>
|
||||
<field name="prodlot_id" groups="stock.group_production_lot" context="{'product_id': product_id}"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<button name="%(stock.move_consume)d"
|
||||
string="Consume Products" type="action"
|
||||
|
|
|
@ -99,7 +99,7 @@ class procurement_order(osv.osv):
|
|||
'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'),
|
||||
'close_move': fields.boolean('Close Move at end'),
|
||||
'location_id': fields.many2one('stock.location', 'Location', required=True, states={'draft':[('readonly',False)]}, readonly=True),
|
||||
'procure_method': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
||||
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
|
||||
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
|
||||
" a make to order method."),
|
||||
|
||||
|
@ -333,8 +333,8 @@ class procurement_order(osv.osv):
|
|||
move_obj = self.pool.get('stock.move')
|
||||
for procurement in self.browse(cr, uid, ids, context=context):
|
||||
if procurement.product_qty <= 0.00:
|
||||
raise osv.except_osv(_('Insufficient Data!'),
|
||||
_('Quantity in procurement order(s) must be greater than 0.'))
|
||||
raise osv.except_osv(_('Data Insufficient !'),
|
||||
_('Please check the quantity in procurement order(s) for the product "%s", it should not be 0 or less!' % procurement.product_id.name))
|
||||
if procurement.product_id.type in ('product', 'consu'):
|
||||
if not procurement.move_id:
|
||||
source = procurement.location_id.id
|
||||
|
@ -423,24 +423,26 @@ class procurement_order(osv.osv):
|
|||
"""
|
||||
return 0
|
||||
|
||||
# XXX action_cancel() should accept a context argument
|
||||
def action_cancel(self, cr, uid, ids):
|
||||
""" Cancels procurement and writes move state to Assigned.
|
||||
"""Cancel Procurements and either cancel or assign the related Stock Moves, depending on the procurement configuration.
|
||||
|
||||
@return: True
|
||||
"""
|
||||
todo = []
|
||||
todo2 = []
|
||||
to_assign = []
|
||||
to_cancel = []
|
||||
move_obj = self.pool.get('stock.move')
|
||||
for proc in self.browse(cr, uid, ids):
|
||||
if proc.close_move and proc.move_id:
|
||||
if proc.move_id.state not in ('done', 'cancel'):
|
||||
todo2.append(proc.move_id.id)
|
||||
to_cancel.append(proc.move_id.id)
|
||||
else:
|
||||
if proc.move_id and proc.move_id.state == 'waiting':
|
||||
todo.append(proc.move_id.id)
|
||||
if len(todo2):
|
||||
move_obj.action_cancel(cr, uid, todo2)
|
||||
if len(todo):
|
||||
move_obj.write(cr, uid, todo, {'state': 'assigned'})
|
||||
to_assign.append(proc.move_id.id)
|
||||
if len(to_cancel):
|
||||
move_obj.action_cancel(cr, uid, to_cancel)
|
||||
if len(to_assign):
|
||||
move_obj.write(cr, uid, to_assign, {'state': 'assigned'})
|
||||
self.write(cr, uid, ids, {'state': 'cancel'})
|
||||
self.cancel_send_note(cr, uid, ids, context=None)
|
||||
wf_service = netsvc.LocalService("workflow")
|
||||
|
@ -548,6 +550,19 @@ class stock_warehouse_orderpoint(osv.osv):
|
|||
result[orderpoint.id] = procurement_ids
|
||||
return result
|
||||
|
||||
def _check_product_uom(self, cr, uid, ids, context=None):
|
||||
'''
|
||||
Check if the UoM has the same category as the product standard UoM
|
||||
'''
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
for rule in self.browse(cr, uid, ids, context=context):
|
||||
if rule.product_id.uom_id.category_id.id != rule.product_uom.category_id.id:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=32, required=True),
|
||||
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the orderpoint without removing it."),
|
||||
|
@ -580,6 +595,9 @@ class stock_warehouse_orderpoint(osv.osv):
|
|||
_sql_constraints = [
|
||||
('qty_multiple_check', 'CHECK( qty_multiple > 0 )', 'Qty Multiple must be greater than zero.'),
|
||||
]
|
||||
_constraints = [
|
||||
(_check_product_uom, 'You have to select a product unit of measure in the same category than the default unit of measure of the product', ['product_id', 'product_uom']),
|
||||
]
|
||||
|
||||
def default_get(self, cr, uid, fields, context=None):
|
||||
res = super(stock_warehouse_orderpoint, self).default_get(cr, uid, fields, context)
|
||||
|
@ -610,9 +628,10 @@ class stock_warehouse_orderpoint(osv.osv):
|
|||
"""
|
||||
if product_id:
|
||||
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
d = {'product_uom': [('category_id', '=', prod.uom_id.category_id.id)]}
|
||||
v = {'product_uom': prod.uom_id.id}
|
||||
return {'value': v}
|
||||
return {}
|
||||
return {'value': v, 'domain': d}
|
||||
return {'domain': {'product_uom': []}}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if not default:
|
||||
|
|
|
@ -203,7 +203,7 @@ class product_pricelist(osv.osv):
|
|||
|
||||
if partner:
|
||||
partner_where = 'base <> -2 OR %s IN (SELECT name FROM product_supplierinfo WHERE product_id = %s) '
|
||||
partner_args = (partner, product_id)
|
||||
partner_args = (partner, tmpl_id)
|
||||
else:
|
||||
partner_where = 'base <> -2 '
|
||||
partner_args = ()
|
||||
|
|
|
@ -35,7 +35,7 @@ To this end, a new check box named 'Visible Discount' is added to the pricelist
|
|||
If the check box is unchecked, we will have on Sale Order and Invoice lines:
|
||||
Unit price=225, Discount=0,00, Net price=225.
|
||||
""",
|
||||
'depends': ['sale'],
|
||||
'depends': ["sale","purchase"],
|
||||
'demo': [],
|
||||
'data': ['product_visible_discount_view.xml'],
|
||||
'auto_install': False,
|
||||
|
|
|
@ -7,14 +7,14 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 6.0dev\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
|
||||
"PO-Revision-Date: 2012-06-28 12:50+0000\n"
|
||||
"PO-Revision-Date: 2012-09-29 14:57+0000\n"
|
||||
"Last-Translator: Erwin <Unknown>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-21 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-09-30 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16049)\n"
|
||||
|
||||
#. module: project
|
||||
#: view:report.project.task.user:0
|
||||
|
@ -1326,7 +1326,7 @@ msgstr ""
|
|||
#. module: project
|
||||
#: view:project.task:0
|
||||
msgid "Delegation"
|
||||
msgstr ""
|
||||
msgstr "Delegeren"
|
||||
|
||||
#. module: project
|
||||
#: model:ir.model,name:project.model_res_users
|
||||
|
|
|
@ -509,6 +509,8 @@ def Project():
|
|||
model_name=vals.get('alias_model', 'project.task'),
|
||||
context=context)
|
||||
vals['alias_id'] = alias_id
|
||||
if vals.get('partner_id', False):
|
||||
vals['type'] = 'contract'
|
||||
project_id = super(project, self).create(cr, uid, vals, context)
|
||||
mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'project_id': project_id} }, context)
|
||||
self.create_send_note(cr, uid, [project_id], context=context)
|
||||
|
@ -690,7 +692,6 @@ class task(base_stage, osv.osv):
|
|||
if not default.get('remaining_hours', False):
|
||||
default['remaining_hours'] = float(self.read(cr, uid, id, ['planned_hours'])['planned_hours'])
|
||||
default['active'] = True
|
||||
default['stage_id'] = False
|
||||
if not default.get('name', False):
|
||||
default['name'] = self.browse(cr, uid, id, context=context).name or ''
|
||||
if not context.get('copy',False):
|
||||
|
@ -768,7 +769,7 @@ class task(base_stage, osv.osv):
|
|||
}),
|
||||
'user_id': fields.many2one('res.users', 'Assigned to'),
|
||||
'delegated_user_id': fields.related('child_ids', 'user_id', type='many2one', relation='res.users', string='Delegated To'),
|
||||
'partner_id': fields.many2one('res.partner', 'Contact'),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer'),
|
||||
'work_ids': fields.one2many('project.task.work', 'task_id', 'Work done'),
|
||||
'manager_id': fields.related('project_id', 'analytic_account_id', 'user_id', type='many2one', relation='res.users', string='Project Manager'),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
|
|
|
@ -92,12 +92,12 @@
|
|||
</div>
|
||||
<group>
|
||||
<group>
|
||||
<field name="privacy_visibility"/>
|
||||
<field name="user_id" string="Project Manager" attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"/>
|
||||
<field name="partner_id" string="Contact" on_change="onchange_partner_id(partner_id)"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="privacy_visibility"/>
|
||||
<field name="analytic_account_id" readonly="1" required="0"/>
|
||||
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
|
||||
<field name="analytic_account_id" readonly="1" required="0" attrs="{'invisible': [('analytic_account_id','=',False)]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
|
@ -121,14 +121,14 @@
|
|||
</field>
|
||||
</page>
|
||||
<page string="Other Info">
|
||||
<group string="Email Interface" colspan="2">
|
||||
<div attrs="{'invisible': [('alias_domain', '=', False)]}">
|
||||
<field name="alias_id" invisible="1" required="0"/>
|
||||
<label for="alias_name" class="oe_edit_only "/>
|
||||
<field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
<group>
|
||||
<group string="Email Interface" attrs="{'invisible': [('alias_domain', '=', False)]}">
|
||||
<div>
|
||||
<field name="alias_id" invisible="1" required="0"/>
|
||||
<label for="alias_name" class="oe_edit_only "/>
|
||||
<field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
|
||||
</div>
|
||||
</group>
|
||||
<group string="Administration" groups="project.group_time_work_estimation_tasks">
|
||||
<field name="planned_hours" widget="float_time"/>
|
||||
<field name="effective_hours" widget="float_time"/>
|
||||
|
@ -136,7 +136,7 @@
|
|||
</group>
|
||||
<group string="Miscellaneous" name="misc">
|
||||
<field name="date"/>
|
||||
<field name="priority"/>
|
||||
<field name="priority" groups="base.group_no_one"/>
|
||||
<field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
|
||||
|
||||
<field name="currency_id" groups="base.group_multi_currency" required="1"/>
|
||||
|
@ -240,7 +240,7 @@
|
|||
<a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action"> <field name="task_count"/> Tasks</a>
|
||||
</div>
|
||||
<div class="oe_kanban_footer_left">
|
||||
<span>
|
||||
<span groups="project.group_time_work_estimation_tasks">
|
||||
<span class="oe_e">R</span>
|
||||
<t t-esc="Math.round(record.effective_hours.raw_value)"/>/<t t-esc="Math.round(record.planned_hours.raw_value)"/> <field name="company_uom_id"/>
|
||||
</span>
|
||||
|
@ -520,7 +520,7 @@
|
|||
<div class="oe_kanban_content">
|
||||
<div><b><field name="name"/></b></div>
|
||||
<div>
|
||||
<field name="project_id"/>
|
||||
<field name="project_id"/><br/>
|
||||
<t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/>
|
||||
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
|
||||
<span t-attf-class="#{red || ''}"><i><field name="date_deadline"/></i></span>
|
||||
|
@ -714,7 +714,7 @@
|
|||
</record>
|
||||
|
||||
<record id="ir_project_task_open" model="ir.values">
|
||||
<field eval=" 'tree_but_open'" name="key2"/>
|
||||
<field eval="'tree_but_open'" name="key2"/>
|
||||
<field eval="'project.project'" name="model"/>
|
||||
<field name="name">View project's tasks</field>
|
||||
<field eval="'ir.actions.act_window,'+str(dblc_proj)" name="value"/>
|
||||
|
@ -758,7 +758,7 @@
|
|||
<field name="model">project.task.type</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Task Stage">
|
||||
<field name="sequence"/>
|
||||
<field name="sequence" widget="handle"/>
|
||||
<field name="name"/>
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
|
|
|
@ -292,7 +292,7 @@ account_analytic_account()
|
|||
class project_task(osv.osv):
|
||||
_inherit = "project.task"
|
||||
_columns = {
|
||||
'phase_id': fields.many2one('project.phase', 'Project Phase'),
|
||||
'phase_id': fields.many2one('project.phase', 'Project Phase', domain="[('project_id', '=', project_id)]"),
|
||||
}
|
||||
project_task()
|
||||
|
||||
|
|
|
@ -37,8 +37,10 @@ class procurement_order(osv.osv):
|
|||
""" Checks if task is done or not.
|
||||
@return: True or False.
|
||||
"""
|
||||
return all(proc.product_id.type != 'service' or (proc.task_id and proc.task_id.state in ('done', 'cancelled')) \
|
||||
for proc in self.browse(cr, uid, ids, context=context))
|
||||
for p in self.browse(cr, uid, ids, context=context):
|
||||
if (p.product_id.type=='service') and (p.procure_method=='make_to_order') and p.task_id and (p.task_id.state not in ('done', 'cancelled')):
|
||||
return False
|
||||
return True
|
||||
|
||||
def check_produce_service(self, cr, uid, procurement, context=None):
|
||||
return True
|
||||
|
@ -81,7 +83,7 @@ class procurement_order(osv.osv):
|
|||
'project_id': project and project.id or False,
|
||||
'company_id': procurement.company_id.id,
|
||||
},context=context)
|
||||
self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running'}, context=context)
|
||||
self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':'from project: task created.'}, context=context)
|
||||
self.running_send_note(cr, uid, ids, context=None)
|
||||
return task_id
|
||||
|
||||
|
|
|
@ -46,23 +46,27 @@ class project_project(osv.osv):
|
|||
def open_timesheets(self, cr, uid, ids, context=None):
|
||||
""" open Timesheets view """
|
||||
project = self.browse(cr, uid, ids[0], context)
|
||||
try:
|
||||
journal_id = self.pool.get('ir.model.data').get_object(cr, uid, 'hr_timesheet', 'analytic_journal').id
|
||||
except ValueError:
|
||||
journal_id = False
|
||||
view_context = {
|
||||
'search_default_account_id': [project.analytic_account_id.id],
|
||||
'default_account_id': project.analytic_account_id.id,
|
||||
'default_journal_id': journal_id,
|
||||
}
|
||||
help = _("""<p class="oe_view_nocontent_create">Record your timesheets for the project '%s'.</p>""")
|
||||
try:
|
||||
if project.to_invoice and project.partner_id:
|
||||
help+= _("""<p>Timesheets on this project may be invoiced to %s, according to the terms defined in the contract.</p>""" ) % (project.partner_id.name,)
|
||||
except:
|
||||
# if the user do not have access rights on the partner
|
||||
pass
|
||||
|
||||
return {
|
||||
'type': 'ir.actions.act_window',
|
||||
'name': _('Bill Tasks Works'),
|
||||
'res_model': 'account.analytic.line',
|
||||
'name': _('Timesheets'),
|
||||
'res_model': 'hr.analytic.timesheet',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'context': view_context,
|
||||
'nodestroy': True,
|
||||
'help': help
|
||||
}
|
||||
project_project()
|
||||
|
||||
|
|
|
@ -20,12 +20,14 @@
|
|||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="context">{'search_default_partner_id': active_id}</field>
|
||||
<field name="groups_id" eval="[(4, ref('purchase.group_purchase_user'))]"/>
|
||||
<field name="help">
|
||||
This supplier has no RFQ or Purchase Order. Click here to create a new RFQ.
|
||||
<p>
|
||||
The "Quotation" is the first step of the Purchases flow. Manage your purchases from quotation to invoice.
|
||||
<p>
|
||||
You will be able to buy products (manage receptions) as well as services (create projects).
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
This supplier has no purchase order. Click to create a new RfQ.
|
||||
</p><p>
|
||||
The request for quotation is the first step of the purchases flow. Once
|
||||
converted into a purchase order, you will be able to control the reception
|
||||
of the products and the supplier invoice.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
@ -53,12 +55,15 @@
|
|||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="domain">[('type','=','in_invoice')]</field>
|
||||
<field name="context">{'search_default_partner_id': active_id, 'default_type': 'in_invoice', 'type': 'in_invoice', 'journal_type': 'purchase'}</field>
|
||||
<field name="help">
|
||||
Click here to create Supplier invoice.
|
||||
<p>
|
||||
You can control the invoice from your supplier according to what you purchased or received.
|
||||
<p>
|
||||
OpenERP can also generate draft invoices automatically from purchase orders or receipts.
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click here to record a supplier invoice.
|
||||
</p><p>
|
||||
Supplier invoices can be pre-generated based on purchase
|
||||
orders or receptions. This allows you to control invoices
|
||||
you receive from your supplier according to the draft
|
||||
document in OpenERP.
|
||||
</p>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
|
|
@ -792,14 +792,6 @@ class purchase_order_line(osv.osv):
|
|||
res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
|
||||
return res
|
||||
|
||||
def _get_uom_id(self, cr, uid, context=None):
|
||||
try:
|
||||
proxy = self.pool.get('ir.model.data')
|
||||
result = proxy.get_object_reference(cr, uid, 'product', 'product_uom_unit')
|
||||
return result[1]
|
||||
except Exception, ex:
|
||||
return False
|
||||
|
||||
_columns = {
|
||||
'name': fields.text('Description', required=True),
|
||||
'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
|
||||
|
@ -826,7 +818,6 @@ class purchase_order_line(osv.osv):
|
|||
|
||||
}
|
||||
_defaults = {
|
||||
'product_uom' : _get_uom_id,
|
||||
'product_qty': lambda *a: 1.0,
|
||||
'state': lambda *args: 'draft',
|
||||
'invoiced': lambda *a: 0,
|
||||
|
@ -1057,9 +1048,10 @@ class procurement_order(osv.osv):
|
|||
purchase_date = self._get_purchase_order_date(cr, uid, procurement, company, schedule_date, context=context)
|
||||
|
||||
#Passing partner_id to context for purchase order line integrity of Line name
|
||||
context.update({'lang': partner.lang, 'partner_id': partner_id})
|
||||
new_context = context.copy()
|
||||
new_context.update({'lang': partner.lang, 'partner_id': partner_id})
|
||||
|
||||
product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context)
|
||||
product = prod_obj.browse(cr, uid, procurement.product_id.id, context=new_context)
|
||||
taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id
|
||||
taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids)
|
||||
|
||||
|
@ -1088,7 +1080,7 @@ class procurement_order(osv.osv):
|
|||
'company_id': procurement.company_id.id,
|
||||
'fiscal_position': partner.property_account_position and partner.property_account_position.id or False
|
||||
}
|
||||
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=context)
|
||||
res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
|
||||
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
|
||||
self.running_send_note(cr, uid, [procurement.id], context=context)
|
||||
return res
|
||||
|
|
|
@ -267,16 +267,13 @@ class procurement_order(osv.osv):
|
|||
}
|
||||
def make_po(self, cr, uid, ids, context=None):
|
||||
res = {}
|
||||
sequence_obj = self.pool.get('ir.sequence')
|
||||
requisition_obj = self.pool.get('purchase.requisition')
|
||||
warehouse_obj = self.pool.get('stock.warehouse')
|
||||
procurement = self.browse(cr, uid, ids, context=context)[0]
|
||||
if procurement.product_id.purchase_requisition:
|
||||
seq_name = sequence_obj.get(cr, uid, 'purchase.order.requisition')
|
||||
warehouse_id = warehouse_obj.search(cr, uid, [('company_id', '=', procurement.company_id.id or company.id)], context=context)
|
||||
res[procurement.id] = requisition_obj.create(cr, uid,
|
||||
{
|
||||
'name': seq_name,
|
||||
'origin': procurement.origin,
|
||||
'date_end': procurement.date_planned,
|
||||
'warehouse_id':warehouse_id and warehouse_id[0] or False,
|
||||
|
|
|
@ -107,7 +107,7 @@ class WebKitParser(report_sxw):
|
|||
tmp_dir = tempfile.gettempdir()
|
||||
out_filename = tempfile.mktemp(suffix=".pdf", prefix="webkit.tmp.")
|
||||
files = []
|
||||
file_to_del = []
|
||||
file_to_del = [out_filename]
|
||||
if comm_path:
|
||||
command = [comm_path]
|
||||
else:
|
||||
|
@ -160,22 +160,33 @@ class WebKitParser(report_sxw):
|
|||
file_to_del.append(html_file.name)
|
||||
command.append(html_file.name)
|
||||
command.append(out_filename)
|
||||
stderr_fd, stderr_path = tempfile.mkstemp(text=True)
|
||||
file_to_del.append(stderr_path)
|
||||
try:
|
||||
status = subprocess.call(command, stderr=subprocess.PIPE) # ignore stderr
|
||||
status = subprocess.call(command, stderr=stderr_fd)
|
||||
os.close(stderr_fd) # ensure flush before reading
|
||||
stderr_fd = None # avoid closing again in finally block
|
||||
fobj = open(stderr_path, 'r')
|
||||
error_message = fobj.read()
|
||||
fobj.close()
|
||||
if not error_message:
|
||||
error_message = _('No diagnosis message was provided')
|
||||
else:
|
||||
error_message = _('The following diagnosis message was provided:\n') + error_message
|
||||
if status :
|
||||
raise except_osv(
|
||||
_('Webkit raise an error!' ),
|
||||
status
|
||||
)
|
||||
except Exception:
|
||||
for f_to_del in file_to_del :
|
||||
os.unlink(f_to_del)
|
||||
|
||||
pdf = file(out_filename, 'rb').read()
|
||||
for f_to_del in file_to_del :
|
||||
os.unlink(f_to_del)
|
||||
|
||||
os.unlink(out_filename)
|
||||
raise except_osv(_('Webkit error' ),
|
||||
_("The command 'wkhtmltopdf' failed with error code = %s. Message: %s") % (status, error_message))
|
||||
pdf_file = open(out_filename, 'rb')
|
||||
pdf = pdf_file.read()
|
||||
pdf_file.close()
|
||||
finally:
|
||||
if stderr_fd is not None:
|
||||
os.close(stderr_fd)
|
||||
for f_to_del in file_to_del:
|
||||
try:
|
||||
os.unlink(f_to_del)
|
||||
except (OSError, IOError), exc:
|
||||
_logger.error('cannot remove file %s: %s', f_to_del, exc)
|
||||
return pdf
|
||||
|
||||
def translate_call(self, src):
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
%for inv in objects :
|
||||
<% setLang(inv.partner_id.lang) %>
|
||||
<table class="dest_address">
|
||||
<tr><td ><b>${inv.partner_id.title or ''|entity} ${inv.partner_id.name |entity}</b></td></tr>
|
||||
<tr><td ><b>${inv.partner_id.title and inv.partner_id.title.name or ''|entity} ${inv.partner_id.name |entity}</b></td></tr>
|
||||
<tr><td>${inv.address_invoice_id.street or ''|entity}</td></tr>
|
||||
<tr><td>${inv.address_invoice_id.street2 or ''|entity}</td></tr>
|
||||
<tr><td>${inv.address_invoice_id.zip or ''|entity} ${inv.address_invoice_id.city or ''|entity}</td></tr>
|
||||
|
|
|
@ -93,6 +93,7 @@ class sale_report(osv.osv):
|
|||
left join product_template t on (p.product_tmpl_id=t.id)
|
||||
left join product_uom u on (u.id=l.product_uom)
|
||||
left join product_uom u2 on (u2.id=t.uom_id)
|
||||
where l.product_id is not null
|
||||
group by
|
||||
l.product_id,
|
||||
l.product_uom_qty,
|
||||
|
|
|
@ -253,7 +253,6 @@ class sale_order(osv.osv):
|
|||
assert mode in ('finished', 'canceled'), _("invalid mode for test_state")
|
||||
finished = True
|
||||
canceled = False
|
||||
notcanceled = False
|
||||
write_done_ids = []
|
||||
write_cancel_ids = []
|
||||
for order in self.browse(cr, uid, ids, context={}):
|
||||
|
@ -268,8 +267,6 @@ class sale_order(osv.osv):
|
|||
canceled = True
|
||||
if line.state != 'exception':
|
||||
write_cancel_ids.append(line.id)
|
||||
else:
|
||||
notcanceled = True
|
||||
if write_done_ids:
|
||||
self.pool.get('sale.order.line').write(cr, uid, write_done_ids, {'state': 'done'})
|
||||
if write_cancel_ids:
|
||||
|
@ -279,9 +276,6 @@ class sale_order(osv.osv):
|
|||
return finished
|
||||
elif mode == 'canceled':
|
||||
return canceled
|
||||
if notcanceled:
|
||||
return False
|
||||
return canceled
|
||||
|
||||
def _prepare_order_line_procurement(self, cr, uid, order, line, move_id, date_planned, context=None):
|
||||
return {
|
||||
|
|
|
@ -40,6 +40,7 @@ class ir_model_access(osv.Model):
|
|||
LEFT JOIN ir_module_category c ON (c.id=g.category_id)
|
||||
WHERE
|
||||
m.model=%s AND
|
||||
a.active IS true AND
|
||||
(g.share IS NULL or g.share IS false) AND
|
||||
a.perm_''' + access_mode, (model_name,))
|
||||
return [('%s/%s' % x) if x[0] else x[1] for x in cr.fetchall()]
|
||||
|
|
|
@ -167,6 +167,7 @@ class report_stock_inventory(osv.osv):
|
|||
help='When the stock move is created it is in the \'Draft\' state.\n After that it is set to \'Confirmed\' state.\n If stock is available state is set to \'Avaiable\'.\n When the picking it done the state is \'Done\'.\
|
||||
\nThe state is \'Waiting\' if the move is waiting for another one.'),
|
||||
'location_type': fields.selection([('supplier', 'Supplier Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location for Inter-Companies Transfers')], 'Location Type', required=True),
|
||||
'scrap_location': fields.boolean('scrap'),
|
||||
}
|
||||
def init(self, cr):
|
||||
tools.drop_view_if_exists(cr, 'report_stock_inventory')
|
||||
|
@ -177,7 +178,7 @@ CREATE OR REPLACE view report_stock_inventory AS (
|
|||
to_char(m.date, 'YYYY') as year,
|
||||
to_char(m.date, 'MM') as month,
|
||||
m.partner_id as partner_id, m.location_id as location_id,
|
||||
m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
|
||||
m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type, l.scrap_location as scrap_location,
|
||||
m.company_id,
|
||||
m.state as state, m.prodlot_id as prodlot_id,
|
||||
|
||||
|
@ -194,14 +195,14 @@ CREATE OR REPLACE view report_stock_inventory AS (
|
|||
LEFT JOIN stock_location l ON (m.location_id=l.id)
|
||||
GROUP BY
|
||||
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
|
||||
m.prodlot_id, m.date, m.state, l.usage, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
|
||||
m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
|
||||
) UNION ALL (
|
||||
SELECT
|
||||
-m.id as id, m.date as date,
|
||||
to_char(m.date, 'YYYY') as year,
|
||||
to_char(m.date, 'MM') as month,
|
||||
m.partner_id as partner_id, m.location_dest_id as location_id,
|
||||
m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
|
||||
m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type, l.scrap_location as scrap_location,
|
||||
m.company_id,
|
||||
m.state as state, m.prodlot_id as prodlot_id,
|
||||
coalesce(sum(pt.standard_price * m.product_qty * pu.factor / pu2.factor)::decimal, 0.0) as value,
|
||||
|
@ -217,7 +218,7 @@ CREATE OR REPLACE view report_stock_inventory AS (
|
|||
LEFT JOIN stock_location l ON (m.location_dest_id=l.id)
|
||||
GROUP BY
|
||||
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
|
||||
m.prodlot_id, m.date, m.state, l.usage, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
|
||||
m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
|
||||
)
|
||||
);
|
||||
""")
|
||||
|
|
|
@ -155,7 +155,7 @@
|
|||
<field name="state"/>
|
||||
<field name="location_type"/>
|
||||
<field name="date"/>
|
||||
<filter icon="terp-go-home" name="location_type_scrap" string="Scrap" domain="[('location_type','=','scrap')]"/>
|
||||
<filter icon="terp-go-home" name="location_type_scrap" string="Scrap" domain="[('scrap_location','=','True')]"/>
|
||||
</group>
|
||||
<group expand="1" string="Group By..." >
|
||||
<filter string="Partner" name="group_partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
|
||||
|
|
|
@ -2,6 +2,16 @@
|
|||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- After installation of the module, open the related menu -->
|
||||
<record id="action_client_warehouse_menu" model="ir.actions.client">
|
||||
<field name="name">Open Warehouse Menu</field>
|
||||
<field name="tag">reload</field>
|
||||
<field name="params" eval="{'menu_id': ref('menu_stock_root')}"/>
|
||||
</record>
|
||||
<record id="base.open_menu" model="ir.actions.todo">
|
||||
<field name="action_id" ref="action_client_warehouse_menu"/>
|
||||
<field name="state">open</field>
|
||||
</record>
|
||||
<record id="view_stock_config_settings" model="ir.ui.view">
|
||||
<field name="name">stock settings</field>
|
||||
<field name="model">stock.config.settings</field>
|
||||
|
|
|
@ -36,8 +36,8 @@ access_stock_report_tracklots,stock.report.tracklots,model_stock_report_tracklot
|
|||
access_report_stock_move_user,report.stock.move user,model_report_stock_move,stock.group_stock_user,1,0,0,0
|
||||
access_report_stock_move_manager,report.stock.move manager,model_report_stock_move,stock.group_stock_manager,1,1,1,1
|
||||
access_report_stock_inventory_user,report.stock.inventory user,model_report_stock_inventory,stock.group_stock_user,1,1,1,1
|
||||
access_product_product_stock_user,product_product_stock_user,product.model_product_product,stock.group_stock_user,1,0,0,0
|
||||
access_product_template_stock_user,product.template stock user,product.model_product_template,stock.group_stock_user,1,0,0,0
|
||||
access_product_product_stock_user,product_product_stock_user,product.model_product_product,stock.group_stock_user,1,1,0,0
|
||||
access_product_template_stock_user,product.template stock user,product.model_product_template,stock.group_stock_user,1,1,0,0
|
||||
access_account_invoice_user,account.invoice stock user,account.model_account_invoice,stock.group_stock_user,1,1,1,0
|
||||
access_account_invoice_line_user,account.invoice.line stock user,account.model_account_invoice_line,stock.group_stock_user,1,1,1,0
|
||||
access_account_invoice_tax_user,account.invoice.tax stock user,account.model_account_invoice_tax,stock.group_stock_user,1,1,1,0
|
||||
|
|
|
|
@ -510,9 +510,13 @@ class stock_tracking(osv.osv):
|
|||
return self.name_get(cr, user, ids, context)
|
||||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
"""Append the serial to the name"""
|
||||
if not len(ids):
|
||||
return []
|
||||
res = [(r['id'], r['name']+' ['+(r['serial'] or '')+']') for r in self.read(cr, uid, ids, ['name', 'serial'], context)]
|
||||
res = [ (r['id'], r['serial'] and '%s [%s]' % (r['name'], r['serial'])
|
||||
or r['name'] )
|
||||
for r in self.read(cr, uid, ids, ['name', 'serial'],
|
||||
context=context) ]
|
||||
return res
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
|
@ -644,7 +648,7 @@ class stock_picking(osv.osv):
|
|||
),
|
||||
'min_date': fields.function(get_min_max_date, fnct_inv=_set_minimum_date, multi="min_max_date",
|
||||
store=True, type='datetime', string='Scheduled Date', select=1, help="Scheduled date for the shipment to be processed"),
|
||||
'date': fields.datetime('Order Date', help="Date of order", select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
|
||||
'date': fields.datetime('Date', help="Creation date, usually the date of the order.", select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
|
||||
'date_done': fields.datetime('Date Done', help="Date of Completion", states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
|
||||
'max_date': fields.function(get_min_max_date, fnct_inv=_set_maximum_date, multi="min_max_date",
|
||||
store=True, type='datetime', string='Max. Expected Date', select=2),
|
||||
|
@ -675,6 +679,7 @@ class stock_picking(osv.osv):
|
|||
def action_process(self, cr, uid, ids, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
"""Open the partial picking wizard"""
|
||||
context.update({
|
||||
'active_model': self._name,
|
||||
'active_ids': ids,
|
||||
|
@ -723,6 +728,7 @@ class stock_picking(osv.osv):
|
|||
return {}
|
||||
|
||||
def action_explode(self, cr, uid, moves, context=None):
|
||||
"""Hook to allow other modules to split the moves of a picking."""
|
||||
return moves
|
||||
|
||||
def action_confirm(self, cr, uid, ids, context=None):
|
||||
|
@ -864,14 +870,20 @@ class stock_picking(osv.osv):
|
|||
# TODO: change and create a move if not parents
|
||||
#
|
||||
def action_done(self, cr, uid, ids, context=None):
|
||||
""" Changes picking state to done.
|
||||
"""Changes picking state to done.
|
||||
|
||||
This method is called at the end of the workflow by the activity "done".
|
||||
@return: True
|
||||
"""
|
||||
self.write(cr, uid, ids, {'state': 'done', 'date_done': time.strftime('%Y-%m-%d %H:%M:%S')})
|
||||
return True
|
||||
|
||||
def action_move(self, cr, uid, ids, context=None):
|
||||
""" Changes move state to assigned.
|
||||
"""Process the Stock Moves of the Picking
|
||||
|
||||
This method is called by the workflow by the activity "move".
|
||||
Normally that happens when the signal button_done is received (button
|
||||
"Done" pressed on a Picking view).
|
||||
@return: True
|
||||
"""
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
|
@ -1274,9 +1286,14 @@ class stock_picking(osv.osv):
|
|||
for move in too_few:
|
||||
product_qty = move_product_qty[move.id]
|
||||
if not new_picking:
|
||||
new_picking_name = pick.name
|
||||
self.write(cr, uid, [pick.id],
|
||||
{'name': sequence_obj.get(cr, uid,
|
||||
'stock.picking.%s'%(pick.type)),
|
||||
})
|
||||
new_picking = self.copy(cr, uid, pick.id,
|
||||
{
|
||||
'name': sequence_obj.get(cr, uid, 'stock.picking.%s'%(pick.type)),
|
||||
'name': new_picking_name,
|
||||
'move_lines' : [],
|
||||
'state':'draft',
|
||||
})
|
||||
|
@ -1296,9 +1313,10 @@ class stock_picking(osv.osv):
|
|||
move_obj.copy(cr, uid, move.id, defaults)
|
||||
move_obj.write(cr, uid, [move.id],
|
||||
{
|
||||
'product_qty' : move.product_qty - partial_qty[move.id],
|
||||
'product_qty': move.product_qty - partial_qty[move.id],
|
||||
'product_uos_qty': move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty
|
||||
|
||||
'prodlot_id': False,
|
||||
'tracking_id': False,
|
||||
})
|
||||
|
||||
if new_picking:
|
||||
|
@ -1343,6 +1361,22 @@ class stock_picking(osv.osv):
|
|||
res[pick.id] = {'delivered_picking': delivered_pack.id or False}
|
||||
|
||||
return res
|
||||
|
||||
# views associated to each picking type
|
||||
_VIEW_LIST = {
|
||||
'out': 'view_picking_out_form',
|
||||
'in': 'view_picking_in_form',
|
||||
'internal': 'view_picking_form',
|
||||
}
|
||||
def _get_view_id(self, cr, uid, type):
|
||||
"""Get the view id suiting the given type
|
||||
|
||||
@param type: the picking type as a string
|
||||
@return: view i, or False if no view found
|
||||
"""
|
||||
res = self.pool.get('ir.model.data').get_object_reference(cr, uid,
|
||||
'stock', self._VIEW_LIST.get(type, 'view_picking_form'))
|
||||
return res and res[1] or False
|
||||
|
||||
def log_picking(self, cr, uid, ids, context=None):
|
||||
""" This function will create log messages for picking.
|
||||
|
@ -1353,7 +1387,6 @@ class stock_picking(osv.osv):
|
|||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
msg=''
|
||||
if pick.auto_picking:
|
||||
|
@ -1363,11 +1396,6 @@ class stock_picking(osv.osv):
|
|||
'in':_('Reception'),
|
||||
'internal': _('Internal picking'),
|
||||
}
|
||||
view_list = {
|
||||
'out': 'view_picking_out_form',
|
||||
'in': 'view_picking_in_form',
|
||||
'internal': 'view_picking_form',
|
||||
}
|
||||
message = type_list.get(pick.type, _('Document')) + " '" + (pick.name or '?') + "' "
|
||||
if pick.min_date:
|
||||
msg= _(' for the ')+ datetime.strptime(pick.min_date, '%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y')
|
||||
|
@ -1379,8 +1407,7 @@ class stock_picking(osv.osv):
|
|||
'auto': _('is waiting.'),
|
||||
'draft': _('is in draft state.'),
|
||||
}
|
||||
res = data_obj.get_object_reference(cr, uid, 'stock', view_list.get(pick.type, 'view_picking_form'))
|
||||
context.update({'view_id': res and res[1] or False})
|
||||
context['view_id'] = self._get_view_id(cr, uid, pick.type)
|
||||
message += state_list[pick.state]
|
||||
return True
|
||||
|
||||
|
@ -1620,7 +1647,8 @@ class stock_move(osv.osv):
|
|||
(move.product_id.track_production and move.location_id.usage == 'production') or \
|
||||
(move.product_id.track_production and move.location_dest_id.usage == 'production') or \
|
||||
(move.product_id.track_incoming and move.location_id.usage == 'supplier') or \
|
||||
(move.product_id.track_outgoing and move.location_dest_id.usage == 'customer') \
|
||||
(move.product_id.track_outgoing and move.location_dest_id.usage == 'customer') or \
|
||||
(move.product_id.track_incoming and move.location_id.usage == 'inventory') \
|
||||
)):
|
||||
return False
|
||||
return True
|
||||
|
@ -1642,7 +1670,16 @@ class stock_move(osv.osv):
|
|||
'date_expected': fields.datetime('Scheduled Date', states={'done': [('readonly', True)]},required=True, select=True, help="Scheduled date for the processing of this move"),
|
||||
'product_id': fields.many2one('product.product', 'Product', required=True, select=True, domain=[('type','<>','service')],states={'done': [('readonly', True)]}),
|
||||
|
||||
'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True,states={'done': [('readonly', True)]}),
|
||||
'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'),
|
||||
required=True,states={'done': [('readonly', True)]},
|
||||
help="This is the quantity of products from an inventory "
|
||||
"point of view. For moves in the state 'done', this is the "
|
||||
"quantity of products that were actually moved. For other "
|
||||
"moves, this is the quantity of product that is planned to "
|
||||
"be moved. Lowering this quantity does not generate a "
|
||||
"backorder. Changing this quantity on assigned moves affects "
|
||||
"the product reservation, and should be done with care."
|
||||
),
|
||||
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True,states={'done': [('readonly', True)]}),
|
||||
'product_uos_qty': fields.float('Quantity (UOS)', digits_compute=dp.get_precision('Product Unit of Measure'), states={'done': [('readonly', True)]}),
|
||||
'product_uos': fields.many2one('product.uom', 'Product UOS', states={'done': [('readonly', True)]}),
|
||||
|
@ -1677,7 +1714,7 @@ class stock_move(osv.osv):
|
|||
'price_unit': fields.float('Unit Price', digits_compute= dp.get_precision('Account'), help="Technical field used to record the product cost set by the user during a picking confirmation (when average price costing method is used)"),
|
||||
'price_currency_id': fields.many2one('res.currency', 'Currency for average price', help="Technical field used to record the currency chosen by the user during a picking confirmation (when average price costing method is used)"),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
|
||||
'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order", select=True),
|
||||
'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order of", select=True),
|
||||
'origin': fields.related('picking_id','origin',type='char', size=64, relation="stock.picking", string="Source", store=True),
|
||||
|
||||
# used for colors in tree views:
|
||||
|
@ -1863,19 +1900,32 @@ class stock_move(osv.osv):
|
|||
result = {
|
||||
'product_uos_qty': 0.00
|
||||
}
|
||||
warning = {}
|
||||
|
||||
if (not product_id) or (product_qty <=0.0):
|
||||
result['product_qty'] = 0.0
|
||||
return {'value': result}
|
||||
|
||||
product_obj = self.pool.get('product.product')
|
||||
uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff'])
|
||||
|
||||
# Warn if the quantity was decreased
|
||||
if ids:
|
||||
for move in self.read(cr, uid, ids, ['product_qty']):
|
||||
if product_qty < move['product_qty']:
|
||||
warning.update({
|
||||
'title': _('Information'),
|
||||
'message': _("By changing this quantity here, you accept the "
|
||||
"new quantity as complete: OpenERP will not "
|
||||
"automatically generate a back order.") })
|
||||
break
|
||||
|
||||
if product_uos and product_uom and (product_uom != product_uos):
|
||||
result['product_uos_qty'] = product_qty * uos_coeff['uos_coeff']
|
||||
else:
|
||||
result['product_uos_qty'] = product_qty
|
||||
|
||||
return {'value': result}
|
||||
return {'value': result, 'warning': warning}
|
||||
|
||||
def onchange_uos_quantity(self, cr, uid, ids, product_id, product_uos_qty,
|
||||
product_uos, product_uom):
|
||||
|
@ -1889,19 +1939,30 @@ class stock_move(osv.osv):
|
|||
result = {
|
||||
'product_qty': 0.00
|
||||
}
|
||||
warning = {}
|
||||
|
||||
if (not product_id) or (product_uos_qty <=0.0):
|
||||
result['product_uos_qty'] = 0.0
|
||||
return {'value': result}
|
||||
|
||||
product_obj = self.pool.get('product.product')
|
||||
uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff'])
|
||||
|
||||
# Warn if the quantity was decreased
|
||||
for move in self.read(cr, uid, ids, ['product_uos_qty']):
|
||||
if product_uos_qty < move['product_uos_qty']:
|
||||
warning.update({
|
||||
'title': _('Warning: No Back Order'),
|
||||
'message': _("By changing the quantity here, you accept the "
|
||||
"new quantity as complete: OpenERP will not "
|
||||
"automatically generate a Back Order.") })
|
||||
break
|
||||
|
||||
if product_uos and product_uom and (product_uom != product_uos):
|
||||
result['product_qty'] = product_uos_qty / uos_coeff['uos_coeff']
|
||||
else:
|
||||
result['product_qty'] = product_uos_qty
|
||||
|
||||
return {'value': result}
|
||||
return {'value': result, 'warning': warning}
|
||||
|
||||
def onchange_product_id(self, cr, uid, ids, prod_id=False, loc_id=False,
|
||||
loc_dest_id=False, partner_id=False):
|
||||
|
@ -1927,7 +1988,8 @@ class stock_move(osv.osv):
|
|||
'product_uom': product.uom_id.id,
|
||||
'product_uos': uos_id,
|
||||
'product_qty': 1.00,
|
||||
'product_uos_qty' : self.pool.get('stock.move').onchange_quantity(cr, uid, ids, prod_id, 1.00, product.uom_id.id, uos_id)['value']['product_uos_qty']
|
||||
'product_uos_qty' : self.pool.get('stock.move').onchange_quantity(cr, uid, ids, prod_id, 1.00, product.uom_id.id, uos_id)['value']['product_uos_qty'],
|
||||
'prodlot_id' : False,
|
||||
}
|
||||
if not ids:
|
||||
result['name'] = product.partner_ref
|
||||
|
@ -2114,6 +2176,10 @@ class stock_move(osv.osv):
|
|||
@return: True
|
||||
"""
|
||||
self.write(cr, uid, ids, {'state': 'assigned'})
|
||||
wf_service = netsvc.LocalService('workflow')
|
||||
for move in self.browse(cr, uid, ids, context):
|
||||
if move.picking_id:
|
||||
wf_service.trg_write(uid, 'stock.picking', move.picking_id.id, cr)
|
||||
return True
|
||||
|
||||
def cancel_assign(self, cr, uid, ids, context=None):
|
||||
|
@ -2490,8 +2556,6 @@ class stock_move(osv.osv):
|
|||
'tracking_id': move.tracking_id.id,
|
||||
'prodlot_id': move.prodlot_id.id,
|
||||
}
|
||||
if move.location_id.usage <> 'internal':
|
||||
default_val.update({'location_id': move.location_dest_id.id})
|
||||
new_move = self.copy(cr, uid, move.id, default_val)
|
||||
|
||||
res += [new_move]
|
||||
|
@ -2505,6 +2569,7 @@ class stock_move(osv.osv):
|
|||
return res
|
||||
|
||||
# action_split function is not used anywhere
|
||||
# FIXME: deprecate this method
|
||||
def action_split(self, cr, uid, ids, quantity, split_by_qty=1, prefix=False, with_lot=True, context=None):
|
||||
""" Split Stock Move lines into production lot which specified split by quantity.
|
||||
@param cr: the database cursor
|
||||
|
@ -2709,8 +2774,10 @@ class stock_move(osv.osv):
|
|||
complete.append(self.browse(cr, uid, new_move))
|
||||
self.write(cr, uid, [move.id],
|
||||
{
|
||||
'product_qty' : move.product_qty - product_qty,
|
||||
'product_uos_qty':move.product_qty - product_qty,
|
||||
'product_qty': move.product_qty - product_qty,
|
||||
'product_uos_qty': move.product_qty - product_qty,
|
||||
'prodlot_id': False,
|
||||
'tracking_id': False,
|
||||
})
|
||||
|
||||
|
||||
|
@ -2749,7 +2816,7 @@ class stock_inventory(osv.osv):
|
|||
'name': fields.char('Inventory Reference', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'date': fields.datetime('Creation Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'date_done': fields.datetime('Date done'),
|
||||
'inventory_line_id': fields.one2many('stock.inventory.line', 'inventory_id', 'Inventories', states={'done': [('readonly', True)]}),
|
||||
'inventory_line_id': fields.one2many('stock.inventory.line', 'inventory_id', 'Inventories', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'move_ids': fields.many2many('stock.move', 'stock_inventory_move_rel', 'inventory_id', 'move_id', 'Created Moves'),
|
||||
'state': fields.selection( (('draft', 'Draft'), ('cancel','Cancelled'), ('confirm','Confirmed'), ('done', 'Done')), 'Status', readonly=True, select=True),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True, select=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||
|
@ -2896,11 +2963,11 @@ class stock_inventory_line(osv.osv):
|
|||
@return: Dictionary of changed values
|
||||
"""
|
||||
if not product:
|
||||
return {'value': {'product_qty': 0.0, 'product_uom': False}}
|
||||
return {'value': {'product_qty': 0.0, 'product_uom': False, 'prod_lot_id': False}}
|
||||
obj_product = self.pool.get('product.product').browse(cr, uid, product)
|
||||
uom = uom or obj_product.uom_id.id
|
||||
amount = self.pool.get('stock.location')._product_get(cr, uid, location_id, [product], {'uom': uom, 'to_date': to_date, 'compute_child': False})[product]
|
||||
result = {'product_qty': amount, 'product_uom': uom}
|
||||
result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False}
|
||||
return {'value': result}
|
||||
|
||||
stock_inventory_line()
|
||||
|
@ -2945,7 +3012,7 @@ class stock_picking_in(osv.osv):
|
|||
_name = "stock.picking.in"
|
||||
_inherit = "stock.picking"
|
||||
_table = "stock_picking"
|
||||
_description = "Incomming Shipments"
|
||||
_description = "Incoming Shipments"
|
||||
|
||||
def check_access_rights(self, cr, uid, operation, raise_exception=True):
|
||||
#override in order to redirect the check of acces rights on the stock.picking object
|
||||
|
|
|
@ -759,26 +759,26 @@
|
|||
<field name="state" widget="statusbar" statusbar_visible="draft,assigned,done" statusbar_colors='{"shipping_except":"red","invoice_except":"red","waiting_date":"blue"}'/>
|
||||
</header>
|
||||
<sheet>
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
<h1>
|
||||
<field name="name" class="oe_inline"/>
|
||||
<field name="name" class="oe_inline" attrs="{'invisible': [('name','=','/')]}" readonly="1"/>
|
||||
</h1>
|
||||
<group>
|
||||
<group>
|
||||
<field name="partner_id" on_change="onchange_partner_in(partner_id)"/>
|
||||
<field name="backorder_id" readonly="1"/>
|
||||
<field name="backorder_id" readonly="1" attrs="{'invisible': [('backorder_id','=',False)]}"/>
|
||||
<field name="invoice_state" string="Invoice Control" groups="account.group_account_invoice" attrs="{'invisible':[('invoice_state', '=', 'none')]}"/>
|
||||
<field name="stock_journal_id" widget="selection" groups="account.group_account_user"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="date"/>
|
||||
<field name="min_date" readonly="1"/>
|
||||
<field name="min_date" readonly="1" attrs="{'invisible': [('min_date','=',False)]}"/>
|
||||
<field name="origin" placeholder="e.g. PO0032" class="oe_inline"/>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Products">
|
||||
<field name="move_lines" context="{'address_in_id': partner_id, 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
|
||||
<field name="note" placeholder="Add an internal note..." class="oe_inline"/>
|
||||
</page>
|
||||
<page string="Additional Info">
|
||||
<group>
|
||||
|
@ -793,9 +793,6 @@
|
|||
</group>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Notes">
|
||||
<field name="note" placeholder="Add an internal note..."/>
|
||||
</page>
|
||||
</notebook>
|
||||
</sheet>
|
||||
</form>
|
||||
|
@ -913,7 +910,7 @@
|
|||
<field name="partner_id" on_change="onchange_partner_in(partner_id)" string="Customer"/>
|
||||
</xpath>
|
||||
<xpath expr="//field[@name='move_lines']" position="replace">
|
||||
<field name="move_lines" context="{'address_in_id': partner_id, 'picking_type': 'out', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
|
||||
<field name="move_lines" context="{'address_out_id': partner_id, 'picking_type': 'out', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
|
||||
</xpath>
|
||||
<xpath expr="/form/sheet" position="after">
|
||||
<div class="oe_chatter">
|
||||
|
@ -1122,7 +1119,7 @@
|
|||
<record id="view_move_tree" model="ir.ui.view">
|
||||
<field name="name">stock.move.tree</field>
|
||||
<field name="model">stock.move</field>
|
||||
<field eval="6" name="priority"/>
|
||||
<field eval="8" name="priority"/>
|
||||
<field name="arch" type="xml">
|
||||
<tree colors="grey:state == 'cancel';red:(state not in ('cancel','done')) and date > current_date" string="Moves" editable="top">
|
||||
<field name="name"/>
|
||||
|
@ -1496,7 +1493,7 @@
|
|||
<field name="view_id" ref="view_move_tree_reception_picking"/>
|
||||
<field name="context">{'product_receive': True, 'search_default_future': True, 'picking_type': 'in'}</field>
|
||||
<field name="help" type="html">
|
||||
<p>
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to register a product reception.
|
||||
</p><p>
|
||||
Here you can receive individual products, no matter what
|
||||
|
@ -1631,6 +1628,9 @@
|
|||
<field name="view_id" ref="view_move_tree_reception_picking"/>
|
||||
<field name="context">{'picking_type': 'out', 'search_default_future': True}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to register a product delivery.
|
||||
</p>
|
||||
<p>
|
||||
You will find in this list all products you have to deliver to
|
||||
your customers. You can process the deliveries directly from
|
||||
|
@ -1696,7 +1696,7 @@
|
|||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="help" type="html">
|
||||
<p>
|
||||
<p class="oe_view_nocontent_create">
|
||||
Click to create a new journal.
|
||||
</p><p>
|
||||
The stock journal system allows you to assign each stock
|
||||
|
|
|
@ -109,16 +109,17 @@ class stock_fill_inventory(osv.osv_memory):
|
|||
for move in move_obj.browse(cr, uid, move_ids, context=context):
|
||||
lot_id = move.prodlot_id.id
|
||||
prod_id = move.product_id.id
|
||||
if move.location_dest_id.id == location:
|
||||
qty = uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
|
||||
else:
|
||||
qty = -uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
|
||||
if move.location_dest_id.id != move.location_id.id:
|
||||
if move.location_dest_id.id == location:
|
||||
qty = uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
|
||||
else:
|
||||
qty = -uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
|
||||
|
||||
|
||||
if datas.get((prod_id, lot_id)):
|
||||
qty += datas[(prod_id, lot_id)]['product_qty']
|
||||
if datas.get((prod_id, lot_id)):
|
||||
qty += datas[(prod_id, lot_id)]['product_qty']
|
||||
|
||||
datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id}
|
||||
datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id}
|
||||
|
||||
if datas:
|
||||
flag = True
|
||||
|
|
|
@ -65,6 +65,7 @@ class stock_partial_picking_line(osv.TransientModel):
|
|||
|
||||
class stock_partial_picking(osv.osv_memory):
|
||||
_name = "stock.partial.picking"
|
||||
_rec_name = 'picking_id'
|
||||
_description = "Partial Picking Processing Wizard"
|
||||
|
||||
def _hide_tracking(self, cursor, user, ids, name, arg, context=None):
|
||||
|
|
|
@ -72,7 +72,7 @@ class subscription_subscription(osv.osv):
|
|||
'state': fields.selection([('draft','Draft'),('running','Running'),('done','Done')], 'Status'),
|
||||
'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128, help="User can choose the source document on which he wants to create documents"),
|
||||
'doc_lines': fields.one2many('subscription.subscription.history', 'subscription_id', 'Documents created', readonly=True),
|
||||
'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription"),
|
||||
'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription", states={'running':[('readonly',True)], 'done':[('readonly',True)]}),
|
||||
'note': fields.text('Notes', help="Description or Summary of Subscription"),
|
||||
}
|
||||
_defaults = {
|
||||
|
|
|
@ -145,10 +145,14 @@ class survey(osv.osv):
|
|||
return report
|
||||
|
||||
def fill_survey(self, cr, uid, ids, context=None):
|
||||
sur_obj = self.read(cr, uid, ids,['title'], context=context)
|
||||
sur_obj = self.read(cr, uid, ids,['title', 'page_ids'], context=context)
|
||||
for sur in sur_obj:
|
||||
name = sur['title']
|
||||
context.update({'active':False,'survey_id': ids[0]})
|
||||
pages = sur['page_ids']
|
||||
if not pages:
|
||||
raise osv.except_osv(_('Warning!'), _('This survey has no question defined. Please define the questions and answers first.'))
|
||||
else:
|
||||
context.update({'active':False,'survey_id': ids[0]})
|
||||
return {
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
|
|
Loading…
Reference in New Issue