Example #1
0
    def get_ship_to(country="GB"):
        """Returns a shipto to a known country"""
        if country == "GB":
            ship_to_address = ShipmentConfirm.address_type(
                AddressLine1="205, Copper Gate House",
                AddressLine2="16 Brune Street",
                City="London",
                #StateProvinceCode="E1 7NJ",
                CountryCode="GB",
                PostalCode="E1 7NJ")
        elif country == "US":
            ship_to_address = ShipmentConfirm.address_type(
                AddressLine1="1 Infinite Loop",
                City="Cupertino",
                StateProvinceCode="CA",
                CountryCode="US",
                PostalCode="95014")
        else:
            raise Exception("This country is not supported")

        return ShipmentConfirm.ship_to_type(
            ship_to_address,
            CompanyName="Apple",
            AttentionName="Someone other than Steve",
            TaxIdentificationNumber="123456",
            PhoneNumber='4089961010',
        )
Example #2
0
    def do_shipping_request(self, cr, uid, omni, package, context=None):
        """
	This method calls the UPS API, sends the ShipmentConfirm Request
	to the API and gets the total cost of shipment and tracking number.

        """

	package_obj = self.pool.get('stock.out.package')
        currency_obj = self.pool.get('res.currency')
        uom_obj = self.pool.get('product.uom')
	picking_obj = self.pool.get('stock.picking')
        ups_message_obj = self.pool.get('ups.message')
	omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)

        payment_info_prepaid = \
            ShipmentConfirm.payment_information_prepaid_type(
                AccountNumber=ups_shipper)
        payment_info = ShipmentConfirm.payment_information_type(
            payment_info_prepaid)


        (shipper, ship_to, ship_from) = self._add_addresses(cr, uid, omni,
            package, context)

	if not package.picking.carrier_id.service:
	    raise osv.except_osv(_('Error!'),_("Delivery method has no service: %s")% package.picking.carrier_id.name)

	if not package.picking.carrier_id.service.service_code:
	    raise osv.except_osv(_('Error!'),_("The Carrier %s is not a valid UPS Shipping Method")% package.picking.carrier_id.service.name)

        service = ShipmentConfirm.service_type(
            Code=package.picking.carrier_id.service.service_code)

	#TODO Fix weight
	weight = package.weight or 1.00

	#TODO Review reference
        (packages, shipment_service) = self._add_packages(cr, uid,
            omni, package, weight, context)
        ship_confirm = ShipmentConfirm.shipment_confirm_request_type(
            shipper, ship_to, ship_from, service, payment_info,
            shipment_service, *packages,
            Description='None')

        shipment_confirm_instance = self.get_ups_api(cr, uid, omni, 'confirm', context)
	#Try to get transaction reference to work
	shipment_confirm_instance.TransactionReference = E.TransactionReference(
	    E.CustomerContext('test')
	)
	#End Transaction Reference
        try:
            response = shipment_confirm_instance.request(
                ship_confirm)
            if isinstance(response, tuple):
                request = response[0]
                response = response[1]

        except PyUPSException, error:
            raise osv.except_osv(('Error : '), ('%s' % error[0]))
Example #3
0
    def get_ship_from(country="GB"):
        """Returns a shipfrom from a known country"""
        if country == "GB":
            ship_from_address = ShipmentConfirm.address_type(
                AddressLine1="2,Hope Rd",
                AddressLine2="Anson Road",
                City="Manchester",
                CountryCode="GB",
                PostalCode="M145EU"
                )
        elif country == "US":
            ship_from_address = ShipmentConfirm.address_type(
                AddressLine1="245 NE 24th Street",
                AddressLine2="Suite 108",
                City="Miami",
                StateProvinceCode="FL",
                CountryCode="US",
                PostalCode="33137"
                )
        else:
            raise Exception("This country is not supported")

        return ShipmentConfirm.ship_from_type(
            ship_from_address,
            CompanyName="Openlabs",
            AttentionName="Someone other than Sharoon",
            TaxIdentificationNumber="33065",
            PhoneNumber='0987654321',
            )
Example #4
0
    def get_ship_from(country="GB"):
        """Returns a shipfrom from a known country"""
        if country == "GB":
            ship_from_address = ShipmentConfirm.address_type(
                AddressLine1="2,Hope Rd",
                AddressLine2="Anson Road",
                City="Manchester",
                CountryCode="GB",
                PostalCode="M145EU")
        elif country == "US":
            ship_from_address = ShipmentConfirm.address_type(
                AddressLine1="245 NE 24th Street",
                AddressLine2="Suite 108",
                City="Miami",
                StateProvinceCode="FL",
                CountryCode="US",
                PostalCode="33137")
        else:
            raise Exception("This country is not supported")

        return ShipmentConfirm.ship_from_type(
            ship_from_address,
            CompanyName="Openlabs",
            AttentionName="Someone other than Sharoon",
            TaxIdentificationNumber="33065",
            PhoneNumber='0987654321',
        )
Example #5
0
    def get_ship_to(country="GB"):
        """Returns a shipto to a known country"""
        if country == "GB":
            ship_to_address = ShipmentConfirm.address_type(
                AddressLine1="205, Copper Gate House",
                AddressLine2="16 Brune Street",
                City="London",
                #StateProvinceCode="E1 7NJ",
                CountryCode="GB",
                PostalCode="E1 7NJ"
                )
        elif country == "US":
            ship_to_address = ShipmentConfirm.address_type(
                AddressLine1="1 Infinite Loop",
                City="Cupertino",
                StateProvinceCode="CA",
                CountryCode="US",
                PostalCode="95014"
                )
        else:
            raise Exception("This country is not supported")

        return ShipmentConfirm.ship_to_type(
            ship_to_address,
            CompanyName="Apple",
            AttentionName="Someone other than Steve",
            TaxIdentificationNumber="123456",
            PhoneNumber='4089961010',
            )
Example #6
0
    def test_0020_gb_gb(self):
        "GB to GB UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package

            # Package 2
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package
            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),  # UPS Standard
            Description=__doc__[:50])
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)
    def test_0020_gb_gb(self):
        "GB to GB UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            # Package 2
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),    # UPS Standard
            Description = __doc__[:50]
            )
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)
Example #8
0
 def test_0010_blow_up(self):
     """Send a stupid request which should blow up because its valid in the
     client but not in UPS server. Example: dont send packages"""
     with self.assertRaises(PyUPSException):
         ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
             Helper.get_shipper(self.shipper_number, "GB"),
             Helper.get_ship_to("GB"),
             Helper.get_ship_from("GB"),
             Helper.get_payment_info(AccountNumber=self.shipper_number),
             ShipmentConfirm.service_type(Code='11'),  # UPS Standard
             Description=__doc__[:50])
         self.shipment_confirm_api.request(ship_confirm_request)
    def test_0010_blow_up(self):
        """Send a stupid request which should blow up because its valid in the
        client but not in UPS server. Example: dont send packages"""
        with self.assertRaises(PyUPSException):
            ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
                Helper.get_shipper(self.shipper_number, "GB"),
                Helper.get_ship_to("GB"),
                Helper.get_ship_from("GB"),

                Helper.get_payment_info(AccountNumber=self.shipper_number),
                ShipmentConfirm.service_type(Code='11'),    # UPS Standard
                Description = __doc__[:50]
                )
            self.shipment_confirm_api.request(ship_confirm_request)
