Глобальная / Линейная скидка на Продажу/Покупку/Учетную запись

#odoo #odoo-14

Вопрос:

[Издание сообщества Odoo 14]

Мне нужно настроить Глобальные и линейные скидки (сумма и процент) на продажу / покупку / Учетную запись.

Я занимался продажей и покупкой запчастей. Это просто добавление полей и нескольких логик здесь и там и отправка данных в учетную запись (account.move) методами prepare_invoice.

Теперь вот проблема, с которой я столкнулся, — Учетная запись. У меня возникает огромная путаница в том, где я должен изменить. После того, как я попытался понять и отследить поток стандартного выставления счетов/выставления счетов, я растерялся. Для меня, не разбирающегося в бухгалтерском учете, слишком много функций/переменных, чтобы пытаться извлечь из этого всю идею.

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

Дело в том, что мне нужны точные предложения и/или указания о том, какие функции/методы я должен унаследовать ровно настолько, чтобы это стало возможным. У меня есть 2 поля скидки по строке (сумма и процент) и 2 Глобальных скидки (также сумма и процент). Расчет между ними здесь не представляет интереса. Единственная проблема на данный момент заключается в интеграции этих полей (из SO, PO и созданных вручную) в расчет всего в выставлении счетов/выставлении счетов.

Вот поля:

учетная запись.переместить

 global_discount_amount = fields.Float(string='Global Discount Amount', compute=compute_global_discount_amount, store=True)
global_discount_percent = fields.Float(string='Global Discount Percent', compute=compute_global_discount_percent, store=True)
 

учетная запись.переместить.строка

 discount_line_amount = fields.Float(string='Disc. Line Amount', compute=compute_discount_line_amount, store=True)
discount_line_percent = fields.Float(string='Disc. Line %', compute=compute_discount_line_percent, store=True)
 

Прямо сейчас я путаюсь с некоторыми методами, такими как: (несколько примеров)

учетная запись.переместить

  • _recompute_tax_линии

учетная запись.переместить.строка

  • Создать
  • _get_fields_onchange_balance_модель
  • _get_price_total_and_subtotal_model
  • _onchange_price_субтотал

Большинство модификаций написаны путем копирования всего метода из стандарта в мою новую модель (унаследуйте эту стандартную модель) и отредактируйте некоторые коды здесь-Переопределите стандартный код из моего понимания.

Ответ №1:

Вычисление/выполнение функции либо зависит от изменения значений других полей, либо вычисляется каждый раз при загрузке формы/представления списка.

Проверьте в вашем случае, что зависит от функции compute_global_discount_amount и compute_global_discount_percentage

Для лучшей разработки/устранения неполадок удалите все @depends() объявления полей в функциях. Кроме того, store=True временно удалите атрибут. Это поможет вам сузить круг вопросов. И убедитесь, что вы получили правильные цифры.

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

Вот пример переопределения метода (Odoo 14 CE), который будет выполняться во время вычисления суммы.

 @api.depends(
    'line_ids.matched_debit_ids.debit_move_id.move_id.payment_id.is_matched',
    'line_ids.matched_debit_ids.debit_move_id.move_id.line_ids.amount_residual',
    'line_ids.matched_debit_ids.debit_move_id.move_id.line_ids.amount_residual_currency',
    'line_ids.matched_credit_ids.credit_move_id.move_id.payment_id.is_matched',
    'line_ids.matched_credit_ids.credit_move_id.move_id.line_ids.amount_residual',
    'line_ids.matched_credit_ids.credit_move_id.move_id.line_ids.amount_residual_currency',
    'line_ids.debit',
    'line_ids.credit',
    'line_ids.currency_id',
    'line_ids.amount_currency',
    'line_ids.amount_residual',
    'line_ids.amount_residual_currency',
    'line_ids.payment_id.state',
    'line_ids.full_reconcile_id')
def _compute_amount(self):
    super()._compute_amount()
    for record in self:
        record.compute_global_discount_amount()
        record.compute_global_discount_percent()

def compute_global_discount_amount(self):
    for record in self:
        # Execute your logic for compute global_discount_amount
        record.global_discount_amount = $$
 

Ответ №2:

взгляните на apply_discount функцию в унаследованном классе sale.order

 def apply_discount(self, cr, uid, ids, discount_rate):
        cur_obj = self.pool.get('res.currency')
        res = {}
        line_obj = self.pool.get('sale.order.line')
        for order in self.browse(cr, uid, ids, context=None):
            for line in order.order_line:
                line_obj.write(cr, uid, [line.id], {'discount': discount_rate}, context=None)
        return res
 

Новый столбец был добавлен в новый унаследованный подкласс заказа на продажу

'discount_rate' : fields.float('Discount rate'),

Затем в представлении заказа на продажу (унаследованном) разместил новое поле discount sale.order.view и запустил событие по on_change значению, передав значение поля on_change событию

Таким образом, вы можете последовательно применять скидку к строкам заказа, не изменяя обычный процесс.

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

1. В SO и PO это уже правильно. Проблема в счете/выставлении счетов.

2. Проверьте это apps.odoo.com/apps/modules/9.0/sale_invoice_global_discount

3. @holydragon Как ты в итоге это сделал?

4. Я все еще пытаюсь сделать это, путаясь со стандартными методами в account.move и account.move.line. Почти на месте, я думаю, но все очень запутано. Однако мне все еще нужен правильный/лучший способ сделать это.