예제 #1
0
    def make_fedex_labels(self):
        """
        Make labels for the given shipment

        :return: Tracking number as string
        """
        Currency = Pool().get('currency.currency')
        Attachment = Pool().get('ir.attachment')
        Package = Pool().get('stock.package')
        Uom = Pool().get('product.uom')

        if self.state not in ('packed', 'done'):
            self.raise_user_error('invalid_state')

        if not self.carrier.carrier_cost_method == 'fedex':
            self.raise_user_error('wrong_carrier')

        if self.tracking_number:
            self.raise_user_error('tracking_number_already_present')

        fedex_credentials = self.carrier.get_fedex_credentials()

        ship_request = ProcessShipmentRequest(fedex_credentials)
        requested_shipment = ship_request.RequestedShipment

        requested_shipment.DropoffType = self.fedex_drop_off_type.value
        requested_shipment.ServiceType = self.fedex_service_type.value
        requested_shipment.PackagingType = self.fedex_packaging_type.value

        uom_pound, = Uom.search([('symbol', '=', 'lb')])

        if len(self.packages) > 1:
            requested_shipment.TotalWeight.Units = 'LB'
            requested_shipment.TotalWeight.Value = Uom.compute_qty(
                self.weight_uom, self.weight, uom_pound
            )

        # Shipper & Recipient
        requested_shipment.Shipper.AccountNumber = \
            fedex_credentials.AccountNumber

        if not self.warehouse.address:
            self.raise_user_error('warehouse_address_required')

        self.warehouse.address.set_fedex_address(requested_shipment.Shipper)
        self.delivery_address.set_fedex_address(requested_shipment.Recipient)

        # Shipping Charges Payment
        shipping_charges = requested_shipment.ShippingChargesPayment
        shipping_charges.PaymentType = 'SENDER'
        shipping_charges.Payor.ResponsibleParty = requested_shipment.Shipper

        # Express Freight Detail
        fright_detail = requested_shipment.ExpressFreightDetail
        fright_detail.PackingListEnclosed = 1  # XXX
        fright_detail.ShippersLoadAndCount = 2  # XXX
        fright_detail.BookingConfirmationNumber = 'Ref-%s' % self.reference

        if self.is_international_shipping:
            # Customs Clearance Detail
            self.get_fedex_customs_details(ship_request)

        # Label Specification
        # Maybe make them as configurable items in later versions
        requested_shipment.LabelSpecification.LabelFormatType = 'COMMON2D'
        requested_shipment.LabelSpecification.ImageType = 'PNG'
        requested_shipment.LabelSpecification.LabelStockType = 'PAPER_4X6'

        requested_shipment.RateRequestTypes = ['ACCOUNT']

        master_tracking_number = None

        for index, package in enumerate(self.packages, start=1):
            item = ship_request.get_element_from_type(
                'RequestedPackageLineItem'
            )
            item.SequenceNumber = index

            # TODO: some country needs item.ItemDescription

            item.Weight.Units = 'LB'
            item.Weight.Value = Uom.compute_qty(
                package.weight_uom, package.weight, uom_pound
            )

            ship_request.RequestedShipment.RequestedPackageLineItems = [item]
            ship_request.RequestedShipment.PackageCount = len(self.packages)

            if master_tracking_number is not None:
                tracking_id = ship_request.get_element_from_type(
                    'TrackingId'
                )
                tracking_id.TrackingNumber = master_tracking_number
                ship_request.RequestedShipment.MasterTrackingId = tracking_id

            try:
                response = ship_request.send_request(str(self.id))
            except RequestError, error:
                self.raise_user_error('error_label', error_args=(error,))

            package_details = response.CompletedShipmentDetail.CompletedPackageDetails  # noqa
            tracking_number = package_details[0].TrackingIds[0].TrackingNumber

            if self.packages.index(package) == 0:
                master_tracking_number = tracking_number

            Package.write([package], {
                'tracking_number': tracking_number,
            })

            for id, image in enumerate(package_details[0].Label.Parts):
                Attachment.create([{
                    'name': "%s_%s_Fedex.png" % (tracking_number, id),
                    'type': 'data',
                    'data': buffer(base64.decodestring(image.Image)),
                    'resource': '%s,%s' % (self.__name__, self.id)
                }])
