Untitled

mail@pastecode.io avatarunknown
plain_text
2 months ago
8.0 kB
4
Indexable
Never
=>  This is for adding additional vechile we are not calling any e-vechile update services

def add_vehicle(self, new_vehicles):
    from dispatcher.models.dispatch_vehicle_mapping import DispatchVehicleMapping
    from dispatcher.models.helper_classes import DispatchVehicleType
    if self.is_dispatched():
        raise Exception(
            'Dispatch#{0} has been dispatched. Vehicle can\'t be added to dispatch.'.format(self.id))
    if len(new_vehicles) == 0:
        raise Exception('No additional vehicle selected. Please select at least one vehicle to add in the dispatch.')
    if not self.dispatch_vehicle:
        raise Exception('You can not add additional vehicles to a dispatch not having primary vehicle')
    if self.dispatch_vehicle and self.dispatch_vehicle.vehicle_type in [
            DispatchVehicleType.FOOTER, DispatchVehicleType.BICYCLE, DispatchVehicleType.BIKE]:
        raise Exception('You can not add additional vehicles to a dispatch having primary vehicle as '
                        'BIKE, BICYCLE or FOOTER')
    vehicles = []
    current_mapped_vehicles_count = DispatchVehicleMapping.objects.filter(
        dispatch_id=self.id, vehicle_function__in=[Function.PRIMARY, Function.ADDITIONAL]).count()
    if (current_mapped_vehicles_count + len(new_vehicles)) > 3:
        raise Exception('You can not assign more than 2 additional Vehicles to a dispatch')
    for vehicle in new_vehicles:
        vehicles.append(
            DispatchVehicleMapping.create_vehicle_mapping(
                self.id,
                vehicle
            )
        )
    return vehicles

    def create_vehicle_mapping(dispatch_id, data):
        vehicle_mapping = None
        vehicle_function = data.get('vehicle_function') or Function.PRIMARY
        if data.get("registration_no"):
            data['registration_no'] = data['registration_no'].upper()
            if vehicle_function == Function.PRIMARY or vehicle_function == Function.ADDITIONAL:
                not_allowed_vehicle_functions = [Function.PRIMARY, Function.ADDITIONAL]
                vehicle_mapping = DispatchVehicleMapping.objects.filter(
                    registration_no=data['registration_no'],
                    dispatch__status__in=[DispatchStatus.WIP, DispatchStatus.DISPATCHED],
                    vehicle_function__in=not_allowed_vehicle_functions
                )
                vehicle_mapping = list(vehicle_mapping)
        max_dispatches_allowd = 1
        if data.get('allow_second_dispatch'):
            max_dispatches_allowd = 2
        if vehicle_mapping:
            for x in vehicle_mapping:
                if x.dispatch.status == DispatchStatus.WIP:
                    raise BusinessException("WIP Dispatch {id} already exist for the vehicle {registration_no}".format(
                        id=x.dispatch.id, registration_no=x.registration_no))
        if vehicle_mapping and len(vehicle_mapping) >= max_dispatches_allowd:
            logger.debug(
                'Vehicle with registration_no {0} is already busy with dispatch {1}'.format(data['registration_no'],
                                                                                            vehicle_mapping[
                                                                                                0].dispatch_id))
            raise BusinessException(
                'Vehicle with registration_no {0} is already busy with dispatch {1}'.format(data['registration_no'],
                                                                                            vehicle_mapping[
                                                                                                0].dispatch_id))
        vehicle_cost = data.get('vehicle_cost')
        if not vehicle_cost:
            vehicle_cost = 0
        vehicle_mapping = DispatchVehicleMapping()
        vehicle_mapping.registration_no = data.get("registration_no")
        vehicle_mapping.vehicle_id = data.get("vehicle_id")
        vehicle_mapping.fleet_id = data.get("fleet_id")
        vehicle_mapping.start_km = data.get("start_km", 0)
        vehicle_mapping.end_km = data.get("end_km", 0)
        vehicle_mapping.contract_id = data.get("contract_id")
        vehicle_mapping.dispatch_id = dispatch_id
        vehicle_mapping.vehicle_type = data.get("vehicle_type")
        vehicle_mapping.vehicle_function = data.get("vehicle_function") or Function.PRIMARY
        vehicle_mapping.ownership = data.get("vehicle_ownership", DispatchVehicleOwnership.COMPANY_OWNED) or DispatchVehicleOwnership.COMPANY_OWNED
        vehicle_mapping.created_by = Requester.get_current_user_id()
        vehicle_mapping.vehicle_cost = vehicle_cost
        vehicle_mapping.save()
        if vehicle_mapping.registration_no and vehicle_function == Function.PRIMARY:  # Validate for Concurrency
            vehicle_mapping = DispatchVehicleMapping.objects.filter(registration_no=data['registration_no'],
                                                                 dispatch__status__in=[DispatchStatus.WIP,
                                                                                       DispatchStatus.DISPATCHED],
                                                                 vehicle_function=Function.PRIMARY).order_by('-id')[0]

        return vehicle_mapping


where we update vechile service





we call  this from common pkgs check then update the ewbn
 def update_ewbn(self, pkg, async=None, vehicle=None, src=EwaybillUpdateSource.ADD_TO_DISPATCH):
        """
        Args:
            pkg (Package):
            async (None | bool): In case of None, decision will be made here, else based on the value passed
        Returns:
            (None | dict): In case of async call, return None else response of the API request
        """
        if pkg.is_mps() and not pkg.is_mps_master():
            logger.debug('update_ewbn(%s): MPS Child Shipment', pkg.waybill)
            return False
        if not vehicle:
            vehicle = self.dispatch_vehicle
        if pkg.valid_ewaybill and pkg.e_waybills and vehicle and vehicle.registration_no:

            payload = {
                "ewaybillNos": pkg.e_waybills,
                "modeOfTransport": "ROAD",
                "vehicleNo": vehicle.registration_no,
                "transhipmentLocation": self.center.city,
                "consolidate": False,
                "updateReason": "TRANSHIPMENT",
                "state": self.center.state_abbr
            }
            logger.info('EWaybillUpdate: %s %s %s %s', payload.get('ewaybillNos'), payload.get('vehicleNo'), payload.get('state'), payload.get('transhipmentLocation'))
            # Earlier, ewaybill was updated using third party systems. It was changed so that ewaybill is updated using
            # inhouse ewaybill service.
            if not self.condition_for_update_ewbn_das(source=src) and self.status == DispatchStatus.DISPATCHED and not pkg.is_hyperlocal_shipment():
                raise AppException(message="Cannot add package {wbn} in Dispatched dispatch {dispatch_id}\
                                           as package requires ewaybill vehicle update. Add package to a new WIP dispatch.".format(
                    wbn=pkg.waybill, dispatch_id=self.id))
            # Key 'sync' is used to tell whether the API request should be sync call. If sync is False, need to
            # mention callback URL. Ewaybill service mentioned that keeping sync=True does not gurantee
            # ewaybill is updated. So using sync=False.
            e_waybill_service_payload = {
                'awb': pkg.waybill,
                'data': payload,
                'sync': False,
                'src': 'LM',
                'callback_url': settings.LM_BACKEND_URL + '/packages/ewbn_vhu_callback/' + str(pkg.waybill) + '/'
            }
            ewaybill_update_response = EwaybillService.update_vehicle(e_waybill_service_payload, raise_exception=True, center_code = pkg.center_code)
            return ewaybill_update_response

        return None