2012-03-17 11 views
3

私はここでこれを尋ねるべきかどうかは分かりません(私は現在、モデレータがstackoverflowにそれを移動させると考えています)が、openerpまたはlaunchpadフォーラムでは回答が得られません。これは、請求書のライン価格単位と割引と言うことであるopenerpサーバーの動作 - Pythonコード

class account_invoice(osv.osv): 
    _inherit = "account.invoice" 

    """ Function to update all lines on invoice """ 
    def update_invoice(self, cr, uid, ids, context=None): 
     if context is None: 
      context = {} 
     line_obj = self.pool.get('account.invoice.line') 
     invoice_ids = self.browse(cr, uid, ids, context) 
     for invoice in invoice_ids: 
      for line in invoice.invoice_line: 
       if line.product_id: 
        res = line_obj.product_id_change(cr, uid, [line.id], (line.product_id and line.product_id.id or False), uom=(line.uos_id and line.uos_id.id or False), qty=(line.quantity or 0), 
       name=(line.name or ''), type=(invoice.type or False), partner_id=invoice.partner_id.id, fposition_id=invoice.fiscal_position.id, price_unit=(line.price_unit or 0), 
       address_invoice_id=(invoice.address_invoice_id and invoice.address_invoice_id.id or False), currency_id=(invoice.currency_id and invoice.currency_id.id or False), context=context) 
        price_unit = res['value']['price_unit'] 
        discount = res['value']['discount'] 
        line_obj.write(cr, uid, [line.id], {'price_unit': price_unit}) 
        line_obj.write(cr, uid, [line.id], {'discount': discount}) 
     return True 

    account_invoice() 

:OpenERP 6.0.1、次の関数で
は何のボタンが請求書フォームに配置されたときにそれを実行するために行うことになっていこのボタンがフォーム内でクリックされると更新されます。

私はメニュー項目からのすべての請求書に対してこの機能を実行する "python code"タイプのオブジェクト "Invoice"のサーバーアクションを作成しようとしています。 Pythonコードボックスで、私は書いた:

inv = self.pool.get('account.invoice') 
line_obj = self.pool.get('account.invoice.line') 
for invoice in inv.browse(cr, uid, ids): 
    for line in invoice.invoice_line: 
     res = line_obj.product_id_change(cr, uid, [line.id], (line.product_id and line.product_id.id or False), uom=(line.uos_id and line.uos_id.id or False), qty=(line.quantity or 0), name=(line.name or ''), type=(invoice.type or False), partner_id=invoice.partner_id.id, fposition_id=invoice.fiscal_position.id, price_unit=(line.price_unit or 0), address_invoice_id=(invoice.address_invoice_id and invoice.address_invoice_id.id or False), currency_id=(invoice.currency_id and invoice.currency_id.id or False), context=context) 
    price_unit = res['value']['price_unit'] 
    discount = res['value']['discount'] 
    line_obj.write(cr, uid, [line.id], {'price_unit': price_unit}) 
    line_obj.write(cr, uid, [line.id], {'discount': discount}) 

しかし、それは動作しません。私は間違って何をしていますか?

EDIT: は誰も私が更新関数を書くことができます/account/wizard/account_invoice_state.pyと同様のすべての請求書行?

+0

見当もつかない誰ですか? – 3a2roub

+0

"それは動作しない"部分でより正確に記述できますか? –

+0

もし私が文法を間違えてしまった場合は、メニュー項目をダブルクリックするとエラーが発生します。今はそれが原因でエラーが発生しないので、請求書のみが変更されることはありません。関数が間違った場所で実行されていて実際の請求書に適用されていないかのように扱われます。 – 3a2roub

答えて

1

私は成功した私は必要なものを書くことに成功し、ここではありません:

class account_invoice_update(osv.osv_memory): 

_name = "account.invoice.update" 

""" Function to update all lines on selected invoice(s) """ 
def invoice_update(self, cr, uid, ids, context=None): 
    if context is None: 
     context = {} 

    pool_obj = pooler.get_pool(cr.dbname) 
    data_inv = pool_obj.get('account.invoice').read(cr, uid, context['active_ids'], ['state'], context=context) 

    for record in data_inv: 
     if record['state'] in ('cancel','paid','open'): 
      raise osv.except_osv(_('Warning'), _("Selected Invoice(s) cannot be cancelled as they are already in 'Cancelled','Done', or 'Open' state!")) 

    inv_obj = self.pool.get('account.invoice') 
    inv_line_obj = self.pool.get('account.invoice.line') 
    for invoice in inv_obj.browse(cr, uid, context.get('active_ids'), context=context): 
     for line in invoice.invoice_line: 
      res = inv_line_obj.product_id_change(cr, uid, [line.id], (line.product_id and line.product_id.id or False), uom=(line.uos_id and line.uos_id.id or False), qty=(line.quantity or 0), name=(line.name or ''), type=(invoice.type or False), partner_id=invoice.partner_id.id, fposition_id=invoice.fiscal_position.id, price_unit=(line.price_unit or 0), address_invoice_id=(invoice.address_invoice_id and invoice.address_invoice_id.id or False), currency_id=(invoice.currency_id and invoice.currency_id.id or False), context=context) 
      price_unit = res['value']['price_unit'] 
      discount = res['value']['discount'] 
      inv_line_obj.write(cr, uid, [line.id], {'price_unit': price_unit}) 
      inv_line_obj.write(cr, uid, [line.id], {'discount': discount}) 

    return {'type': 'ir.actions.act_window_close'} 

account_invoice_update() 
+0

'pooler'とは何ですか?どのように定義しましたか?あなたはそれを輸入しましたか?それともあなたが割り当てたグローバル変数ですか? – Paco

0

単純なPythonコードを書くことができます。あなたはself.pool.get()を使用しようとしています。サーバーアクションでは不可能です。あなたの要件について具体的にお答えください。

+0

私はこれが、私が関数に似た関数を書くことに焦点を当てていることに気付きました:** account_invoice_state.py **の** invoice_confirm **そして**アクション**から関数を実行します。今はちょうどちょうどちょうど**正しく機能している上記の** update_invoice **を修正する問題です。私は模倣の並べ替えをしようとしているサンプル関数を投稿する必要がありますか? – 3a2roub

1

画面で選択した行にコードを実行する場合は、client_action_multiのウィザードを使用します。それは、リストで選択したレコード上で実行することができclient_action_multi

import wizard 
import pooler 

def _set_flags(self, cr, uid, data, context): 
    stock_picking_obj = pooler.get_pool(cr.dbname).get('stock.picking') 

    move_ids = data['ids'] 
    picking_ids = stock_picking_obj.search(
     cr, 
     uid, 
     [('move_lines', 'in', move_ids)]) 
    stock_picking_obj.write(cr, uid, picking_ids, {'sanity_checked': True}) 
    return {} 

class sanity_checked(wizard.interface): 
    states = { 
     'init': { 
      'actions': [_set_flags], 
      'result': {'type': 'state', 'state':'end'} 
     }, 
    } 
sanity_checked('promise.date.sanity.checked') 

I configure the wizard

<wizard 
     id="wiz_sanity_checked" 
     model="stock.move" 
     string="Sanity Checked" 
     name="promise.date.sanity.checked" 
     keyword="client_action_multi"/> 

が実際に実行するには、ここだけの株式pickingsにフラグ「をチェック健全性」を設定a wizard I wroteですウィザードで、メニューバーの[アクション]ボタンをクリックします。

+0

ありがとうございました。これは便利です – 3a2roub

関連する問題