# -*- coding: utf-8 -*- ############################################################################## # # Author: Nicolas Bessi # Copyright 2013, 2014 Camptocamp SA # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # 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/>. # ############################################################################## from datetime import datetime from openerp.tools import DEFAULT_SERVER_DATE_FORMAT from openerp.osv import orm, fields # Using new API seem to have side effect on # other official addons class product_pricelist(orm.Model): """Add framework agreement behavior on pricelist""" _inherit = "product.pricelist" def _plist_is_agreement(self, cr, uid, pricelist_id, context=None): """Check that a price list can be subject to agreement. :param pricelist_id: the price list to be validated :returns: a boolean (True if agreement is applicable) """ p_list = self.browse(cr, uid, pricelist_id, context=context) return p_list.type == 'purchase' def price_get(self, cr, uid, ids, prod_id, qty, partner=None, context=None): """Override of price retrieval function in order to support framework agreement. If it is a supplier price list, agreement will be taken in account and use the price of the agreement if required. If there is not enough available qty on agreement, standard price will be used. This is maybe a faulty design and we should use on_change override """ if context is None: context = {} agreement_obj = self.pool['framework.agreement'] res = super(product_pricelist, self).price_get( cr, uid, ids, prod_id, qty, partner=partner, context=context) if not partner: return res for pricelist_id in res: if (pricelist_id == 'item_id' or not self._plist_is_agreement(cr, uid, pricelist_id, context=context)): continue now = datetime.strptime(fields.date.today(), DEFAULT_SERVER_DATE_FORMAT) date = context.get('date') or context.get('date_order') or now prod = self.pool['product.product'].browse(cr, uid, prod_id, context=context) agreement = agreement_obj.get_product_agreement( cr, uid, prod.product_tmpl_id.id, partner, date, qty=qty, context=context ) if agreement is not None: currency = agreement_obj._get_currency( cr, uid, partner, pricelist_id, context=context ) res[pricelist_id] = agreement.get_price(qty, currency=currency) return res