[MERGE] forward port of branch saas-4 up to f68c835
authorChristophe Simonis <chs@odoo.com>
Wed, 25 Jun 2014 10:43:41 +0000 (12:43 +0200)
committerChristophe Simonis <chs@odoo.com>
Wed, 25 Jun 2014 10:43:41 +0000 (12:43 +0200)
1  2 
addons/crm_claim/crm_claim.py
addons/l10n_be/wizard/l10n_be_vat_intra.py
addons/purchase_requisition/purchase_requisition.py
addons/web/static/src/js/chrome.js
addons/web_calendar/static/src/js/web_calendar.js
addons/website/controllers/main.py
addons/website/static/src/js/website.translator.js
openerp/addons/base/ir/ir_ui_view.py

Simple merge
@@@ -82,96 -64,58 +82,100 @@@ class purchase_requisition(osv.osv)
              'name': self.pool.get('ir.sequence').get(cr, uid, 'purchase.order.requisition'),
          })
          return super(purchase_requisition, self).copy(cr, uid, id, default, context)
 -    
 +
      def tender_cancel(self, cr, uid, ids, context=None):
          purchase_order_obj = self.pool.get('purchase.order')
 -        for purchase in self.browse(cr, uid, ids, context=context):
 -            for purchase_id in purchase.purchase_ids:
 -                if str(purchase_id.state) in('draft'):
 -                    purchase_order_obj.action_cancel(cr,uid,[purchase_id.id])
 +        #try to set all associated quotations to cancel state
 +        purchase_ids = []
 +        for tender in self.browse(cr, uid, ids, context=context):
 +            for purchase_order in tender.purchase_ids:
 +                purchase_order_obj.action_cancel(cr, uid, [purchase_order.id], context=context)
 +                purchase_order_obj.message_post(cr, uid, [purchase_order.id], body=_('Cancelled by the tender associated to this quotation.'), context=context)
+         procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context)
+         self.pool['procurement.order'].action_done(cr, uid, procurement_ids)
          return self.write(cr, uid, ids, {'state': 'cancel'})
  
      def tender_in_progress(self, cr, uid, ids, context=None):
 -        return self.write(cr, uid, ids, {'state':'in_progress'} ,context=context)
 +        return self.write(cr, uid, ids, {'state': 'in_progress'}, context=context)
 +
 +    def tender_open(self, cr, uid, ids, context=None):
 +        return self.write(cr, uid, ids, {'state': 'open'}, context=context)
  
      def tender_reset(self, cr, uid, ids, context=None):
 -        return self.write(cr, uid, ids, {'state': 'draft'})
 +        self.write(cr, uid, ids, {'state': 'draft'})
 +        for p_id in ids:
 +            # Deleting the existing instance of workflow for PO
 +            self.delete_workflow(cr, uid, [p_id])
 +            self.create_workflow(cr, uid, [p_id])
 +        return True
  
      def tender_done(self, cr, uid, ids, context=None):