예제 #2
0
    def make_fedex_labels(self):
        """
        Make labels for the given shipment

        :return: Tracking number as string
        """
        Currency = Pool().get('currency.currency')
        Attachment = Pool().get('ir.attachment')
        Package = Pool().get('stock.package')
        Uom = Pool().get('product.uom')

        if self.state not in ('packed', 'done'):
            self.raise_user_error('invalid_state')

        if not self.carrier.carrier_cost_method == 'fedex':
            self.raise_user_error('wrong_carrier')

        if self.tracking_number:
            self.raise_user_error('tracking_number_already_present')

        fedex_credentials = self.carrier.get_fedex_credentials()

        ship_request = ProcessShipmentRequest(fedex_credentials)
        requested_shipment = ship_request.RequestedShipment

        requested_shipment.DropoffType = self.fedex_drop_off_type.value
        requested_shipment.ServiceType = self.fedex_service_type.value
        requested_shipment.PackagingType = self.fedex_packaging_type.value

        uom_pound, = Uom.search([('symbol', '=', 'lb')])

        if len(self.packages) > 1:
            requested_shipment.TotalWeight.Units = 'LB'
            requested_shipment.TotalWeight.Value = Uom.compute_qty(
                self.weight_uom, self.weight, uom_pound
            )

        # Shipper & Recipient
        requested_shipment.Shipper.AccountNumber = \
            fedex_credentials.AccountNumber

        from_address = self._get_ship_from_address()
        from_address.set_fedex_address(requested_shipment.Shipper)
        self.delivery_address.set_fedex_address(requested_shipment.Recipient)

        # Shipping Charges Payment
        shipping_charges = requested_shipment.ShippingChargesPayment
        shipping_charges.PaymentType = 'SENDER'
        shipping_charges.Payor.ResponsibleParty = requested_shipment.Shipper

        # Express Freight Detail
        fright_detail = requested_shipment.ExpressFreightDetail
        fright_detail.PackingListEnclosed = 1  # XXX
        fright_detail.ShippersLoadAndCount = 2  # XXX
        fright_detail.BookingConfirmationNumber = 'Ref-%s' % self.reference

        if self.is_international_shipping:
            # Customs Clearance Detail
            self.get_fedex_customs_details(ship_request)

        # Label Specification
        # Maybe make them as configurable items in later versions
        requested_shipment.LabelSpecification.LabelFormatType = 'COMMON2D'
        requested_shipment.LabelSpecification.ImageType = 'PNG'
        requested_shipment.LabelSpecification.LabelStockType = 'PAPER_4X6'

        requested_shipment.RateRequestTypes = ['ACCOUNT']

        master_tracking_number = None

        for index, package in enumerate(self.packages, start=1):
            item = ship_request.get_element_from_type(
                'RequestedPackageLineItem'
            )
            item.SequenceNumber = index

            # TODO: some country needs item.ItemDescription

            item.Weight.Units = 'LB'
            item.Weight.Value = Uom.compute_qty(
                package.weight_uom, package.weight, uom_pound
            )

            ship_request.RequestedShipment.RequestedPackageLineItems = [item]
            ship_request.RequestedShipment.PackageCount = len(self.packages)

            if master_tracking_number is not None:
                tracking_id = ship_request.get_element_from_type(
                    'TrackingId'
                )
                tracking_id.TrackingNumber = master_tracking_number
                ship_request.RequestedShipment.MasterTrackingId = tracking_id

            try:
                response = ship_request.send_request(str(self.id))
            except RequestError, error:
                self.raise_user_error('error_label', error_args=(error,))

            package_details = response.CompletedShipmentDetail.CompletedPackageDetails  # noqa
            tracking_number = package_details[0].TrackingIds[0].TrackingNumber

            if self.packages.index(package) == 0:
                master_tracking_number = tracking_number

            Package.write([package], {
                'tracking_number': tracking_number,
            })

            for id, image in enumerate(package_details[0].Label.Parts):
                Attachment.create([{
                    'name': "%s_%s_Fedex.png" % (tracking_number, id),
                    'type': 'data',
                    'data': buffer(base64.decodestring(image.Image)),
                    'resource': '%s,%s' % (self.__name__, self.id)
                }])
