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) }])
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) }])
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')