~unifield-team/unifield-wm/us-671-homere

« back to all changes in this revision

Viewing changes to msf_outgoing/msf_outgoing.py

  • Committer: jf
  • Date: 2015-07-24 09:52:17 UTC
  • mfrom: (2551.1.2 us-286)
  • Revision ID: jfb@tempo-consulting.fr-20150724095217-lqyziqd3k7g5este
US-286 [FIX] Add checks on pick/pack/ship validation to block concurrent validation
lp:~unifield-team/unifield-wm/us-286

Show diffs side-by-side

added added

removed removed

Lines of Context:
759
759
 
760
760
                # Update the moves, decrease the quantities
761
761
                for move in move_obj.browse(cr, uid, move_ids, context=context):
 
762
                    if move.state != 'assigned':
 
763
                        raise osv.except_osv(
 
764
                            _('Error'),
 
765
                            _('All returned lines must be \'Available\'. Please check this and re-try.')
 
766
                        )
762
767
                    """
763
768
                    Stock moves are not canceled as for PPL return process
764
769
                    because this represents a draft packing, meaning some shipment could be canceled and
992
997
 
993
998
                move_data = {}
994
999
                for move in move_obj.browse(cr, uid, move_ids, context=context):
 
1000
                    if move.state != 'assigned':
 
1001
                        raise osv.except_osv(
 
1002
                            _('Error'),
 
1003
                            _('One of the returned family is not \'Available\'. Check the state of the pack families and re-try.'),
 
1004
                        )
 
1005
 
995
1006
                    move_data.setdefault(move.id, {
996
1007
                        'initial': move.product_qty,
997
1008
                        'partial_qty': 0,
1148
1159
            #assert shipment.state == 'packed', 'cannot ship a shipment which is not in correct state - packed - %s' % shipment.state
1149
1160
            if shipment.state != 'packed':
1150
1161
                raise osv.except_osv(_('Error, packing in wrong state !'),
1151
 
                    _('Cannot make a shipment which is in a wrong correct state - should be "packed" but here it is - %s' % shipment.state))
 
1162
                    _('Cannot process a Shipment which is in an incorrect state'))
1152
1163
 
1153
1164
            # the state does not need to be updated - function
1154
1165
            # update actual ship date (shipment_actual_date) to today + time
1241
1252
            # draft packing for this shipment - some draft packing can already be done for this shipment, so we filter according to state
1242
1253
            draft_packing_ids = pick_obj.search(cr, uid, [('shipment_id', '=', shipment.id), ('state', '=', 'draft'), ], context=context)
1243
1254
            for draft_packing in pick_obj.browse(cr, uid, draft_packing_ids, context=context):
1244
 
                assert draft_packing.subtype == 'packing', 'draft packing which is not packing subtype - %s' % draft_packing.subtype
1245
 
                assert draft_packing.state == 'draft', 'draft packing which is not draft state - %s' % draft_packing.state
 
1255
                if draft_packing.subtype != 'packing':
 
1256
                    raise osv.except_osv(
 
1257
                        _('Error'),
 
1258
                        _('The draft packing must be a \'Packing\' subtype')
 
1259
                    )
 
1260
                if draft_packing.state != 'draft':
 
1261
                    raise osv.except_osv(
 
1262
                        _('Error'),
 
1263
                        _('The draft packing must be in \'Draft\' state')
 
1264
                    )
 
1265
 
1246
1266
                # we check if the corresponding draft packing can be moved to done.
1247
1267
                # if all packing with backorder_id equal to draft are done or canceled
1248
1268
                # and the quantity for each stock move (state != done) of the draft packing is equal to zero
1256
1276
                            treat_draft = False
1257
1277
                        elif move.from_pack or move.to_pack:
1258
1278
                            # qty = 0, from/to pack should have been set to zero
1259
 
                            assert False, 'stock moves with 0 quantity but part of pack family sequence'
 
1279
                            raise osv.except_osv(
 
1280
                                _('Error'),
 
1281
                                _('There are stock moves with 0 quantity on the pack family sequence')
 
1282
                            )
1260
1283
 
1261
1284
                # check if ongoing packing are present, if present, we do not validate the draft one, the shipping is not finished
1262
1285
                if treat_draft:
1473
1496
 
1474
1497
        for shipment in self.browse(cr, uid, ids, context=context):
1475
1498
            # validate should only be called on shipped shipments
1476
 
            assert shipment.state in ('shipped',), 'shipment state is not shipped'
 
1499
            if shipment.state != 'shipped':
 
1500
                raise osv.except_osv(
 
1501
                    _('Error'),
 
1502
                    _('The state of the shipment must be \'Shipped\'. Please check it and re-try.')
 
1503
                )
1477
1504
            # corresponding packing objects - only the distribution -> customer ones
1478
1505
            # we have to discard picking object with state done, because when we return from shipment
1479
1506
            # all object of a given picking object, he is set to Done and still belong to the same shipment_id
1509
1536
        pick_obj = self.pool.get('stock.picking')
1510
1537
        for shipment in self.browse(cr, uid, ids, context=context):
1511
1538
            # validate should only be called on shipped shipments
1512
 
            assert shipment.state in ['done'], 'shipment state is not shipped'
 
1539
            if shipment.state != 'done':
 
1540
                raise osv.except_osv(
 
1541
                    _('Error'),
 
1542
                    _('The shipment must be \'Closed\'. Please check this and re-try')
 
1543
                )
1513
1544
            # gather the corresponding packing and trigger the corresponding function
1514
1545
            packing_ids = pick_obj.search(cr, uid, [('shipment_id', '=', shipment.id), ('state', '=', 'done')], context=context)
1515
1546
            # set delivered all packings
3297
3328
            for line in wizard.move_ids:
3298
3329
                move_data.setdefault(line.move_id.id, {
3299
3330
                    'initial_qty': line.move_id.product_qty,
 
3331
                    'line_number': line.move_id.line_number,
3300
3332
                    'processed_qty': 0.00,
3301
3333
                })
3302
3334
 
 
3335
 
3303
3336
                if line.uom_id.id != line.move_id.product_uom.id:
3304
3337
                    processed_qty = uom_obj._compute_qty(cr, uid, line.uom_id.id, line.quantity, line.move_id.product_uom.id)
3305
3338
                else:
3327
3360
 
3328
3361
            # Update initial stock moves
3329
3362
            for move_id, move_vals in move_data.iteritems():
 
3363
                if move_vals['processed_qty'] > move_vals['initial_qty']:
 
3364
                    raise osv.except_osv(
 
3365
                        _('Error'),
 
3366
                        _('Line %s :: You cannot processed more quantity than the quantity of the stock move - Maybe the line is already processed' % move_vals['line_number'])
 
3367
                    )
3330
3368
                initial_qty = max(move_vals['initial_qty'] - move_vals['processed_qty'], 0.00)
3331
3369
                wr_vals = {
3332
3370
                    'product_qty': initial_qty,
3381
3419
        if isinstance(ids, (int, long)):
3382
3420
            ids = [ids]
3383
3421
 
 
3422
        if self.read(cr, uid, ids[0], ['state'], context=context)['state'] != 'assigned':
 
3423
            raise osv.except_osv(
 
3424
                _('Error'),
 
3425
                _('The picking ticket is not in \'Available\' state. Please check this and re-try')
 
3426
            )
 
3427
 
3384
3428
        processor_id = proc_obj.create(cr, uid, {'picking_id': ids[0]}, context=context)
3385
3429
        proc_obj.create_lines(cr, uid, processor_id, context=context)
3386
3430
 
3427
3471
        for wizard in proc_obj.browse(cr, uid, wizard_ids, context=context):
3428
3472
            picking = wizard.picking_id
3429
3473
 
 
3474
            if picking.state != 'assigned':
 
3475
                raise osv.except_osv(
 
3476
                    _('Error'),
 
3477
                    _('The picking ticket is not in \'Available\' state. Please check this and re-try')
 
3478
                )
 
3479
 
3430
3480
            move_data = {}
3431
3481
            for move in picking.move_lines:
3432
3482
                if move.id not in move_data:
3629
3679
        if isinstance(ids, (int, long)):
3630
3680
            ids = [ids]
3631
3681
 
 
3682
        if self.read(cr, uid, ids[0], ['state'], context=context)['state'] != 'assigned':
 
3683
            raise osv.except_osv(
 
3684
                _('Error'),
 
3685
                _('The pre-packing list is not in \'Available\' state. Please check this and re-try')
 
3686
            )
 
3687
 
3632
3688
        processor_id = proc_obj.create(cr, uid, {'picking_id': ids[0]}, context=context)
3633
3689
        proc_obj.create_lines(cr, uid, processor_id, context=context)
3634
3690
 
3668
3724
 
3669
3725
        # Create the different pack families according to values in stock moves
3670
3726
        for wizard in proc_obj.browse(cr, uid, wizard_ids, context=context):
 
3727
            if wizard.picking_id.state != 'assigned':
 
3728
                raise osv.except_osv(
 
3729
                    _('Error'),
 
3730
                    _('The pre-packing list is not in \'Available\' state. Please check this and re-try')
 
3731
                )
 
3732
 
3671
3733
            families_data = {}
3672
3734
 
3673
3735
            for line in wizard.move_ids:
3752
3814
        for wizard in proc_obj.browse(cr, uid, wizard_ids, context=context):
3753
3815
            picking = wizard.picking_id
3754
3816
 
 
3817
            if picking.state != 'assigned':
 
3818
                raise osv.except_osv(
 
3819
                    _('Error'),
 
3820
                    _('The pre-packing list is not in \'Available\' state. Please check this and re-try')
 
3821
                )
 
3822
 
3755
3823
            moves_data = {}
3756
3824
 
3757
3825
            # Create the new packing
3957
4025
            for line in wizard.move_ids:
3958
4026
                return_qty = line.quantity
3959
4027
 
 
4028
                if line.move_id.state != 'assigned':
 
4029
                    raise osv.except_osv(
 
4030
                        _('Error'),
 
4031
                        _('Line %s :: The move is not \'Available\'. Check the state of the stock move and re-try.') % line.move_id.line_number,
 
4032
                    )
 
4033
 
3960
4034
                # UF-2531: Store some important info for the return pack messages
3961
4035
                return_info.setdefault(str(counter), {
3962
4036
                        'name': picking.previous_step_id.backorder_id.name,