def _extract_tracking(shipment_node: Element, settings: Settings) -> TrackingDetails: track_detail = ShipmentType() track_detail.build(shipment_node) activity_nodes = shipment_node.xpath(".//*[local-name() = $name]", name="Activity") def build_activity(node) -> ActivityType: activity = ActivityType() activity.build(node) return activity activities: List[ActivityType] = list(map(build_activity, activity_nodes)) return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=track_detail.InquiryNumber.Value, events=list( map( lambda a: TrackingEvent( date=format_date(a.Date, "%Y%m%d"), time=format_time(a.Time, "%H%M%S"), code=a.Status.Code if a.Status else None, location=(a.ActivityLocation.Address.City if a.ActivityLocation and a.ActivityLocation. Address else None), description=a.Status.Description if a.Status else None, ), activities, )), )
def _extract_intl_rates(service_node: Element, settings: Settings) -> RateDetails: service: ServiceType = ServiceType() service.build(service_node) currency = "USD" special_services: List[ExtraServiceType] = [ (lambda s: (s, s.build(svc)))(ExtraServiceType())[0] for svc in service_node.xpath(".//*[local-name() = $name]", name="ExtraService") ] delivery_date = (format_date(service.GuaranteeAvailability, "%m/%d/%Y") if service.GuaranteeAvailability is not None else None) return RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, service=service.SvcDescription, base_charge=decimal(service.Postage), total_charge=decimal(service.Postage), currency=currency, estimated_delivery=delivery_date, extra_charges=[ ChargeDetails( name=ExtraService(special.ServiceID).name, amount=decimal(special.Price), currency=currency, ) for special in special_services ], )
def _extract_tracking(tracking_node: Element, settings) -> TrackingDetails: tracking: TrackInfoType = TrackInfoType() tracking.build(tracking_node) track_detail_nodes = tracking_node.xpath(".//*[local-name() = $name]", name="TrackDetail") details: List[TrackDetailType] = [ (lambda t: (t, t.build(detail)))(TrackDetailType())[0] for detail in track_detail_nodes ] return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=tracking.TrackInfoID, events=[ TrackingEvent( code=str(event.EventCode), date=format_date(event.EventDate, "%B %d, %Y"), time=format_time(event.EventTime, "%H:%M %p"), description=event.ActionCode, location=", ".join([ location for location in [ event.EventCity, event.EventState, event.EventCountry, str(event.EventZIPCode), ] if location is not None ]), ) for event in details ], )
def _extract_tracking( info_node: Element, settings: Settings ) -> Optional[TrackingDetails]: info = AWBInfo() info.build(info_node) if info.ShipmentInfo is None: return None return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=info.AWBNumber, events=list( map( lambda e: TrackingEvent( date=format_date(e.Date), time=format_time(e.Time), signatory=e.Signatory, code=e.ServiceEvent.EventCode, location=e.ServiceArea.Description, description=e.ServiceEvent.Description, ), info.ShipmentInfo.ShipmentEvent, ) ), )
def _extract_pickup(response: Element, settings: Settings) -> PickupDetails: pickup = BookPUResponse() pickup.build(response) pickup_charge = (ChargeDetails( name="Pickup Charge", amount=decimal(pickup.PickupCharge), currency=pickup.CurrencyCode, ) if pickup.PickupCharge is not None else None) return PickupDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, confirmation_number=str(pickup.ConfirmationNumber[0]), pickup_date=format_date(pickup.NextPickupDate), pickup_charge=pickup_charge, ready_time=format_time(pickup.ReadyByTime), closing_time=format_time(pickup.CallInTime), )
def _extract_tracking(node: Element, settings: Settings) -> TrackingDetails: track = TrackingInformation() track.build(node) return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=str(track.PIN.Value), events=[ TrackingEvent( date=format_date(cast(Scan, scan).ScanDate), time=format_timestamp(cast(Scan, scan).ScanTime), description=cast(Scan, scan).Description, location=cast(Depot, cast(Scan, scan).Depot).Name, code=cast(Scan, scan).ScanType, ) for scan in track.Scans.Scan ], )
def _extract_tracking(pin_summary_node: Element, settings: Settings) -> TrackingDetails: pin_summary_ = pin_summary() pin_summary_.build(pin_summary_node) return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=pin_summary_.pin, events=[ TrackingEvent( date=format_date(pin_summary_.event_date_time, "%Y%m%d:%H%M%S"), time=format_time(pin_summary_.event_date_time, "%Y%m%d:%H%M%S"), signatory=pin_summary_.signatory_name, code=pin_summary_.event_type, location=pin_summary_.event_location, description=pin_summary_.event_description, ) ], )
def _extract_quote(qtdshp_node: Element, settings: Settings) -> RateDetails: qtdshp = ResponseQtdShpType() qtdshp.build(qtdshp_node) if qtdshp.ShippingCharge is None or qtdshp.ShippingCharge == 0: return None ExtraCharges = list( map( lambda s: ChargeDetails(name=s.LocalServiceTypeName, amount=decimal(s.ChargeValue or 0)), qtdshp.QtdShpExChrg, )) Discount_ = reduce( lambda d, ec: d + ec.amount if "Discount" in ec.name else d, ExtraCharges, 0.0) DutiesAndTaxes_ = reduce( lambda d, ec: d + ec.amount if "TAXES PAID" in ec.name else d, ExtraCharges, 0.0) DlvyDateTime = qtdshp.DeliveryDate[0].DlvyDateTime delivery_date = (datetime.strptime( str(DlvyDateTime), "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d") if DlvyDateTime is not None else None) service_name = next( (p.name for p in Product if p.value in qtdshp.LocalProductName), qtdshp.LocalProductName, ) return RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, currency=qtdshp.CurrencyCode, estimated_delivery=format_date(delivery_date), service=service_name, base_charge=decimal(qtdshp.WeightCharge), total_charge=decimal(qtdshp.ShippingCharge), duties_and_taxes=decimal(DutiesAndTaxes_), discount=decimal(Discount_), extra_charges=list( map( lambda s: ChargeDetails(name=s.LocalServiceTypeName, amount=decimal(s.ChargeValue), currency=qtdshp.CurrencyCode), qtdshp.QtdShpExChrg, )), )
def _extract_tracking(track_detail_node: Element, settings: Settings) -> Optional[TrackingDetails]: track_detail = TrackDetail() track_detail.build(track_detail_node) if track_detail.Notification.Severity == "ERROR": return None return TrackingDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, tracking_number=track_detail.TrackingNumber, events=list( map( lambda e: TrackingEvent( date=format_date(e.Timestamp, "%Y-%m-%d %H:%M:%S%z"), time=format_time(e.Timestamp, "%Y-%m-%d %H:%M:%S%z"), code=e.EventType, location=e.ArrivalLocation, description=e.EventDescription, ), track_detail.Events, )), )
def _extract_quote(price_quote_node: Element, settings: Settings) -> RateDetails: price_quote = price_quoteType() price_quote.build(price_quote_node) currency = Currency.CAD.name discounts = [ ChargeDetails( name=d.adjustment_name, currency=currency, amount=decimal(d.adjustment_cost or 0), ) for d in price_quote.price_details.adjustments.adjustment ] return RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, currency=currency, estimated_delivery=format_date( price_quote.service_standard.expected_delivery_date ), service=ServiceType(price_quote.service_code).name, base_charge=decimal(price_quote.price_details.base or 0), total_charge=decimal(price_quote.price_details.due or 0), discount=decimal(reduce(lambda total, d: total + d.amount, discounts, 0.0)), duties_and_taxes=decimal( float(price_quote.price_details.taxes.gst.valueOf_ or 0) + float(price_quote.price_details.taxes.pst.valueOf_ or 0) + float(price_quote.price_details.taxes.hst.valueOf_ or 0) ), extra_charges=list( map( lambda a: ChargeDetails( name=a.adjustment_name, currency=currency, amount=decimal(a.adjustment_cost or 0), ), price_quote.price_details.adjustments.adjustment, ) ), )
def _extract_rate(estimate_node: Element, settings: Settings) -> RateDetails: estimate = ShipmentEstimate() estimate.build(estimate_node) currency = Currency.CAD.name duties_and_taxes = [ ChargeDetails( name=cast(Tax, tax).Description, amount=decimal(cast(Tax, tax).Amount), currency=currency, ) for tax in estimate.Taxes.Tax ] surcharges = [ ChargeDetails( name=cast(Surcharge, charge).Description, amount=decimal(cast(Surcharge, charge).Amount), currency=currency, ) for charge in estimate.Surcharges.Surcharge ] option_charges = [ ChargeDetails( name=cast(OptionPrice, charge).Description, amount=decimal(cast(OptionPrice, charge).Amount), currency=currency, ) for charge in estimate.OptionPrices.OptionPrice ] service = next((p.name for p in Product if p.value in estimate.ServiceID), estimate.ServiceID) return RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, service=service, currency=currency, base_charge=decimal(estimate.BasePrice), estimated_delivery=format_date(estimate.ExpectedDeliveryDate), total_charge=decimal(estimate.TotalPrice), duties_and_taxes=decimal(sum(c.amount for c in duties_and_taxes)), extra_charges=(duties_and_taxes + surcharges + option_charges), )
def _extract_rate(detail_node: Element, settings: Settings) -> Optional[RateDetails]: rate: RateReplyDetail = RateReplyDetail() rate.build(detail_node) service = ServiceType(rate.ServiceType).name rate_type = rate.ActualRateType shipment_rate, shipment_discount = cast( Tuple[ShipmentRateDetail, Money], next(((r.ShipmentRateDetail, r.EffectiveNetDiscount) for r in rate.RatedShipmentDetails if cast(ShipmentRateDetail, r.ShipmentRateDetail).RateType == rate_type), (None, None))) discount = decimal( shipment_discount.Amount) if shipment_discount is not None else None currency = cast(Money, shipment_rate.TotalBaseCharge).Currency duties_and_taxes = shipment_rate.TotalTaxes.Amount + shipment_rate.TotalDutiesAndTaxes.Amount surcharges = [ ChargeDetails(name=cast(Surcharge, s).Description, amount=decimal(cast(Surcharge, s).Amount.Amount), currency=currency) for s in shipment_rate.Surcharges + shipment_rate.Taxes ] return RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, service=service, currency=currency, base_charge=decimal(shipment_rate.TotalBaseCharge.Amount), total_charge=decimal( shipment_rate.TotalNetChargeWithDutiesAndTaxes.Amount), duties_and_taxes=decimal(duties_and_taxes), discount=discount, estimated_delivery=format_date(rate.DeliveryTimestamp, "%Y-%m-%d %H:%M:%S"), extra_charges=surcharges, )
def extract(rates: List[RateDetails], detail_node: Element) -> List[RateDetails]: rate = RatedShipmentType() rate.build(detail_node) if rate.NegotiatedRateCharges is not None: total_charges = ( rate.NegotiatedRateCharges.TotalChargesWithTaxes or rate.NegotiatedRateCharges.TotalCharge ) taxes = rate.NegotiatedRateCharges.TaxCharges itemized_charges = rate.NegotiatedRateCharges.ItemizedCharges + taxes else: total_charges = rate.TotalChargesWithTaxes or rate.TotalCharges taxes = rate.TaxCharges itemized_charges = rate.ItemizedCharges + taxes extra_charges = itemized_charges + [rate.ServiceOptionsCharges] arrival = PickupType() [ arrival.build(arrival) for arrival in detail_node.xpath( ".//*[local-name() = $name]", name="Arrival" ) ] currency_ = next( c.text for c in detail_node.xpath( ".//*[local-name() = $name]", name="CurrencyCode" ) ) service = ShippingServiceCode(rate.Service.Code).name return rates + [ RateDetails( carrier_name=settings.carrier_name, carrier_id=settings.carrier_id, currency=currency_, service=service, base_charge=decimal(rate.TransportationCharges.MonetaryValue), total_charge=decimal(total_charges.MonetaryValue), duties_and_taxes=reduce( lambda total, charge: total + decimal(charge.MonetaryValue), taxes or [], 0.0, ), extra_charges=reduce( lambda total, charge: ( total + [ ChargeDetails( name=charge.Code, amount=decimal(charge.MonetaryValue), currency=charge.CurrencyCode, ) ] ), [charge for charge in extra_charges if charge is not None], [], ), estimated_delivery=format_date(arrival.Date), ) ]