odoo составляет накладную на основе перемещений запасов

#xml #odoo #crm #odoo-11

#xml #odoo #crm #odoo-11

Вопрос:

Я тестировал и искал решение своей проблемы, но я не могу его найти, заранее спасибо всем, кто помогает.

В Odoo 11 я пытаюсь создавать счета-фактуры для поставщиков из перемещений на складе, поэтому я добавил древовидное представление внутри листа блокнота account.invoice.supplier.form , которое выглядит следующим образом:

 <field name="x_stock_move" widget="many2many" options="{'no_create': True}" domain="['amp;amp;',
  ('state','=','done'), ('picking_partner_id','=',context.get('partner_id'))]" 
  attrs="{'readonly':[('state','not in',('draft',))]}">
  <tree>
    <field name="state" invisible="1"/> 
    <field name="date" />
    <field name="picking_partner_id" invisible="1"/>
    <field name="reference" />
    <field name="product_id" />
    <field name="product_uom_qty" string="Cantidad" />
    <field name="product_uom" />
  </tree>
</field>
 

account.invoice имеет x_stock_move поле one2many, связанное со счетом-фактурой, через x_invoice_id которое many2one в stock.move

Моя проблема возникает, когда (в поле account.invoice.supplier.form x_stock_move) Я нажимаю «добавить элемент»: Я вижу все stock.moves, статус которых «выполнен», и у них тот же партнер, что и у выбранного в счете, но я также могу выбрать stock.moves, которые назначены другому счету, и это должно быть невозможно.

Я попытался добавить домен [('x_invoice_id','=','False')] в поле x_stock_move , но это изменяет представление дерева внутри account.invoice.supplier.form , а не форму «добавить элемент», таким образом, я не могу добавлять перемещения запасов в счета.

Добавление context="{'x_invoice_id':'False'}" или False , похоже, ничего не меняет.

Что я должен сделать, чтобы позволить пользователю выбирать только stock.moves те, у которых нет x_invoice_id связанного inside account.invoice.supplier.form ?

А вот для части 2:

Как я могу добавить каждую запись из x_stock_move as invoice_line_id в счет, который я создаю? (Я бы предпочел сделать это, просто отредактировав представление xml account.invoice.supplier.form или не разрабатывая пользовательский модуль)

Спасибо, что зашли так далеко, и надеюсь, у вас будет хороший день 🙂

Чтобы немного упростить, я закончил разработку модуля, вот описание моей модели:

 class Move(models.Model):
    _inherit = 'stock.move'


    x_invoice_id = fields.Many2one('account.invoice',
        string="Factura de referencia", ondelete='set null')


class Invoice(models.Model):
    _inherit = 'account.invoice'

    x_stock_move = fields.One2many('stock.move',
        string="Movimiento asociado",'x_invoice_id')
 

Как я могу добавить каждое x_stock_move.product_id и x_stock_move.product_qty в качестве строки счета-фактуры?

Комментарии:

1. Часть 1 можно решить, просто проверив, как правильно составлять связанные домены domain="['amp;amp;', ('state','=','done'), ('picking_partner_id','=',context.get('partner_id')), 'amp;amp;', ('x_invoice_id','=',False)]"

2. Не могли бы вы, пожалуйста, добавить сюда определение поля x_stock_move и x_invoice_id код python? Вы часто смешиваете «many2many» и «one2many» в своем вопросе. Не лучше ли было бы создать процесс с «другой стороны»? Я имею в виду создание счетов-фактур из ходов (списка) или даже из целых партий.

3.Я не делаю этого, разрабатывая модуль, я только что создал два новых столбца в моделях account.invoice имеет x_stock_move one2many объект типа поля stock.move rel x_invoice_id stock.move имеет x_invoice_id many2one объект типа поля account.invoice

4. создание счетов-фактур из ходов звучит как жизнеспособная идея для части 2, я попытаюсь найти решение с помощью этих строк

5. Ваши требования будут зависеть от пользовательского модуля, просто говорю.

Ответ №1:

Вы можете сделать это с помощью мастера, который использует active_id накладной при нажатии на действие, чтобы открыть мастер. Смотрите мой пример ниже (не тестировался, но вы получите концепцию)

stock_move_invoice_wizard.xml

 <record model="ir.ui.view" id="stock_move_invoice_wizard">
    <field name="name">Stock Move Invoice</field>
    <field name="model">stock.move.invoice.wizard</field>
    <field name="type">form</field>
    <field name="arch" type="xml">
        <form string="Stock Move Invoice">
            <group>
                <field name="invocie_id"/>
            </group>
            <group>
                <field name="moves_ids"/>
            </group>
            <footer>
                <button name="action_update_moves_date" string="Link moves to invocie" type="object" class="oe_highlight"/>
                <button string="Cancel" special="cancel"/>
            </footer>
        </form>
    </field>
</record>
 

и в том же файле добавьте действие для вызова мастера

 <act_window id="action_stock_move_invoice_wizard"
            name="Stock Move Invoice"
            res_model="stock.move.invoice.wizard"
            context="{'default_invoice_id': active_id}"
            view_mode="form"
            target="new"/>
 

stock_move_invoice_wizard.py

 class StockMoveInvoiceWizard(models.TransientModel):
    _name = 'stock.move.invoice.wizard'

    invoice_id = fields.Many2one('account.invoice', readonly=True)
    moves_ids = fields.Many2many('stock.move')

    def action_update_moves_invoice(self):
        for rec in self:
            for move in rec.moves_ids:
                move.x_invoice_id = rec.invoice_id.id
 

account_invoice.xml

 <record id="account_invoice_form_inherit" model="ir.ui.view">
    <field name="name">account.invoice.form.inherit</field>
    <field name="model">account.invoice</field>
    <field name="inherit_id" ref="put_here_the_move_view_external_id"/>
    <field name="arch" type="xml">
        <xpath expr="//button[@name='action_cancel']" position="after">
            <button name="%(your_module_external_id.action_stock_move_invoice_wizard)d" string="Link Stock Moves" type="action"/>
        </xpath>
    </field>
</record>