Example #10
0
    def get_payment_info(type="prepaid", **kwargs):
        """Returns the payment info filled

        :param type: The payment type.

        .. note::
            if payment type is prepaid AccountNumber must be provided.
        """
        if type == 'prepaid':
            assert 'AccountNumber' in kwargs
            return ShipmentConfirm.payment_information_type(
                ShipmentConfirm.payment_information_prepaid_type(
                    AccountNumber=kwargs['AccountNumber']))
        else:
            raise Exception("Type %s is not supported" % type)
Example #11
0
    def get_payment_info(type="prepaid", **kwargs):
        """Returns the payment info filled

        :param type: The payment type.

        .. note::
            if payment type is prepaid AccountNumber must be provided.
        """
        if type == 'prepaid':
            assert 'AccountNumber' in kwargs
            return ShipmentConfirm.payment_information_type(
                ShipmentConfirm.payment_information_prepaid_type(
                    AccountNumber=kwargs['AccountNumber'])
                )
        else:
            raise Exception("Type %s is not supported" % type)
Example #12
0
    def setUp(self):
        """Initialise a ShipmentConfirm and ShipmentAccept class each.
        """
        logging.disable(logging.DEBUG)
        self.shipper_number = os.environ['UPS_SHIPPER_NO']
        self.shipment_confirm_api = ShipmentConfirm(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True  # Test must be performed in sandbox anyway
        )

        self.shipment_accept_api = ShipmentAccept(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True  # Test must be performed in sandbox anyway
        )
 def _add_packages(self, cursor, user, register_id, context=None):
     """
     Adds the UPS style packages and return the XML element
     
     :param cursor: Database Cursor
     :param user: ID of User
     :param register_id: Shipment Register ID
     :param context: Context directly uses active id.
     """
     company_obj = self.pool.get('res.company')
     
     packages = []
     ups_uoms = company_obj.get_ups_uoms(cursor, user, context)
     register_record = self.browse(cursor, user, register_id, context)
     
     for package in register_record.package_det:
         package_type = ShipmentConfirm.packaging_type(
             Code=package.package_type.code)
         package_weight = ShipmentConfirm.package_weight_type(
             Weight=str(package.weight), Code=ups_uoms[0], 
             Description=package.description or 'None')
         if package.length and package.height and package.width:
             package_dimension = ShipmentConfirm.dimensions_type(
                 Code=ups_uoms[1], Length=str(package.length),
                 Height=str(package.height), Width=str(package.width),
                 Description=package.description or 'None')
         else:
             raise osv.except_osv(('Error : '), 
                 ("Package Dimensions are required"))
         package_container = ShipmentConfirm.package_type(
             package_type,
             package_weight,
             package_dimension)
         packages.append(package_container)
     shipment_service = ShipmentConfirm.shipment_service_option_type(
         SaturdayDelivery=1 if register_record.saturday_delivery \
         else 'None')
     return (packages, shipment_service)
    def setUp(self):
        """Initialise a ShipmentConfirm and ShipmentAccept class each.
        """
        logging.disable(logging.DEBUG)
        self.shipper_number = os.environ['UPS_SHIPPER_NO']
        self.shipment_confirm_api = ShipmentConfirm(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True            # Test must be performed in sandbox anyway
            )

        self.shipment_accept_api = ShipmentAccept(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True            # Test must be performed in sandbox anyway
            )
Example #15
0
    def _add_packages(self, cursor, user, register_id, context=None):
        """
        Adds the UPS style packages and return the XML element

        :param cursor: Database Cursor
        :param user: ID of User
        :param register_id: Shipment Register ID
        :param context: Context directly uses active id.
        """
        company_obj = self.pool.get('res.company')

        packages = []
        ups_uoms = company_obj.get_ups_uoms(cursor, user, context)
        register_record = self.browse(cursor, user, register_id, context)

        for package in register_record.package_det:
            package_type = ShipmentConfirm.packaging_type(
                Code=package.package_type.code)
            package_weight = ShipmentConfirm.package_weight_type(
                Weight=str(package.weight),
                Code=ups_uoms[0],
                Description=package.description or 'None')
            package_service_options = \
                ShipmentConfirm.package_service_options_type(
                    ShipmentConfirm.insured_value_type(
                        MonetaryValue=str(package.insured_value) or ''))
            if package.length and package.height and package.width:
                package_dimension = ShipmentConfirm.dimensions_type(
                    Code=ups_uoms[1],
                    Length=str(package.length),
                    Height=str(package.height),
                    Width=str(package.width),
                    Description=package.description or 'None')
            else:
                raise osv.except_osv(('Error : '),
                                     ("Package Dimensions are required"))
            package_container = ShipmentConfirm.package_type(
                package_type, package_weight, package_dimension,
                package_service_options)
            packages.append(package_container)
        shipment_service = ShipmentConfirm.shipment_service_option_type(
            SaturdayDelivery=1 if register_record.saturday_delivery \
            else 'None')
        return (packages, shipment_service)
Example #16
0
    def get_package(country="GB",
                    package_type_code='02',
                    weight='14.1',
                    dimensions=None):
        """UPS really expects units that are used in the country
        
        :param package_type_code: Str of the Code
        :param weight: Str eg '14.1' 
        :param dimensions: A dict with length, width and height
            eg {'length': 10, 'width': 10, 'height': 10}
        """
        if dimensions is None:
            dimensions = {
                'length': '10',
                'width': '10',
                'height': '10',
            }
        if country == "GB":
            package_weight = ShipmentConfirm.package_weight_type(
                Weight=weight, Code="KGS", Description="Kilograms")
            dimensions = ShipmentConfirm.dimensions_type(
                Code="CM",
                Length=dimensions['length'],
                Width=dimensions['width'],
                Height=dimensions['height'],
            )
        elif country == "US":
            package_weight = ShipmentConfirm.package_weight_type(
                Weight=weight, Code="LBS", Description="Pounds")
            dimensions = ShipmentConfirm.dimensions_type(
                Code="IN",
                Length=dimensions['length'],
                Width=dimensions['width'],
                Height=dimensions['height'],
            )
        else:
            raise Exception("This country is not supported")

        package_type = ShipmentConfirm.packaging_type(Code=package_type_code)

        return ShipmentConfirm.package_type(
            package_type,
            package_weight,
            dimensions,
        )
