Comment 7 for bug 1080617

Revision history for this message
Alexandre Fayolle - camptocamp (alexandre-fayolle-c2c) wrote : Re: [6.0 / 6.1 / trunk] Sale Order marked as delivered when the OUT move has not yet been processed

Hello Olivier,

thanks for looking into this.

Your analysis matches ours, regarding the procurement logic.

Regarding the resolution, this is really an important topic for my current customer running 6.1 (hence the OPW I opened). The current situation for the sales team is a total mess of sales marked shipped, some of which are indeed shipped and others which are not, which makes giving information on the phone to the customers inquiring about the status of their orders quite painful (and with Christmas approaching people are indeed getting touchy on that topic, and the Sales period will start shortly after that in January). The invoicing situation is also awkward, as the invoicing policy is to send the invoice when the order is shipped, which results in invoices being sent before the goods are really shipped...

For the record, the Magento connector uses the following SQL query to find out which sale orders have been completely shipped (crossing fingers in hope the formatting will be preserved)

class sale_shop(osv.osv):
    _inherit = 'sale.shop'
    def _export_shipping_query(self, cr, uid, shop, context=None):
        query = """
        SELECT stock_picking.id AS picking_id,
               sale_order.id AS order_id,
               count(pickings.id) AS picking_number
        FROM stock_picking
        LEFT JOIN sale_order
                  ON sale_order.id = stock_picking.sale_id
        LEFT JOIN stock_picking as pickings
                  ON (sale_order.id = pickings.sale_id
                      AND pickings.type='out'
                      AND pickings.state != 'cancel')
        LEFT JOIN ir_model_data
                  ON stock_picking.id = ir_model_data.res_id
                  AND ir_model_data.model = 'stock.picking'
        LEFT JOIN delivery_carrier
                  ON delivery_carrier.id = stock_picking.carrier_id
        WHERE shop_id = %(shop_id)s
              AND ir_model_data.res_id ISNULL
              AND stock_picking.state = 'done'
              AND stock_picking.type = 'out'
              AND NOT stock_picking.do_not_export
              AND (NOT delivery_carrier.export_needs_tracking
                   OR stock_picking.carrier_tracking_ref IS NOT NULL)
        GROUP BY stock_picking.id,
                 sale_order.id,
                 delivery_carrier.export_needs_tracking,
                 stock_picking.carrier_tracking_ref,
                 stock_picking.backorder_id
        ORDER BY sale_order.id ASC,
                 COALESCE(stock_picking.backorder_id, NULL, 0) ASC"""
        params = {'shop_id': shop.id}
        return query, params

    def export_shipping(self, cr, uid, ids, context):
        picking_obj = self.pool.get('stock.picking')
        for shop in self.browse(cr, uid, ids):
            cr.execute(*self._export_shipping_query(
                            cr, uid, shop, context=context))
            results = cr.dictfetchall()
            if not results:
                _logger.info("There is no shipping to export for the shop '%s' to the external referential", shop.name)
                continue
            context['conn_obj'] = shop.referential_id.external_connection()

            picking_cr = pooler.get_db(cr.dbname).cursor()
            try:
                for result in results:
                    picking_id = result['picking_id']

                    if result["picking_number"] == 1:
                        picking_type = 'complete'
                    else:
                        picking_type = 'partial'
           [...]

http://bazaar.launchpad.net/~extra-addons-commiter/e-commerce-addons/oerp6.1-stable/view/head:/base_sale_multichannels/sale.py#L387

Maybe a similar approach could be used in sales?