예제 #3
0
    def test_0020_process_shipment(self):
        """
        Try sending a shipment
        """
        psr = ProcessShipmentRequest(self.accountinfo)
        psr.RequestedShipment.DropoffType = 'REGULAR_PICKUP'
        psr.RequestedShipment.ServiceType = 'INTERNATIONAL_PRIORITY_FREIGHT'
        psr.RequestedShipment.PackagingType = 'YOUR_PACKAGING'
        # psr.RequestedShipment.PreferredCurrency = 'USD'
        # Shipper
        psr.RequestedShipment.Shipper.AccountNumber = \
            self.accountinfo.AccountNumber
        psr.RequestedShipment.Shipper.Contact.CompanyName = \
            'WAPISENDER-WBUS1100'
        psr.RequestedShipment.Shipper.Contact.PersonName = 'Sender Name'
        psr.RequestedShipment.Shipper.Contact.PhoneNumber = '1234567890'
        psr.RequestedShipment.Shipper.Contact.EMailAddress = \
            '*****@*****.**'
        psr.RequestedShipment.Shipper.Address.StreetLines = [
            'SN2000 Test Meter 8', '10 Fedex Parkway'
        ]
        psr.RequestedShipment.Shipper.Address.City = 'Detroit'
        psr.RequestedShipment.Shipper.Address.StateOrProvinceCode = 'MI'
        psr.RequestedShipment.Shipper.Address.PostalCode = '48208'
        psr.RequestedShipment.Shipper.Address.CountryCode = 'US'
        # Recipient
        psr.RequestedShipment.Recipient.Contact.PersonName = 'Recipient_Name'
        psr.RequestedShipment.Recipient.Contact.PhoneNumber = '9018549236'
        psr.RequestedShipment.Recipient.Address.StreetLines = [
            'Recipient Address Line 1', 'Address line 2'
        ]
        psr.RequestedShipment.Recipient.Address.City = 'Edmonton'
        psr.RequestedShipment.Recipient.Address.StateOrProvinceCode = 'AB'
        psr.RequestedShipment.Recipient.Address.PostalCode = 'T5A1'
        psr.RequestedShipment.Recipient.Address.CountryCode = 'CA'
        # Shipping Charges Payment
        psr.RequestedShipment.ShippingChargesPayment.PaymentType = 'SENDER'
        psr.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty = \
            psr.RequestedShipment.Shipper
        # Express Freight Detail
        psr.RequestedShipment.ExpressFreightDetail.PackingListEnclosed = 1
        psr.RequestedShipment.ExpressFreightDetail.ShippersLoadAndCount = 2
        psr.RequestedShipment.ExpressFreightDetail.BookingConfirmationNumber =\
            '123asd789'

        # Customs Clearance Detail
        customs_detail = psr.get_element_from_type('CustomsClearanceDetail')
        customs_detail.DocumentContent = 'DOCUMENTS_ONLY'
        # Customs Value
        customs_detail.CustomsValue.Currency = 'USD'
        customs_detail.CustomsValue.Amount = '5000'
        # Commercial Invoice
        customs_detail.CommercialInvoice.TermsOfSale = 'FOB'

        customs_detail.DutiesPayment.PaymentType = 'SENDER'
        customs_detail.DutiesPayment.Payor.ResponsibleParty = \
            psr.RequestedShipment.Shipper
        psr.RequestedShipment.CustomsClearanceDetail = customs_detail
        # Encoding Items for customs
        commodities = []
        commodity_1 = psr.get_element_from_type('Commodity')
        commodity_1.NumberOfPieces = 1
        commodity_1.Name = 'Shoes'
        commodity_1.Description = 'My Beautiful Adidas Shoes'
        commodity_1.CountryOfManufacture = 'US'
        commodity_1.Weight.Units = 'LB'
        commodity_1.Weight.Value = 10
        commodity_1.Quantity = 1
        commodity_1.QuantityUnits = "pairs"
        commodity_1.UnitPrice.Amount = 100
        commodity_1.UnitPrice.Currency = 'USD'
        commodity_1.CustomsValue.Currency = 'USD'
        commodity_1.CustomsValue.Amount = 100
        commodities.append(commodity_1)
        psr.RequestedShipment.CustomsClearanceDetail.Commodities = commodities
        # Label Specification
        psr.RequestedShipment.LabelSpecification.LabelFormatType = 'COMMON2D'
        psr.RequestedShipment.LabelSpecification.ImageType = 'PNG'
        psr.RequestedShipment.LabelSpecification.LabelStockType = 'PAPER_4X6'
        # Charges and Payments
        psr.RequestedShipment.RateRequestTypes = ['ACCOUNT']
        # Encoding for items
        items = []
        item_1 = psr.get_element_from_type('RequestedPackageLineItem')
        item_1.SequenceNumber = 1
        item_1.ItemDescription = "My Beautiful Shoes"
        item_1.Weight.Units = 'LB'
        item_1.Weight.Value = 180
        item_1.Dimensions.Length = 12
        item_1.Dimensions.Width = 12
        item_1.Dimensions.Height = 12
        item_1.Dimensions.Units = 'IN'
        items.append(item_1)
        psr.RequestedShipment.RequestedPackageLineItems = items
        psr.RequestedShipment.PackageCount = len(items)

        print psr.send_request('0020')