Example #17
0
    def get_package(country="GB", package_type_code='02', 
            weight='14.1', dimensions=None):
        """UPS really expects units that are used in the country
        
        :param package_type_code: Str of the Code
        :param weight: Str eg '14.1' 
        :param dimensions: A dict with length, width and height
            eg {'length': 10, 'width': 10, 'height': 10}
        """
        if dimensions is None:
            dimensions = {
                'length': '10',
                'width': '10',
                'height': '10',
                }
        if country == "GB":
            package_weight = ShipmentConfirm.package_weight_type(
                Weight=weight, Code="KGS", Description="Kilograms")
            dimensions = ShipmentConfirm.dimensions_type(
                Code="CM", 
                Length=dimensions['length'], 
                Width=dimensions['width'], 
                Height=dimensions['height'],
                )
        elif country == "US":
            package_weight = ShipmentConfirm.package_weight_type(
                Weight=weight, Code="LBS", Description="Pounds")
            dimensions = ShipmentConfirm.dimensions_type(
                Code="IN", 
                Length=dimensions['length'], 
                Width=dimensions['width'], 
                Height=dimensions['height'],
                )
        else:
            raise Exception("This country is not supported")

        package_type = ShipmentConfirm.packaging_type(Code=package_type_code)

        return ShipmentConfirm.package_type(
            package_type,
            package_weight,
            dimensions,
            )
Example #18
0
    def _add_addresses(self, cursor, user, register_id, context=None):
        """
        Adds the UPS style addresses to the ShipmentConfirm

        :param cursor: Database Cursor
        :param user: ID of User
        :param register_id: ID of Shipment Register
        :param context: Context directly uses active id.
        """
        address_obj = self.pool.get('res.partner.address')
        company_obj = self.pool.get('res.company')

        ups_shipper = company_obj.get_ups_shipper(cursor, user, context)
        register_record = self.browse(cursor, user, register_id, context)
        #Fetch Addresses
        to_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.to_address.id, context)
        from_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.from_address.id, context)
        shipper_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.shipper_address.id, context)

        # Generating the XML Elements

        # Ship to address
        ship_to_address_elem = ShipmentConfirm.address_type(
            AddressLine1=to_address['line1'],
            AddressLine2=to_address['line2'],
            City=to_address['city'],
            PostalCode=to_address['postal_code'],
            StateProvinceCode=to_address['state_code'],
            CountryCode=to_address['country_code'],
        )

        # Ship from address
        ship_from_address_elem = ShipmentConfirm.address_type(
            AddressLine1=from_address['line1'],
            AddressLine2=from_address['line2'],
            City=from_address['city'],
            PostalCode=from_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=from_address['country_code'])

        # Shipper address
        shipper_address_elem = ShipmentConfirm.address_type(
            AddressLine1=shipper_address['line1'],
            AddressLine2=shipper_address['line2'],
            City=shipper_address['city'],
            PostalCode=shipper_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=shipper_address['country_code'])

        # Shipper
        shipper = ShipmentConfirm.shipper_type(
            shipper_address_elem,
            Name=shipper_address['company_name'],
            AttentionName=shipper_address['attention_name'],
            TaxIdentificationNumber=shipper_address['tin'],
            PhoneNumber=shipper_address['phone'],
            FaxNumber=shipper_address['fax'],
            EMailAddress=shipper_address['email'],
            ShipperNumber=ups_shipper)

        # Ship to
        ship_to = ShipmentConfirm.ship_to_type(
            ship_to_address_elem,
            CompanyName=to_address['company_name'],
            AttentionName=to_address['attention_name'],
            TaxIdentificationNumber=to_address['tin'],
            PhoneNumber=to_address['phone'],
            FaxNumber=to_address['fax'],
            EMailAddress=to_address['email'],
            LocationId='None')

        # Ship from
        ship_from = ShipmentConfirm.ship_from_type(
            ship_from_address_elem,
            CompanyName=from_address['company_name'],
            AttentionName=from_address['attention_name'],
            TaxIdentificationNumber=from_address['tin'],
            PhoneNumber=from_address['phone'],
            FaxNumber=from_address['fax'],
            EMailAddress=from_address['email'])

        return (shipper, ship_to, ship_from)
Example #19
0
class TestShippingPackage(unittest.TestCase):
    """Test the :class:`ShipmentConfirm` and :class:`ShipmentAccept` classes
    for various cases originating from GB.
    """
    @classmethod
    def setUpClass(self):
        """Check if the variables for initialising the test case is available
        in the environment"""
        assert 'UPS_LICENSE_NO' in os.environ, \
            "UPS_LICENSE_NO not given. Hint:Use export UPS_LICENSE_NO=<number>"
        assert 'UPS_SHIPPER_NO' in os.environ, \
            "UPS_SHIPPER_NO not given. Hint:Use export UPS_SHIPPER_NO=<number>"
        assert 'UPS_USER_ID' in os.environ, \
            "UPS_USER_ID not given. Hint:Use export UPS_USER_ID=<user_id>"
        assert 'UPS_PASSWORD' in os.environ, \
            "UPS_PASSWORD not given. Hint:Use export UPS_PASSWORD=<password>"

    def setUp(self):
        """Initialise a ShipmentConfirm and ShipmentAccept class each.
        """
        logging.disable(logging.DEBUG)
        self.shipper_number = os.environ['UPS_SHIPPER_NO']
        self.shipment_confirm_api = ShipmentConfirm(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True  # Test must be performed in sandbox anyway
        )

        self.shipment_accept_api = ShipmentAccept(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True  # Test must be performed in sandbox anyway
        )

    def test_0010_blow_up(self):
        """Send a stupid request which should blow up because its valid in the
        client but not in UPS server. Example: dont send packages"""
        with self.assertRaises(PyUPSException):
            ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
                Helper.get_shipper(self.shipper_number, "GB"),
                Helper.get_ship_to("GB"),
                Helper.get_ship_from("GB"),
                Helper.get_payment_info(AccountNumber=self.shipper_number),
                ShipmentConfirm.service_type(Code='11'),  # UPS Standard
                Description=__doc__[:50])
            self.shipment_confirm_api.request(ship_confirm_request)

    def test_0020_gb_gb(self):
        "GB to GB UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package

            # Package 2
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package
            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),  # UPS Standard
            Description=__doc__[:50])
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)

    @unittest.skipUnless(datetime.today().weekday() == 4, "since not a friday")
    def test_0030_gb_gb_saturday(self):
        "GB to GB UPS Standard with 2 packages and Saturday delivery"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package

            # Package 2
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package
            ShipmentConfirm.shipment_service_option_type(SaturdayDelivery="1"),
            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),  # UPS Standard
            Description=__doc__[:50])
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)

    def test_0040_gb_us(self):
        "GB to US UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("US"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package

            # Package 2
            Helper.get_package(
                "GB", weight='15.0',
                package_type_code='02'),  # Customer Supplied Package
            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='07'),  # UPS Standard
            Description=__doc__[:50])
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)
Example #20
0
    def _add_addresses(self, cr, uid, omni, package, context=None):
        """
        Adds the UPS style addresses to the ShipmentConfirm

        """
        address_obj = self.pool.get('res.partner')

	omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)
        #Fetch Addresses
        to_address = address_obj.address_to_ups_dict(
            cr, uid, package.picking.partner_id, context)
        from_address = address_obj.address_to_ups_dict(
            cr, uid, package.picking.company_id.partner_id, context)
        shipper_address = address_obj.address_to_ups_dict(
            cr, uid, package.picking.company_id.partner_id, context)
        # Generating the XML Elements

        # Ship to address
        ship_to_address_elem = ShipmentConfirm.address_type(
            AddressLine1=to_address['line1'],
            AddressLine2=to_address['line2'],
            City=to_address['city'],
            PostalCode=to_address['postal_code'],
            StateProvinceCode=to_address['state_code'],
            CountryCode=to_address['country_code'],)

        # Ship from address
        ship_from_address_elem = ShipmentConfirm.address_type(
            AddressLine1=from_address['line1'],
            AddressLine2=from_address['line2'],
            City=from_address['city'],
            PostalCode=from_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=from_address['country_code'])


        # Shipper address
        shipper_address_elem = ShipmentConfirm.address_type(
            AddressLine1=shipper_address['line1'],
            AddressLine2=shipper_address['line2'],
            City=shipper_address['city'],
            PostalCode=shipper_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=shipper_address['country_code'])

        # Shipper
        shipper = ShipmentConfirm.shipper_type(
            shipper_address_elem,
            Name=shipper_address['company_name'],
            AttentionName=shipper_address['attention_name'],
            TaxIdentificationNumber=shipper_address['tin'],
            PhoneNumber=shipper_address['phone'],
            FaxNumber=shipper_address['fax'],
            EMailAddress=shipper_address['email'] or '',
            ShipperNumber=ups_shipper)

	if to_address['email'] == 'None':
	    to_address['email'] = ''

        # Ship to
        ship_to = ShipmentConfirm.ship_to_type(
            ship_to_address_elem,
            CompanyName=to_address['company_name'],
            AttentionName=to_address['attention_name'],
            TaxIdentificationNumber=to_address['tin'],
            PhoneNumber=to_address['phone'],
            FaxNumber=to_address['fax'],
            EMailAddress=to_address['email'],
            LocationId='None')

        # Ship from
        ship_from = ShipmentConfirm.ship_from_type(
            ship_from_address_elem,
            CompanyName=from_address['company_name'],
            AttentionName=from_address['attention_name'],
            TaxIdentificationNumber=from_address['tin'],
            PhoneNumber=from_address['phone'],
	    FaxNumber=from_address['fax'],
            EMailAddress=from_address['email'])
        return (shipper, ship_to, ship_from)