+         procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context)
+         self.pool['procurement.order'].action_done(cr, uid, procurement_ids)
 -        return self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context)
 -
 -    def _planned_date(self, requisition, delay=0.0):
 -        company = requisition.company_id
 -        date_planned = False
 -        if requisition.date_start:
 -            date_planned = datetime.strptime(requisition.date_start, '%Y-%m-%d %H:%M:%S') - relativedelta(days=company.po_lead)
 -        else:
 -            date_planned = datetime.today() - relativedelta(days=company.po_lead)
 -        if delay:
 -            date_planned -= relativedelta(days=delay)
 -        return date_planned and date_planned.strftime('%Y-%m-%d %H:%M:%S') or False
 -
 -    def _seller_details(self, cr, uid, requisition_line, supplier, context=None):
 +        return self.write(cr, uid, ids, {'state': 'done'}, context=context)
 +
 +    def open_product_line(self, cr, uid, ids, context=None):
 +        """ This opens product line view to view all lines from the different quotations, groupby default by product and partner to show comparaison
 +            between supplier price
 +            @return: the product line tree view
 +        """
 +        if context is None:
 +            context = {}
 +        res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'purchase_requisition', 'purchase_line_tree', context=context)
 +        res['context'] = context
 +        po_lines = self.browse(cr, uid, ids, context=context)[0].po_line_ids
 +        res['context'] = {
 +            'search_default_groupby_product': True,
 +            'search_default_hide_cancelled': True,
 +        }
 +        res['domain'] = [('id', 'in', [line.id for line in po_lines])]
 +        return res
 +
 +    def open_rfq(self, cr, uid, ids, context=None):
 +        """ This opens rfq view to view all quotations associated to the call for bids
 +            @return: the RFQ tree view
 +        """
 +        if context is None:
 +            context = {}
 +        res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'purchase', 'purchase_rfq', context=context)
 +        res['context'] = context
 +        po_ids = [po.id for po in self.browse(cr, uid, ids, context=context)[0].purchase_ids]
 +        res['domain'] = [('id', 'in', po_ids)]
 +        return res
 +
 +    def _prepare_purchase_order(self, cr, uid, requisition, supplier, context=None):
 +        supplier_pricelist = supplier.property_product_pricelist_purchase and supplier.property_product_pricelist_purchase.id or False
 +        picking_type_in = self.pool.get("purchase.order")._get_picking_in(cr, uid, context=context)
 +        return {
 +            'origin': requisition.name,
 +            'date_order': requisition.date_end or fields.date.context_today(self, cr, uid, context=context),
 +            'partner_id': supplier.id,
 +            'pricelist_id': supplier_pricelist,
 +            'location_id': requisition.picking_type_id.default_location_dest_id.id,
 +            'company_id': requisition.company_id.id,
 +            'fiscal_position': supplier.property_account_position and supplier.property_account_position.id or False,
 +            'requisition_id': requisition.id,
 +            'notes': requisition.description,
 +            'picking_type_id': picking_type_in,
 +        }
 +
 +    def _prepare_purchase_order_line(self, cr, uid, requisition, requisition_line, purchase_id, supplier, context=None):
 +        po_line_obj = self.pool.get('purchase.order.line')
          product_uom = self.pool.get('product.uom')
 -        pricelist = self.pool.get('product.pricelist')
          product = requisition_line.product_id
          default_uom_po_id = product.uom_po_id.id
 +        date_order = requisition.ordering_date or fields.date.context_today(self, cr, uid, context=context)
          qty = product_uom._compute_qty(cr, uid, requisition_line.product_uom_id.id, requisition_line.product_qty, default_uom_po_id)
 -        seller_delay = 0.0
 -        seller_price = False
 -        seller_qty = False
 -        for product_supplier in product.seller_ids:
 -            if supplier.id ==  product_supplier.name and qty >= product_supplier.qty:
 -                seller_delay = product_supplier.delay
 -                seller_qty = product_supplier.qty
 -        supplier_pricelist = supplier.property_product_pricelist_purchase or False
 -        seller_price = pricelist.price_get(cr, uid, [supplier_pricelist.id], product.id, qty, supplier.id, {'uom': default_uom_po_id})[supplier_pricelist.id]
 -        if seller_qty:
 -            qty = max(qty,seller_qty)
 -        date_planned = self._planned_date(requisition_line.requisition_id, seller_delay)
 -        return seller_price, qty, default_uom_po_id, date_planned
 +        supplier_pricelist = supplier.property_product_pricelist_purchase and supplier.property_product_pricelist_purchase.id or False
 +        vals = po_line_obj.onchange_product_id(cr, uid, [], supplier_pricelist, product.id, qty, default_uom_po_id,
 +            supplier.id, date_order=date_order, fiscal_position_id=supplier.property_account_position, date_planned=requisition_line.schedule_date,
 +            name=False, price_unit=False, state='draft', context=context)['value']
 +        vals.update({
 +            'order_id': purchase_id,
 +            'product_id': product.id,
 +            'account_analytic_id': requisition_line.account_analytic_id.id,
 +        })
 +        return vals
  
      def make_purchase_order(self, cr, uid, ids, partner_id, context=None):
          """
@@@ -352,51 -216,21 +356,55 @@@ class purchase_order(osv.osv)
                              proc_obj.write(cr, uid, proc_ids, {'purchase_id': po.id})
                          self.signal_purchase_cancel(cr, uid, [order.id])
                      po.requisition_id.tender_done(context=context)
+             if po.requisition_id and all(purchase_id.state in ['draft', 'cancel'] for purchase_id in po.requisition_id.purchase_ids if purchase_id.id != po.id):
+                 procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', '=', po.requisition_id.id)], context=context)
+                 for procurement in proc_obj.browse(cr, uid, procurement_ids, context=context):
+                     procurement.move_id.write({'location_id': procurement.move_id.location_dest_id.id})
          return res
  
 +    def copy(self, cr, uid, id, default=None, context=None):
 +        if context is None:
 +            context = {}
 +        if not context.get('force_requisition_id'):
 +            default = default or {}
 +            default.update({'requisition_id': False})
 +        return super(purchase_order, self).copy(cr, uid, id, default=default, context=context)
 +
 +    def _prepare_order_line_move(self, cr, uid, order, order_line, picking_id, group_id, context=None):
 +        stock_move_lines = super(purchase_order, self)._prepare_order_line_move(cr, uid, order, order_line, picking_id, group_id, context=context)
 +        if order.requisition_id and order.requisition_id.procurement_id and order.requisition_id.procurement_id.move_dest_id:
 +            for i in range(0, len(stock_move_lines)):
 +                stock_move_lines[i]['move_dest_id'] = order.requisition_id.procurement_id.move_dest_id.id
 +        return stock_move_lines
  
 -class product_product(osv.osv):
 -    _inherit = 'product.product'
 +
 +class purchase_order_line(osv.osv):
 +    _inherit = 'purchase.order.line'
  
      _columns = {
 -        'purchase_requisition': fields.boolean('Purchase Requisition', help="Check this box to generates purchase requisition instead of generating requests for quotation from procurement.")
 +        'quantity_bid': fields.float('Quantity Bid', digits_compute=dp.get_precision('Product Unit of Measure'), help="Technical field for not loosing the initial information about the quantity proposed in the bid"),
      }
 -    _defaults = {
 -        'purchase_requisition': False
 +
 +    def action_draft(self, cr, uid, ids, context=None):
 +        self.write(cr, uid, ids, {'state': 'draft'}, context=context)
 +
 +    def action_confirm(self, cr, uid, ids, context=None):
 +        super(purchase_order_line, self).action_confirm(cr, uid, ids, context=context)
 +        for element in self.browse(cr, uid, ids, context=context):
 +            if not element.quantity_bid:
 +                self.write(cr, uid, ids, {'quantity_bid': element.product_qty}, context=context)
 +        return True
 +
 +    def generate_po(self, cr, uid, tender_id, context=None):
 +        #call generate_po from tender with active_id. Called from js widget
 +        return self.pool.get('purchase.requisition').generate_po(cr, uid, [tender_id], context=context)
 +
 +
 +class product_template(osv.osv):
 +    _inherit = 'product.template'
 +
 +    _columns = {
 +        'purchase_requisition': fields.boolean('Call for Bids', help="Check this box to generate Call for Bids instead of generating requests for quotation from procurement.")
      }
  
  
Simple merge
Simple merge
Simple merge