def _process_debt_event(task, event): item = DebtRecoveryEvent(sellerid=task.sellerid) item.debtrecoverytype = mwsdecode.element_auto_text(event, 'DebtRecoveryType') item.recoveryamount = _currency_money(item, event, 'RecoveryAmount') item.overpaymentcredit = _currency_money(item, event, 'OverPaymentCredit') item.save() debtitems = mwsdecode.element_auto_list(event, 'DebtRecoveryItemList/DebtRecoveryItem') for db in debtitems: _process_debt_event_item(item, db) chargeinstruments = mwsdecode.element_auto_list(event, 'ChargeInstrumentList/ChargeInstrument') for ci in chargeinstruments: _process_debt_event_charge(item, ci)
def _process_response(task, response): """ 处理返回结果 :param task: :return: """ if response is None or response['code'] != '00000': logger.info("response error %s " % response) task.reset_init() return tree = mwsdecode.tree_ignore_namepace(response['mwsResponse']) if tree is None: return task.update_last_request_time() if mwsdecode.is_error_response(tree): logger.info("%s reponse error: %s" % (task.sellerid, response)) return result = '' if response['action'] == 'ListOrders': result = 'ListOrdersResult' elif response['action'] == 'ListOrdersByNextToken': result = 'ListOrdersByNextTokenResult' orders_path = result + '/Orders/Order' orders = mwsdecode.element_auto_list(tree, orders_path) for item in orders: _process_order(task, item) nexttoken_path = result + "/NextToken" nexttoken = mwsdecode.element_auto_text(tree, nexttoken_path) if nexttoken is None: task.task_finished() else: task.need_nexttoken(nexttoken)
def _process_performance_event(task, event): item = PerformanceBondRefundEvent(sellerid=task.sellerid) item.marketplacecountrycode = mwsdecode.element_auto_text(event, 'MarketplaceCountryCode') item.amount = _currency_money(item, event, 'Amount') groupids = mwsdecode.element_auto_list(event, 'ProductGroupList/ProductGroup') pgids = map(lambda x: x.text, groupids) item.productgrouplist = ",".join(pgids) item.save()
def _process_adjustment_event(task, event): item = AdjustmentEvent(sellerid=task.sellerid) item.adjustmenttype = mwsdecode.element_auto_text(event, 'AdjustmentType') item.adjustmentamount = _currency_money(item, event, 'AdjustmentAmount') item.post_date = task.last_after_datetime item.save() items = mwsdecode.element_auto_list(event, 'AdjustmentItemList/AdjustmentItem') for it in items: _process_adjustment_event_item(item, it)
def _process_rental_event(task, event): amazonid = mwsdecode.element_auto_text(event, 'AmazonOrderId') posteddate = mwsdecode.mws_datestr_to_datetime(mwsdecode.element_auto_text(event, 'PostedDate')) tetype = mwsdecode.element_auto_text(event, 'RentalEventType') item, created = RentalTransactionEvent.objects.get_or_create(sellerid=task.sellerid, amazonorderid=amazonid, posteddate=posteddate, rentaleventtype=tetype) if not created: return item.extensionlength = int(mwsdecode.element_auto_text(event, 'ExtensionLength', '0')) item.marketplacename = mwsdecode.element_auto_text(event, 'MarketplaceName') item.rentalinitialvalue = _currency_money(item, event, 'RentalInitialValue') item.rentalreimbursement = _currency_money(item, event, 'RentalReimbursement') item.save() chargelist = mwsdecode.element_auto_list(event, 'RentalChargeList/ChargeComponent') for cl in chargelist: _process_rental_event_charge(item, cl) feelist = mwsdecode.element_auto_list(event, 'RentalFeeList/FeeComponent') for fl in feelist: _process_rental_event_fee(item, fl)
def _process_servicefee_event(task, event): item = ServiceFeeEvent(sellerid=task.sellerid) item.amazonorderid = mwsdecode.element_auto_text(event, 'AmazonOrderId') item.feereason = mwsdecode.element_auto_text(event, 'FeeReason') item.sellersku = mwsdecode.element_auto_text(event, 'SellerSKU') item.fnsku = mwsdecode.element_auto_text(event, 'FnSKU') item.feedescription = mwsdecode.element_auto_text(event, 'FeeDescription') item.asin = mwsdecode.element_auto_text(event, 'ASIN') item.postdate = task.last_after_datetime item.save() feelist = mwsdecode.element_auto_list(event, 'FeeList/FeeComponent') for fl in feelist: _process_servicefee_event_fee(item, fl)
def _process_response(task, response): """ 处理返回结果 :param task: :return: """ if response is None or response['code'] != '00000': logger.info("response error %s " % response) task.reset_init() return tree = mwsdecode.tree_ignore_namepace(response['mwsResponse']) if tree is None: return if mwsdecode.is_error_response(tree): logger.info("%s reponse error: %s" % (task.sellerid, response)) return result = "" if response['action'] == 'ListOrderItems': result = 'ListOrderItemsResult' elif response['action'] == 'ListOrderItemsByNextToken': result = 'ListOrderItemsByNextTokenResult' items = mwsdecode.element_auto_list(tree, ('%s/OrderItems/OrderItem' % result)) amazon_order_id = mwsdecode.element_auto_text( tree, ('%s/AmazonOrderId' % result)) try: order = Order.objects.get(sellerid=task.sellerid, amazon_order_id=amazon_order_id) for item in items: _process_orderitem(order=order, amazon_order_id=amazon_order_id, itemele=item) if order.order_status in [ 'Shipped', 'InvoiceUnconfirmed', 'Canceled', 'Unfulfillable' ]: order.pulled_items = 2 else: order.pulled_items = 1 order.save() except MultipleObjectsReturned: logger.info( "find MultipleObjectsReturned on order %s-%s" % task.sellerid, amazon_order_id) nexttoken = mwsdecode.element_auto_text(tree, ('%s/NextToken' % result)) if nexttoken is None: task.task_finished() else: task.need_nexttoken(nexttoken)
def _process_paywithamazon_event(task, event): item = PayWithAmazonEvent(sellerid=task.sellerid) item.sellerorderid = mwsdecode.element_auto_text(event, 'SellerOrderId') item.transactionposteddate = mwsdecode.mws_datestr_to_datetime(mwsdecode.element_auto_text(event, 'TransactionPostedDate')) item.businessobjecttype = mwsdecode.element_auto_text(event, 'businessobjecttype') item.saleschannel = mwsdecode.element_auto_text(event, 'SalesChannel') item.charge_type = mwsdecode.element_auto_text(event, 'Charge/ChargeType') item.charge_amount = _currency_money(item, event, 'Charge/ChargeAmount') item.paymentamounttype = mwsdecode.element_auto_text(event, 'PaymentAmountType') item.amountdescription = mwsdecode.element_auto_text(event, 'AmountDescription') item.fulfillmentchannel = mwsdecode.element_auto_text(event, 'FulfillmentChannel') item.storename = mwsdecode.element_auto_text(event, 'StoreName') item.save() feelist = mwsdecode.element_auto_list(event, 'FeeList/FeeComponent') for fee in feelist: _process_paywithamazon_fee(item, event)
def _process_shipmentevents(task, event, category): posteddate = mwsdecode.mws_datestr_to_datetime(mwsdecode.element_auto_text(event, 'PostedDate')) amazonorderid = mwsdecode.element_auto_text(event, 'AmazonOrderId') shipment, created = ShipmentEvent.objects.get_or_create(sellerid=task.sellerid, category=category, amazonorderid=amazonorderid, posteddate=posteddate) if not created: # ignore if the evnet is recorded return shipment.sellerorderid = mwsdecode.element_auto_text(event, 'SellerOrderId') shipment.marketplacename = mwsdecode.element_auto_text(event, 'MarketplaceName') shipment.save() orderchargementlist = mwsdecode.element_auto_list(event, 'OrderChargeList/ChargeComponent') for ordercharge in orderchargementlist: _process_shipmentevent_charge(shipment, ordercharge, 'order') orderchargeadjustmentlist = mwsdecode.element_auto_list(event, 'OrderChargeAdjustmentList/ChargeComponent') for oj in orderchargeadjustmentlist: _process_shipmentevent_charge(shipment, oj, 'orderadjustment') shipmentfeelist = mwsdecode.element_auto_list(event, 'ShipmentFeeList/FeeComponent') for sf in shipmentfeelist: _process_shipmentevent_fee(shipment, sf, 'shipment') shipmentfeeadjustmentlist = mwsdecode.element_auto_list(event, 'ShipmentFeeAdjustmentList/FeeComponent') for sfa in shipmentfeeadjustmentlist: _process_shipmentevent_fee(shipment, sfa, 'shipmentadjustment') orderfeelist = mwsdecode.element_auto_list(event, 'OrderFeeList/FeeComponent') for of in orderfeelist: _process_shipmentevent_fee(shipment, of, 'order') orderfeeadjustmentlist = mwsdecode.element_auto_list(event, 'OrderFeeAdjustmentList/FeeComponent') for ofa in orderfeeadjustmentlist: _process_shipmentevent_fee(shipment, ofa, 'orderadjustment') directpaymentlist = mwsdecode.element_auto_list(event, 'DirectPaymentList/DirectPayment') for dp in directpaymentlist: _process_shipmentevent_direct(shipment, dp) shipmentitemlist = mwsdecode.element_auto_list(event, 'ShipmentItemList/ShipmentItem') for si in shipmentitemlist: _process_shipmentevent_item(shipment, si, 'normal') shipmentitemadjustmentlist = mwsdecode.element_auto_list(event, 'ShipmentItemAdjustmentList/ShipmentItem') for sia in shipmentitemadjustmentlist: _process_shipmentevent_item(shipment, sia, 'adjustment')
def _process_shipmentevent_item(shipment, event, category): item = ShipmentItem(shipmentevent=shipment, category=category) item.sellersku = mwsdecode.element_auto_text(event, 'SellerSKU') item.orderitemid = mwsdecode.element_auto_text(event, 'OrderItemId') item.orderadjustmentitemid = mwsdecode.element_auto_text(event, 'OrderAdjustmentItemId') item.quantityshipped = int(mwsdecode.element_auto_text(event, 'QuantityShipped', '0')) item.costofpointsgranted = _currency_money(item, event, 'CostOfPointsGranted') item.cotofpointsreturned = _currency_money(item, event, 'CostOfPointsReturned') item.save() chargers = [] itemchargelist = mwsdecode.element_auto_list(event, 'ItemChargeList/ChargeComponent') for ic in itemchargelist: chargers.append(_process_shipmentitem_charge(item, ic, 'normal')) itemchargeadjustmentlist = mwsdecode.element_auto_list(event, 'ItemChargeAdjustmentList/ChargeComponent') for ica in itemchargeadjustmentlist: chargers.append(_process_shipmentitem_charge(item, ica, 'adjustment')) for charger in chargers: item.charger = Decimal(item.charger) + Decimal(charger.charegeamount) item.currency = charger.currency fees = [] itemfeelist = mwsdecode.element_auto_list(event, 'ItemFeeList/FeeComponent') for ifee in itemfeelist: fees.append(_process_shipmentitem_fee(item, ifee, 'normal')) itemfeeadjustmentlist = mwsdecode.element_auto_list(event, 'ItemFeeAdjustmentList/FeeComponent') for ifeea in itemfeeadjustmentlist: fees.append(_process_shipmentitem_fee(item, ifeea, 'adjustment')) for fee in fees: item.fee = Decimal(item.fee) + Decimal(fee.feeamount) promotions = [] promotionlist = mwsdecode.element_auto_list(event, 'PromotionList/Promotion') for p in promotionlist: promotions.append(_process_shipmentitem_promoion(item, p, 'normal')) promotionadjustmentlist = mwsdecode.element_auto_list(event, 'PromotionAdjustmentList/Promotion') for pa in promotionadjustmentlist: promotions.append(_process_shipmentitem_promoion(item, pa, 'adjustment')) for promotion in promotions: item.promotion = Decimal(item.promotion) + Decimal(promotion.promotionamount) item.save()
def _process_response(task, response): """ 处理返回结果 :param task: :return: """ if response is None or response['code'] != '00000': logger.info("response error %s " % response) task.reset_init() return tree = mwsdecode.tree_ignore_namepace(response['mwsResponse']) if tree is None: return if mwsdecode.is_error_response(tree): logger.info("%s reponse error: %s" % (task.sellerid, response)) return result = '' if response['action'] == 'ListFinancialEvents': result = 'ListFinancialEventsResult' elif response['action'] == 'ListFinancialEventsByNextToken': result = 'ListFinancialEventsByNextTokenResult' financial_tree_path = result + '/FinancialEvents' financial_tree = tree.find(financial_tree_path) shipmentevents = mwsdecode.element_auto_list(financial_tree, "ShipmentEventList/ShipmentEvent") for item in shipmentevents: _process_shipmentevents(task, item, 'normal') refundevents = mwsdecode.element_auto_list(financial_tree, "RefundEventList/ShipmentEvent") for rf in refundevents: _process_shipmentevents(task, rf, 'refund') guaranteeclaimevents = mwsdecode.element_auto_list(financial_tree, "GuaranteeClaimEventList/ShipmentEvent") for gc in guaranteeclaimevents: _process_shipmentevents(task, gc, 'guarantee_claim') chargebackevents = mwsdecode.element_auto_list(financial_tree, "ChargebackEventList/ShipmentEvent") for cb in chargebackevents: _process_shipmentevents(task, cb, 'chargeback') paywithamazonevents = mwsdecode.element_auto_list(financial_tree, 'PayWithAmazonEventList/PayWithAmazonEvent') for pwa in paywithamazonevents: _process_paywithamazon_event(task, pwa) serviceprovidercreditevents = mwsdecode.element_auto_list(financial_tree, 'ServiceProviderCreditEventList/SolutionProviderCreditEvent') for spc in serviceprovidercreditevents: _process_serviceprovider_event(task, spc) retrochargeevents = mwsdecode.element_auto_list(financial_tree, 'RetrochargeEventList/RetrochargeEvent') for rc in retrochargeevents: _process_retrocharge_event(task, rc) rentaltransactionevents = mwsdecode.element_auto_list(financial_tree, 'RentalTransactionEventList/RentalTransactionEvent') for rte in rentaltransactionevents: _process_rental_event(task, rte) performancebondrefundevents = mwsdecode.element_auto_list(financial_tree, 'PerformanceBondRefundEventList/PerformanceBondRefundEvent') for pb in performancebondrefundevents: _process_performance_event(task, pb) servicefeeevents = mwsdecode.element_auto_list(financial_tree, 'ServiceFeeEventList/ServiceFeeEvent') for sf in servicefeeevents: _process_servicefee_event(task, sf) debtrecoveryevents = mwsdecode.element_auto_list(financial_tree, 'DebtRecoveryEventList/DebtRecoveryEvent') for dr in debtrecoveryevents: _process_debt_event(task, dr) loanservicingevents = mwsdecode.element_auto_list(financial_tree, 'LoanServicingEventList/LoanServicingEvent') for ls in loanservicingevents: _process_loan_event(task, ls) adjustmentevents = mwsdecode.element_auto_list(financial_tree, 'AdjustmentEventList/AdjustmentEvent') for ae in adjustmentevents: _process_adjustment_event(task, ae) nexttoken_path = result + "/NextToken" nexttoken = mwsdecode.element_auto_text(tree, nexttoken_path) if nexttoken is None: task.task_finished() else: task.need_nexttoken(nexttoken)
def _process_orderitem(order, amazon_order_id, itemele): orderitemid = mwsdecode.element_auto_text(itemele, 'OrderItemId') item, created = OrderItem.objects.get_or_create( order_item_id=orderitemid, sellerid=order.sellerid, amazon_order_id=order.amazon_order_id) if created: item.purchase_date = order.purchase_date item.fulfillment_channel = order.fulfillment_channel item.phone = order.phone item.marketplaceid = order.marketplaceid item.asin = mwsdecode.element_auto_text(itemele, 'ASIN') item.seller_sku = mwsdecode.element_auto_text(itemele, 'SellerSKU') item.customized_url = mwsdecode.element_auto_text( itemele, 'BuyerCustomizedInfo/CustomizedURL') item.title = mwsdecode.element_auto_text(itemele, 'Title') item.quantity_ordered = int( mwsdecode.element_auto_text(itemele, 'QuantityOrdered', '0')) item.quantity_shipped = int( mwsdecode.element_auto_text(itemele, 'QuantityShipped', '0')) item.points_number = int( mwsdecode.element_auto_text(itemele, 'PointsGranted/PointsNumber', '0')) item.points_monetary_value = _orderitem_money( item, itemele, 'PointsGranted/PointsMonetaryValue') item.item_price = _orderitem_money(item, itemele, 'ItemPrice') item.shipping_price = _orderitem_money(item, itemele, 'ShippingPrice') item.gift_wrap_price = _orderitem_money(item, itemele, 'GiftWrapPrice') item.item_tax = _orderitem_money(item, itemele, 'ItemTax') item.shipping_tax = _orderitem_money(item, itemele, 'ShippingTax') item.gift_wrap_tax = _orderitem_money(item, itemele, 'GiftWrapTax') item.shipping_discount = _orderitem_money(item, itemele, 'ShippingDiscount') item.promotion_discount = _orderitem_money(item, itemele, 'PromotionDiscount') promotionids = mwsdecode.element_auto_list(itemele, 'PromotionIds/PromotionId') pids = map(lambda x: x.text, promotionids) item.promotion_ids = ",".join(pids) item.cod_fee = _orderitem_money(item, itemele, 'CODFee') item.cod_fee_discount = _orderitem_money(item, itemele, 'CODFeeDiscount') item.gift_message_text = mwsdecode.element_auto_text( itemele, 'GiftMessageText') item.gift_wrap_level = mwsdecode.element_auto_text(itemele, 'GiftWrapLevel') item.invoice_requirement = mwsdecode.element_auto_text( itemele, 'InvoiceData/InvoiceRequirement') item.buyer_selected_invoice_category = mwsdecode.element_auto_text( itemele, 'InvoiceData/BuyerSelectedInvoiceCategory') item.invoice_title = mwsdecode.element_auto_text( itemele, 'InvoiceData/InvoiceTitle') item.invoice_information = mwsdecode.element_auto_text( itemele, 'InvoiceData/InvoiceInformation') item.condition_note = mwsdecode.element_auto_text(itemele, 'ConditionNote') item.conditionid = mwsdecode.element_auto_text(itemele, 'ConditionId') item.condition_subtype_id = mwsdecode.element_auto_text( itemele, 'ConditionSubtypeId') item.scheduled_delivery_start_date = mwsdecode.element_auto_text( itemele, 'ScheduledDeliveryStartDate') item.scheduled_delivery_end_date = mwsdecode.element_auto_text( itemele, 'ScheduledDeliveryEndDate') item.price_designation = mwsdecode.element_auto_text( itemele, 'PriceDesignation') item.save()
def _process_response(shop, response): """ 处理返回结果 :param task: :return: """ reponseok = True if response is None or response['code'] != '00000': logger.info("response error %s " % response) reponseok = False return tree = mwsdecode.tree_ignore_namepace(response['mwsResponse']) if tree is None: reponseok = False return if mwsdecode.is_error_response(tree): logger.info("%s reponse error: %s" % (shop.sellerid, response)) reponseok = False if not reponseok: reponse_api(code="00014", msg="error") return data = {} data["sellerid"] = shop.sellerid data["marketplaceid"] = mwsdecode.element_auto_text(tree, 'GetLowestPricedOffersForSKUResult/Identifier/MarketplaceId') data["sellersku"] = mwsdecode.element_auto_text(tree, 'GetLowestPricedOffersForSKUResult/Identifier/SellerSKU') data["numberOfOffers"] = int( mwsdecode.element_auto_text(tree, 'GetLowestPricedOffersForSKUResult/Summary/TotalOfferCount', '0')) data["currency"] = "" data['lowestLandPrice'] = 10000.0 data['lowestListingPrice'] = 10000.0 data['lowestShippingPrice'] = 10000.0 lowestPrices = mwsdecode.element_auto_list(tree, 'GetLowestPricedOffersForSKUResult/Summary/LowestPrices/LowestPrice') for lowest in lowestPrices: condition = lowest.get("condition", 'used') fulfillmentChannel = lowest.get('fulfillmentChannel', 'Merchant') if condition not in ['new', 'New']: continue lowest_land_price = float(_currency_money(data, lowest, 'LandedPrice')) lowest_listing_price = float(_currency_money(data, lowest, 'ListingPrice')) lowest_shipping_price = float(_currency_money(data, lowest, 'Shipping')) if data['lowestListingPrice'] < lowest_listing_price: continue data["lowestFulfillment"] = fulfillmentChannel data['lowestLandPrice'] = lowest_land_price data['lowestListingPrice'] = lowest_listing_price data['lowestShippingPrice'] = lowest_shipping_price buyboxps = mwsdecode.element_auto_list(tree, 'GetLowestPricedOffersForSKUResult/Summary/BuyBoxPrices/BuyBoxPrice') for buybox in buyboxps: condition = lowest.get("condition", 'used') if condition not in ['New', 'new']: continue data["buyboxLandPrice"] = float(_currency_money(data, buybox, 'LandedPrice')) data['buyboxListingPrice'] = float(_currency_money(data, buybox, 'ListingPrice')) data['buyboxShippingPrice'] = float(_currency_money(data, buybox, 'Shipping')) if data["numberOfOffers"] > 0: offers = mwsdecode.element_auto_list(tree, 'GetLowestPricedOffersForSKUResult/Offers/Offer') for offer in offers: myoffer = mwsdecode.mws_boolean(mwsdecode.element_auto_text(offer, 'MyOffer', 'false')) if not myoffer: continue isFBA = mwsdecode.mws_boolean(mwsdecode.element_auto_text(offer, 'IsFulfilledByAmazon', 'false')) data['myFulfillment'] = 'Amazon' if isFBA else 'Merchant' data['myListingPrice'] = float(_currency_money(data, offer, 'ListingPrice')) data['myShippingPrice'] = float(_currency_money(data, offer, 'Shipping')) data['buyboxWinner'] = mwsdecode.mws_boolean(mwsdecode.element_auto_text(offer, 'IsBuyBoxWinner', 'false')) if data['lowestListingPrice'] == 10000.0: data['lowestLandPrice'] = data['lowestListingPrice'] = data['lowestShippingPrice'] = 0.0 reponse_api(code="00000", msg="success", data=data)