Example #21
0
    def _add_packages(self, cr, uid, omni, package, weight, context=None):
        """
        Adds the UPS style packages and return the XML element

        """
        picking_obj = self.pool.get('stock.picking')
        package_obj = self.pool.get('stock.out.package')

        ups_package = None
        omni_obj = self.pool.get('omniship')
        ups_uoms = omni_obj.get_ups_uoms(cr, uid, omni, context)

        #Solves a bug where weight is rejected by UPS api for being too low
        if weight < 0.5:
            weight = 0.5

        package_type = ShipmentConfirm.packaging_type(Code='02')

        package_weight = ShipmentConfirm.package_weight_type(
            Weight=str(weight), Code=ups_uoms[0], Description='None')

        #Shipment References
        ref1 = str(12345)
        package_referencenumber1 = \
            ShipmentConfirm.reference_type(Code='02', Value=ref1)

        #Ignore ref2 for now
        #       ref2 = str(package.move_id.product_id.sku)
        #      package_referencenumber2 = \
        #         ShipmentConfirm.reference_type(Code='02', Value=ref2)

        #REVIEW: Value set to 0
        package_service_options = \
            ShipmentConfirm.package_service_options_type(
                ShipmentConfirm.insured_value_type(
                    MonetaryValue='0'))

        if package.length > 0.1 and package.width > 0.1 and package.height > 0.1:
            length = package.length
            width = package.width
            height = package.height

        elif package.shape_dimension:
            dims = package.shape_dimension
            length = dims.length
            width = dims.width
            height = dims.height

        else:
            length = 1.0
            width = 1.0
            height = 1.0

        package_dimension = ShipmentConfirm.dimensions_type(Code=ups_uoms[1],
                                                            Length=str(length),
                                                            Height=str(height),
                                                            Width=str(width),
                                                            Description='None')

        xml_package = ShipmentConfirm.package_type(package_type,
                                                   package_weight,
                                                   package_dimension,
                                                   package_service_options,
                                                   package_referencenumber1)
        #    package_referencenumber2)

        shipment_service = ShipmentConfirm.shipment_service_option_type(
            SaturdayDelivery='None')

        return ([xml_package], shipment_service)
Example #22
0
    def do_shipping_request(self, cr, uid, omni, package, context=None):
        """
	This method calls the UPS API, sends the ShipmentConfirm Request
	to the API and gets the total cost of shipment and tracking number.

        """

        package_obj = self.pool.get('stock.out.package')
        currency_obj = self.pool.get('res.currency')
        uom_obj = self.pool.get('product.uom')
        picking_obj = self.pool.get('stock.picking')
        ups_message_obj = self.pool.get('ups.message')
        omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)

        payment_info_prepaid = \
            ShipmentConfirm.payment_information_prepaid_type(
                AccountNumber=ups_shipper)
        payment_info = ShipmentConfirm.payment_information_type(
            payment_info_prepaid)

        (shipper, ship_to,
         ship_from) = self._add_addresses(cr, uid, omni, package, context)

        if not package.picking.carrier_id.service:
            raise osv.except_osv(
                _('Error!'),
                _("Delivery method has no service: %s") %
                package.picking.carrier_id.name)

        if not package.picking.carrier_id.service.service_code:
            raise osv.except_osv(
                _('Error!'),
                _("The Carrier %s is not a valid UPS Shipping Method") %
                package.picking.carrier_id.service.name)

        service = ShipmentConfirm.service_type(
            Code=package.picking.carrier_id.service.service_code)

        #TODO Fix weight
        weight = package.weight or 1.00

        #TODO Review reference
        (packages,
         shipment_service) = self._add_packages(cr, uid, omni, package, weight,
                                                context)
        ship_confirm = ShipmentConfirm.shipment_confirm_request_type(
            shipper,
            ship_to,
            ship_from,
            service,
            payment_info,
            shipment_service,
            *packages,
            Description='None')

        shipment_confirm_instance = self.get_ups_api(cr, uid, omni, 'confirm',
                                                     context)
        #Try to get transaction reference to work
        shipment_confirm_instance.TransactionReference = E.TransactionReference(
            E.CustomerContext('test'))
        #End Transaction Reference
        try:
            response = shipment_confirm_instance.request(ship_confirm)
            if isinstance(response, tuple):
                request = response[0]
                response = response[1]

        except PyUPSException, error:
            raise osv.except_osv(('Error : '), ('%s' % error[0]))
