Ejemplo n.º 1
0
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,
            )),
    )
Ejemplo n.º 2
0
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
        ],
    )
Ejemplo n.º 3
0
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
        ],
    )
Ejemplo n.º 4
0
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,
            )
        ),
    )
Ejemplo n.º 5
0
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),
    )
Ejemplo n.º 6
0
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
        ],
    )
Ejemplo n.º 7
0
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,
            )
        ],
    )
Ejemplo n.º 8
0
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,
            )),
    )
Ejemplo n.º 9
0
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,
            )),
    )
Ejemplo n.º 10
0
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,
            )
        ),
    )
Ejemplo n.º 11
0
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),
    )
Ejemplo n.º 12
0
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,
    )
Ejemplo n.º 13
0
    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),
            )
        ]