def get_shipping_rates(delivery_note, add_shipping_overhead=False):
    """get packages Information from delivery note, create the xml request to fetch the ups rates"""
    try:
        # dn = frappe.get_doc("Delivery Note",delivery_note)
        if isinstance(delivery_note, DeliveryNote):
            dn = delivery_note
        else:
            dn = frappe.get_doc(json.loads(delivery_note))

        if dn.dn_status in ["Draft", "Partialy Packed"]:
            frappe.throw("First create the packing slips")

        params = Helper.get_ups_api_params()
        rating_api = get_rating_service(params)
        request = get_ups_rating_request(dn, params)

        response = rating_api.request(request)
        shipping_rates = parse_xml_response_to_json(response)

        dn.ups_rates = json.dumps(shipping_rates)
        dn.dn_status = "UPS Rates Fetched"

        dn.save(ignore_permissions= True)

        if shipping_rates.get("03"):
            if add_shipping_overhead: add_shipping_charges(dn_name=dn.name, service_code="03")
            # return True
            return shipping_rates
        else:
            frappe.msgprint("UPS Ground rates are not available. Please select other services")
            return shipping_rates
        # return shipping_rates
    except PyUPSException, e:
        """ e is PyUPSException obj returns tuple as structured (message, request, response)"""
        frappe.throw(e[0])
def get_shipping_labels(delivery_note):
    # get package information from delivery note
    # create xml request for ups shipping_package
    # parse the xml response and store the shipping labels and tracking_id

    # dn = frappe.get_doc("Delivery Note",delivery_note)
    try:
        dn = delivery_note

        params = Helper.get_ups_api_params()
        shipment_confirm_api = get_shipment_confirm_service(params)
        shipment_accept_api = get_shipment_accept_service(params)
        shipment_confirm_request = get_ups_shipment_confirm_request(dn, params)

        response = shipment_confirm_api.request(shipment_confirm_request)
        digest = shipment_confirm_api.extract_digest(response)
        shipment_accept_request = ShipmentAccept.shipment_accept_request_type(
            digest)
        response = shipment_accept_api.request(shipment_accept_request)

        shipping_info = parse_xml_response_to_json(response, dn)

        # save tracking no and labels to delivery note
        save_tracking_number_and_shipping_labels(dn, shipping_info)
        # reduce box items from stock ledger
        dn.boxes_stock_entry = create_boxes_stock_entry(dn)
    except PyUPSException, e:
        frappe.throw(e[0])
def get_shipping_labels(delivery_note):
    # get package information from delivery note
    # create xml request for ups shipping_package
    # parse the xml response and store the shipping labels and tracking_id

    # dn = frappe.get_doc("Delivery Note",delivery_note)
    try:
        dn = delivery_note

        params = Helper.get_ups_api_params()
        shipment_confirm_api = get_shipment_confirm_service(params)
        shipment_accept_api = get_shipment_accept_service(params)
        shipment_confirm_request = get_ups_shipment_confirm_request(dn, params)

        response = shipment_confirm_api.request(shipment_confirm_request)
        digest = shipment_confirm_api.extract_digest(response)
        shipment_accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        response = shipment_accept_api.request(shipment_accept_request)

        shipping_info = parse_xml_response_to_json(response, dn)

        # save tracking no and labels to delivery note
        save_tracking_number_and_shipping_labels(dn, shipping_info)
        # reduce box items from stock ledger
        dn.boxes_stock_entry = create_boxes_stock_entry(dn)
    except PyUPSException, e:
        frappe.throw(e[0])
def get_package_tracking_status(tracking_number=None):
    if not tracking_number:
        create_scheduler_log("Invalid Input", "get_package_tracking_status",
                            "Invalid Tracking Number %s : tracking number can not\
                            be None"%(tracking_number), tracking_number)
    else:
        try:
            params = Helper.get_ups_api_params()
            tracking_api = get_tracking_service(params)
            tracking_request = TrackingRequest.tracking_request_type(
                E.TrackingNumber(tracking_number),
            )
            response = tracking_api.request(tracking_request)
            return parse_xml_response_to_json(response, tracking_number)
        except PyUPSException, e:
            create_scheduler_log(e[0], "get_package_tracking_status", tracking_number, e)