Example #23
0
    def _add_addresses(self, cr, uid, omni, package, context=None):
        """
        Adds the UPS style addresses to the ShipmentConfirm

        """
        address_obj = self.pool.get('res.partner')

        omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)
        #Fetch Addresses
        if package.alternate_sender_address:
            from_addr = package.alternate_sender_address
            to_addr = package.picking.company_id.partner_id
        else:
            from_addr = package.picking.company_id.partner_id
            to_addr = package.picking.partner_id

        to_address = address_obj.address_to_ups_dict(cr, uid, to_addr, context)
        from_address = address_obj.address_to_ups_dict(cr, uid, from_addr,
                                                       context)
        shipper_address = address_obj.address_to_ups_dict(
            cr, uid, package.picking.company_id.partner_id, context)
        # Generating the XML Elements

        # Ship to address
        ship_to_address_elem = ShipmentConfirm.address_type(
            AddressLine1=to_address['line1'],
            AddressLine2=to_address['line2'],
            City=to_address['city'],
            PostalCode=to_address['postal_code'],
            StateProvinceCode=to_address['state_code'],
            CountryCode=to_address['country_code'],
        )

        # Ship from address
        ship_from_address_elem = ShipmentConfirm.address_type(
            AddressLine1=from_address['line1'],
            AddressLine2=from_address['line2'],
            City=from_address['city'],
            PostalCode=from_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=from_address['country_code'])

        # Shipper address
        shipper_address_elem = ShipmentConfirm.address_type(
            AddressLine1=shipper_address['line1'],
            AddressLine2=shipper_address['line2'],
            City=shipper_address['city'],
            PostalCode=shipper_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=shipper_address['country_code'])

        # Shipper
        shipper = ShipmentConfirm.shipper_type(
            shipper_address_elem,
            Name=shipper_address['company_name'],
            AttentionName=shipper_address['attention_name'],
            TaxIdentificationNumber=shipper_address['tin'],
            PhoneNumber=shipper_address['phone'],
            FaxNumber=shipper_address['fax'],
            EMailAddress=shipper_address['email'] or '',
            ShipperNumber=ups_shipper)

        if to_address['email'] == 'None':
            to_address['email'] = ''

        # Ship to
        ship_to = ShipmentConfirm.ship_to_type(
            ship_to_address_elem,
            CompanyName=to_address['company_name'],
            AttentionName=to_address['attention_name'],
            TaxIdentificationNumber=to_address['tin'],
            PhoneNumber=to_address['phone'],
            FaxNumber=to_address['fax'],
            EMailAddress=to_address['email'],
            LocationId='None')

        # Ship from
        ship_from = ShipmentConfirm.ship_from_type(
            ship_from_address_elem,
            CompanyName=from_address['company_name'],
            AttentionName=from_address['attention_name'],
            TaxIdentificationNumber=from_address['tin'],
            PhoneNumber=from_address['phone'],
            FaxNumber=from_address['fax'],
            EMailAddress=from_address['email'])
        return (shipper, ship_to, ship_from)