예제 #4
0
    def test_0020_process_shipment(self):
        """
        Try sending a shipment
        """
        psr = ProcessShipmentRequest(self.accountinfo)
        psr.RequestedShipment.DropoffType = 'REGULAR_PICKUP'
        psr.RequestedShipment.ServiceType = 'INTERNATIONAL_PRIORITY_FREIGHT'
        psr.RequestedShipment.PackagingType = 'YOUR_PACKAGING'
        # psr.RequestedShipment.PreferredCurrency = 'USD'
        # Shipper
        psr.RequestedShipment.Shipper.AccountNumber = \
            self.accountinfo.AccountNumber
        psr.RequestedShipment.Shipper.Contact.CompanyName = \
            'WAPISENDER-WBUS1100'
        psr.RequestedShipment.Shipper.Contact.PersonName = 'Sender Name'
        psr.RequestedShipment.Shipper.Contact.PhoneNumber = '1234567890'
        psr.RequestedShipment.Shipper.Contact.EMailAddress = \
            '*****@*****.**'
        psr.RequestedShipment.Shipper.Address.StreetLines = [
            'SN2000 Test Meter 8',
            '10 Fedex Parkway'
        ]
        psr.RequestedShipment.Shipper.Address.City = 'Detroit'
        psr.RequestedShipment.Shipper.Address.StateOrProvinceCode = 'MI'
        psr.RequestedShipment.Shipper.Address.PostalCode = '48208'
        psr.RequestedShipment.Shipper.Address.CountryCode = 'US'
        # Recipient
        psr.RequestedShipment.Recipient.Contact.PersonName = 'Recipient_Name'
        psr.RequestedShipment.Recipient.Contact.PhoneNumber = '9018549236'
        psr.RequestedShipment.Recipient.Address.StreetLines = [
            'Recipient Address Line 1',
            'Address line 2'
        ]
        psr.RequestedShipment.Recipient.Address.City = 'Edmonton'
        psr.RequestedShipment.Recipient.Address.StateOrProvinceCode = 'AB'
        psr.RequestedShipment.Recipient.Address.PostalCode = 'T5A1'
        psr.RequestedShipment.Recipient.Address.CountryCode = 'CA'
        # Shipping Charges Payment
        psr.RequestedShipment.ShippingChargesPayment.PaymentType = 'SENDER'
        psr.RequestedShipment.ShippingChargesPayment.Payor.ResponsibleParty = \
            psr.RequestedShipment.Shipper
        # Express Freight Detail
        psr.RequestedShipment.ExpressFreightDetail.PackingListEnclosed = 1
        psr.RequestedShipment.ExpressFreightDetail.ShippersLoadAndCount = 2
        psr.RequestedShipment.ExpressFreightDetail.BookingConfirmationNumber =\
            '123asd789'

        # Customs Clearance Detail
        customs_detail = psr.get_element_from_type('CustomsClearanceDetail')
        customs_detail.DocumentContent = 'DOCUMENTS_ONLY'
        # Customs Value
        customs_detail.CustomsValue.Currency = 'USD'
        customs_detail.CustomsValue.Amount = '5000'
        # Commercial Invoice
        customs_detail.CommercialInvoice.TermsOfSale = 'FOB'

        customs_detail.DutiesPayment.PaymentType = 'SENDER'
        customs_detail.DutiesPayment.Payor.ResponsibleParty = \
            psr.RequestedShipment.Shipper
        psr.RequestedShipment.CustomsClearanceDetail = customs_detail
        # Encoding Items for customs
        commodities = []
        commodity_1 = psr.get_element_from_type('Commodity')
        commodity_1.NumberOfPieces = 1
        commodity_1.Name = 'Shoes'
        commodity_1.Description = 'My Beautiful Adidas Shoes'
        commodity_1.CountryOfManufacture = 'US'
        commodity_1.Weight.Units = 'LB'
        commodity_1.Weight.Value = 10
        commodity_1.Quantity = 1
        commodity_1.QuantityUnits = "pairs"
        commodity_1.UnitPrice.Amount = 100
        commodity_1.UnitPrice.Currency = 'USD'
        commodity_1.CustomsValue.Currency = 'USD'
        commodity_1.CustomsValue.Amount = 100
        commodities.append(commodity_1)
        psr.RequestedShipment.CustomsClearanceDetail.Commodities = commodities
        # Label Specification
        psr.RequestedShipment.LabelSpecification.LabelFormatType = 'COMMON2D'
        psr.RequestedShipment.LabelSpecification.ImageType = 'PNG'
        psr.RequestedShipment.LabelSpecification.LabelStockType = 'PAPER_4X6'
        # Charges and Payments
        psr.RequestedShipment.RateRequestTypes = ['ACCOUNT']
        # Encoding for items
        items = []
        item_1 = psr.get_element_from_type('RequestedPackageLineItem')
        item_1.SequenceNumber = 1
        item_1.ItemDescription = "My Beautiful Shoes"
        item_1.Weight.Units = 'LB'
        item_1.Weight.Value = 180
        item_1.Dimensions.Length = 12
        item_1.Dimensions.Width = 12
        item_1.Dimensions.Height = 12
        item_1.Dimensions.Units = 'IN'
        items.append(item_1)
        psr.RequestedShipment.RequestedPackageLineItems = items
        psr.RequestedShipment.PackageCount = len(items)

        print psr.send_request('0020')