[MERGE] branch merged with lp:~openerp-dev/openobject-addons/trunk-dev-addons3
bzr revid: mtr@mtr-20100707073814-34uuosy3gxyczrma
This commit is contained in:
@@ -376,7 +376,7 @@
|
||||
<separator string="Other Configuration" colspan="4"/>
|
||||
<field name="centralisation" groups="base.group_extended"/>
|
||||
<field name="entry_posted"/>
|
||||
<field name="update_posted"/>
|
||||
<!-- <field name="update_posted"/> -->
|
||||
</group>
|
||||
</group>
|
||||
</page>
|
||||
|
||||
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-06 03:37+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.6\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-07-06 03:17+0000\n"
|
||||
"PO-Revision-Date: 2010-07-06 10:39+0000\n"
|
||||
"Last-Translator: Black Jack <onetimespeed@hotmail.com>\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: 2010-07-06 03:37+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
@@ -45,7 +45,7 @@ msgstr "设置过期支付的催款信息"
|
||||
#. module: account
|
||||
#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
|
||||
msgid "Confirm statement from draft"
|
||||
msgstr "从草稿确认"
|
||||
msgstr "从草稿确认对帐单"
|
||||
|
||||
#. module: account
|
||||
#: model:account.account.type,name:account.account_type_asset
|
||||
@@ -60,7 +60,7 @@ msgstr "在动作定义使用了无效的模块名。"
|
||||
#. module: account
|
||||
#: help:account.journal,currency:0
|
||||
msgid "The currency used to enter statement"
|
||||
msgstr "报表使用的货币"
|
||||
msgstr "使用的货币"
|
||||
|
||||
#. module: account
|
||||
#: wizard_view:account_use_models,init_form:0
|
||||
@@ -454,7 +454,7 @@ msgstr "特殊计算"
|
||||
#. module: account
|
||||
#: model:process.transition,note:account.process_transition_confirmstatementfromdraft0
|
||||
msgid "Confirm statement with/without reconciliation from draft statement"
|
||||
msgstr "从草稿确认将不对账"
|
||||
msgstr "从草稿确认与对/不对帐"
|
||||
|
||||
#. module: account
|
||||
#: wizard_view:account.move.bank.reconcile,init:0
|
||||
@@ -487,7 +487,7 @@ msgstr "税用在"
|
||||
msgid ""
|
||||
"Set if the amount of tax must be included in the base amount before "
|
||||
"computing the next taxes."
|
||||
msgstr "如果这税额必须包含在计算下一个税的基础金额里, 请设置"
|
||||
msgstr "如果这税额必须在计算下一个税的基础金额里, 请设置"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_finance_periodical_processing
|
||||
@@ -954,7 +954,7 @@ msgstr "默认借方科目"
|
||||
#: model:ir.actions.act_window,name:account.action_bank_statement_tree
|
||||
#: model:ir.ui.menu,name:account.menu_bank_statement_tree
|
||||
msgid "Entries by Statements"
|
||||
msgstr "银行对帐单"
|
||||
msgstr "对帐单"
|
||||
|
||||
#. module: account
|
||||
#: model:process.transition,name:account.process_transition_analyticinvoice0
|
||||
@@ -1092,7 +1092,7 @@ msgstr "含税价计算代码"
|
||||
#: model:ir.actions.act_window,name:account.action_tax_code_list
|
||||
#: model:ir.ui.menu,name:account.menu_action_tax_code_list
|
||||
msgid "Tax codes"
|
||||
msgstr "税代码"
|
||||
msgstr "税事务"
|
||||
|
||||
#. module: account
|
||||
#: field:account.fiscal.position.template,chart_template_id:0
|
||||
@@ -1739,7 +1739,7 @@ msgstr "成本分类账的会计期间"
|
||||
#: model:ir.actions.act_window,name:account.action_bank_statement_tree2
|
||||
#: model:ir.ui.menu,name:account.menu_bank_statement_tree2
|
||||
msgid "New Statement"
|
||||
msgstr "新银行对帐单"
|
||||
msgstr "新对帐单"
|
||||
|
||||
#. module: account
|
||||
#: wizard_field:account.analytic.account.chart,init,from_date:0
|
||||
@@ -2581,7 +2581,7 @@ msgstr "应付账"
|
||||
#. module: account
|
||||
#: wizard_view:populate_statement_from_inv,init:0
|
||||
msgid "Import Invoices in Statement"
|
||||
msgstr "在银行对帐单里导入发票"
|
||||
msgstr "在对帐单里导入发票"
|
||||
|
||||
#. module: account
|
||||
#: view:account.invoice:0
|
||||
@@ -2873,12 +2873,12 @@ msgstr "跳过'草稿'状态创建分录"
|
||||
#: field:account.invoice.tax,account_id:0
|
||||
#: field:account.move.line,tax_code_id:0
|
||||
msgid "Tax Account"
|
||||
msgstr "税科目"
|
||||
msgstr "税事务"
|
||||
|
||||
#. module: account
|
||||
#: model:process.transition,note:account.process_transition_statemententries0
|
||||
msgid "From statement, create entries"
|
||||
msgstr "从对账单创建分录"
|
||||
msgstr "从对帐单创建分录"
|
||||
|
||||
#. module: account
|
||||
#: field:account.analytic.account,complete_name:0
|
||||
@@ -2913,7 +2913,7 @@ msgstr "会计报表"
|
||||
#. module: account
|
||||
#: rml:account.overdue:0
|
||||
msgid "Document: Customer account statement"
|
||||
msgstr "文档:客户报表"
|
||||
msgstr "文档:客户科目"
|
||||
|
||||
#. module: account
|
||||
#: view:product.product:0
|
||||
@@ -3003,7 +3003,7 @@ msgid ""
|
||||
"The maturity date of the generated entries for this model. You can chosse "
|
||||
"between the date of the creation action or the the date of the creation of "
|
||||
"the entries plus the partner payment terms."
|
||||
msgstr "这模型在到期日产生分录. 你能从创建日期到到付款期限间选择."
|
||||
msgstr "这模型在付款到期日产生分录. 你能从创建日期到到付款期限间选择."
|
||||
|
||||
#. module: account
|
||||
#: selection:account.analytic.journal,type:0
|
||||
@@ -3212,7 +3212,7 @@ msgstr "平均汇率"
|
||||
#: model:process.node,note:account.process_node_bankstatement0
|
||||
#: model:process.node,note:account.process_node_supplierbankstatement0
|
||||
msgid "Statement encoding produces payment entries"
|
||||
msgstr "产品付款分录清单"
|
||||
msgstr "产品付款分录对帐单"
|
||||
|
||||
#. module: account
|
||||
#: field:account.account,code:0
|
||||
@@ -3694,7 +3694,7 @@ msgstr "周期性分录科目"
|
||||
#: field:account.move.line,date_maturity:0
|
||||
#: rml:account.overdue:0
|
||||
msgid "Maturity date"
|
||||
msgstr "到期日期"
|
||||
msgstr "付款到期日"
|
||||
|
||||
#. module: account
|
||||
#: view:account.subscription:0
|
||||
@@ -3798,7 +3798,7 @@ msgstr "付款分录"
|
||||
#. module: account
|
||||
#: help:account.move.line,tax_code_id:0
|
||||
msgid "The Account can either be a base tax code or tax code account."
|
||||
msgstr "这科目可以选基础税的代码或税代码科目"
|
||||
msgstr "可以选基于的税务代码或税务代码"
|
||||
|
||||
#. module: account
|
||||
#: help:account.automatic.reconcile,init,account_ids:0
|
||||
@@ -4011,7 +4011,7 @@ msgstr "凭证"
|
||||
#: view:account.bank.statement:0
|
||||
#: field:account.bank.statement,line_ids:0
|
||||
msgid "Statement lines"
|
||||
msgstr "银行对帐单明细"
|
||||
msgstr "对帐单明细"
|
||||
|
||||
#. module: account
|
||||
#: field:account.move.line,amount_taxed:0
|
||||
@@ -4182,7 +4182,7 @@ msgstr "报表上显示的会计年度名称"
|
||||
msgid ""
|
||||
"This field is used for payable and receivable entries. You can put the limit "
|
||||
"date for the payment of this entry line."
|
||||
msgstr "这字段用于应付和应收分录. 你可以在付款分录明细放入的限制日期"
|
||||
msgstr "这字段用于应付和应收分录. 你可以放入该分录明细的付款限定日期"
|
||||
|
||||
#. module: account
|
||||
#: rml:account.tax.code.entries:0
|
||||
@@ -4552,7 +4552,7 @@ msgstr "将根据选择的模板自动设置你的科目一览表、银行帐号
|
||||
#: field:account.bank.statement.line,statement_id:0
|
||||
#: field:account.move.line,statement_id:0
|
||||
msgid "Statement"
|
||||
msgstr "银行对帐单"
|
||||
msgstr "对帐单"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_move_line_form_encode_by_move
|
||||
@@ -4622,12 +4622,12 @@ msgstr "运行中"
|
||||
msgid ""
|
||||
"Indicate if the amount of tax must be included in the base amount for the "
|
||||
"computation of the next taxes"
|
||||
msgstr "表明如果税额必须包含在计算下一个税的基础金额里"
|
||||
msgstr "指出如果税额必须在计算下一个税的基础金额里"
|
||||
|
||||
#. module: account
|
||||
#: model:process.node,name:account.process_node_draftstatement0
|
||||
msgid "Draft statement"
|
||||
msgstr "银行对帐单草稿"
|
||||
msgstr "对帐单草稿"
|
||||
|
||||
#. module: account
|
||||
#: field:account.analytic.journal,name:0
|
||||
@@ -4637,7 +4637,7 @@ msgstr "分录集合名称"
|
||||
#. module: account
|
||||
#: model:process.transition,note:account.process_transition_invoiceimport0
|
||||
msgid "Import invoice from statement"
|
||||
msgstr "从银行对帐单导入发票"
|
||||
msgstr "从对帐单导入发票"
|
||||
|
||||
#. module: account
|
||||
#: selection:account.automatic.reconcile,init,power:0
|
||||
@@ -4730,7 +4730,7 @@ msgstr "已取消"
|
||||
#: model:ir.actions.act_window,name:account.action_bank_statement_draft_tree
|
||||
#: model:ir.ui.menu,name:account.menu_bank_statement_draft_tree
|
||||
msgid "Draft statements"
|
||||
msgstr "银行对帐单草稿"
|
||||
msgstr "对帐单草稿"
|
||||
|
||||
#. module: account
|
||||
#: wizard_field:populate_statement_from_inv,init,date:0
|
||||
@@ -5887,7 +5887,7 @@ msgstr "财务结构"
|
||||
#. module: account
|
||||
#: model:process.process,name:account.process_process_statementprocess0
|
||||
msgid "Statement Process"
|
||||
msgstr "银行对帐单处理"
|
||||
msgstr "对帐单处理"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.model,name:account.model_account_bank_statement_reconcile
|
||||
|
||||
@@ -88,3 +88,6 @@
|
||||
"access_report_account_type_sales","report.account_type.sales","model_report_account_type_sales","account.group_account_manager",1,0,0,0
|
||||
"access_report_account_sales","report.account.sales","model_report_account_sales","account.group_account_manager",1,0,0,0
|
||||
"access_account_invoice_report","account.invoice.report","model_account_invoice_report","account.group_account_manager",1,0,0,0
|
||||
"access_account_account_report_manager","account.account.report","model_account_account_report","account.group_account_manager",1,0,0,0
|
||||
"access_account_entries_report_manager","account.entries.report","model_account_entries_report","account.group_account_manager",1,0,0,0
|
||||
"access_analytic_entries_report_manager","analytic.entries.report","model_analytic_entries_report","account.group_account_manager",1,0,0,0
|
||||
|
||||
|
@@ -58,14 +58,19 @@ class account_statement_from_invoice_lines(osv.osv_memory):
|
||||
# else:
|
||||
ctx['date'] = line_date
|
||||
amount = 0.0
|
||||
|
||||
if line.debit > 0:
|
||||
amount = line.debit
|
||||
elif line.credit > 0:
|
||||
amount = -line.credit
|
||||
|
||||
if line.amount_currency:
|
||||
amount = currency_obj.compute(cr, uid, line.currency_id.id,
|
||||
amount = currency_obj.compute(cursor, user, line.currency_id.id,
|
||||
statement.currency.id, line.amount_currency, context=ctx)
|
||||
else:
|
||||
if line.debit > 0:
|
||||
amount=line.debit
|
||||
elif line.credit > 0:
|
||||
amount=-line.credit
|
||||
elif (line.invoice and line.invoice.currency_id.id <> statement.currency.id):
|
||||
amount = currency_obj.compute(cursor, user, line.invoice.currency_id.id,
|
||||
statement.currency.id, amount, context=ctx)
|
||||
|
||||
reconcile_id = statement_reconcile_obj.create(cr, uid, {
|
||||
'line_ids': [(6, 0, [line.id])]
|
||||
}, context=context)
|
||||
|
||||
@@ -200,7 +200,7 @@ class account_analytic_account(osv.osv):
|
||||
res[id] = round(res.get(id, 0.0),2) + round(res2.get(id, 0.0),2)
|
||||
return res
|
||||
|
||||
def _last_worked_date_calc (self, cr, uid, ids, name, arg, context = None):
|
||||
def _last_worked_date_calc (self, cr, uid, ids, name, arg, context=None):
|
||||
res = {}
|
||||
parent_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)]))
|
||||
if parent_ids:
|
||||
@@ -384,6 +384,7 @@ class account_analytic_account(osv.osv):
|
||||
'month_ids': fields.function(_month, method=True, type='many2many', relation='account_analytic_analysis.summary.month', string='Month'),
|
||||
'user_ids': fields.function(_user, method=True, type="many2many", relation='account_analytic_analysis.summary.user', string='User'),
|
||||
}
|
||||
|
||||
account_analytic_account()
|
||||
|
||||
class account_analytic_account_summary_user(osv.osv):
|
||||
@@ -507,11 +508,11 @@ class account_analytic_account_summary_user(osv.osv):
|
||||
res.extend(cr.dictfetchall())
|
||||
else:
|
||||
res = map(lambda x: {'id': x}, ids)
|
||||
|
||||
res_trans_obj = self.pool.get('ir.translation')
|
||||
for f in fields_pre:
|
||||
if self._columns[f].translate:
|
||||
ids = map(lambda x: x['id'], res)
|
||||
res_trans = self.pool.get('ir.translation')._get_ids(cr, user, self._name+','+f, 'model', context.get('lang', False) or 'en_US', ids)
|
||||
res_trans = res_trans_obj._get_ids(cr, user, self._name+','+f, 'model', context.get('lang', False) or 'en_US', ids)
|
||||
for r in res:
|
||||
r[f] = res_trans.get(r['id'], False) or r[f]
|
||||
|
||||
@@ -683,11 +684,12 @@ class account_analytic_account_summary_month(osv.osv):
|
||||
res.extend(cr.dictfetchall())
|
||||
else:
|
||||
res = map(lambda x: {'id': x}, ids)
|
||||
|
||||
|
||||
res_trans_obj = self.pool.get('ir.translation')
|
||||
for f in fields_pre:
|
||||
if self._columns[f].translate:
|
||||
ids = map(lambda x: x['id'], res)
|
||||
res_trans = self.pool.get('ir.translation')._get_ids(cr, user, self._name+','+f, 'model', context.get('lang', False) or 'en_US', ids)
|
||||
res_trans = res_trans_obj._get_ids(cr, user, self._name+','+f, 'model', context.get('lang', False) or 'en_US', ids)
|
||||
for r in res:
|
||||
r[f] = res_trans.get(r['id'], False) or r[f]
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-04 03:45+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
|
||||
@@ -33,7 +33,7 @@ Allows to automatically select analytic accounts based on criterions:
|
||||
""",
|
||||
'author' : 'Tiny',
|
||||
'website' : 'http://www.openerp.com',
|
||||
'depends' : ['account', 'sale'],
|
||||
'depends' : ['sale'],
|
||||
'init_xml' : [],
|
||||
'update_xml': ['security/ir.model.access.csv', 'account_analytic_default_view.xml'],
|
||||
'demo_xml' : [],
|
||||
|
||||
@@ -38,6 +38,7 @@ class account_analytic_default(osv.osv):
|
||||
'date_start': fields.date('Start Date'),
|
||||
'date_stop': fields.date('End Date'),
|
||||
}
|
||||
|
||||
def account_get(self, cr, uid, product_id=None, partner_id=None, user_id=None, date=None, context=None):
|
||||
domain = []
|
||||
if product_id:
|
||||
@@ -65,20 +66,22 @@ class account_analytic_default(osv.osv):
|
||||
res = rec
|
||||
best_index = index
|
||||
return res
|
||||
|
||||
account_analytic_default()
|
||||
|
||||
class account_invoice_line(osv.osv):
|
||||
_inherit = 'account.invoice.line'
|
||||
_description = 'Invoice Line'
|
||||
|
||||
def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
|
||||
res_prod = super(account_invoice_line,self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition, price_unit, address_invoice_id, currency_id=currency_id, context=context)
|
||||
def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fiscal_position=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
|
||||
res_prod = super(account_invoice_line,self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fiscal_position, price_unit, address_invoice_id, currency_id=currency_id, context=context)
|
||||
rec = self.pool.get('account.analytic.default').account_get(cr, uid, product, partner_id, uid, time.strftime('%Y-%m-%d'), context)
|
||||
if rec:
|
||||
res_prod['value'].update({'account_analytic_id':rec.analytic_id.id})
|
||||
else:
|
||||
res_prod['value'].update({'account_analytic_id':False})
|
||||
return res_prod
|
||||
|
||||
account_invoice_line()
|
||||
|
||||
|
||||
@@ -105,14 +108,14 @@ class sale_order_line(osv.osv):
|
||||
create_ids = super(sale_order_line,self).invoice_line_create(cr, uid, ids, context)
|
||||
if not ids:
|
||||
return create_ids
|
||||
sale_line_obj = self.browse(cr, uid, ids[0], context)
|
||||
pool_inv_line = self.pool.get('account.invoice.line')
|
||||
|
||||
for line in pool_inv_line.browse(cr, uid, create_ids, context):
|
||||
rec = self.pool.get('account.analytic.default').account_get(cr, uid, line.product_id.id, sale_line_obj.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
|
||||
sale_line = self.browse(cr, uid, ids[0], context)
|
||||
inv_line_obj = self.pool.get('account.invoice.line')
|
||||
anal_def_obj = self.pool.get('account.analytic.default')
|
||||
for line in inv_line_obj.browse(cr, uid, create_ids, context):
|
||||
rec = anal_def_obj.account_get(cr, uid, line.product_id.id, sale_line.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
|
||||
|
||||
if rec:
|
||||
pool_inv_line.write(cr, uid, [line.id], {'account_analytic_id':rec.analytic_id.id}, context=context)
|
||||
inv_line_obj.write(cr, uid, [line.id], {'account_analytic_id':rec.analytic_id.id}, context=context)
|
||||
return create_ids
|
||||
|
||||
sale_order_line()
|
||||
|
||||
@@ -53,6 +53,7 @@ class account_analytic_plan(osv.osv):
|
||||
'name': fields.char('Analytic Plan', size=64, required=True, select=True,),
|
||||
'plan_ids': fields.one2many('account.analytic.plan.line','plan_id','Analytic Plans'),
|
||||
}
|
||||
|
||||
account_analytic_plan()
|
||||
|
||||
class account_analytic_plan_line(osv.osv):
|
||||
@@ -71,6 +72,7 @@ class account_analytic_plan_line(osv.osv):
|
||||
'min_required': 100.0,
|
||||
'max_required': 100.0,
|
||||
}
|
||||
|
||||
account_analytic_plan_line()
|
||||
|
||||
class account_analytic_plan_instance(osv.osv):
|
||||
@@ -187,16 +189,18 @@ class account_analytic_plan_instance(osv.osv):
|
||||
pids = self.pool.get('account.analytic.plan.instance').search(cr, uid, [('name','=',vals['name']),('code','=',vals['code']),('plan_id','<>',False)])
|
||||
if pids:
|
||||
raise osv.except_osv(_('Error'), _('A model having this name and code already exists !'))
|
||||
|
||||
res = self.pool.get('account.analytic.plan.line').search(cr, uid, [('plan_id','=',journal.plan_id.id)])
|
||||
|
||||
acct_anal_acct = self.pool.get('account.analytic.account')
|
||||
acct_anal_plan_line_obj = self.pool.get('account.analytic.plan.line')
|
||||
res = acct_anal_plan_line_obj.search(cr, uid, [('plan_id','=',journal.plan_id.id)])
|
||||
for i in res:
|
||||
total_per_plan = 0
|
||||
item = self.pool.get('account.analytic.plan.line').browse(cr, uid, i)
|
||||
item = acct_anal_plan_line_obj.browse(cr, uid, i)
|
||||
temp_list=['account1_ids','account2_ids','account3_ids','account4_ids','account5_ids','account6_ids']
|
||||
for l in temp_list:
|
||||
if vals.has_key(l):
|
||||
for tempo in vals[l]:
|
||||
if self.pool.get('account.analytic.account').search(cr, uid, [('parent_id','child_of',[item.root_analytic_id.id]),('id','=',tempo[2]['analytic_account_id'])]):
|
||||
if acct_anal_acct.search(cr, uid, [('parent_id','child_of',[item.root_analytic_id.id]),('id','=',tempo[2]['analytic_account_id'])]):
|
||||
total_per_plan += tempo[2]['rate']
|
||||
if total_per_plan < item.min_required or total_per_plan > item.max_required:
|
||||
raise osv.except_osv(_('Value Error') ,_('The Total Should be Between %s and %s') % (str(item.min_required), str(item.max_required)))
|
||||
@@ -252,6 +256,7 @@ class account_journal(osv.osv):
|
||||
_columns = {
|
||||
'plan_id':fields.many2one('account.analytic.plan', 'Analytic Plans'),
|
||||
}
|
||||
|
||||
account_journal()
|
||||
|
||||
class account_invoice_line(osv.osv):
|
||||
@@ -277,6 +282,7 @@ class account_invoice_line(osv.osv):
|
||||
if rec and rec.analytics_id:
|
||||
res_prod['value'].update({'analytics_id':rec.analytics_id.id})
|
||||
return res_prod
|
||||
|
||||
account_invoice_line()
|
||||
|
||||
class account_move_line(osv.osv):
|
||||
@@ -345,6 +351,7 @@ class account_invoice(osv.osv):
|
||||
sign = -1
|
||||
|
||||
iml = self.pool.get('account.invoice.line').move_line_get(cr, uid, inv.id)
|
||||
acct_ins_obj = self.pool.get('account.analytic.plan.instance')
|
||||
|
||||
for il in iml:
|
||||
if il['analytics_id']:
|
||||
@@ -353,14 +360,14 @@ class account_invoice(osv.osv):
|
||||
ref = inv.reference
|
||||
else:
|
||||
ref = self._convert_ref(cr, uid, inv.number)
|
||||
obj_move_line=self.pool.get('account.analytic.plan.instance').browse(cr, uid, il['analytics_id'])
|
||||
amount_calc=cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, il['price'], context={'date': inv.date_invoice}) * sign
|
||||
qty=il['quantity']
|
||||
obj_move_line = acct_ins_obj.browse(cr, uid, il['analytics_id'])
|
||||
amount_calc = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, il['price'], context={'date': inv.date_invoice}) * sign
|
||||
qty = il['quantity']
|
||||
il['analytic_lines']=[]
|
||||
for line2 in obj_move_line.account_ids:
|
||||
amt=amount_calc * (line2.rate/100)
|
||||
qtty=qty* (line2.rate/100)
|
||||
al_vals={
|
||||
amt = amount_calc * (line2.rate/100)
|
||||
qtty = qty* (line2.rate/100)
|
||||
al_vals = {
|
||||
'name': il['name'],
|
||||
'date': inv['date_invoice'],
|
||||
'unit_amount':qtty,
|
||||
@@ -389,6 +396,7 @@ class analytic_default(osv.osv):
|
||||
_columns = {
|
||||
'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
|
||||
}
|
||||
|
||||
analytic_default()
|
||||
|
||||
class sale_order_line(osv.osv):
|
||||
@@ -398,14 +406,15 @@ class sale_order_line(osv.osv):
|
||||
def invoice_line_create(self, cr, uid, ids, context=None):
|
||||
create_ids = super(sale_order_line,self).invoice_line_create(cr, uid, ids, context)
|
||||
if ids:
|
||||
sale_line_obj = self.browse(cr, uid, ids[0], context)
|
||||
pool_inv_line = self.pool.get('account.invoice.line')
|
||||
|
||||
for line in pool_inv_line.browse(cr, uid, create_ids, context):
|
||||
rec = self.pool.get('account.analytic.default').account_get(cr, uid, line.product_id.id, sale_line_obj.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
|
||||
sale_line = self.browse(cr, uid, ids[0], context)
|
||||
inv_line_obj = self.pool.get('account.invoice.line')
|
||||
acct_anal_def_obj = self.pool.get('account.analytic.default')
|
||||
|
||||
for line in inv_line_obj.browse(cr, uid, create_ids, context):
|
||||
rec = acct_anal_def_obj.account_get(cr, uid, line.product_id.id, sale_line.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
|
||||
|
||||
if rec:
|
||||
pool_inv_line.write(cr, uid, [line.id], {'analytics_id':rec.analytics_id.id}, context=context)
|
||||
inv_line_obj.write(cr, uid, [line.id], {'analytics_id':rec.analytics_id.id}, context=context)
|
||||
return create_ids
|
||||
|
||||
sale_order_line()
|
||||
|
||||
@@ -22,4 +22,5 @@ import product
|
||||
import stock
|
||||
import purchase
|
||||
import invoice
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -17,11 +17,12 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name" : "Stock Accounting for Anglo Saxon countries",
|
||||
"version" : "1.2",
|
||||
"author" : "Tiny, Veritos",
|
||||
"website" : "http://tinyerp.com - http://veritos.nl",
|
||||
"name" : "Stock Accounting for Anglo Saxon countries",
|
||||
"version" : "1.2",
|
||||
"author" : "Tiny, Veritos",
|
||||
"website" : "http://tinyerp.com - http://veritos.nl",
|
||||
"description" : """This module will support the Anglo-Saxons accounting methodology by
|
||||
changing the accounting logic with stock transactions. The difference between the Anglo-Saxon accounting countries
|
||||
and the Rhine or also called Continental accounting countries is the moment of taking the Cost of Goods Sold versus Cost of Sales.
|
||||
@@ -29,12 +30,13 @@
|
||||
This module will add this functionality by using a interim account, to store the value of shipped goods and will contra book this interim account
|
||||
when the invoice is created to transfer this amount to the debtor or creditor account.
|
||||
Secondly, price differences between actual purchase price and fixed product standard price are booked on a seperate account""",
|
||||
"depends" : ["product", "account", "sale", "purchase", "stock"],
|
||||
"category" : "Generic Modules/Inventory Control",
|
||||
"init_xml" : [],
|
||||
"demo_xml" : [],
|
||||
"depends" : ["product", "purchase"],
|
||||
"category" : "Generic Modules/Inventory Control",
|
||||
"init_xml" : [],
|
||||
"demo_xml" : [],
|
||||
"update_xml" : ["product_view.xml",],
|
||||
"active": False,
|
||||
"active" : False,
|
||||
"installable": True
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -5,13 +5,11 @@
|
||||
<field name="name">product.normal.form.inherit.stock</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="inherit_id" ref="account.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page/field[@name='property_account_expense']" position="after">
|
||||
<field name="property_account_creditor_price_difference" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
|
||||
<newline/>
|
||||
<!-- <field name="property_account_sending_goods" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}" />-->
|
||||
<!-- <field name="property_account_received_goods" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />-->
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -20,13 +18,11 @@
|
||||
<field name="name">product.template.product.form.inherit</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="product.product_template_form_view"/>
|
||||
<field name="inherit_id" ref="account.product_template_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page/field[@name='property_account_expense']" position="after">
|
||||
<field name="property_account_creditor_price_difference" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
|
||||
<newline/>
|
||||
<!-- <field name="property_account_sending_goods" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}" />-->
|
||||
<!-- <field name="property_account_received_goods" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />-->
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
@@ -41,8 +37,6 @@
|
||||
<group col="2" colspan="2">
|
||||
<separator string=" Accounting Property" colspan="2"/>
|
||||
<field name="property_account_creditor_price_difference_categ" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
|
||||
<!-- <field name="property_account_sending_goods_categ" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}" />-->
|
||||
<!-- <field name="property_account_received_goods_categ" domain="[('type','<>','view'),('type','<>','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />-->
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
@@ -22,5 +22,6 @@
|
||||
import crossovered_budget
|
||||
import report
|
||||
import wizard
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -20,14 +20,9 @@
|
||||
##############################################################################
|
||||
|
||||
from osv import osv,fields
|
||||
import tools
|
||||
import netsvc
|
||||
from mx import DateTime
|
||||
import time
|
||||
import datetime
|
||||
from tools.translate import _
|
||||
|
||||
|
||||
def strToDate(dt):
|
||||
dt_date=datetime.date(int(dt[0:4]),int(dt[5:7]),int(dt[8:10]))
|
||||
return dt_date
|
||||
@@ -127,13 +122,6 @@ class crossovered_budget(osv.osv):
|
||||
'creating_user_id': lambda self,cr,uid,context: uid,
|
||||
}
|
||||
|
||||
# def action_set_to_draft(self, cr, uid, ids, *args):
|
||||
# self.write(cr, uid, ids, {'state': 'draft'})
|
||||
# wf_service = netsvc.LocalService('workflow')
|
||||
# for id in ids:
|
||||
# wf_service.trg_create(uid, self._name, id, cr)
|
||||
# return True
|
||||
|
||||
def budget_confirm(self, cr, uid, ids, *args):
|
||||
self.write(cr, uid, ids, {
|
||||
'state':'confirm'
|
||||
|
||||
@@ -19,17 +19,16 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
"name" : "Account Cancel",
|
||||
"version" : "1.1",
|
||||
"depends" : ["account"],
|
||||
"author" : "Tiny",
|
||||
"category": 'Generic Modules/Accounting',
|
||||
"description": """
|
||||
Module Add Allow cancelling entries field on form view of account journal if it set to true it allows user to cancel entries & invoices.
|
||||
Module adds 'Allow cancelling entries' field on form view of account journal. If set to true it allows user to cancel entries & invoices.
|
||||
""",
|
||||
'website': 'http://www.openerp.com',
|
||||
"depends" : ["account"],
|
||||
'init_xml': [],
|
||||
'update_xml': ['account_cancel_view.xml' ],
|
||||
'demo_xml': [],
|
||||
@@ -37,4 +36,5 @@
|
||||
'active': False,
|
||||
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="account.view_account_journal_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/notebook/page[@string='General Information']/group/field[@name='centralisation']" position="after">
|
||||
<xpath expr="/form/notebook/page[@string='General Information']/group/group/field[@name='centralisation']" position="after">
|
||||
<field name="update_posted"/>
|
||||
</xpath>
|
||||
</field>
|
||||
|
||||
@@ -21,5 +21,6 @@
|
||||
|
||||
import account_coda
|
||||
import wizard
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -20,23 +20,24 @@
|
||||
##############################################################################
|
||||
|
||||
{
|
||||
"name":"Account CODA - import bank statements from coda file",
|
||||
"version":"1.0",
|
||||
"author":"Tiny",
|
||||
"category":"Account CODA",
|
||||
"description":"""
|
||||
"name" : "Account CODA - import bank statements from coda file",
|
||||
"version" : "1.0",
|
||||
"author" : "Tiny",
|
||||
"category" : "Account CODA",
|
||||
"description": """
|
||||
Module provides functionality to import
|
||||
bank statements from coda files.
|
||||
""",
|
||||
"depends":["base", "account"],
|
||||
"demo_xml":["account_coda_demo.xml"],
|
||||
"init_xml":[],
|
||||
"update_xml" : ["security/ir.model.access.csv",
|
||||
"depends" : ["account"],
|
||||
"demo_xml" : [],
|
||||
"init_xml" : [],
|
||||
"update_xml": ["security/ir.model.access.csv",
|
||||
"wizard/account_coda_import.xml",
|
||||
"account_coda_view.xml"],
|
||||
"active":False,
|
||||
"installable":True,
|
||||
"active" : False,
|
||||
"installable" : True,
|
||||
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -26,25 +26,26 @@ class account_coda(osv.osv):
|
||||
_name = "account.coda"
|
||||
_description = "coda for an Account"
|
||||
_columns = {
|
||||
'name': fields.binary('Coda file', readonly=True ,help="Store the detail of bank statements"),
|
||||
'statement_ids': fields.one2many('account.bank.statement','coda_id','Generated Bank Statements', readonly=True),
|
||||
'name': fields.binary('Coda file', readonly=True, help="Store the detail of bank statements"),
|
||||
'statement_ids': fields.one2many('account.bank.statement', 'coda_id', 'Generated Bank Statements', readonly=True),
|
||||
'note': fields.text('Import log', readonly=True),
|
||||
'journal_id': fields.many2one('account.journal','Journal', readonly=True, select=True,help="Bank Journal"),
|
||||
'journal_id': fields.many2one('account.journal', 'Journal', readonly=True, select=True, help="Bank Journal"),
|
||||
'date': fields.date('Date', readonly=True, select=True, help="Import Date"),
|
||||
'user_id': fields.many2one('res.users','User', readonly=True, select=True),
|
||||
'user_id': fields.many2one('res.users', 'User', readonly=True, select=True),
|
||||
}
|
||||
_defaults = {
|
||||
'date': time.strftime('%Y-%m-%d'),
|
||||
'user_id': lambda self,cr,uid,context: uid,
|
||||
}
|
||||
|
||||
account_coda()
|
||||
|
||||
class account_bank_statement(osv.osv):
|
||||
_inherit = "account.bank.statement"
|
||||
_columns = {
|
||||
'coda_id':fields.many2one('account.coda','Coda'),
|
||||
'coda_id':fields.many2one('account.coda', 'Coda'),
|
||||
}
|
||||
|
||||
account_bank_statement()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -21,7 +21,6 @@
|
||||
##############################################################################
|
||||
|
||||
import time
|
||||
from mx import DateTime
|
||||
import base64
|
||||
|
||||
from osv import fields
|
||||
@@ -54,7 +53,8 @@ class account_coda_import(osv.osv_memory):
|
||||
'coda': fields.binary('Coda File', required=True),
|
||||
'note':fields.text('Log'),
|
||||
}
|
||||
def coda_parsing(self, cr, uid, ids, context):
|
||||
|
||||
def coda_parsing(self, cr, uid, ids, context=None):
|
||||
|
||||
journal_obj=self.pool.get('account.journal')
|
||||
account_period_obj = self.pool.get('account.period')
|
||||
@@ -65,10 +65,12 @@ class account_coda_import(osv.osv_memory):
|
||||
statement_reconcile_obj = self.pool.get('account.bank.statement.reconcile')
|
||||
account_coda_obj = self.pool.get('account.coda')
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
|
||||
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
data = self.read(cr, uid, ids)[0]
|
||||
|
||||
|
||||
codafile = data['coda']
|
||||
journal_code = journal_obj.browse(cr, uid, data['journal_id'], context).code
|
||||
|
||||
@@ -265,6 +267,7 @@ class account_coda_import(osv.osv_memory):
|
||||
context.update({ 'statment_ids':bkst_list})
|
||||
model_data_ids = mod_obj.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'account_coda_note_view')], context=context)
|
||||
resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
|
||||
|
||||
return {
|
||||
'name': _('Result'),
|
||||
'res_id': ids[0],
|
||||
@@ -277,7 +280,10 @@ class account_coda_import(osv.osv_memory):
|
||||
'context': context,
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
def action_open_window(self, cr, uid, data, context):
|
||||
|
||||
def action_open_window(self, cr, uid, data, context=None):
|
||||
if not context:
|
||||
cotext = {}
|
||||
return {
|
||||
'domain':"[('id','in',%s)]"%(context.get('statment_ids', False)),
|
||||
'name': 'Statement',
|
||||
@@ -287,6 +293,7 @@ class account_coda_import(osv.osv_memory):
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
|
||||
account_coda_import()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -40,4 +40,5 @@ This module implement the modification on the invoice form.
|
||||
'active': False,
|
||||
'certificate': '0070514190381',
|
||||
}
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
import time
|
||||
|
||||
from osv import fields, osv
|
||||
import decimal_precision as dp
|
||||
|
||||
class account_invoice(osv.osv):
|
||||
_inherit = "account.invoice"
|
||||
@@ -117,7 +116,7 @@ class account_invoice_line(osv.osv):
|
||||
return super(account_invoice_line, self)._price_unit_default(cr, uid, context)
|
||||
return 0
|
||||
|
||||
def _get_invoice(self, cr, uid, ids, context):
|
||||
def _get_invoice(self, cr, uid, ids, context=None):
|
||||
result = {}
|
||||
for inv in self.pool.get('account.invoice').browse(cr, uid, ids, context=context):
|
||||
for line in inv.invoice_line:
|
||||
@@ -126,9 +125,9 @@ class account_invoice_line(osv.osv):
|
||||
|
||||
_columns = {
|
||||
'price_subtotal': fields.function(_amount_line2, method=True, string='Subtotal w/o tax', multi='amount',
|
||||
store={'account.invoice':(_get_invoice,['price_type'],10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}),
|
||||
store={'account.invoice':(_get_invoice,['price_type'], 10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}),
|
||||
'price_subtotal_incl': fields.function(_amount_line2, method=True, string='Subtotal', multi='amount',
|
||||
store={'account.invoice':(_get_invoice,['price_type'],10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}),
|
||||
store={'account.invoice':(_get_invoice,['price_type'], 10), 'account.invoice.line': (lambda self, cr, uid, ids, c={}: ids, None,10)}),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
|
||||
@@ -31,15 +31,10 @@
|
||||
""",
|
||||
"category" : "Generic Modules/Accounting",
|
||||
"website" : "http://tinyerp.com",
|
||||
"depends" : [
|
||||
"base",
|
||||
"account"
|
||||
],
|
||||
"init_xml" : [
|
||||
],
|
||||
"depends" : ["account"],
|
||||
"init_xml" : [],
|
||||
|
||||
"demo_xml" : [
|
||||
],
|
||||
"demo_xml" : [],
|
||||
|
||||
"update_xml" : [
|
||||
"security/ir.model.access.csv",
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_account_voucher_user","account.voucher","model_account_voucher","account.group_account_user",1,0,0,0
|
||||
"access_account_voucher_line_user","account.voucher.line","model_account_voucher_line","account.group_account_user",1,0,0,0
|
||||
"access_account_open_voucher_user","account.open.voucher","model_account_open_voucher","account.group_account_user",1,0,0,0
|
||||
"access_account_voucher_manager","account.voucher","model_account_voucher","account.group_account_manager",1,1,1,1
|
||||
"access_account_voucher_line_manager","account.voucher.line","model_account_voucher_line","account.group_account_manager",1,1,1,1
|
||||
"access_account_open_voucher_manager","account.open.voucher","model_account_open_voucher","account.group_account_manager",1,1,1,1
|
||||
|
||||
|
@@ -138,7 +138,7 @@
|
||||
|
||||
<!-- Receipt Vouchers -->
|
||||
<record model="ir.actions.act_window" id="action_receipt_vou_voucher_list">
|
||||
<field name="name">Customer Vouchers</field>
|
||||
<field name="name">Receivable Vouchers</field>
|
||||
<field name="res_model">account.voucher</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
@@ -151,7 +151,7 @@
|
||||
|
||||
<!-- Purchase Vouchers -->
|
||||
<record model="ir.actions.act_window" id="action_pay_vou_voucher_list">
|
||||
<field name="name">Vendor Vouchers</field>
|
||||
<field name="name">Payable Vouchers</field>
|
||||
<field name="res_model">account.voucher</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_account_voucher_unreconcile_user","account.voucher.unreconcile","model_account_voucher_unreconcile","account.group_account_user",1,0,0,0
|
||||
"access_account_voucher_unreconcile_manager","account.voucher.unreconcile","model_account_voucher_unreconcile","account.group_account_manager",1,1,1,1
|
||||
|
||||
|
@@ -22,4 +22,3 @@
|
||||
"access_report_object_encoded","report.object.encoded","model_report_object_encoded","base.group_user",1,0,0,0
|
||||
"access_report_object_encoded_manager","report.object.encoded.manager","model_report_object_encoded_manager","base.group_user",1,0,0,0
|
||||
"access_report_unclassified_objects","report.unclassified.objects","model_report_unclassified_objects","base.group_user",1,0,0,0
|
||||
"access_auction_lots_buyer_map_user","auction_lots_buyer_map_user","model_auction_lots_buyer_map","base.group_user",1,0,0,0
|
||||
|
||||
|
@@ -21,8 +21,6 @@
|
||||
|
||||
from datetime import datetime
|
||||
from osv import fields, osv, orm
|
||||
from osv.orm import except_orm
|
||||
from osv.osv import osv_pool
|
||||
from tools.translate import _
|
||||
import mx.DateTime
|
||||
import pooler
|
||||
@@ -42,17 +40,14 @@ class base_action_rule(osv.osv):
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
return self.state_get(cr, uid, context=context)
|
||||
|
||||
|
||||
def state_get(self, cr, uid, context={}):
|
||||
""" Get State
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
return [('', '')]
|
||||
|
||||
def priority_get(self, cr, uid, context={}):
|
||||
@@ -61,14 +56,13 @@ class base_action_rule(osv.osv):
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
return [('', '')]
|
||||
|
||||
_columns = {
|
||||
'name': fields.many2one('ir.model', 'Object', required=True),
|
||||
'max_level': fields.integer('Max Level', help='Specifies maximum level.'),
|
||||
'create_date': fields.datetime('Create Date', readonly=1),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true,\
|
||||
'active': fields.boolean('Active', help="If the active field is set to False,\
|
||||
it will allow you to hide the rule without removing it."),
|
||||
'sequence': fields.integer('Sequence', help="Gives the sequence order \
|
||||
when displaying a list of rules."),
|
||||
@@ -85,10 +79,7 @@ specifies you can put a negative number. If you need a delay before the \
|
||||
trigger date, like sending a reminder 15 minutes before a meeting."),
|
||||
'trg_date_range_type': fields.selection([('minutes', 'Minutes'), ('hour', 'Hours'), \
|
||||
('day', 'Days'), ('month', 'Months')], 'Delay type'),
|
||||
|
||||
|
||||
'trg_user_id': fields.many2one('res.users', 'Responsible'),
|
||||
|
||||
'trg_partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'trg_partner_categ_id': fields.many2one('res.partner.category', 'Partner Category'),
|
||||
'trg_state_from': fields.selection(_state_get, 'State', size=16),
|
||||
@@ -136,7 +127,9 @@ the rule to mark CC(mail to any other person defined in actions)."),
|
||||
|
||||
def pre_action(self, cr, uid, ids, model, context=None):
|
||||
# Searching for action rules
|
||||
cr.execute("SELECT model.model, rule.id FROM base_action_rule rule LEFT JOIN ir_model model on (model.id = rule.name)")
|
||||
cr.execute("SELECT model.model, rule.id FROM base_action_rule rule \
|
||||
LEFT JOIN ir_model model on (model.id = rule.name) \
|
||||
where active")
|
||||
res = cr.fetchall()
|
||||
# Check if any rule matching with current object
|
||||
for obj_name, rule_id in res:
|
||||
@@ -171,10 +164,9 @@ the rule to mark CC(mail to any other person defined in actions)."),
|
||||
def _register_hook(self, cr, uid, ids, context=None):
|
||||
if not context:
|
||||
context = {}
|
||||
model_pool = self.pool.get('ir.model')
|
||||
for action_rule in self.browse(cr, uid, ids, context=context):
|
||||
model = action_rule.name.model
|
||||
obj_pool = self.pool.get(model)
|
||||
obj_pool = self.pool.get(model)
|
||||
obj_pool.__setattr__('create', self._create(obj_pool.create, model, context=context))
|
||||
obj_pool.__setattr__('write', self._write(obj_pool.write, model, context=context))
|
||||
return True
|
||||
@@ -194,7 +186,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
|
||||
"""
|
||||
This Function is call by scheduler.
|
||||
"""
|
||||
rule_pool= self.pool.get('base.action.rule')
|
||||
rule_pool = self.pool.get('base.action.rule')
|
||||
rule_ids = rule_pool.search(cr, uid, [], context=context)
|
||||
return self._register_hook(cr, uid, rule_ids, context=context)
|
||||
|
||||
@@ -202,7 +194,6 @@ the rule to mark CC(mail to any other person defined in actions)."),
|
||||
def format_body(self, body):
|
||||
""" Foramat Action rule's body
|
||||
@param self: The object pointer """
|
||||
|
||||
return body and tools.ustr(body) or ''
|
||||
|
||||
def format_mail(self, obj, body):
|
||||
@@ -392,7 +383,7 @@ the rule to mark CC(mail to any other person defined in actions)."),
|
||||
obj.date_action_next = dt
|
||||
model_obj.write(cr, uid, [obj.id], {'date_action_next': dt}, context)
|
||||
else:
|
||||
ok = action.trg_date_type=='none'
|
||||
ok = action.trg_date_type == 'none'
|
||||
|
||||
if ok:
|
||||
self.do_action(cr, uid, action, model_obj, obj, context)
|
||||
@@ -431,7 +422,7 @@ class ir_cron(osv.osv):
|
||||
|
||||
def _poolJobs(self, db_name, check=False):
|
||||
try:
|
||||
db, pool = pooler.get_db_and_pool(db_name)
|
||||
db = pooler.get_db(db_name)
|
||||
except:
|
||||
return False
|
||||
cr = db.cursor()
|
||||
@@ -439,12 +430,12 @@ class ir_cron(osv.osv):
|
||||
next = datetime.now().strftime('%Y-%m-%d %H:00:00')
|
||||
# Putting nextcall always less than current time in order to call it every time
|
||||
cr.execute('UPDATE ir_cron set nextcall = \'%s\' where numbercall<>0 and active and model=\'base.action.rule\' ' % (next))
|
||||
cr.commit()
|
||||
res = super(ir_cron, self)._poolJobs(db_name, check=check)
|
||||
finally:
|
||||
cr.commit()
|
||||
cr.close()
|
||||
|
||||
super(ir_cron, self)._poolJobs(db_name, check=check)
|
||||
|
||||
ir_cron()
|
||||
|
||||
|
||||
|
||||
@@ -57,22 +57,18 @@
|
||||
<field name="server_action_id"/>
|
||||
</page>
|
||||
<page string="Email Actions">
|
||||
<!-- <group col="4" colspan="2">-->
|
||||
<separator colspan="4" string="Email Reminders"/>
|
||||
<field name="act_remind_partner"/>
|
||||
<field name="act_remind_attach"/>
|
||||
<field name="act_remind_user"/>
|
||||
<group col="2" colspan="2" attrs="{'invisible': [('act_remind_user','=',False)]}">
|
||||
<field name="act_reply_to" attrs="{'required':[('act_remind_user','=',True)]}"/>
|
||||
</group>
|
||||
<separator colspan="4" string="Email Information"/>
|
||||
<field name="act_mail_to_watchers"/>
|
||||
<field name="act_mail_to_user"/>
|
||||
<field colspan="4" name="act_mail_to_email"/>
|
||||
<!-- </group>-->
|
||||
<!-- <group col="4" colspan="2">-->
|
||||
<separator colspan="4" string="Email Reminders"/>
|
||||
<field name="act_remind_partner"/>
|
||||
<field name="act_remind_attach"/>
|
||||
<field name="act_remind_user"/>
|
||||
<group col="2" colspan="2" attrs="{'invisible': [('act_remind_user','=',False)]}">
|
||||
<field name="act_reply_to" attrs="{'required':[('act_remind_user','=',True)]}"/>
|
||||
</group>
|
||||
<field name="act_mail_to_watchers"/>
|
||||
<field colspan="4" name="act_email_cc"/>
|
||||
<!-- </group>-->
|
||||
<separator colspan="4" string="Email Body"/>
|
||||
<field colspan="4" name="act_mail_body" height="250"
|
||||
nolabel="1" attrs="{'required':[('act_remind_user','=',True)]}" />
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_base_action_rule","base.action.rule","model_base_action_rule",,1,0,0,0
|
||||
"access_base_action_rule_config","base.action.rule config","model_base_action_rule",base.group_system,1,0,0,0
|
||||
"access_base_action_rule_config","base.action.rule config","model_base_action_rule",base.group_system,1,1,1,1
|
||||
|
+5
-5
@@ -22,7 +22,7 @@
|
||||
import time
|
||||
from datetime import datetime
|
||||
from datetime import timedelta
|
||||
|
||||
import base64
|
||||
import tools
|
||||
from osv import fields
|
||||
from osv import osv
|
||||
@@ -342,7 +342,6 @@ class crm_case(object):
|
||||
destination=False)
|
||||
|
||||
def remind_user(self, cr, uid, ids, context={}, attach=False,destination=True):
|
||||
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@@ -359,8 +358,9 @@ class crm_case(object):
|
||||
if case.section_id.reply_to and case.email_from:
|
||||
src = case.email_from
|
||||
dest = case.section_id.reply_to
|
||||
body = ""
|
||||
body = case.email_last or case.description
|
||||
body = case.description or ""
|
||||
if case.message_ids:
|
||||
body = case.message_ids[0].description or ""
|
||||
if not destination:
|
||||
src, dest = dest, src
|
||||
if body and case.user_id.signature:
|
||||
@@ -371,7 +371,7 @@ class crm_case(object):
|
||||
attach_to_send = None
|
||||
|
||||
if attach:
|
||||
attach_ids = self.pool.get('ir.attachment').search(cr, uid, [('res_model', '=', 'mailgate.thread'), ('res_id', '=', case.id)])
|
||||
attach_ids = self.pool.get('ir.attachment').search(cr, uid, [('res_model', '=', self._name), ('res_id', '=', case.id)])
|
||||
attach_to_send = self.pool.get('ir.attachment').read(cr, uid, attach_ids, ['datas_fname','datas'])
|
||||
attach_to_send = map(lambda x: (x['datas_fname'], base64.decodestring(x['datas'])), attach_to_send)
|
||||
|
||||
|
||||
@@ -115,26 +115,22 @@ this if you want the rule to send an email to the partner."),
|
||||
|
||||
|
||||
def state_get(self, cr, uid, context={}):
|
||||
|
||||
"""@param self: The object pointer
|
||||
"""Gets available states for crm
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
res = super(base_action_rule, self).state_get(cr, uid, context=context)
|
||||
return res + crm.AVAILABLE_STATES
|
||||
|
||||
def priority_get(self, cr, uid, context={}):
|
||||
|
||||
"""@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values """
|
||||
|
||||
res = super(base_action_rule, self).priority_get(cr, uid, context=context)
|
||||
return res + crm.AVAILABLE_PRIORITIES
|
||||
|
||||
|
||||
base_action_rule()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<field name="inherit_id" ref="base_action_rule.view_base_action_rule_form"/>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<field name="act_mail_to_watchers" position="before">
|
||||
<field name="act_mail_to_user" position="after">
|
||||
<field name="act_mail_to_partner"/>
|
||||
</field>
|
||||
</field>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Luc Latour'" name="partner_name"/>
|
||||
<field eval="'open'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(726) 782-0636'" name="mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
@@ -21,13 +21,14 @@
|
||||
<field eval="'The Oil Company'" name="name"/>
|
||||
<field eval="'(769) 703-274'" name="phone"/>
|
||||
</record>
|
||||
|
||||
<record id="crm_case_electonicgoodsdealer0" model="crm.lead">
|
||||
<field name="type_id" ref="crm.type_lead7"/>
|
||||
<field eval="'4'" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Marc Dufour'" name="partner_name"/>
|
||||
<field eval="'open'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(392) 895-7917'" name="mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
@@ -36,13 +37,14 @@
|
||||
<field eval="'Le Club SARL'" name="name"/>
|
||||
<field eval="'(956) 293-2595'" name="phone"/>
|
||||
</record>
|
||||
|
||||
<record id="crm_case_developingwebapplications0" model="crm.lead">
|
||||
<field name="type_id" ref="crm.type_lead5"/>
|
||||
<field eval="'2'" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field eval="'Fabien Pinckaers'" name="partner_name"/>
|
||||
<field eval="'done'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(820) 167-3208'" name="mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
@@ -67,13 +69,14 @@
|
||||
<field eval="'The Gas Company'" name="name"/>
|
||||
<field eval="'(514) 698-4118'" name="phone"/>
|
||||
</record>
|
||||
|
||||
<record id="crm_case_itdeveloper0" model="crm.lead">
|
||||
<field name="type_id" ref="crm.type_lead4"/>
|
||||
<field eval="'3'" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Carrie Helle'" name="partner_name"/>
|
||||
<field eval="'pending'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(333) 715-1450'" name="mobile"/>
|
||||
<field eval="1" name="active"/>
|
||||
@@ -82,6 +85,7 @@
|
||||
<field eval="'Stonage IT'" name="name"/>
|
||||
<field eval="'(855) 924-4364'" name="phone"/>
|
||||
</record>
|
||||
|
||||
<record id="crm_case_mgroperations0" model="crm.lead">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_1"/>
|
||||
<field eval="1" name="active"/>
|
||||
@@ -91,7 +95,7 @@
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Tina Pinero'" name="partner_name"/>
|
||||
<field eval="'cancel'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(468) 017-2684'" name="mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor8"/>
|
||||
@@ -107,7 +111,7 @@
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval="'Wendi Baltz'" name="partner_name"/>
|
||||
<field eval="'done'" name="state"/>
|
||||
<field eval="'draft'" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval="'(463) 014-1208'" name="mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor4"/>
|
||||
@@ -115,5 +119,107 @@
|
||||
<field eval="'Gardner Group'" name="name"/>
|
||||
<field eval="'(282) 603-7489'" name="phone"/>
|
||||
</record>
|
||||
<record id="crm_case_webvisitor0" model="crm.lead">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="type_id" ref="crm.type_lead5"/>
|
||||
<field eval=""1"" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field eval=""Questionnaire"" name="name"/>
|
||||
<field eval=""open"" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval=""Smith John"" name="partner_name2"/>
|
||||
<field eval=""(487) 013-1504"" name="partner_mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor6"/>
|
||||
<field eval=""Website Visitor"" name="partner_name"/>
|
||||
<field eval=""smith_john@gmail.com"" name="email_from"/>
|
||||
<field eval="time.strftime('%Y-%m-16 10:05:15')" name="date"/>
|
||||
</record>
|
||||
<record id="crm_case_business_card0" model="crm.lead">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="type_id" ref="crm.type_lead3"/>
|
||||
<field eval=""2"" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval=""Marketing Products"" name="name"/>
|
||||
<field eval=""open"" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval=""Elvis Borne"" name="partner_name2"/>
|
||||
<field eval=""(147) 014-6574"" name="partner_mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor5"/>
|
||||
<field name="stage_id" ref="crm.stage_lead1"/>
|
||||
<field eval=""Business Card"" name="partner_name"/>
|
||||
<field eval=""(124) 587-8974"" name="partner_phone"/>
|
||||
<field eval="time.strftime('%Y-%m-16 11:05:15')" name="date"/>
|
||||
</record>
|
||||
<record id="crm_case_imported_contact0" model="crm.lead">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="type_id" ref="crm.type_lead8"/>
|
||||
<field eval=""2"" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field eval=""Business Group"" name="name"/>
|
||||
<field eval=""cancel"" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval=""Drew Clark"" name="partner_name2"/>
|
||||
<field eval=""(125) 021-4781"" name="partner_mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor1"/>
|
||||
<field name="stage_id" ref="crm.stage_lead2"/>
|
||||
<field eval=""Imported Contact"" name="partner_name"/>
|
||||
</record>
|
||||
<record id="crm_case_employee0" model="crm.lead">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="type_id" ref="crm.type_lead3"/>
|
||||
<field eval=""3"" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_root"/>
|
||||
<field eval=""OpenERP Campaining"" name="name"/>
|
||||
<field eval=""draft"" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval=""Carl Nelson"" name="partner_name2"/>
|
||||
<field eval=""(874) 022-6574"" name="partner_mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor3"/>
|
||||
<field name="stage_id" ref="crm.stage_lead3"/>
|
||||
<field eval=""Campaining"" name="partner_name"/>
|
||||
<field eval=""(232) 147-6329"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_company_partnership0" model="crm.lead">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="type_id" ref="crm.type_lead3"/>
|
||||
<field eval=""3"" name="priority"/>
|
||||
<field name="type">lead</field>
|
||||
<field name="user_id" ref="base.user_demo"/>
|
||||
<field eval=""Offer"" name="name"/>
|
||||
<field eval=""done"" name="state"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field eval=""Joe Lucas"" name="partner_name2"/>
|
||||
<field eval=""(234) 031-1254"" name="partner_mobile"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor7"/>
|
||||
<field name="stage_id" ref="crm.stage_lead1"/>
|
||||
<field eval=""Partnership Offer"" name="partner_name"/>
|
||||
<field eval=""(254) 954-2147"" name="partner_phone"/>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Call Function to Open the leads-->
|
||||
<function model="crm.lead" name="case_open">
|
||||
<value eval="[ref('crm_case_itisatelesalescampaign0'), ref('crm_case_electonicgoodsdealer0'), ref('crm_case_company_partnership0'), ref('crm_case_webvisitor0'), ref('crm_case_business_card0')]"/>
|
||||
</function>
|
||||
|
||||
<!-- Call Function to mark the lead as Pending-->
|
||||
<function model="crm.lead" name="case_pending">
|
||||
<value eval="[ref('crm_case_itdeveloper0')]"/>
|
||||
</function>
|
||||
|
||||
<!-- Call Function to Close the leads-->
|
||||
<function model="crm.lead" name="case_close">
|
||||
<value eval="[ref('crm_case_vpoperations0'), ref('crm_case_developingwebapplications0'), ref('crm_case_webvisitor0')]"/>
|
||||
</function>
|
||||
|
||||
<!-- Call Function to Cancel the leads-->
|
||||
<function model="crm.lead" name="case_cancel">
|
||||
<value eval="[ref('crm_case_mgroperations0'), ref('crm_case_imported_contact0')]"/>
|
||||
</function>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -57,6 +57,8 @@ class crm_meeting(osv.osv, crm_case):
|
||||
'id': fields.integer('ID'),
|
||||
'create_date': fields.datetime('Creation Date' , readonly=True),
|
||||
'write_date': fields.datetime('Write Date' , readonly=True),
|
||||
'date_action_last': fields.datetime('Last Action', readonly=1),
|
||||
'date_action_next': fields.datetime('Next Action', readonly=1),
|
||||
# Meeting fields
|
||||
'categ_id': fields.many2one('crm.case.categ', 'Meeting Type', \
|
||||
domain="[('object_id.model', '=', 'crm.meeting')]", \
|
||||
|
||||
+7
-6
@@ -33,7 +33,7 @@ class hr_employee_category(osv.osv):
|
||||
'child_ids': fields.one2many('hr.employee.category', 'parent_id', 'Child Categories')
|
||||
}
|
||||
|
||||
def _check_recursion(self, cr, uid, ids):
|
||||
def _check_recursion(self, cr, uid, ids, context=None):
|
||||
level = 100
|
||||
while len(ids):
|
||||
cr.execute('select distinct parent_id from hr_employee_category where id IN %s', (tuple(ids), ))
|
||||
@@ -53,9 +53,10 @@ class hr_employee_marital_status(osv.osv):
|
||||
_name = "hr.employee.marital.status"
|
||||
_description = "Employee Marital Status"
|
||||
_columns = {
|
||||
'name': fields.char('Marital Status', size=30, required=True),
|
||||
'name': fields.char('Marital Status', size=32, required=True),
|
||||
'description': fields.text('Status Description'),
|
||||
}
|
||||
|
||||
hr_employee_marital_status()
|
||||
|
||||
class hr_job(osv.osv):
|
||||
@@ -95,11 +96,11 @@ class hr_employee(osv.osv):
|
||||
'country_id': fields.many2one('res.country', 'Nationality'),
|
||||
'birthday': fields.date("Birthday"),
|
||||
'ssnid': fields.char('SSN No', size=32, help='Social Security Number'),
|
||||
'sinid': fields.char('SIN No', size=32),
|
||||
'sinid': fields.char('SIN No', size=32, help="Social Insurance Number"),
|
||||
'otherid': fields.char('Other ID', size=32),
|
||||
'gender': fields.selection([('male', 'Male'),('female', 'Female')], 'Gender'),
|
||||
'marital': fields.many2one('hr.employee.marital.status', 'Marital Status'),
|
||||
'bank_account': fields.char('Bank Account', size=56),
|
||||
'bank_account': fields.char('Bank Account', size=64),
|
||||
'partner_id': fields.related('company_id', 'partner_id', type='many2one', relation='res.partner', readonly=True),
|
||||
'department_id':fields.many2one('hr.department','Department'),
|
||||
'address_id': fields.many2one('res.partner.address', 'Working Address'),
|
||||
@@ -127,7 +128,7 @@ class hr_employee(osv.osv):
|
||||
'photo': _get_photo,
|
||||
}
|
||||
|
||||
def _check_recursion(self, cr, uid, ids):
|
||||
def _check_recursion(self, cr, uid, ids, context=None):
|
||||
level = 100
|
||||
while len(ids):
|
||||
cr.execute('select distinct parent_id from hr_employee where id IN %s',(tuple(ids),))
|
||||
@@ -143,4 +144,4 @@ class hr_employee(osv.osv):
|
||||
|
||||
hr_employee()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
+10
-10
@@ -39,7 +39,7 @@ class hr_department(osv.osv):
|
||||
return res
|
||||
|
||||
def _dept_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
|
||||
res = self.name_get(cr, uid, ids, context)
|
||||
res = self.name_get(cr, uid, ids, context=context)
|
||||
return dict(res)
|
||||
|
||||
_name = "hr.department"
|
||||
@@ -53,20 +53,20 @@ class hr_department(osv.osv):
|
||||
'manager_id': fields.many2one('res.users', 'Manager', required=True),
|
||||
'member_ids': fields.many2many('res.users', 'hr_department_user_rel', 'department_id', 'user_id', 'Members'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
|
||||
_defaults = {
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr.department', context=c),
|
||||
}
|
||||
}
|
||||
|
||||
def _get_members(self,cr, uid, context=None):
|
||||
mids = self.search(cr, uid, [('manager_id', '=', uid)])
|
||||
result = {uid:1}
|
||||
for m in self.browse(cr, uid, mids, context):
|
||||
result = {uid: 1}
|
||||
for m in self.browse(cr, uid, mids, context=context):
|
||||
for user in m.member_ids:
|
||||
result[user.id] = 1
|
||||
return result.keys()
|
||||
|
||||
def _check_recursion(self, cr, uid, ids):
|
||||
def _check_recursion(self, cr, uid, ids, context=None):
|
||||
level = 100
|
||||
while len(ids):
|
||||
cr.execute('select distinct parent_id from hr_department where id IN %s',(tuple(ids),))
|
||||
@@ -122,12 +122,12 @@ class res_users(osv.osv):
|
||||
result[user_id] = parent_ids
|
||||
return result
|
||||
|
||||
def _parent_search(self, cr, uid, obj, name, args, context):
|
||||
def _parent_search(self, cr, uid, obj, name, args, context=None):
|
||||
parent = []
|
||||
for arg in args:
|
||||
if arg[0] == 'parent_id':
|
||||
parent = arg[2]
|
||||
child_ids = self._child_compute(cr, uid, parent, name, args, {})
|
||||
child_ids = self._child_compute(cr, uid, parent, name, args, context=context)
|
||||
if not child_ids:
|
||||
return [('id', 'in', [0])]
|
||||
return [('id', 'in', child_ids.get(uid,[]))]
|
||||
@@ -163,7 +163,7 @@ class res_users(osv.osv):
|
||||
for arg in args:
|
||||
if arg[0] == 'child_ids':
|
||||
parent = arg[2]
|
||||
child_ids = self._child_compute(cr, uid, parent, name, args, {})
|
||||
child_ids = self._child_compute(cr, uid, parent, name, args, context=context)
|
||||
if not child_ids:
|
||||
return [('id', 'in', [0])]
|
||||
return [('id', 'in', child_ids.get(uid,[]))]
|
||||
|
||||
+16
-2
@@ -89,6 +89,7 @@
|
||||
<field name="department_id"/>
|
||||
<field name="job_id"/>
|
||||
<field name="parent_id"/>
|
||||
<field name="coach_id" invisible="1" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
@@ -150,9 +151,20 @@
|
||||
<!--
|
||||
=======================
|
||||
Employee marital status
|
||||
=======================
|
||||
=======================
|
||||
-->
|
||||
|
||||
<record id="hr_hr_employee_marital_status_tree" model="ir.ui.view">
|
||||
<field name="name">hr.hr.employee.marital.status.tree</field>
|
||||
<field name="model">hr.employee.marital.status</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Marital Status">
|
||||
<field name="name" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="hr_hr_employee_marital_status_form" model="ir.ui.view">
|
||||
<field name="name">hr.hr.employee.marital.status</field>
|
||||
<field name="model">hr.employee.marital.status</field>
|
||||
@@ -171,6 +183,7 @@
|
||||
<field name="res_model">hr.employee.marital.status</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="hr_hr_employee_marital_status_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem action="action_hr_marital_status" id="hr_menu_marital_status"
|
||||
@@ -307,6 +320,7 @@
|
||||
<group col="6" colspan="4">
|
||||
<field name="name" />
|
||||
<field name="department_id" />
|
||||
<newline/>
|
||||
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
|
||||
<field name="expected_employees"/>
|
||||
<field name="no_of_employee"/>
|
||||
@@ -358,7 +372,7 @@
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name"/>
|
||||
<field name="department_id" widget="selection">
|
||||
<filter icon="terp-gtk-select-all" domain="[('department_id','=',context.get('department_id',False))]" help="My Departments Jobs"/>
|
||||
<filter icon="terp-gtk-select-all" domain="[('department_id', '=', context.get('department_id', False))]" help="My Departments Jobs"/>
|
||||
</field>
|
||||
</search>
|
||||
</field>
|
||||
|
||||
@@ -2,6 +2,5 @@
|
||||
"access_hr_action_reason_employee","hr action reason employee","model_hr_action_reason","hr_attendance.group_hr_attendance",1,0,0,0
|
||||
"access_hr_action_reason_employee","hr action reason employee","model_hr_action_reason","hr.group_hr_manager",1,1,1,1
|
||||
"access_hr_attendance_employee","hr attendance employee","model_hr_attendance","hr_attendance.group_hr_attendance",1,1,1,1
|
||||
"access_hr_sign_in_out","hr attendance sign in out","model_hr_sign_in_out","hr_attendance.group_hr_attendance",1,1,1,1
|
||||
"access_hr_attendance_employee","hr employee attendance sign in out","hr.model_hr_employee","hr_attendance.group_hr_attendance",1,0,0,0
|
||||
"access_hr_attendance_resource","hr resource attendance sign in out","resource.model_resource_resource","hr_attendance.group_hr_attendance",1,0,0,0
|
||||
|
||||
|
@@ -194,10 +194,10 @@ class payroll_register(osv.osv):
|
||||
# 'advice_ids':fields.one2many('hr.payroll.advice', 'register_id', 'Bank Advice'),
|
||||
'company_id':fields.many2one('res.company', 'Company', required=False),
|
||||
'period_id': fields.many2one('account.period', 'Force Period', domain=[('state','<>','done')], help="Keep empty to use the period of the validation(Payslip) date."),
|
||||
'grows': fields.function(_calculate, method=True, store=True, multi='dc', string='Gross Salary', type='float', digits=(16, int(config['price_accuracy']))),
|
||||
'net': fields.function(_calculate, method=True, store=True, multi='dc', string='Net Salary', digits=(16, int(config['price_accuracy']))),
|
||||
'allounce': fields.function(_calculate, method=True, store=True, multi='dc', string='Allowance', digits=(16, int(config['price_accuracy']))),
|
||||
'deduction': fields.function(_calculate, method=True, store=True, multi='dc', string='Deduction', digits=(16, int(config['price_accuracy']))),
|
||||
'grows': fields.function(_calculate, method=True, store=True, multi='dc', string='Gross Salary', type='float', digits=(16, 4)),
|
||||
'net': fields.function(_calculate, method=True, store=True, multi='dc', string='Net Salary', digits=(16, 4)),
|
||||
'allounce': fields.function(_calculate, method=True, store=True, multi='dc', string='Allowance', digits=(16, 4)),
|
||||
'deduction': fields.function(_calculate, method=True, store=True, multi='dc', string='Deduction', digits=(16, 4)),
|
||||
'note': fields.text('Description'),
|
||||
}
|
||||
|
||||
@@ -366,8 +366,8 @@ class payroll_advice_line(osv.osv):
|
||||
'advice_id':fields.many2one('hr.payroll.advice', 'Bank Advice', required=False),
|
||||
'name':fields.char('Bank Account A/C', size=64, required=True, readonly=False),
|
||||
'employee_id':fields.many2one('hr.employee', 'Employee', required=True),
|
||||
'amount': fields.float('Amount', digits=(16, int(config['price_accuracy']))),
|
||||
'bysal': fields.float('By Salary', digits=(16, int(config['price_accuracy']))),
|
||||
'amount': fields.float('Amount', digits=(16, 4)),
|
||||
'bysal': fields.float('By Salary', digits=(16, 4)),
|
||||
'flag':fields.char('D/C', size=8, required=True, readonly=False),
|
||||
}
|
||||
_defaults = {
|
||||
@@ -434,10 +434,10 @@ class contrib_register(osv.osv):
|
||||
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account', required=False),
|
||||
'name':fields.char('Name', size=256, required=True, readonly=False),
|
||||
'register_line_ids':fields.one2many('hr.contibution.register.line', 'register_id', 'Register Line', readonly=True),
|
||||
'yearly_total_by_emp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Employee', digits=(16, int(config['price_accuracy']))),
|
||||
'yearly_total_by_comp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Company', digits=(16, int(config['price_accuracy']))),
|
||||
'monthly_total_by_emp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Employee', digits=(16, int(config['price_accuracy']))),
|
||||
'monthly_total_by_comp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Company', digits=(16, int(config['price_accuracy']))),
|
||||
'yearly_total_by_emp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Employee', digits=(16, 4)),
|
||||
'yearly_total_by_comp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Company', digits=(16, 4)),
|
||||
'monthly_total_by_emp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Employee', digits=(16, 4)),
|
||||
'monthly_total_by_comp': fields.function(_total_contrib, method=True, multi='dc', store=True, string='Total By Company', digits=(16, 4)),
|
||||
'note': fields.text('Description'),
|
||||
}
|
||||
_defaults = {
|
||||
@@ -466,9 +466,9 @@ class contrib_register_line(osv.osv):
|
||||
'code':fields.char('Code', size=64, required=False, readonly=False),
|
||||
'employee_id':fields.many2one('hr.employee', 'Employee', required=True),
|
||||
'period_id': fields.many2one('account.period', 'Period'),
|
||||
'emp_deduction': fields.float('Employee Deduction', digits=(16, int(config['price_accuracy']))),
|
||||
'comp_deduction': fields.float('Company Deduction', digits=(16, int(config['price_accuracy']))),
|
||||
'total': fields.function(_total, method=True, store=True, string='Total', digits=(16, int(config['price_accuracy']))),
|
||||
'emp_deduction': fields.float('Employee Deduction', digits=(16, 4)),
|
||||
'comp_deduction': fields.float('Company Deduction', digits=(16, 4)),
|
||||
'total': fields.function(_total, method=True, store=True, string='Total', digits=(16, 4)),
|
||||
}
|
||||
contrib_register_line()
|
||||
|
||||
@@ -539,7 +539,7 @@ class company_contribution(osv.osv):
|
||||
('fix','Fixed Amount'),
|
||||
('func','Function Calculation'),
|
||||
],'Amount Type', select=True),
|
||||
'contribute_per':fields.float('Contribution', digits=(16, int(config['price_accuracy'])), help='Define Company contribution ratio 1.00=100% contribution, If Employee Contribute 5% then company will and here 0.50 defined then company will contribute 50% on employee 5% contribution'),
|
||||
'contribute_per':fields.float('Contribution', digits=(16, 4), help='Define Company contribution ratio 1.00=100% contribution, If Employee Contribute 5% then company will and here 0.50 defined then company will contribute 50% on employee 5% contribution'),
|
||||
'account_id':fields.property(
|
||||
'account.account',
|
||||
type='many2one',
|
||||
@@ -596,13 +596,13 @@ class company_contribution_line(osv.osv):
|
||||
'contribution_id':fields.many2one('company.contribution', 'Contribution', required=False),
|
||||
'name':fields.char('Name', size=64, required=False, readonly=False),
|
||||
'umo_id':fields.many2one('product.uom', 'Unite', required=False),
|
||||
'from_val': fields.float('From', digits=(16, int(config['price_accuracy']))),
|
||||
'to_val': fields.float('To', digits=(16, int(config['price_accuracy']))),
|
||||
'from_val': fields.float('From', digits=(16, 4)),
|
||||
'to_val': fields.float('To', digits=(16, 4)),
|
||||
'amount_type':fields.selection([
|
||||
('fix','Fixed Amount'),
|
||||
],'Amount Type', select=True),
|
||||
'sequence':fields.integer('Sequence'),
|
||||
'value': fields.float('Value', digits=(16, int(config['price_accuracy']))),
|
||||
'value': fields.float('Value', digits=(16, 4)),
|
||||
}
|
||||
company_contribution_line()
|
||||
|
||||
@@ -730,8 +730,8 @@ class hr_payslip(osv.osv):
|
||||
('cancel','Reject'),
|
||||
],'State', select=True, readonly=True),
|
||||
'basic_before_leaves': fields.float('Basic Salary', readonly=True, digits=(16, 2)),
|
||||
'leaves': fields.float('Leaved Deduction', readonly=True, digits=(16, 2)),
|
||||
'basic': fields.float('Basic Salary - Leaves', readonly=True, digits=(16, 2)),
|
||||
'leaves': fields.float('Leave Deductions', readonly=True, digits=(16, 2)),
|
||||
'basic': fields.float('Net Basic', readonly=True, digits=(16, 2)),
|
||||
'grows': fields.function(_calculate, method=True, store=True, multi='dc', string='Gross Salary', type='float', digits=(16, 2)),
|
||||
'net': fields.function(_calculate, method=True, store=True, multi='dc', string='Net Salary', digits=(16, 2)),
|
||||
'allounce': fields.function(_calculate, method=True, store=True, multi='dc', string='Allowance', digits=(16, 2)),
|
||||
@@ -1213,9 +1213,9 @@ class hr_payslip_line(osv.osv):
|
||||
'amount': fields.float('Amount / Percentage', digits=(16, 4)),
|
||||
'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account', required=False),
|
||||
'account_id':fields.many2one('account.account', 'General Account', required=True),
|
||||
'total': fields.float('Sub Total', readonly=True, digits=(16, int(config['price_accuracy']))),
|
||||
'total': fields.float('Sub Total', readonly=True, digits=(16, 4)),
|
||||
#'total': fields.function(_calculate, method=True, type='float', string='Label', store=True),
|
||||
'company_contrib': fields.float('Company Contribution', readonly=True, digits=(16, int(config['price_accuracy']))),
|
||||
'company_contrib': fields.float('Company Contribution', readonly=True, digits=(16, 4)),
|
||||
'expanse_id': fields.many2one('hr.expense.expense', 'Expense'),
|
||||
'sequence': fields.integer('Sequence'),
|
||||
'note':fields.text('Description'),
|
||||
@@ -1251,13 +1251,13 @@ class hr_payslip_line_line(osv.osv):
|
||||
'slipline_id':fields.many2one('hr.payslip.line', 'Slip Line', required=False),
|
||||
'name':fields.char('Name', size=64, required=False, readonly=False),
|
||||
'umo_id':fields.many2one('product.uom', 'Unite', required=False),
|
||||
'from_val': fields.float('From', digits=(16, int(config['price_accuracy']))),
|
||||
'to_val': fields.float('To', digits=(16, int(config['price_accuracy']))),
|
||||
'from_val': fields.float('From', digits=(16, 4)),
|
||||
'to_val': fields.float('To', digits=(16, 4)),
|
||||
'amount_type':fields.selection([
|
||||
('fix','Fixed Amount'),
|
||||
],'Amount Type', select=True),
|
||||
'sequence':fields.integer('Sequence'),
|
||||
'value': fields.float('Value', digits=(16, int(config['price_accuracy']))),
|
||||
'value': fields.float('Value', digits=(16, 4)),
|
||||
}
|
||||
hr_payslip_line_line()
|
||||
|
||||
|
||||
@@ -505,7 +505,7 @@
|
||||
<button string="Compute Sheet" icon="terp-stock_format-scientific" name="compute_sheet" states="new"/>
|
||||
<button string="Recompute Sheet" icon="terp-stock_format-scientific" name="compute_sheet" type="object" states="draft"/>
|
||||
<button string="Verify Sheet" icon="terp-camera_test" name="verify_sheet" states="draft"/>
|
||||
<button string="Complete HR Checking" icon="terp-camera_test" name="final_verify_sheet" states="hr_check"/>
|
||||
<button string="Validate Sheet" icon="terp-camera_test" name="final_verify_sheet" states="hr_check"/>
|
||||
<button string="Pay Salary" icon="terp-dolar_ok!" name="process_sheet" states="confirm"/>
|
||||
<button string="Cancel" icon="terp-dialog-close" name="cancel_sheet" states="draft,hr_check,confirm"/>
|
||||
<button string="Set to Draft" icon="terp-stock_effects-object-colorize" name="set_to_draft" states="cancel"/>
|
||||
|
||||
@@ -2,5 +2,4 @@
|
||||
"access_hr_analytic_timesheet","hr.analytic.timesheet","model_hr_analytic_timesheet","hr.group_hr_user",1,1,1,1
|
||||
"access_hr_account_analytic_line","account.account.analytic.line","account.model_account_analytic_line","hr.group_hr_user",1,1,1,0
|
||||
"access_account_analytic_journal","account.account.analytic.journal","account.model_account_analytic_journal","hr.group_hr_user",1,0,0,0
|
||||
"access_hr_analytal_timesheet_user","hr.analytical.timesheet.user","model_hr_analytical_timesheet_users","hr.group_hr_user",1,1,1,1
|
||||
"access_hr_timesheet_report","hr.timesheet.report","model_hr_timesheet_report","hr.group_hr_manager",1,0,0,0
|
||||
|
||||
|
@@ -9,4 +9,3 @@
|
||||
"access_report_timesheet_invoice","report_timesheet.invoice","model_report_timesheet_invoice","hr.group_hr_manager",1,0,0,0
|
||||
"access_report_random_timesheet","report_random_timesheet","model_report_random_timesheet","hr.group_hr_manager",1,0,0,0
|
||||
"access_report_random_timesheet_lines","random_timesheet_lines","model_random_timesheet_lines","hr.group_hr_manager",1,0,0,0
|
||||
"access_hr_timesheet_analytic_profit","hr_timesheet_analytic_profit","model_hr_timesheet_analytic_profit","account.group_account_invoice",1,1,1,1
|
||||
|
||||
|
@@ -4,5 +4,4 @@
|
||||
"access_idea_vote","idea.vote","model_idea_vote","base.group_user",1,1,1,1
|
||||
"access_idea_vote_stat","idea.vote.stat","model_idea_vote_stat","base.group_user",1,0,0,0
|
||||
"access_idea_category_system","idea.category system","model_idea_category","base.group_system",1,1,1,1
|
||||
"access_idea_select","idea.select","model_idea_select","base.group_user",1,1,1,1
|
||||
"access_idea_comment","idea.comment","model_idea_comment","base.group_system",1,1,1,1
|
||||
|
||||
|
@@ -13,7 +13,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-06 03:37+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: mrp
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-03 03:48+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: multi_company
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-03 03:48+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: product_visible_discount
|
||||
|
||||
@@ -15,7 +15,5 @@
|
||||
"access_sale_order_manager","sale.order.manager","model_sale_order","group_sale_manager",1,1,1,1
|
||||
"access_sale_order_line_manager","sale.order.line.manager","model_sale_order_line","group_sale_manager",1,1,1,1
|
||||
"access_sale_report_manager","sale.report","model_sale_report","group_sale_manager",1,0,0,0
|
||||
"access_sale_open_invoice","sale.open.invoice","model_sale_open_invoice","group_sale_user",1,1,1,0
|
||||
"access_sale_open_invoice_manager","sale.open.invoice","model_sale_open_invoice","group_sale_manager",1,1,1,1
|
||||
"access_product_product_sale_user","product.product.sale.user","model_product_product","group_sale_user",1,0,0,0
|
||||
"access_sale_account_journal","account.journal sale order.user","account.model_account_journal","group_sale_user",1,0,0,0
|
||||
|
||||
|
@@ -64,7 +64,7 @@ class sale_advance_payment_inv(osv.osv_memory):
|
||||
_("You cannot make an advance on a sale order \
|
||||
that is defined as 'Automatic Invoice after delivery'."))
|
||||
val = obj_lines.product_id_change(cr, uid, [], sale_adv_obj.product_id.id,
|
||||
uom = False, partner_id = sale.partner_id.id, fposition_id=sale.fiscal_position.id)
|
||||
uom = False, partner_id = sale.partner_id.id, fiscal_position = sale.fiscal_position.id)
|
||||
line_id =obj_lines.create(cr, uid, {
|
||||
'name': val['value']['name'],
|
||||
'account_id': val['value']['account_id'],
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<field name="res_model">account.invoice.report</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">graph,tree</field>
|
||||
<field name="view_id" ref="view_turnover_by_month_tree"/>
|
||||
<field name="view_id" ref="view_turnover_by_month_graph"/>
|
||||
<field name="domain">[('year','ilike',time.strftime('%Y')),('user_id','=',uid)]</field>
|
||||
<field name="context">{'group_by_no_leaf':1,'group_by':['month']}</field>
|
||||
<field name="search_view_id" ref="account.view_account_invoice_report_search"/>
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-03 03:48+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-07-07 03:39+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: sale_margin
|
||||
|
||||
@@ -32,8 +32,9 @@ class sale_order_line(osv.osv):
|
||||
res = super(sale_order_line, self).product_id_change(cr, uid, ids, pricelist, product, qty=qty,
|
||||
uom=uom, qty_uos=qty_uos, uos=uos, name=name, partner_id=partner_id,
|
||||
lang=lang, update_tax=update_tax, date_order=date_order, packaging=packaging, fiscal_position=fiscal_position, flag=flag)
|
||||
purchase_price = self.pool.get('product.product').browse(cr, uid, product).standard_price
|
||||
res['value'].update({'purchase_price':purchase_price})
|
||||
if product:
|
||||
purchase_price = self.pool.get('product.product').browse(cr, uid, product).standard_price
|
||||
res['value'].update({'purchase_price':purchase_price})
|
||||
return res
|
||||
|
||||
def _product_margin(self, cr, uid, ids, field_name, arg, context=None):
|
||||
|
||||
@@ -25,5 +25,4 @@ import product
|
||||
import report
|
||||
import wizard
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -19,7 +19,6 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
||||
{
|
||||
"name" : "Inventory Management",
|
||||
"version" : "1.1",
|
||||
@@ -61,7 +60,6 @@ Thanks to the double entry management, the inventory controlling is powerful and
|
||||
"wizard/stock_traceability_view.xml",
|
||||
"stock_workflow.xml",
|
||||
"stock_incoterms.xml",
|
||||
"stock_wizard.xml",
|
||||
"stock_view.xml",
|
||||
"stock_report.xml",
|
||||
"stock_sequence.xml",
|
||||
|
||||
@@ -45,5 +45,6 @@
|
||||
|
||||
<menuitem icon="terp-graph" id="menu_dashboard_stock" name="Dashboard" sequence="0" parent="stock.next_id_61"/>
|
||||
<menuitem action="open_board_warehouse" icon="terp-graph" id="menu_board_warehouse" parent="menu_dashboard_stock" sequence="1"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
+11
-13
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
@@ -15,7 +15,7 @@
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
@@ -23,29 +23,27 @@ from osv import fields, osv
|
||||
import ir
|
||||
|
||||
class res_partner(osv.osv):
|
||||
_name = 'res.partner'
|
||||
_inherit = 'res.partner'
|
||||
_columns = {
|
||||
'property_stock_customer': fields.property(
|
||||
'stock.location',
|
||||
type='many2one',
|
||||
relation='stock.location',
|
||||
string="Customer Location",
|
||||
type='many2one',
|
||||
relation='stock.location',
|
||||
string="Customer Location",
|
||||
method=True,
|
||||
view_load=True,
|
||||
help="This stock location will be used, instead of the default one, as the destination location for goods you send to this partner"),
|
||||
|
||||
'property_stock_supplier': fields.property(
|
||||
'stock.location',
|
||||
type='many2one',
|
||||
relation='stock.location',
|
||||
string="Supplier Location",
|
||||
type='many2one',
|
||||
relation='stock.location',
|
||||
string="Supplier Location",
|
||||
method=True,
|
||||
view_load=True,
|
||||
help="This stock location will be used, instead of the default one, as the source location for goods you receive from the current partner"),
|
||||
}
|
||||
|
||||
res_partner()
|
||||
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -22,4 +22,4 @@
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
+44
-39
@@ -22,45 +22,46 @@
|
||||
from osv import fields, osv
|
||||
from tools.translate import _
|
||||
|
||||
|
||||
class product_product(osv.osv):
|
||||
_inherit = "product.product"
|
||||
|
||||
def get_product_accounts(self, cr, uid, product_id, context=None):
|
||||
""" To get the stock input account, stock output account and stock journal related to product.
|
||||
@param product_id: product id
|
||||
@param product_id: product id
|
||||
@return: dictionary which contains information regarding stock input account, stock output account and stock journal
|
||||
"""
|
||||
product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context)
|
||||
|
||||
stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False
|
||||
if context is None:
|
||||
context = {}
|
||||
product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
|
||||
|
||||
stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False
|
||||
if not stock_input_acc:
|
||||
stock_input_acc = product_obj.categ_id.property_stock_account_input_categ and product_obj.categ_id.property_stock_account_input_categ.id or False
|
||||
|
||||
|
||||
stock_output_acc = product_obj.property_stock_account_output and product_obj.property_stock_account_output.id or False
|
||||
if not stock_output_acc:
|
||||
stock_output_acc = product_obj.categ_id.property_stock_account_output_categ and product_obj.categ_id.property_stock_account_output_categ.id or False
|
||||
|
||||
journal_id = product_obj.categ_id.property_stock_journal and product_obj.categ_id.property_stock_journal.id or False
|
||||
account_variation = product_obj.categ_id.property_stock_variation and product_obj.categ_id.property_stock_variation.id or False
|
||||
|
||||
|
||||
return {
|
||||
'stock_account_input': stock_input_acc,
|
||||
'stock_account_output': stock_output_acc,
|
||||
'stock_journal': journal_id,
|
||||
'stock_account_input': stock_input_acc,
|
||||
'stock_account_output': stock_output_acc,
|
||||
'stock_journal': journal_id,
|
||||
'property_stock_variation': account_variation
|
||||
}
|
||||
}
|
||||
|
||||
def do_change_standard_price(self, cr, uid, ids, datas, context={}):
|
||||
""" Changes the Standard Price of Product and creates an account move accordingly.
|
||||
@param datas : dict. contain default datas like new_price, stock_output_account, stock_input_account, stock_journal
|
||||
@param context: A standard dictionary
|
||||
@return:
|
||||
|
||||
"""
|
||||
@param context: A standard dictionary
|
||||
@return:
|
||||
|
||||
"""
|
||||
location_obj = self.pool.get('stock.location')
|
||||
move_obj = self.pool.get('account.move')
|
||||
move_line_obj = self.pool.get('account.move.line')
|
||||
move_line_obj = self.pool.get('account.move.line')
|
||||
|
||||
new_price = datas.get('new_price', 0.0)
|
||||
stock_output_acc = datas.get('stock_output_account', False)
|
||||
@@ -71,7 +72,7 @@ class product_product(osv.osv):
|
||||
account_variation = product_obj.categ_id.property_stock_variation
|
||||
account_variation_id = account_variation and account_variation.id or False
|
||||
if not account_variation_id: raise osv.except_osv(_('Error!'), _('Variation Account is not specified for Product Category: %s' % (product_obj.categ_id.name)))
|
||||
move_ids = []
|
||||
move_ids = []
|
||||
loc_ids = location_obj.search(cr, uid,[('usage','=','internal')])
|
||||
for rec_id in ids:
|
||||
for location in location_obj.browse(cr, uid, loc_ids):
|
||||
@@ -79,14 +80,14 @@ class product_product(osv.osv):
|
||||
c.update({
|
||||
'location': location.id,
|
||||
'compute_child': False
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
product = self.browse(cr, uid, rec_id, context=c)
|
||||
qty = product.qty_available
|
||||
diff = product.standard_price - new_price
|
||||
diff = product.standard_price - new_price
|
||||
if not diff: raise osv.except_osv(_('Error!'), _("Could not find any difference between standard price and new price!"))
|
||||
if qty:
|
||||
company_id = location.company_id and location.company_id.id or False
|
||||
company_id = location.company_id and location.company_id.id or False
|
||||
if not company_id: raise osv.except_osv(_('Error!'), _('Company is not specified in Location'))
|
||||
#
|
||||
# Accounting Entries
|
||||
@@ -100,10 +101,10 @@ class product_product(osv.osv):
|
||||
(product.categ_id.name,
|
||||
product.categ_id.id,))
|
||||
move_id = move_obj.create(cr, uid, {
|
||||
'journal_id': journal_id,
|
||||
'journal_id': journal_id,
|
||||
'company_id': company_id
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
move_ids.append(move_id)
|
||||
|
||||
|
||||
@@ -120,7 +121,7 @@ class product_product(osv.osv):
|
||||
'for this product: "%s" (id: %d)') % \
|
||||
(product.name,
|
||||
product.id,))
|
||||
amount_diff = qty * diff
|
||||
amount_diff = qty * diff
|
||||
move_line_obj.create(cr, uid, {
|
||||
'name': product.name,
|
||||
'account_id': stock_input_acc,
|
||||
@@ -133,7 +134,7 @@ class product_product(osv.osv):
|
||||
'credit': amount_diff,
|
||||
'move_id': move_id
|
||||
})
|
||||
elif diff < 0:
|
||||
elif diff < 0:
|
||||
if not stock_output_acc:
|
||||
stock_output_acc = product.product_tmpl_id.\
|
||||
property_stock_account_output.id
|
||||
@@ -158,13 +159,15 @@ class product_product(osv.osv):
|
||||
'account_id': account_variation_id,
|
||||
'debit': amount_diff,
|
||||
'move_id': move_id
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
self.write(cr, uid, rec_id, {'standard_price': new_price})
|
||||
|
||||
return move_ids
|
||||
|
||||
def view_header_get(self, cr, user, view_id, view_type, context):
|
||||
def view_header_get(self, cr, user, view_id, view_type, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
res = super(product_product, self).view_header_get(cr, user, view_id, view_type, context)
|
||||
if res: return res
|
||||
if (context.get('location', False)):
|
||||
@@ -280,12 +283,14 @@ class product_product(osv.osv):
|
||||
res[prod_id] -= amount
|
||||
return res
|
||||
|
||||
def _product_available(self, cr, uid, ids, field_names=None, arg=False, context={}):
|
||||
def _product_available(self, cr, uid, ids, field_names=None, arg=False, context=None):
|
||||
""" Finds the incoming and outgoing quantity of product.
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
if not field_names:
|
||||
field_names = []
|
||||
if context is None:
|
||||
context = {}
|
||||
res = {}
|
||||
for id in ids:
|
||||
res[id] = {}.fromkeys(field_names, 0.0)
|
||||
@@ -323,7 +328,7 @@ class product_product(osv.osv):
|
||||
|
||||
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
|
||||
res = super(product_product,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
|
||||
if context == None:
|
||||
if context is None:
|
||||
context = {}
|
||||
if ('location' in context) and context['location']:
|
||||
location_info = self.pool.get('stock.location').browse(cr, uid, context['location'])
|
||||
@@ -348,7 +353,7 @@ class product_product(osv.osv):
|
||||
if location_info.usage == 'inventory':
|
||||
if fields.get('virtual_available'):
|
||||
res['fields']['virtual_available']['string'] = _('Future P&L')
|
||||
if fields.get('qty_available'):
|
||||
if fields.get('qty_available'):
|
||||
res['fields']['qty_available']['string'] = _('P&L Qty')
|
||||
|
||||
if location_info.usage == 'procurement':
|
||||
@@ -362,10 +367,9 @@ class product_product(osv.osv):
|
||||
res['fields']['virtual_available']['string'] = _('Future Productions')
|
||||
if fields.get('qty_available'):
|
||||
res['fields']['qty_available']['string'] = _('Produced Qty')
|
||||
|
||||
return res
|
||||
product_product()
|
||||
|
||||
product_product()
|
||||
|
||||
class product_template(osv.osv):
|
||||
_name = 'product.template'
|
||||
@@ -407,10 +411,11 @@ class product_template(osv.osv):
|
||||
string='Stock Output Account', method=True, view_load=True,
|
||||
help='This account will be used, instead of the default one, to value output stock'),
|
||||
}
|
||||
|
||||
product_template()
|
||||
|
||||
|
||||
class product_category(osv.osv):
|
||||
|
||||
_inherit = 'product.category'
|
||||
_columns = {
|
||||
'property_stock_journal': fields.property('account.journal',
|
||||
@@ -425,14 +430,14 @@ class product_category(osv.osv):
|
||||
type='many2one', relation='account.account',
|
||||
string='Stock Output Account', method=True, view_load=True,
|
||||
help='This account will be used to value the output stock'),
|
||||
'property_stock_variation': fields.property('account.account',
|
||||
'property_stock_variation': fields.property('account.account',
|
||||
type='many2one',
|
||||
relation='account.account',
|
||||
string="Stock Variation Account",
|
||||
method=True, view_load=True,
|
||||
method=True, view_load=True,
|
||||
help="This account will be used in product when valuation type is real-time valuation ",),
|
||||
}
|
||||
|
||||
product_category()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -32,6 +32,6 @@
|
||||
<field eval="False" name="value"/>
|
||||
<field name="company_id" ref="base.main_company"/>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
@@ -20,6 +20,5 @@
|
||||
"access_stock_report_tracklots","stock.report.tracklots","model_stock_report_tracklots","stock.group_stock_user",1,1,1,1
|
||||
"access_report_products_to_received_planned","report.products.to.received.planned","model_report_products_to_received_planned","stock.group_stock_user",1,1,1,1
|
||||
"access_report_delivery_products_planned","report.delivery.products.planned","model_report_delivery_products_planned","stock.group_stock_user",1,1,1,1
|
||||
"access_stock_inventory_line_split","stock.inventory.line.split","model_stock_inventory_line_split","stock.group_stock_user",1,1,1,1
|
||||
"access_report_stock_move","report.stock.move","model_report_stock_move","stock.group_stock_user",1,1,1,1
|
||||
"access_report_stock_inventory","report.stock.inventory","model_report_stock_inventory","stock.group_stock_user",1,1,1,1
|
||||
|
||||
|
+142
-125
@@ -37,12 +37,12 @@ class stock_incoterms(osv.osv):
|
||||
_name = "stock.incoterms"
|
||||
_description = "Incoterms"
|
||||
_columns = {
|
||||
'name': fields.char('Name', size=64, required=True,help="Incoterms are series of sales terms.They are used to divide transaction costs and responsibilities between buyer and seller and reflect state-of-the-art transportation practices."),
|
||||
'code': fields.char('Code', size=3, required=True,help="Code for Incoterms"),
|
||||
'name': fields.char('Name', size=64, required=True, help="Incoterms are series of sales terms.They are used to divide transaction costs and responsibilities between buyer and seller and reflect state-of-the-art transportation practices."),
|
||||
'code': fields.char('Code', size=3, required=True, help="Code for Incoterms"),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the incoterms without removing it."),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: True,
|
||||
'active': True,
|
||||
}
|
||||
|
||||
stock_incoterms()
|
||||
@@ -52,11 +52,12 @@ class stock_journal(osv.osv):
|
||||
_description = "Stock Journal"
|
||||
_columns = {
|
||||
'name': fields.char('Stock Journal', size=32, required=True),
|
||||
'user_id': fields.many2one('res.users','Responsible'),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
}
|
||||
_defaults = {
|
||||
'user_id': lambda s,c,u,ctx: u
|
||||
'user_id': lambda s, c, u, ctx: u
|
||||
}
|
||||
|
||||
stock_journal()
|
||||
|
||||
#----------------------------------------------------------
|
||||
@@ -70,22 +71,24 @@ class stock_location(osv.osv):
|
||||
_parent_order = 'id'
|
||||
_order = 'parent_left'
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
res = []
|
||||
if context is None:
|
||||
context = {}
|
||||
if not len(ids):
|
||||
return []
|
||||
reads = self.read(cr, uid, ids, ['name','location_id'], context)
|
||||
res = []
|
||||
reads = self.read(cr, uid, ids, ['name','location_id'], context=context)
|
||||
for record in reads:
|
||||
name = record['name']
|
||||
if context.get('full',False):
|
||||
if record['location_id']:
|
||||
name = record['location_id'][1]+' / '+name
|
||||
name = record['location_id'][1] + ' / ' + name
|
||||
res.append((record['id'], name))
|
||||
else:
|
||||
res.append((record['id'], name))
|
||||
return res
|
||||
|
||||
def _complete_name(self, cr, uid, ids, name, args, context):
|
||||
def _complete_name(self, cr, uid, ids, name, args, context=None):
|
||||
""" Forms complete name of location from parent location to child location.
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
@@ -100,7 +103,7 @@ class stock_location(osv.osv):
|
||||
res[m.id] = _get_one_full_name(m)
|
||||
return res
|
||||
|
||||
def _product_qty_available(self, cr, uid, ids, field_names, arg, context={}):
|
||||
def _product_qty_available(self, cr, uid, ids, field_names, arg, context=None):
|
||||
""" Finds real and virtual quantity for product available at particular location.
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
@@ -119,7 +122,7 @@ class stock_location(osv.osv):
|
||||
res[loc]['stock_virtual'] = prod.virtual_available
|
||||
return res
|
||||
|
||||
def product_detail(self, cr, uid, id, field, context={}):
|
||||
def product_detail(self, cr, uid, id, field, context=None):
|
||||
""" Finds detail of product like price type, currency and then calculates its price.
|
||||
@param field: Field name
|
||||
@return: Calculated price
|
||||
@@ -128,6 +131,8 @@ class stock_location(osv.osv):
|
||||
res[id] = {}
|
||||
final_value = 0.0
|
||||
field_to_read = 'virtual_available'
|
||||
if context is None:
|
||||
context = {}
|
||||
if field == 'stock_real_value':
|
||||
field_to_read = 'qty_available'
|
||||
cr.execute('select distinct product_id from stock_move where (location_id=%s) or (location_dest_id=%s)', (id, id))
|
||||
@@ -136,20 +141,18 @@ class stock_location(osv.osv):
|
||||
# Choose the right filed standard_price to read
|
||||
# Take the user company
|
||||
price_type_id = self.pool.get('res.users').browse(cr,uid,uid).company_id.property_valuation_price_type.id
|
||||
pricetype = self.pool.get('product.price.type').browse(cr, uid, price_type_id)
|
||||
pricetype = self.pool.get('product.price.type').browse(cr, uid, price_type_id, context=context)
|
||||
for r in result:
|
||||
c = (context or {}).copy()
|
||||
c['location'] = id
|
||||
product = self.pool.get('product.product').read(cr, uid, r['product_id'], [field_to_read], context=c)
|
||||
# Compute the amount_unit in right currency
|
||||
|
||||
context['currency_id'] = self.pool.get('res.users').browse(cr,uid,uid).company_id.currency_id.id
|
||||
amount_unit = self.pool.get('product.product').browse(cr,uid,r['product_id']).price_get(pricetype.field, context)[r['product_id']]
|
||||
|
||||
final_value += (product[field_to_read] * amount_unit)
|
||||
return final_value
|
||||
|
||||
def _product_value(self, cr, uid, ids, field_names, arg, context={}):
|
||||
def _product_value(self, cr, uid, ids, field_names, arg, context=None):
|
||||
""" Calculates real and virtual stock value of a product.
|
||||
@param field_names: Name of field
|
||||
@return: Dictionary of values
|
||||
@@ -209,20 +212,20 @@ class stock_location(osv.osv):
|
||||
'scrap_location': fields.boolean('Scrap Location', help='Check this box if the current location is a place for destroyed items'),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'usage': lambda *a: 'internal',
|
||||
'allocation_method': lambda *a: 'fifo',
|
||||
'chained_location_type': lambda *a: 'none',
|
||||
'chained_auto_packing': lambda *a: 'manual',
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.location', context=c),
|
||||
'posx': lambda *a: 0,
|
||||
'posy': lambda *a: 0,
|
||||
'posz': lambda *a: 0,
|
||||
'icon': lambda *a: False,
|
||||
'scrap_location': lambda *a: False,
|
||||
'active': True,
|
||||
'usage': 'internal',
|
||||
'allocation_method': 'fifo',
|
||||
'chained_location_type': 'none',
|
||||
'chained_auto_packing': 'manual',
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.location', context=c),
|
||||
'posx': 0,
|
||||
'posy': 0,
|
||||
'posz': 0,
|
||||
'icon': False,
|
||||
'scrap_location': False,
|
||||
}
|
||||
|
||||
def chained_location_get(self, cr, uid, location, partner=None, product=None, context={}):
|
||||
def chained_location_get(self, cr, uid, location, partner=None, product=None, context=None):
|
||||
""" Finds chained location
|
||||
@param location: Location id
|
||||
@param partner: Partner id
|
||||
@@ -239,7 +242,7 @@ class stock_location(osv.osv):
|
||||
return result, location.chained_auto_packing, location.chained_delay, location.chained_journal_id and location.chained_journal_id.id or False, location.chained_company_id and location.chained_company_id.id or False, location.chained_picking_type
|
||||
return result
|
||||
|
||||
def picking_type_get(self, cr, uid, from_location, to_location, context={}):
|
||||
def picking_type_get(self, cr, uid, from_location, to_location, context=None):
|
||||
""" Gets type of picking.
|
||||
@param from_location: Source location
|
||||
@param to_location: Destination location
|
||||
@@ -248,14 +251,12 @@ class stock_location(osv.osv):
|
||||
result = 'internal'
|
||||
if (from_location.usage=='internal') and (to_location and to_location.usage in ('customer', 'supplier')):
|
||||
result = 'delivery'
|
||||
elif (from_location.usage in ('supplier', 'customer')) and (to_location.usage=='internal'):
|
||||
elif (from_location.usage in ('supplier', 'customer')) and (to_location.usage == 'internal'):
|
||||
result = 'in'
|
||||
return result
|
||||
|
||||
def _product_get_all_report(self, cr, uid, ids, product_ids=False,
|
||||
context=None):
|
||||
return self._product_get_report(cr, uid, ids, product_ids, context,
|
||||
recursive=True)
|
||||
def _product_get_all_report(self, cr, uid, ids, product_ids=False, context=None):
|
||||
return self._product_get_report(cr, uid, ids, product_ids, context, recursive=True)
|
||||
|
||||
def _product_get_report(self, cr, uid, ids, product_ids=False,
|
||||
context=None, recursive=False):
|
||||
@@ -323,7 +324,7 @@ class stock_location(osv.osv):
|
||||
result['total_price'] = total_price
|
||||
return result
|
||||
|
||||
def _product_get_multi_location(self, cr, uid, ids, product_ids=False, context={},
|
||||
def _product_get_multi_location(self, cr, uid, ids, product_ids=False, context=None,
|
||||
states=['done'], what=('in', 'out')):
|
||||
"""
|
||||
@param product_ids: Ids of product
|
||||
@@ -332,6 +333,8 @@ class stock_location(osv.osv):
|
||||
@return:
|
||||
"""
|
||||
product_obj = self.pool.get('product.product')
|
||||
if context is None:
|
||||
context = {}
|
||||
context.update({
|
||||
'states': states,
|
||||
'what': what,
|
||||
@@ -339,22 +342,22 @@ class stock_location(osv.osv):
|
||||
})
|
||||
return product_obj.get_product_available(cr, uid, product_ids, context=context)
|
||||
|
||||
def _product_get(self, cr, uid, id, product_ids=False, context={}, states=['done']):
|
||||
def _product_get(self, cr, uid, id, product_ids=False, context=None, states=['done']):
|
||||
"""
|
||||
@param product_ids:
|
||||
@param states:
|
||||
@return:
|
||||
"""
|
||||
ids = id and [id] or []
|
||||
return self._product_get_multi_location(cr, uid, ids, product_ids, context, states)
|
||||
return self._product_get_multi_location(cr, uid, ids, product_ids, context=context, states=states)
|
||||
|
||||
def _product_all_get(self, cr, uid, id, product_ids=False, context={}, states=['done']):
|
||||
def _product_all_get(self, cr, uid, id, product_ids=False, context=None, states=['done']):
|
||||
# build the list of ids of children of the location given by id
|
||||
ids = id and [id] or []
|
||||
location_ids = self.search(cr, uid, [('location_id', 'child_of', ids)])
|
||||
return self._product_get_multi_location(cr, uid, location_ids, product_ids, context, states)
|
||||
|
||||
def _product_virtual_get(self, cr, uid, id, product_ids=False, context={}, states=['done']):
|
||||
def _product_virtual_get(self, cr, uid, id, product_ids=False, context=None, states=['done']):
|
||||
return self._product_all_get(cr, uid, id, product_ids, context, ['confirmed', 'waiting', 'assigned', 'done'])
|
||||
|
||||
#
|
||||
@@ -364,7 +367,7 @@ class stock_location(osv.osv):
|
||||
# Returns:
|
||||
# [ (tracking_id, product_qty, location_id) ]
|
||||
#
|
||||
def _product_reserve(self, cr, uid, ids, product_id, product_qty, context={}):
|
||||
def _product_reserve(self, cr, uid, ids, product_id, product_qty, context=None):
|
||||
"""
|
||||
@param product_id: Id of product
|
||||
@param product_qty: Quantity of product
|
||||
@@ -372,6 +375,8 @@ class stock_location(osv.osv):
|
||||
"""
|
||||
result = []
|
||||
amount = 0.0
|
||||
if context is None:
|
||||
context = {}
|
||||
for id in self.search(cr, uid, [('location_id', 'child_of', ids)]):
|
||||
cr.execute("select product_uom,sum(product_qty) as product_qty from stock_move where location_dest_id=%s and location_id<>%s and product_id=%s and state='done' group by product_uom", (id, id, product_id))
|
||||
results = cr.dictfetchall()
|
||||
@@ -416,7 +421,7 @@ class stock_tracking(osv.osv):
|
||||
return (10 - (sum % 10)) % 10
|
||||
checksum = staticmethod(checksum)
|
||||
|
||||
def make_sscc(self, cr, uid, context={}):
|
||||
def make_sscc(self, cr, uid, context=None):
|
||||
sequence = self.pool.get('ir.sequence').get(cr, uid, 'stock.lot.tracking')
|
||||
return sequence + str(self.checksum(sequence))
|
||||
|
||||
@@ -428,9 +433,9 @@ class stock_tracking(osv.osv):
|
||||
'date': fields.datetime('Created Date', required=True),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'active': 1,
|
||||
'name': make_sscc,
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
}
|
||||
|
||||
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100):
|
||||
@@ -442,7 +447,7 @@ class stock_tracking(osv.osv):
|
||||
ids += self.search(cr, user, [('name', operator, name)]+ args, limit=limit, context=context)
|
||||
return self.name_get(cr, user, ids, context)
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
if not len(ids):
|
||||
return []
|
||||
res = [(r['id'], r['name']+' ['+(r['serial'] or '')+']') for r in self.read(cr, uid, ids, ['name', 'serial'], context)]
|
||||
@@ -453,7 +458,6 @@ class stock_tracking(osv.osv):
|
||||
|
||||
stock_tracking()
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Stock Picking
|
||||
#----------------------------------------------------------
|
||||
@@ -461,7 +465,7 @@ class stock_picking(osv.osv):
|
||||
_name = "stock.picking"
|
||||
_description = "Picking List"
|
||||
|
||||
def _set_maximum_date(self, cr, uid, ids, name, value, arg, context):
|
||||
def _set_maximum_date(self, cr, uid, ids, name, value, arg, context=None):
|
||||
""" Calculates planned date if it is greater than 'value'.
|
||||
@param name: Name of field
|
||||
@param value: Value of field
|
||||
@@ -483,7 +487,7 @@ class stock_picking(osv.osv):
|
||||
cr.execute(sql_str)
|
||||
return True
|
||||
|
||||
def _set_minimum_date(self, cr, uid, ids, name, value, arg, context):
|
||||
def _set_minimum_date(self, cr, uid, ids, name, value, arg, context=None):
|
||||
""" Calculates planned date if it is less than 'value'.
|
||||
@param name: Name of field
|
||||
@param value: Value of field
|
||||
@@ -494,7 +498,7 @@ class stock_picking(osv.osv):
|
||||
return False
|
||||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
for pick in self.browse(cr, uid, ids, context):
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
sql_str = """update stock_move set
|
||||
date_planned='%s'
|
||||
where
|
||||
@@ -504,7 +508,7 @@ class stock_picking(osv.osv):
|
||||
cr.execute(sql_str)
|
||||
return True
|
||||
|
||||
def get_min_max_date(self, cr, uid, ids, field_name, arg, context={}):
|
||||
def get_min_max_date(self, cr, uid, ids, field_name, arg, context=None):
|
||||
""" Finds minimum and maximum dates for picking.
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
@@ -587,16 +591,16 @@ class stock_picking(osv.osv):
|
||||
}
|
||||
_defaults = {
|
||||
'name': lambda self, cr, uid, context: '/',
|
||||
'active': lambda *a: 1,
|
||||
'state': lambda *a: 'draft',
|
||||
'move_type': lambda *a: 'direct',
|
||||
'type': lambda *a: 'in',
|
||||
'invoice_state': lambda *a: 'none',
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
|
||||
'active': 1,
|
||||
'state': 'draft',
|
||||
'move_type': 'direct',
|
||||
'type': 'in',
|
||||
'invoice_state': 'none',
|
||||
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.picking', context=c)
|
||||
}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context={}):
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default = default.copy()
|
||||
@@ -604,16 +608,15 @@ class stock_picking(osv.osv):
|
||||
if ('name' not in default) or (picking_obj.name=='/'):
|
||||
seq_obj_name = 'stock.picking.' + picking_obj.type
|
||||
default['name'] = self.pool.get('ir.sequence').get(cr, uid, seq_obj_name)
|
||||
|
||||
return super(stock_picking, self).copy(cr, uid, id, default, context)
|
||||
|
||||
def onchange_partner_in(self, cr, uid, context, partner_id=None):
|
||||
def onchange_partner_in(self, cr, uid, context=None, partner_id=None):
|
||||
return {}
|
||||
|
||||
def action_explode(self, cr, uid, moves, context={}):
|
||||
def action_explode(self, cr, uid, moves, context=None):
|
||||
return moves
|
||||
|
||||
def action_confirm(self, cr, uid, ids, context={}):
|
||||
def action_confirm(self, cr, uid, ids, context=None):
|
||||
""" Confirms picking.
|
||||
@return: True
|
||||
"""
|
||||
@@ -625,7 +628,7 @@ class stock_picking(osv.osv):
|
||||
todo.append(r.id)
|
||||
todo = self.action_explode(cr, uid, todo, context)
|
||||
if len(todo):
|
||||
self.pool.get('stock.move').action_confirm(cr, uid, todo, context)
|
||||
self.pool.get('stock.move').action_confirm(cr, uid, todo, context=context)
|
||||
return True
|
||||
|
||||
def test_auto_picking(self, cr, uid, ids):
|
||||
@@ -747,7 +750,7 @@ class stock_picking(osv.osv):
|
||||
ok = ok and (move.state in ('cancel', 'done', 'assigned'))
|
||||
return ok
|
||||
|
||||
def action_cancel(self, cr, uid, ids, context={}):
|
||||
def action_cancel(self, cr, uid, ids, context=None):
|
||||
""" Changes picking state to cancel.
|
||||
@return: True
|
||||
"""
|
||||
@@ -769,7 +772,7 @@ class stock_picking(osv.osv):
|
||||
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={}):
|
||||
def action_move(self, cr, uid, ids, context=None):
|
||||
""" Changes move state to assigned.
|
||||
@return: True
|
||||
"""
|
||||
@@ -778,7 +781,6 @@ class stock_picking(osv.osv):
|
||||
for move in pick.move_lines:
|
||||
if move.state == 'assigned':
|
||||
todo.append(move.id)
|
||||
|
||||
if len(todo):
|
||||
self.pool.get('stock.move').action_done(cr, uid, todo,
|
||||
context=context)
|
||||
@@ -1005,7 +1007,7 @@ class stock_picking(osv.osv):
|
||||
}, context=context)
|
||||
return res
|
||||
|
||||
def test_done(self, cr, uid, ids, context={}):
|
||||
def test_done(self, cr, uid, ids, context=None):
|
||||
ok = False
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
if not pick.move_lines:
|
||||
@@ -1017,7 +1019,7 @@ class stock_picking(osv.osv):
|
||||
ok = True
|
||||
return ok
|
||||
|
||||
def test_cancel(self, cr, uid, ids, context={}):
|
||||
def test_cancel(self, cr, uid, ids, context=None):
|
||||
""" Test whether the move lines are canceled or not.
|
||||
@return: True or False
|
||||
"""
|
||||
@@ -1033,7 +1035,6 @@ class stock_picking(osv.osv):
|
||||
move_obj = self.pool.get('stock.move')
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
if pick.state in ['done','cancel']:
|
||||
raise osv.except_osv(_('Error'), _('You cannot remove the picking which is in %s state !')%(pick.state,))
|
||||
@@ -1049,7 +1050,7 @@ class stock_picking(osv.osv):
|
||||
|
||||
return super(stock_picking, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
def do_partial(self, cr, uid, ids, partial_datas, context={}):
|
||||
def do_partial(self, cr, uid, ids, partial_datas, context=None):
|
||||
""" Makes partial picking and moves done.
|
||||
@param partial_datas : Dictionary containing details of partial picking
|
||||
like partner_id, address_id, delivery_date,
|
||||
@@ -1057,7 +1058,6 @@ class stock_picking(osv.osv):
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
res = {}
|
||||
|
||||
move_obj = self.pool.get('stock.move')
|
||||
product_obj = self.pool.get('product.product')
|
||||
currency_obj = self.pool.get('res.currency')
|
||||
@@ -1072,7 +1072,6 @@ class stock_picking(osv.osv):
|
||||
for pick in self.browse(cr, uid, ids, context=context):
|
||||
new_picking = None
|
||||
new_moves = []
|
||||
|
||||
complete, too_many, too_few = [], [], []
|
||||
move_product_qty = {}
|
||||
for move in pick.move_lines:
|
||||
@@ -1185,13 +1184,14 @@ class stock_picking(osv.osv):
|
||||
|
||||
delivered_pack = self.browse(cr, uid, delivered_pack_id, context=context)
|
||||
res[pick.id] = {'delivered_picking': delivered_pack.id or False}
|
||||
|
||||
return res
|
||||
|
||||
stock_picking()
|
||||
|
||||
|
||||
class stock_production_lot(osv.osv):
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
if not ids:
|
||||
return []
|
||||
reads = self.read(cr, uid, ids, ['name', 'prefix', 'ref'], context)
|
||||
@@ -1209,7 +1209,7 @@ class stock_production_lot(osv.osv):
|
||||
_name = 'stock.production.lot'
|
||||
_description = 'Production lot'
|
||||
|
||||
def _get_stock(self, cr, uid, ids, field_name, arg, context={}):
|
||||
def _get_stock(self, cr, uid, ids, field_name, arg, context=None):
|
||||
""" Gets stock of products for locations
|
||||
@return: Dictionary of values
|
||||
"""
|
||||
@@ -1231,9 +1231,10 @@ class stock_production_lot(osv.osv):
|
||||
where
|
||||
location_id IN %s and prodlot_id IN %s group by prodlot_id''',(tuple(locations),tuple(ids),))
|
||||
res.update(dict(cr.fetchall()))
|
||||
|
||||
return res
|
||||
|
||||
def _stock_search(self, cr, uid, obj, name, args, context):
|
||||
def _stock_search(self, cr, uid, obj, name, args, context=None):
|
||||
""" Searches Ids of products
|
||||
@return: Ids of locations
|
||||
"""
|
||||
@@ -1261,7 +1262,7 @@ class stock_production_lot(osv.osv):
|
||||
'company_id': fields.many2one('res.company','Company',select=1),
|
||||
}
|
||||
_defaults = {
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'stock.lot.serial'),
|
||||
'product_id': lambda x, y, z, c: c.get('product_id', False),
|
||||
}
|
||||
@@ -1287,7 +1288,7 @@ class stock_production_lot_revision(osv.osv):
|
||||
|
||||
_defaults = {
|
||||
'author_id': lambda x, y, z, c: z,
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d'),
|
||||
'date': time.strftime('%Y-%m-%d'),
|
||||
}
|
||||
|
||||
stock_production_lot_revision()
|
||||
@@ -1302,7 +1303,7 @@ stock_production_lot_revision()
|
||||
#
|
||||
class stock_move(osv.osv):
|
||||
|
||||
def _getSSCC(self, cr, uid, context={}):
|
||||
def _getSSCC(self, cr, uid, context=None):
|
||||
cr.execute('select id from stock_tracking where create_uid=%s order by id desc limit 1', (uid,))
|
||||
res = cr.fetchone()
|
||||
return (res and res[0]) or False
|
||||
@@ -1311,7 +1312,7 @@ class stock_move(osv.osv):
|
||||
_order = 'date_expected desc, id'
|
||||
_log_create = False
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
def name_get(self, cr, uid, ids, context=None):
|
||||
res = []
|
||||
for line in self.browse(cr, uid, ids, context):
|
||||
res.append((line.id, (line.product_id.code or '/')+': '+line.location_id.name+' > '+line.location_dest_id.name))
|
||||
@@ -1391,7 +1392,7 @@ class stock_move(osv.osv):
|
||||
'You try to assign a lot which is not from the same product',
|
||||
['prodlot_id'])]
|
||||
|
||||
def _default_location_destination(self, cr, uid, context={}):
|
||||
def _default_location_destination(self, cr, uid, context=None):
|
||||
""" Gets default address of partner for destination location
|
||||
@return: Address id or False
|
||||
"""
|
||||
@@ -1407,7 +1408,7 @@ class stock_move(osv.osv):
|
||||
return property_out and property_out.id or False
|
||||
return False
|
||||
|
||||
def _default_location_source(self, cr, uid, context={}):
|
||||
def _default_location_source(self, cr, uid, context=None):
|
||||
""" Gets default address of partner for source location
|
||||
@return: Address id or False
|
||||
"""
|
||||
@@ -1423,24 +1424,24 @@ class stock_move(osv.osv):
|
||||
_defaults = {
|
||||
'location_id': _default_location_source,
|
||||
'location_dest_id': _default_location_destination,
|
||||
'state': lambda *a: 'draft',
|
||||
'priority': lambda *a: '1',
|
||||
'product_qty': lambda *a: 1.0,
|
||||
'scraped' : lambda *a: False,
|
||||
'date_planned': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'state': 'draft',
|
||||
'priority': '1',
|
||||
'product_qty': 1.0,
|
||||
'scraped' : False,
|
||||
'date_planned': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.move', context=c),
|
||||
'date_expected': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'date_expected': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
}
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context={}):
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
default = default.copy()
|
||||
return super(stock_move, self).copy(cr, uid, id, default, context)
|
||||
return super(stock_move, self).copy(cr, uid, id, default, context=context)
|
||||
|
||||
def _auto_init(self, cursor, context):
|
||||
res = super(stock_move, self)._auto_init(cursor, context)
|
||||
def _auto_init(self, cursor, context=None):
|
||||
res = super(stock_move, self)._auto_init(cursor, context=context)
|
||||
cursor.execute('SELECT indexname \
|
||||
FROM pg_indexes \
|
||||
WHERE indexname = \'stock_move_location_id_location_dest_id_product_id_state\'')
|
||||
@@ -1533,7 +1534,7 @@ class stock_move(osv.osv):
|
||||
result['location_dest_id'] = loc_dest_id
|
||||
return {'value': result}
|
||||
|
||||
def _chain_compute(self, cr, uid, moves, context={}):
|
||||
def _chain_compute(self, cr, uid, moves, context=None):
|
||||
""" Finds whether the location has chained location type or not.
|
||||
@param moves: Stock moves
|
||||
@return: Dictionary containing destination location with chained location type.
|
||||
@@ -1559,7 +1560,7 @@ class stock_move(osv.osv):
|
||||
result[m.picking_id].append( (m, dest) )
|
||||
return result
|
||||
|
||||
def action_confirm(self, cr, uid, ids, context={}):
|
||||
def action_confirm(self, cr, uid, ids, context=None):
|
||||
""" Confirms stock move.
|
||||
@return: List of ids.
|
||||
"""
|
||||
@@ -1568,10 +1569,12 @@ class stock_move(osv.osv):
|
||||
self.write(cr, uid, ids, {'state': 'confirmed'})
|
||||
i = 0
|
||||
|
||||
def create_chained_picking(self, cr, uid, moves, context):
|
||||
def create_chained_picking(self, cr, uid, moves, context=None):
|
||||
new_moves = []
|
||||
res_obj = self.pool.get('res.company')
|
||||
for picking, todo in self._chain_compute(cr, uid, moves, context).items():
|
||||
if context is None:
|
||||
context = {}
|
||||
for picking, todo in self._chain_compute(cr, uid, moves, context=context).items():
|
||||
ptype = todo[0][1][5] and todo[0][1][5] or self.pool.get('stock.location').picking_type_get(cr, uid, todo[0][0].location_dest_id, todo[0][1][0])
|
||||
pick_name = ''
|
||||
if ptype == 'delivery':
|
||||
@@ -1641,13 +1644,15 @@ class stock_move(osv.osv):
|
||||
#
|
||||
# Duplicate stock.move
|
||||
#
|
||||
def check_assign(self, cr, uid, ids, context={}):
|
||||
def check_assign(self, cr, uid, ids, context=None):
|
||||
""" Checks the product type and accordingly writes the state.
|
||||
@return: No. of moves done
|
||||
"""
|
||||
done = []
|
||||
count = 0
|
||||
pickings = {}
|
||||
if context is None:
|
||||
context = {}
|
||||
for move in self.browse(cr, uid, ids, context=context):
|
||||
if move.product_id.type == 'consu':
|
||||
if move.state in ('confirmed', 'waiting'):
|
||||
@@ -1697,12 +1702,14 @@ class stock_move(osv.osv):
|
||||
#
|
||||
# Cancel move => cancel others move and pickings
|
||||
#
|
||||
def action_cancel(self, cr, uid, ids, context={}):
|
||||
def action_cancel(self, cr, uid, ids, context=None):
|
||||
""" Cancels the moves and if all moves are cancelled it cancels the picking.
|
||||
@return: True
|
||||
"""
|
||||
if not len(ids):
|
||||
return True
|
||||
if context is None:
|
||||
context = {}
|
||||
pickings = {}
|
||||
for move in self.browse(cr, uid, ids):
|
||||
if move.state in ('confirmed', 'waiting', 'assigned', 'draft'):
|
||||
@@ -1735,6 +1742,9 @@ class stock_move(osv.osv):
|
||||
acc_variation = accounts['property_stock_variation']
|
||||
journal_id = accounts['stock_journal']
|
||||
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
if not acc_src:
|
||||
raise osv.except_osv(_('Error!'), _('There is no stock input account defined ' \
|
||||
'for this product: "%s" (id: %d)') % \
|
||||
@@ -1766,8 +1776,7 @@ class stock_move(osv.osv):
|
||||
# amount = q * move.product_id.standard_price
|
||||
return journal_id, acc_src, acc_dest, acc_variation, amount
|
||||
|
||||
|
||||
def action_done(self, cr, uid, ids, context={}):
|
||||
def action_done(self, cr, uid, ids, context=None):
|
||||
""" Makes the move done and if all moves are done, it will finish the picking.
|
||||
@return:
|
||||
"""
|
||||
@@ -1775,8 +1784,10 @@ class stock_move(osv.osv):
|
||||
picking_ids = []
|
||||
product_uom_obj = self.pool.get('product.uom')
|
||||
price_type_obj = self.pool.get('product.price.type')
|
||||
product_obj=self.pool.get('product.product')
|
||||
product_obj = self.pool.get('product.product')
|
||||
move_obj = self.pool.get('account.move')
|
||||
if context is None:
|
||||
context = {}
|
||||
for move in self.browse(cr, uid, ids):
|
||||
if move.picking_id:
|
||||
picking_ids.append(move.picking_id.id)
|
||||
@@ -1852,11 +1863,11 @@ class stock_move(osv.osv):
|
||||
for (id,name) in picking_obj.name_get(cr, uid, picking_ids):
|
||||
message = _('Document') + " '" + name + "' "+ _("is processed")
|
||||
self.log(cr, uid, id, message)
|
||||
|
||||
return True
|
||||
|
||||
def create_account_move(self, cr, uid, move,account_id,account_variation,amount, context=None):
|
||||
|
||||
def create_account_move(self, cr, uid, move,account_id, account_variation, amount, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
partner_id = move.picking_id.address_id and (move.picking_id.address_id.partner_id and move.picking_id.address_id.partner_id.id or False) or False
|
||||
lines=[(0, 0, {
|
||||
'name': move.name,
|
||||
@@ -1939,6 +1950,8 @@ class stock_move(osv.osv):
|
||||
@return: Splited move lines
|
||||
"""
|
||||
|
||||
if context is None:
|
||||
context = {}
|
||||
if quantity <= 0:
|
||||
raise osv.except_osv(_('Warning!'), _('Please provide Proper Quantity !'))
|
||||
|
||||
@@ -1999,7 +2012,6 @@ class stock_move(osv.osv):
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
if quantity <= 0:
|
||||
raise osv.except_osv(_('Warning!'), _('Please provide Proper Quantity !'))
|
||||
|
||||
@@ -2030,7 +2042,6 @@ class stock_move(osv.osv):
|
||||
else:
|
||||
current_move = self.copy(cr, uid, move.id, default_val)
|
||||
res += [current_move]
|
||||
|
||||
update_val = {}
|
||||
update_val['product_qty'] = quantity_rest
|
||||
update_val['product_uos_qty'] = uos_qty_rest
|
||||
@@ -2039,7 +2050,6 @@ class stock_move(osv.osv):
|
||||
else:
|
||||
quantity_rest = quantity
|
||||
uos_qty_rest = uos_qty
|
||||
|
||||
if move.product_id.track_production and location_id:
|
||||
res += self.split_lines(cr, uid, [move.id], quantity_rest, split_by_qty=1, context=context)
|
||||
else:
|
||||
@@ -2051,11 +2061,11 @@ class stock_move(osv.osv):
|
||||
}
|
||||
|
||||
self.write(cr, uid, [move.id], update_val)
|
||||
|
||||
self.action_done(cr, uid, res)
|
||||
|
||||
return res
|
||||
|
||||
def do_partial(self, cr, uid, ids, partial_datas, context={}):
|
||||
def do_partial(self, cr, uid, ids, partial_datas, context=None):
|
||||
""" Makes partial pickings and moves done.
|
||||
@param partial_datas: Dictionary containing details of partial picking
|
||||
like partner_id, address_id, delivery_date, delivery
|
||||
@@ -2073,9 +2083,11 @@ class stock_move(osv.osv):
|
||||
partner_id = partial_datas.get('partner_id', False)
|
||||
address_id = partial_datas.get('address_id', False)
|
||||
delivery_date = partial_datas.get('delivery_date', False)
|
||||
|
||||
new_moves = []
|
||||
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
complete, too_many, too_few = [], [], []
|
||||
move_product_qty = {}
|
||||
for move in self.browse(cr, uid, ids, context=context):
|
||||
@@ -2153,7 +2165,7 @@ class stock_move(osv.osv):
|
||||
complete.append(move)
|
||||
|
||||
for move in complete:
|
||||
self.action_done(cr, uid, [move.id], context)
|
||||
self.action_done(cr, uid, [move.id], context=context)
|
||||
if move.picking_id.id :
|
||||
# TOCHECK : Done picking if all moves are done
|
||||
cr.execute("""
|
||||
@@ -2174,7 +2186,6 @@ class stock_move(osv.osv):
|
||||
|
||||
stock_move()
|
||||
|
||||
|
||||
class stock_inventory(osv.osv):
|
||||
_name = "stock.inventory"
|
||||
_description = "Inventory"
|
||||
@@ -2188,12 +2199,11 @@ class stock_inventory(osv.osv):
|
||||
'company_id': fields.many2one('res.company','Company',required=True,select=1),
|
||||
}
|
||||
_defaults = {
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'state': lambda *a: 'draft',
|
||||
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'state': 'draft',
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.inventory', context=c)
|
||||
}
|
||||
|
||||
|
||||
def _inventory_line_hook(self, cr, uid, inventory_line, move_vals):
|
||||
""" Creates a stock move from an inventory line
|
||||
@param inventory_line:
|
||||
@@ -2206,6 +2216,8 @@ class stock_inventory(osv.osv):
|
||||
""" Finishes the inventory and writes its finished date
|
||||
@return: True
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
for inv in self.browse(cr, uid, ids):
|
||||
move_ids = []
|
||||
move_line = []
|
||||
@@ -2248,7 +2260,7 @@ class stock_inventory(osv.osv):
|
||||
self.write(cr, uid, [inv.id], {'state': 'done', 'date_done': time.strftime('%Y-%m-%d %H:%M:%S'), 'move_ids': [(6, 0, move_ids)]})
|
||||
return True
|
||||
|
||||
def action_cancel(self, cr, uid, ids, context={}):
|
||||
def action_cancel(self, cr, uid, ids, context=None):
|
||||
""" Cancels the stock move and change inventory state to draft.
|
||||
@return: True
|
||||
"""
|
||||
@@ -2257,7 +2269,7 @@ class stock_inventory(osv.osv):
|
||||
self.write(cr, uid, [inv.id], {'state': 'draft'})
|
||||
return True
|
||||
|
||||
def action_cancel_inventary(self, cr, uid, ids, context={}):
|
||||
def action_cancel_inventary(self, cr, uid, ids, context=None):
|
||||
""" Cancels both stock move and inventory
|
||||
@return: True
|
||||
"""
|
||||
@@ -2268,7 +2280,6 @@ class stock_inventory(osv.osv):
|
||||
|
||||
stock_inventory()
|
||||
|
||||
|
||||
class stock_inventory_line(osv.osv):
|
||||
_name = "stock.inventory.line"
|
||||
_description = "Inventory Line"
|
||||
@@ -2301,7 +2312,6 @@ class stock_inventory_line(osv.osv):
|
||||
|
||||
stock_inventory_line()
|
||||
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Stock Warehouse
|
||||
#----------------------------------------------------------
|
||||
@@ -2318,8 +2328,9 @@ class stock_warehouse(osv.osv):
|
||||
'lot_output_id': fields.many2one('stock.location', 'Location Output', required=True, domain=[('usage','<>','view')]),
|
||||
}
|
||||
_defaults = {
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.inventory', context=c),
|
||||
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'stock.inventory', context=c),
|
||||
}
|
||||
|
||||
stock_warehouse()
|
||||
|
||||
|
||||
@@ -2328,15 +2339,19 @@ stock_warehouse()
|
||||
class stock_picking_move_wizard(osv.osv_memory):
|
||||
_name = 'stock.picking.move.wizard'
|
||||
|
||||
def _get_picking(self, cr, uid, ctx):
|
||||
def _get_picking(self, cr, uid, ctx=None):
|
||||
if ctx is None:
|
||||
ctx = {}
|
||||
if ctx.get('action_id', False):
|
||||
return ctx['action_id']
|
||||
return False
|
||||
|
||||
def _get_picking_address(self, cr, uid, ctx):
|
||||
def _get_picking_address(self, cr, uid, context=None):
|
||||
picking_obj = self.pool.get('stock.picking')
|
||||
if ctx.get('action_id', False):
|
||||
picking = picking_obj.browse(cr, uid, [ctx['action_id']])[0]
|
||||
if context is None:
|
||||
context = {}
|
||||
if context.get('action_id', False):
|
||||
picking = picking_obj.browse(cr, uid, [context['action_id']])[0]
|
||||
return picking.address_id and picking.address_id.id or False
|
||||
return False
|
||||
|
||||
@@ -2382,7 +2397,6 @@ class report_products_to_received_planned(osv.osv):
|
||||
'planned_qty': fields.integer('Planned Qty'),
|
||||
|
||||
}
|
||||
|
||||
def init(self, cr):
|
||||
tools.drop_view_if_exists(cr, 'report_products_to_received_planned')
|
||||
cr.execute("""
|
||||
@@ -2404,6 +2418,7 @@ class report_products_to_received_planned(osv.osv):
|
||||
group by stock.date_planned
|
||||
)
|
||||
""")
|
||||
|
||||
report_products_to_received_planned()
|
||||
|
||||
class report_delivery_products_planned(osv.osv):
|
||||
@@ -2440,5 +2455,7 @@ class report_delivery_products_planned(osv.osv):
|
||||
|
||||
)
|
||||
""")
|
||||
|
||||
report_delivery_products_planned()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
+42
-40
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<menuitem icon="terp-stock" id="menu_stock_root" name="Warehouse" sequence="5"/>
|
||||
<menuitem id="menu_stock_warehouse_mgmt" name="Warehouse Management" parent="menu_stock_root" sequence="1"/>
|
||||
<menuitem id="menu_stock_products_moves" name="Products Moves" parent="menu_stock_root" sequence="2"/>
|
||||
@@ -77,8 +78,8 @@
|
||||
<field name="state"/>
|
||||
</tree>
|
||||
</field>
|
||||
|
||||
</record>
|
||||
|
||||
<record id="view_inventory_form" model="ir.ui.view">
|
||||
<field name="name">stock.inventory.form</field>
|
||||
<field name="model">stock.inventory</field>
|
||||
@@ -129,6 +130,7 @@
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_inventory_form" model="ir.actions.act_window">
|
||||
<field name="name">Periodical Inventory</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
@@ -636,18 +638,18 @@
|
||||
<button
|
||||
name="%(stock.track_line)d"
|
||||
string="Split in production lots"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
type="action" icon="terp-stock_effects-object-colorize"
|
||||
states="draft,waiting,confirmed,assigned" />
|
||||
<field groups="base.group_extended" name="tracking_id"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<field name="location_id"/>
|
||||
<field name="location_dest_id"/>
|
||||
@@ -686,14 +688,14 @@
|
||||
|
||||
<newline/>
|
||||
<label/>
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
states="draft,waiting,confirmed,assigned"
|
||||
type="action" icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended" />
|
||||
<button name="%(move_scrap)d" string="Scrap" type="action" icon="gtk-justify-fill"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
states="draft,assigned,confirmed,done"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize" />
|
||||
<separator colspan="4" string="Move State"/>
|
||||
<field name="state"/>
|
||||
@@ -806,9 +808,9 @@
|
||||
<field name="prodlot_id" groups="base.group_extended"/>
|
||||
<field groups="base.group_extended" name="tracking_id"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
@@ -855,13 +857,13 @@
|
||||
<field groups="base.group_extended" name="tracking_id"/>
|
||||
|
||||
<label/>
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
groups="base.group_extended"
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
groups="base.group_extended"
|
||||
states="draft,waiting,confirmed,assigned"
|
||||
type="action" icon="terp-stock_effects-object-colorize"/>
|
||||
<label/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<separator colspan="4" string="Move State"/>
|
||||
@@ -1015,13 +1017,13 @@
|
||||
groups="base.group_extended"/>
|
||||
<field name="tracking_id" groups="base.group_extended"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<field name="location_id"/>
|
||||
<field name="date_planned"/>
|
||||
@@ -1055,12 +1057,12 @@
|
||||
<label/>
|
||||
<button name="%(track_line)d" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
/>
|
||||
<label/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<label/>
|
||||
<separator colspan="4" string="Move State"/>
|
||||
@@ -1214,11 +1216,11 @@
|
||||
states="draft,waiting,confirmed,assigned" />
|
||||
<field name="tracking_id" groups="base.group_extended"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<field name="state"/>
|
||||
@@ -1252,7 +1254,7 @@
|
||||
<button groups="base.group_extended" name="267" string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize"/>
|
||||
<label/>
|
||||
<button name="275" string="Split Stock Moves" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','<>',False)]}" states="draft,assigned,confirmed,done"/>
|
||||
<separator colspan="4" string="Move State"/>
|
||||
<field name="state"/>
|
||||
@@ -1399,16 +1401,16 @@
|
||||
states="draft,waiting,confirmed,assigned" />
|
||||
<field name="prodlot_id" groups="base.group_extended"/>
|
||||
<button name="%(track_line)d" string="Split in Production Lots" type="action"
|
||||
icon="gtk-justify-fill"
|
||||
icon="gtk-justify-fill"
|
||||
states="draft,waiting,confirmed,assigned"
|
||||
groups="base.group_extended"/>
|
||||
<field groups="base.group_extended" name="tracking_id"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize" attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<field name="location_id"/>
|
||||
@@ -1470,12 +1472,12 @@
|
||||
<group colspan="4" col="4">
|
||||
<label/>
|
||||
<button name="%(track_line)d"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
states="draft,waiting,confirmed,assigned"
|
||||
string="Split in production lots" type="action" icon="terp-stock_effects-object-colorize" colspan="2" />
|
||||
<label/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
</group>
|
||||
@@ -1568,12 +1570,12 @@
|
||||
groups="base.group_extended"/>
|
||||
<field name="tracking_id" groups="base.group_extended"/>
|
||||
<button name="setlast_tracking" string="Put in current pack" type="object"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
attrs="{'invisible': [('tracking_id','<>',False)]}"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<field name="date_planned"/>
|
||||
@@ -1618,18 +1620,18 @@
|
||||
<field groups="base.group_extended" name="tracking_id"/>
|
||||
<newline/>
|
||||
<label/>
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
states="draft,waiting,confirmed,assigned"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
type="action" icon="terp-stock_effects-object-colorize"/>
|
||||
<label/>
|
||||
<button name="%(split_into)d" string="Put in a new pack" type="action"
|
||||
groups="base.group_extended"
|
||||
groups="base.group_extended"
|
||||
icon="terp-stock_effects-object-colorize"
|
||||
states="draft,assigned,confirmed,done"/>
|
||||
<label/>
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
groups="base.group_extended"
|
||||
<button name="%(track_line)d" string="Split in production lots"
|
||||
groups="base.group_extended"
|
||||
type="action" icon="terp-stock_effects-object-colorize"/>
|
||||
<separator colspan="4" string="Move State"/>
|
||||
<field name="state"/>
|
||||
@@ -1970,4 +1972,4 @@
|
||||
parent="menu_warehouse_config" />
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
@@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!--
|
||||
<wizard string="UPS xml file" model="stock.move.lot" name="stock.ups_xml" />
|
||||
-->
|
||||
|
||||
<wizard
|
||||
id="split_inventory_lots"
|
||||
model="stock.inventory.line"
|
||||
multi="True"
|
||||
name="stock.inventory.line.split"
|
||||
string="Split inventory lines"/>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="wkf_picking" model="workflow">
|
||||
<field name="name">stock.picking.basic</field>
|
||||
<field name="osv">stock.picking</field>
|
||||
@@ -43,7 +44,7 @@
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_cancel()</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="act_cancel" model="workflow.activity">
|
||||
<field name="wkf_id" ref="wkf_picking"/>
|
||||
<field name="name">cancel</field>
|
||||
@@ -51,7 +52,7 @@
|
||||
<field name="kind">function</field>
|
||||
<field name="action">action_cancel()</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="trans_draft_confirmed" model="workflow.transition">
|
||||
<field name="act_from" ref="act_draft"/>
|
||||
<field name="act_to" ref="act_confirmed"/>
|
||||
@@ -134,5 +135,6 @@
|
||||
<field name="act_to" ref="act_cancel"/>
|
||||
<field name="condition">test_cancel()</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user