Example #24
0
class OmnishipProcessor(osv.osv_memory):
    _inherit = 'omniship.processor'

    def generate_ups_label(self, cr, uid, package, context=None):
        omni_obj = self.pool.get('omniship')
        omni_id = omni_obj.search(cr,
                                  uid, [('active', '=', True),
                                        ('carrier', '=', 'ups')],
                                  limit=1)
        if not omni_id:
            raise osv.except_osv(
                _('Configuration Error!'),
                _("Could not locate a UPS carrier integration!"))
        omni = omni_obj.browse(cr, uid, omni_id[0])

        self.do_shipping_request(cr, uid, omni, package, context=None)
        return True

    def get_ups_api(self, cr, uid, omni, call='confirm', context=None):
        """
        Returns API with credentials set
        """
        omni_obj = self.pool.get('omniship')
        ups_credentials = omni_obj.get_ups_credentials(cr, uid, omni, context)
        if not ups_credentials[0] or not ups_credentials[1] or \
            not ups_credentials[2]:
            raise osv.except_osv(('Error : '), (
                "Please check your license details for UPS account.\nSome details may be missing."
            ))
        if call == 'confirm':
            call_method = ShipmentConfirm
        elif call == 'accept':
            call_method = ShipmentAccept
        elif call == 'void':
            call_method = ShipmentVoid
        else:
            call_method = None

        if call_method:
            try:
                return call_method(ups_credentials[0], ups_credentials[1],
                                   ups_credentials[2], ups_credentials[3],
                                   ups_credentials[4])
            except TypeError:
                ## Older PyUPS version
                return call_method(ups_credentials[0], ups_credentials[1],
                                   ups_credentials[2], ups_credentials[3])

    def _add_packages(self, cr, uid, omni, package, weight, context=None):
        """
        Adds the UPS style packages and return the XML element

        """
        picking_obj = self.pool.get('stock.picking')
        package_obj = self.pool.get('stock.out.package')

        ups_package = None
        omni_obj = self.pool.get('omniship')
        ups_uoms = omni_obj.get_ups_uoms(cr, uid, omni, context)

        #Solves a bug where weight is rejected by UPS api for being too low
        if weight < 0.5:
            weight = 0.5

        package_type = ShipmentConfirm.packaging_type(Code='02')

        package_weight = ShipmentConfirm.package_weight_type(
            Weight=str(weight), Code=ups_uoms[0], Description='None')

        #Shipment References
        ref1 = str(12345)
        package_referencenumber1 = \
            ShipmentConfirm.reference_type(Code='02', Value=ref1)

        #Ignore ref2 for now
        #       ref2 = str(package.move_id.product_id.sku)
        #      package_referencenumber2 = \
        #         ShipmentConfirm.reference_type(Code='02', Value=ref2)

        #REVIEW: Value set to 0
        package_service_options = \
            ShipmentConfirm.package_service_options_type(
                ShipmentConfirm.insured_value_type(
                    MonetaryValue='0'))

        if package.length > 0.1 and package.width > 0.1 and package.height > 0.1:
            length = package.length
            width = package.width
            height = package.height

        elif package.shape_dimension:
            dims = package.shape_dimension
            length = dims.length
            width = dims.width
            height = dims.height

        else:
            length = 1.0
            width = 1.0
            height = 1.0

        package_dimension = ShipmentConfirm.dimensions_type(Code=ups_uoms[1],
                                                            Length=str(length),
                                                            Height=str(height),
                                                            Width=str(width),
                                                            Description='None')

        xml_package = ShipmentConfirm.package_type(package_type,
                                                   package_weight,
                                                   package_dimension,
                                                   package_service_options,
                                                   package_referencenumber1)
        #    package_referencenumber2)

        shipment_service = ShipmentConfirm.shipment_service_option_type(
            SaturdayDelivery='None')

        return ([xml_package], shipment_service)

    def _add_addresses(self, cr, uid, omni, package, context=None):
        """
        Adds the UPS style addresses to the ShipmentConfirm

        """
        address_obj = self.pool.get('res.partner')

        omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)
        #Fetch Addresses
        if package.alternate_sender_address:
            from_addr = package.alternate_sender_address
            to_addr = package.picking.company_id.partner_id
        else:
            from_addr = package.picking.company_id.partner_id
            to_addr = package.picking.partner_id

        to_address = address_obj.address_to_ups_dict(cr, uid, to_addr, context)
        from_address = address_obj.address_to_ups_dict(cr, uid, from_addr,
                                                       context)
        shipper_address = address_obj.address_to_ups_dict(
            cr, uid, package.picking.company_id.partner_id, context)
        # Generating the XML Elements

        # Ship to address
        ship_to_address_elem = ShipmentConfirm.address_type(
            AddressLine1=to_address['line1'],
            AddressLine2=to_address['line2'],
            City=to_address['city'],
            PostalCode=to_address['postal_code'],
            StateProvinceCode=to_address['state_code'],
            CountryCode=to_address['country_code'],
        )

        # Ship from address
        ship_from_address_elem = ShipmentConfirm.address_type(
            AddressLine1=from_address['line1'],
            AddressLine2=from_address['line2'],
            City=from_address['city'],
            PostalCode=from_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=from_address['country_code'])

        # Shipper address
        shipper_address_elem = ShipmentConfirm.address_type(
            AddressLine1=shipper_address['line1'],
            AddressLine2=shipper_address['line2'],
            City=shipper_address['city'],
            PostalCode=shipper_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=shipper_address['country_code'])

        # Shipper
        shipper = ShipmentConfirm.shipper_type(
            shipper_address_elem,
            Name=shipper_address['company_name'],
            AttentionName=shipper_address['attention_name'],
            TaxIdentificationNumber=shipper_address['tin'],
            PhoneNumber=shipper_address['phone'],
            FaxNumber=shipper_address['fax'],
            EMailAddress=shipper_address['email'] or '',
            ShipperNumber=ups_shipper)

        if to_address['email'] == 'None':
            to_address['email'] = ''

        # Ship to
        ship_to = ShipmentConfirm.ship_to_type(
            ship_to_address_elem,
            CompanyName=to_address['company_name'],
            AttentionName=to_address['attention_name'],
            TaxIdentificationNumber=to_address['tin'],
            PhoneNumber=to_address['phone'],
            FaxNumber=to_address['fax'],
            EMailAddress=to_address['email'],
            LocationId='None')

        # Ship from
        ship_from = ShipmentConfirm.ship_from_type(
            ship_from_address_elem,
            CompanyName=from_address['company_name'],
            AttentionName=from_address['attention_name'],
            TaxIdentificationNumber=from_address['tin'],
            PhoneNumber=from_address['phone'],
            FaxNumber=from_address['fax'],
            EMailAddress=from_address['email'])
        return (shipper, ship_to, ship_from)

    def do_shipping_request(self, cr, uid, omni, package, context=None):
        """
	This method calls the UPS API, sends the ShipmentConfirm Request
	to the API and gets the total cost of shipment and tracking number.

        """

        package_obj = self.pool.get('stock.out.package')
        currency_obj = self.pool.get('res.currency')
        uom_obj = self.pool.get('product.uom')
        picking_obj = self.pool.get('stock.picking')
        ups_message_obj = self.pool.get('ups.message')
        omni_obj = self.pool.get('omniship')
        ups_shipper = omni_obj.get_ups_shipper(cr, uid, omni, context)

        payment_info_prepaid = \
            ShipmentConfirm.payment_information_prepaid_type(
                AccountNumber=ups_shipper)
        payment_info = ShipmentConfirm.payment_information_type(
            payment_info_prepaid)

        (shipper, ship_to,
         ship_from) = self._add_addresses(cr, uid, omni, package, context)

        if not package.picking.carrier_id.service:
            raise osv.except_osv(
                _('Error!'),
                _("Delivery method has no service: %s") %
                package.picking.carrier_id.name)

        if not package.picking.carrier_id.service.service_code:
            raise osv.except_osv(
                _('Error!'),
                _("The Carrier %s is not a valid UPS Shipping Method") %
                package.picking.carrier_id.service.name)

        service = ShipmentConfirm.service_type(
            Code=package.picking.carrier_id.service.service_code)

        #TODO Fix weight
        weight = package.weight or 1.00

        #TODO Review reference
        (packages,
         shipment_service) = self._add_packages(cr, uid, omni, package, weight,
                                                context)
        ship_confirm = ShipmentConfirm.shipment_confirm_request_type(
            shipper,
            ship_to,
            ship_from,
            service,
            payment_info,
            shipment_service,
            *packages,
            Description='None')

        shipment_confirm_instance = self.get_ups_api(cr, uid, omni, 'confirm',
                                                     context)
        #Try to get transaction reference to work
        shipment_confirm_instance.TransactionReference = E.TransactionReference(
            E.CustomerContext('test'))
        #End Transaction Reference
        try:
            response = shipment_confirm_instance.request(ship_confirm)
            if isinstance(response, tuple):
                request = response[0]
                response = response[1]

        except PyUPSException, error:
            raise osv.except_osv(('Error : '), ('%s' % error[0]))

        # Now store values in the register
        currency_id = currency_obj.search(cr, uid,
                   [('symbol', '=', \
                       response.ShipmentCharges.TotalCharges.CurrencyCode)])
        #   uom_id = uom_obj.search(cr, uid, [
        #      ('name', '=', \
        #         response.BillingWeight.UnitOfMeasurement.Code.pyval)])

        before = ShipmentConfirm.extract_digest(response)

        xml_messages = []
        package_obj.write(cr, uid, package.id,
            {
                #                    'name': response.ShipmentIdentificationNumber,
                #                   'billed_weight': response.BillingWeight.Weight,
                #                  'billed_weight_uom': uom_id and uom_id[0] or False,
                    'cost': response.ShipmentCharges.\
                        TotalCharges.MonetaryValue,
        #               'total_amount_currency': currency_id and \
        #                                          currency_id[0] or False,
                'digest': ShipmentConfirm.extract_digest(response),
        #             'xml_messages': xml_messages,
        #            'state': 'confirmed'
                }, context)

        #        after = package_obj.browse(cr, uid, package.id).digest

        #            packages_obj.write(cr, uid,
        #               [pkg.id for pkg in shipment_record.package_det],
        #              {'state': 'confirmed'}, context)

        self.accept_price(cr, uid, omni, package, context=None)
        return True
Example #25
0
    def _add_packages(self, cr, uid, omni, package, weight, context=None):
        """
        Adds the UPS style packages and return the XML element

        """
	picking_obj = self.pool.get('stock.picking')
	package_obj = self.pool.get('stock.out.package')

	ups_package = None
	omni_obj = self.pool.get('omniship')
        ups_uoms = omni_obj.get_ups_uoms(cr, uid, omni, context)

	#Solves a bug where weight is rejected by UPS api for being too low
	if weight < 0.5:
	    weight = 0.5

        package_type = ShipmentConfirm.packaging_type(
            Code='02')

        package_weight = ShipmentConfirm.package_weight_type(
            Weight=str(weight), Code=ups_uoms[0],
            Description='None')

	#Shipment References
	ref1 = str(12345)
	package_referencenumber1 = \
	    ShipmentConfirm.reference_type(Code='02', Value=ref1)

	#Ignore ref2 for now
#       ref2 = str(package.move_id.product_id.sku)
 #      package_referencenumber2 = \
  #         ShipmentConfirm.reference_type(Code='02', Value=ref2)


	#REVIEW: Value set to 0
        package_service_options = \
            ShipmentConfirm.package_service_options_type(
                ShipmentConfirm.insured_value_type(
                    MonetaryValue='0'))

        if ups_package and ups_package.length and ups_package.height and ups_package.width:

            package_dimension = ShipmentConfirm.dimensions_type(
                Code=ups_uoms[1], Length=str(ups_package.length),
                Height=str(ups_package.height), Width=str(ups_package.width),
                Description='None')
        else:
	    #Hardcode a failsafe here so there are no complaints!
            package_dimension = ShipmentConfirm.dimensions_type(
                Code=ups_uoms[1], Length=str(6.0),
                Height=str(6.0), Width=str(6.0),
                Description='None')

        xml_package = ShipmentConfirm.package_type(
            package_type,
            package_weight,
            package_dimension,
            package_service_options,
	    package_referencenumber1)
	#    package_referencenumber2)

        shipment_service = ShipmentConfirm.shipment_service_option_type(
            SaturdayDelivery='None')
        return ([xml_package], shipment_service)
    def _add_addresses(self, cursor, user, register_id, context=None):
        """
        Adds the UPS style addresses to the ShipmentConfirm
        
        :param cursor: Database Cursor
        :param user: ID of User
        :param register_id: ID of Shipment Register
        :param context: Context directly uses active id.
        """
        address_obj = self.pool.get('res.partner.address')
        company_obj = self.pool.get('res.company')
        
        ups_shipper = company_obj.get_ups_shipper(cursor, user, context)
        register_record = self.browse(cursor, user, register_id, context)
        #Fetch Addresses
        to_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.to_address.id, context)
        from_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.from_address.id, context)
        shipper_address = address_obj.address_to_ups_dict(
            cursor, user, register_record.shipper_address.id, context)

        # Generating the XML Elements
        
        # Ship to address
        ship_to_address_elem = ShipmentConfirm.address_type(
            AddressLine1=to_address['line1'],
            AddressLine2=to_address['line2'],
            City=to_address['city'],
            PostalCode=to_address['postal_code'],
            StateProvinceCode=to_address['state_code'],
            CountryCode=to_address['country_code'],)
            
        # Ship from address
        ship_from_address_elem = ShipmentConfirm.address_type(
            AddressLine1=from_address['line1'],
            AddressLine2=from_address['line2'],
            City=from_address['city'],
            PostalCode=from_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=from_address['country_code'])
            
        # Shipper address
        shipper_address_elem = ShipmentConfirm.address_type(
            AddressLine1=shipper_address['line1'],
            AddressLine2=shipper_address['line2'],
            City=shipper_address['city'],
            PostalCode=shipper_address['postal_code'],
            StateProvinceCode=from_address['state_code'],
            CountryCode=shipper_address['country_code'])
            
        # Shipper
        shipper = ShipmentConfirm.shipper_type(
            shipper_address_elem,
            Name=shipper_address['company_name'],
            AttentionName=shipper_address['attention_name'],
            TaxIdentificationNumber=shipper_address['tin'],
            PhoneNumber=shipper_address['phone'],
            FaxNumber=shipper_address['fax'],
            EMailAddress=shipper_address['email'],
            ShipperNumber=ups_shipper)
            
        # Ship to
        ship_to = ShipmentConfirm.ship_to_type(
            ship_to_address_elem,
            CompanyName=to_address['company_name'],
            AttentionName=to_address['attention_name'],
            TaxIdentificationNumber=to_address['tin'],
            PhoneNumber=to_address['phone'],
            FaxNumber=to_address['fax'],
            EMailAddress=to_address['email'],
            LocationId='None')
            
        # Ship from
        ship_from = ShipmentConfirm.ship_from_type(
            ship_from_address_elem,
            CompanyName=from_address['company_name'],
            AttentionName=from_address['attention_name'],
            TaxIdentificationNumber=from_address['tin'],
            PhoneNumber=from_address['phone'],
            FaxNumber=from_address['fax'],
            EMailAddress=from_address['email'])
            
        return (shipper, ship_to, ship_from)
    def do_shipping_request(self, cursor, user, ids, context=None):
        """
        This method calls the UPS API, sends the ShipmentConfirm Request
        to the API and gets the total cost of shipment and tracking number.
        
        :param cursor: Database Cursor
        :param user: ID of User
        :param context: Context directly uses active id.
        """
        currency_obj = self.pool.get('res.currency')
        uom_obj = self.pool.get('product.uom')
        packages_obj = self.pool.get('ups.shippingregister.package')
        company_obj = self.pool.get('res.company')
        ups_shipper = company_obj.get_ups_shipper(cursor, user, context)
        
        payment_info_prepaid = ShipmentConfirm.payment_information_prepaid_type(
            AccountNumber=ups_shipper)
        payment_info = ShipmentConfirm.payment_information_type(
            payment_info_prepaid)

        for shipment_record in self.browse(cursor, user, ids, context):
            (shipper, ship_to, ship_from) = self._add_addresses(cursor, user, 
                shipment_record.id, context)
            service = ShipmentConfirm.service_type(
                Code=shipment_record.service_type.code)
            
            (packages, shipment_service) = self._add_packages(cursor, user, 
                shipment_record.id, context)
            ship_confirm = ShipmentConfirm.shipment_confirm_request_type(
                shipper, ship_to, ship_from, service, payment_info, 
                shipment_service, *packages, 
                Description=shipment_record.description or 'None')
                
            shipment_confirm_instance = self.get_ups_api(cursor, user, 
                'confirm', context)
                
            try:
                response = shipment_confirm_instance.request(ship_confirm)
            except Exception, error:
                raise osv.except_osv(('Error : '), ('%s' % error))
            # Now store values in the register
                
            currency_id = currency_obj.search(cursor, user,
                [('symbol', '=', \
                    response.ShipmentCharges.TotalCharges.CurrencyCode)])
            uom_id = uom_obj.search(cursor, user, [
                ('name', '=', \
                    response.BillingWeight.UnitOfMeasurement.Code.pyval)])
                    
            before = ShipmentConfirm.extract_digest(response)
            
            self.write(cursor, user, shipment_record.id,
                {
                    'name': response.ShipmentIdentificationNumber,
                    'billed_weight': response.BillingWeight.Weight,
                    'billed_weight_uom': uom_id and uom_id[0] or False,
                    'total_amount': response.ShipmentCharges.\
                        TotalCharges.MonetaryValue,
                    'total_amount_currency': currency_id and \
                                                currency_id[0] or False,
                    'digest': ShipmentConfirm.extract_digest(response),
                    'state': 'confirmed'
                    }, context)
            
            after = self.browse(cursor, user, shipment_record.id).digest
            
            packages_obj.write(cursor, user,
                [pkg.id for pkg in shipment_record.package_det],
                {'state': 'confirmed'}, context)
Example #28
0
    def do_shipping_request(self, cursor, user, ids, context=None):
        """
        This method calls the UPS API, sends the ShipmentConfirm Request
        to the API and gets the total cost of shipment and tracking number.

        :param cursor: Database Cursor
        :param user: ID of User
        :param context: Context directly uses active id.
        """
        currency_obj = self.pool.get('res.currency')
        uom_obj = self.pool.get('product.uom')
        packages_obj = self.pool.get('ups.shippingregister.package')
        company_obj = self.pool.get('res.company')
        ups_shipper = company_obj.get_ups_shipper(cursor, user, context)
        ups_message_obj = self.pool.get('ups.message')

        payment_info_prepaid = \
            ShipmentConfirm.payment_information_prepaid_type(
                AccountNumber=ups_shipper)
        payment_info = ShipmentConfirm.payment_information_type(
            payment_info_prepaid)

        for shipment_record in self.browse(cursor, user, ids, context):
            (shipper, ship_to,
             ship_from) = self._add_addresses(cursor, user, shipment_record.id,
                                              context)
            service = ShipmentConfirm.service_type(
                Code=shipment_record.service_type.code)

            (packages,
             shipment_service) = self._add_packages(cursor, user,
                                                    shipment_record.id,
                                                    context)
            ship_confirm = ShipmentConfirm.shipment_confirm_request_type(
                shipper,
                ship_to,
                ship_from,
                service,
                payment_info,
                shipment_service,
                *packages,
                Description=shipment_record.description or 'None')

            shipment_confirm_instance = self.get_ups_api(
                cursor, user, 'confirm', context)

            try:
                response = shipment_confirm_instance.request(ship_confirm)
                if isinstance(response, tuple):
                    request = response[0]
                    response = response[1]

            except PyUPSException, error:
                if company_obj.get_ups_save_xml(cursor, user, context):
                    # TODO: We need a better error exception here.
                    xml_messages = [(0, 0, {
                        'name': 'ConfirmShipmentRequest',
                        'type': 'request',
                        'message': error[1]
                    }),
                                    (0, 0, {
                                        'name':
                                        'ConfirmShipmentResponse',
                                        'type':
                                        'response',
                                        'message':
                                        etree.tostring(error[2],
                                                       pretty_print=True)
                                    })]

                    self.write(cursor, user, shipment_record.id,
                               {'xml_messages': xml_messages}, context)

                raise osv.except_osv(('Error : '), ('%s' % error[0]))
            # Now store values in the register

            currency_id = currency_obj.search(cursor, user,
                [('symbol', '=', \
                    response.ShipmentCharges.TotalCharges.CurrencyCode)])
            uom_id = uom_obj.search(cursor, user, [
                ('name', '=', \
                    response.BillingWeight.UnitOfMeasurement.Code.pyval)])

            before = ShipmentConfirm.extract_digest(response)

            if company_obj.get_ups_save_xml(cursor, user, context):
                xml_messages = [(0, 0, {
                    'name': 'ConfirmShipmentRequest',
                    'type': 'request',
                    'message': request
                }),
                                (0, 0, {
                                    'name':
                                    'ConfirmShipmentResponse',
                                    'type':
                                    'response',
                                    'message':
                                    etree.tostring(response, pretty_print=True)
                                })]
            else:
                xml_messages = []

            self.write(cursor, user, shipment_record.id,
                {
                    'name': response.ShipmentIdentificationNumber,
                    'billed_weight': response.BillingWeight.Weight,
                    'billed_weight_uom': uom_id and uom_id[0] or False,
                    'total_amount': response.ShipmentCharges.\
                        TotalCharges.MonetaryValue,
                    'total_amount_currency': currency_id and \
                                                currency_id[0] or False,
                    'digest': ShipmentConfirm.extract_digest(response),
                    'xml_messages': xml_messages,
                    'state': 'confirmed'
                    }, context)

            after = self.browse(cursor, user, shipment_record.id).digest

            packages_obj.write(cursor, user,
                               [pkg.id for pkg in shipment_record.package_det],
                               {'state': 'confirmed'}, context)
class TestShippingPackage(unittest.TestCase):
    """Test the :class:`ShipmentConfirm` and :class:`ShipmentAccept` classes
    for various cases originating from GB.
    """

    @classmethod
    def setUpClass(self):
        """Check if the variables for initialising the test case is available
        in the environment"""
        assert 'UPS_LICENSE_NO' in os.environ, \
            "UPS_LICENSE_NO not given. Hint:Use export UPS_LICENSE_NO=<number>"
        assert 'UPS_SHIPPER_NO' in os.environ, \
            "UPS_SHIPPER_NO not given. Hint:Use export UPS_SHIPPER_NO=<number>"
        assert 'UPS_USER_ID' in os.environ, \
            "UPS_USER_ID not given. Hint:Use export UPS_USER_ID=<user_id>"
        assert 'UPS_PASSWORD' in os.environ, \
            "UPS_PASSWORD not given. Hint:Use export UPS_PASSWORD=<password>"

    def setUp(self):
        """Initialise a ShipmentConfirm and ShipmentAccept class each.
        """
        logging.disable(logging.DEBUG)
        self.shipper_number = os.environ['UPS_SHIPPER_NO']
        self.shipment_confirm_api = ShipmentConfirm(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True            # Test must be performed in sandbox anyway
            )

        self.shipment_accept_api = ShipmentAccept(
            os.environ['UPS_LICENSE_NO'],
            os.environ['UPS_USER_ID'],
            os.environ['UPS_PASSWORD'],
            True            # Test must be performed in sandbox anyway
            )

    def test_0010_blow_up(self):
        """Send a stupid request which should blow up because its valid in the
        client but not in UPS server. Example: dont send packages"""
        with self.assertRaises(PyUPSException):
            ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
                Helper.get_shipper(self.shipper_number, "GB"),
                Helper.get_ship_to("GB"),
                Helper.get_ship_from("GB"),

                Helper.get_payment_info(AccountNumber=self.shipper_number),
                ShipmentConfirm.service_type(Code='11'),    # UPS Standard
                Description = __doc__[:50]
                )
            self.shipment_confirm_api.request(ship_confirm_request)

    def test_0020_gb_gb(self):
        "GB to GB UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            # Package 2
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),    # UPS Standard
            Description = __doc__[:50]
            )
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)

    @unittest.skipUnless(datetime.today().weekday() == 4, "since not a friday")
    def test_0030_gb_gb_saturday(self):
        "GB to GB UPS Standard with 2 packages and Saturday delivery"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("GB"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            # Package 2
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            ShipmentConfirm.shipment_service_option_type(SaturdayDelivery="1"),

            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='11'),    # UPS Standard
            Description = __doc__[:50]
            )
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)

    def test_0040_gb_us(self):
        "GB to US UPS Standard with 2 packages"
        ship_confirm_request = ShipmentConfirm.shipment_confirm_request_type(
            Helper.get_shipper(self.shipper_number, "GB"),
            Helper.get_ship_to("US"),
            Helper.get_ship_from("GB"),

            # Package 1
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            # Package 2
            Helper.get_package("GB", weight='15.0', 
                package_type_code='02'),    # Customer Supplied Package

            Helper.get_payment_info(AccountNumber=self.shipper_number),
            ShipmentConfirm.service_type(Code='07'),    # UPS Standard
            Description = __doc__[:50]
            )
        response = self.shipment_confirm_api.request(ship_confirm_request)
        digest = self.shipment_confirm_api.extract_digest(response)

        # now accept the package
        accept_request = ShipmentAccept.shipment_accept_request_type(digest)
        result = self.shipment_accept_api.request(accept_request)