Subversion Repositories SmartDukaan

Rev

Rev 7631 | Rev 7663 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7631 Rev 7645
Line 2017... Line 2017...
2017
    order.status = OrderStatus.DOA_REQUEST_RECEIVED
2017
    order.status = OrderStatus.DOA_REQUEST_RECEIVED
2018
    order.statusDescription = "DOA Request Received"
2018
    order.statusDescription = "DOA Request Received"
2019
    session.commit()
2019
    session.commit()
2020
    return True
2020
    return True
2021
 
2021
 
2022
def mark_order_doa_request_authorized(orderId, isAuthorized):
2022
def mark_order_doa_request_authorized(orderId, isAuthorized, fromStore, isReship):
2023
    order = get_order(orderId)
2023
    order = get_order(orderId)
2024
    if order.status != OrderStatus.DOA_REQUEST_RECEIVED:
2024
    if order.status != OrderStatus.DOA_REQUEST_RECEIVED:
2025
        return False
2025
        return False
2026
    if isAuthorized:
2026
    if isAuthorized:
2027
        order.status = OrderStatus.DOA_REQUEST_AUTHORIZED
2027
        order.status = OrderStatus.DOA_REQUEST_AUTHORIZED
2028
        order.statusDescription = "DOA Request Authorized"
2028
        order.statusDescription = "DOA Request Authorized"
-
 
2029
        if order.source == 2:
-
 
2030
            if fromStore:
-
 
2031
                if isReship:
-
 
2032
                    new_order = __clone_order(order, False, False)
-
 
2033
                    order.reship_timestamp = datetime.datetime.now()
-
 
2034
                    order.new_order_id = new_order.id
-
 
2035
                else:
-
 
2036
                    sod = StoreOrderDetail.get_by(orderId = order.id)
-
 
2037
                    if sod.cashAmount > 0:
-
 
2038
                        __push_store_collection_to_hotspot(order, "RefundFromStore", -sod.cashAmount, 0)
-
 
2039
                        
-
 
2040
                    if sod.cardAmount == 0:
-
 
2041
                        sod.payStatus = StorePaymentStatus.ADV_REFUNDED
-
 
2042
                    else:
-
 
2043
                        sod.payStatus = StorePaymentStatus.REFUND_REQUESTED
-
 
2044
                    
-
 
2045
                    order.refund_timestamp = datetime.datetime.now()
-
 
2046
                    order.refunded_by = "CRM Outbound Team"
-
 
2047
                    sod.cashRefundAmount = sod.cashAmount
-
 
2048
                    sod.cardRefundAmount = sod.cardAmount
2029
    else:
2049
    else:
2030
        order.status = OrderStatus.DELIVERY_SUCCESS
2050
        order.status = OrderStatus.DELIVERY_SUCCESS
2031
        order.statusDescription = "Order delivered"
2051
        order.statusDescription = "Order delivered"
2032
    session.commit()
2052
    session.commit()
2033
    return True
2053
    return True
Line 2039... Line 2059...
2039
    order.status = OrderStatus.RET_REQUEST_RECEIVED
2059
    order.status = OrderStatus.RET_REQUEST_RECEIVED
2040
    order.statusDescription = "Return Request Received"
2060
    order.statusDescription = "Return Request Received"
2041
    session.commit()
2061
    session.commit()
2042
    return True
2062
    return True
2043
 
2063
 
2044
def mark_order_return_request_authorized(orderId, isAuthorized):
2064
def mark_order_return_request_authorized(orderId, isAuthorized, fromStore, isReship):
2045
    order = get_order(orderId)
2065
    order = get_order(orderId)
2046
    if order.status != OrderStatus.RET_REQUEST_RECEIVED:
2066
    if order.status != OrderStatus.RET_REQUEST_RECEIVED:
2047
        return False
2067
        return False
-
 
2068
    
2048
    if isAuthorized:
2069
    if isAuthorized:
2049
        order.status = OrderStatus.RET_REQUEST_AUTHORIZED
2070
        order.status = OrderStatus.RET_REQUEST_AUTHORIZED
2050
        order.statusDescription = "Return Request Authorized"
2071
        order.statusDescription = "Return Request Authorized"
-
 
2072
        if order.source == 2:
-
 
2073
            if fromStore:
-
 
2074
                if isReship:
-
 
2075
                    new_order = __clone_order(order, False, False)
-
 
2076
                    order.reship_timestamp = datetime.datetime.now()
-
 
2077
                    order.new_order_id = new_order.id
-
 
2078
                else:
-
 
2079
                    sod = StoreOrderDetail.get_by(orderId = order.id)
-
 
2080
                    if sod.cashAmount > 0:
-
 
2081
                        __push_store_collection_to_hotspot(order, "RefundFromStore", -sod.cashAmount, 0)
-
 
2082
                        
-
 
2083
                    if sod.cardAmount == 0:
-
 
2084
                        sod.payStatus = StorePaymentStatus.ADV_REFUNDED
-
 
2085
                    else:
-
 
2086
                        sod.payStatus = StorePaymentStatus.REFUND_REQUESTED
-
 
2087
                        
-
 
2088
                    order.refund_timestamp = datetime.datetime.now()
-
 
2089
                    order.refunded_by = "CRM Outbound Team"
-
 
2090
                    sod.cashRefundAmount = sod.cashAmount
-
 
2091
                    sod.cardRefundAmount = sod.cardAmount
2051
    else:
2092
    else:
2052
        order.status = OrderStatus.DELIVERY_SUCCESS
2093
        order.status = OrderStatus.DELIVERY_SUCCESS
2053
        order.statusDescription = "Order delivered"
2094
        order.statusDescription = "Order delivered"
2054
    session.commit()
2095
    session.commit()
2055
    return True
2096
    return True
Line 2233... Line 2274...
2233
                    warehouseClient.scanForOrder(None, scanType, lineitem.quantity, order.id, order.fulfilmentWarehouseId, order.warehouse_id)
2274
                    warehouseClient.scanForOrder(None, scanType, lineitem.quantity, order.id, order.fulfilmentWarehouseId, order.warehouse_id)
2234
            if warehouse.billingType == BillingType.OURS_EXTERNAL and scanType == ScanType.SALE_RET:
2275
            if warehouse.billingType == BillingType.OURS_EXTERNAL and scanType == ScanType.SALE_RET:
2235
                warehouseClient.scanForOursExternalSaleReturn(order.id, lineitem.transfer_price)
2276
                warehouseClient.scanForOursExternalSaleReturn(order.id, lineitem.transfer_price)
2236
            if scanFreebie:
2277
            if scanFreebie:
2237
                warehouseClient.scanfreebie(order.id, order.freebieItemId, 0, scanType)
2278
                warehouseClient.scanfreebie(order.id, order.freebieItemId, 0, scanType)
-
 
2279
    
2238
    session.commit()
2280
    session.commit()  
-
 
2281
    if order.source == 2:
-
 
2282
        if order.new_order_id:
-
 
2283
            reship_order(order.id)
-
 
2284
        else:
-
 
2285
            storeOrderDetail = StoreOrderDetail.query.filter(StoreOrderDetail.orderId == order.id).filter(StoreOrderDetail.storeId == order.storeId).first()
-
 
2286
            if storeOrderDetail.payStatus not in (StorePaymentStatus.ADV_REFUNDED , StorePaymentStatus.REFUND_INITIATED, \
-
 
2287
                                          StorePaymentStatus.REFUND_REQUESTED, StorePaymentStatus.REFUNDED):
-
 
2288
                refund_order(order.id, "Store", "N/A")
2239
    return True
2289
    return True
2240
 
2290
 
2241
def validate_doa(order_id, is_valid):
2291
def validate_doa(order_id, is_valid):
2242
    order = get_order(order_id)
2292
    order = get_order(order_id)
2243
    if order.status != OrderStatus.DOA_RECEIVED_PRESTINE:
2293
    if order.status != OrderStatus.DOA_RECEIVED_PRESTINE:
Line 2302... Line 2352...
2302
    
2352
    
2303
    Parameters:
2353
    Parameters:
2304
     - orderId
2354
     - orderId
2305
    """
2355
    """
2306
    order = get_order(order_id)
2356
    order = get_order(order_id)
-
 
2357
    alreadyReshipped = False
-
 
2358
    if order.source == 2 and order.new_order_id:
-
 
2359
        alreadyReshipped = True
2307
    if order.status == OrderStatus.RTO_RECEIVED_PRESTINE:
2360
    if order.status == OrderStatus.RTO_RECEIVED_PRESTINE:
2308
        new_order = __clone_order(order, True, order.cod)
-
 
2309
        order.status = OrderStatus.RTO_RESHIPPED
2361
        order.status = OrderStatus.RTO_RESHIPPED
2310
        order.statusDescription = "Order Reshipped"
2362
        order.statusDescription = "Order Reshipped"
2311
        session.commit()
2363
        if not alreadyReshipped:
-
 
2364
            new_order = __clone_order(order, True, order.cod)
2312
        update_trust_level(order)
2365
        update_trust_level(order)
2313
        __scan_for_reship_order(order_id, new_order)
2366
        __scan_for_reship_order(order_id, new_order)
2314
    elif order.status == OrderStatus.RTO_RECEIVED_DAMAGED:
2367
    elif order.status == OrderStatus.RTO_RECEIVED_DAMAGED:
2315
        new_order = __clone_order(order, False, order.cod)
-
 
2316
        ret_order = __create_return_order(order)
-
 
2317
        order.status = OrderStatus.RTO_DAMAGED_RESHIPPED
2368
        order.status = OrderStatus.RTO_DAMAGED_RESHIPPED
2318
        order.statusDescription = "Order Reshipped Received Damaged"
2369
        order.statusDescription = "Order Reshipped Received Damaged"
2319
        session.commit()
2370
        if not alreadyReshipped:
-
 
2371
            new_order = __clone_order(order, False, order.cod)
-
 
2372
        ret_order = __create_return_order(order)
2320
    elif order.status == OrderStatus.RTO_LOST_IN_TRANSIT:
2373
    elif order.status == OrderStatus.RTO_LOST_IN_TRANSIT:
2321
        new_order = __clone_order(order, False, order.cod)
-
 
2322
        order.status = OrderStatus.RTO_LOST_IN_TRANSIT_RESHIPPED
2374
        order.status = OrderStatus.RTO_LOST_IN_TRANSIT_RESHIPPED
2323
        order.statusDescription = "Order Reshipped Lost In Transit"
2375
        order.statusDescription = "Order Reshipped Lost In Transit"
2324
        session.commit()
2376
        if not alreadyReshipped:
-
 
2377
            new_order = __clone_order(order, False, order.cod)
2325
    elif order.status == OrderStatus.LOST_IN_TRANSIT:
2378
    elif order.status == OrderStatus.LOST_IN_TRANSIT:
2326
        new_order = __clone_order(order, False, order.cod)
-
 
2327
        order.status = OrderStatus.LOST_IN_TRANSIT_RESHIPPED
2379
        order.status = OrderStatus.LOST_IN_TRANSIT_RESHIPPED
2328
        order.statusDescription = "Order Reshipped Lost In Transit"
2380
        order.statusDescription = "Order Reshipped Lost In Transit"
2329
        session.commit()
2381
        if not alreadyReshipped:
-
 
2382
            new_order = __clone_order(order, False, order.cod)
2330
    elif order.status == OrderStatus.DOA_CERT_INVALID:
2383
    elif order.status == OrderStatus.DOA_CERT_INVALID:
2331
        new_order = __clone_order(order, True, False)
-
 
2332
        order.status = OrderStatus.DOA_INVALID_RESHIPPED
2384
        order.status = OrderStatus.DOA_INVALID_RESHIPPED
2333
        order.statusDescription = "Order Reshipped"
2385
        order.statusDescription = "Order Reshipped"
2334
        session.commit()
2386
        if not alreadyReshipped:
-
 
2387
            new_order = __clone_order(order, True, False)
2335
        __scan_for_reship_order(order_id, new_order)
2388
        __scan_for_reship_order(order_id, new_order)
2336
    elif order.status == OrderStatus.DOA_CERT_VALID:
2389
    elif order.status == OrderStatus.DOA_CERT_VALID:
2337
        new_order = __clone_order(order, False, False)
-
 
2338
        ret_order = __create_return_order(order)
-
 
2339
        order.status = OrderStatus.DOA_VALID_RESHIPPED
2390
        order.status = OrderStatus.DOA_VALID_RESHIPPED
2340
        order.statusDescription = "Order Reshipped"
2391
        order.statusDescription = "Order Reshipped"
2341
        session.commit()
2392
        if not alreadyReshipped:
2342
    elif order.status == OrderStatus.DOA_RECEIVED_DAMAGED:
-
 
2343
        new_order = __clone_order(order, False, False)
2393
            new_order = __clone_order(order, False, False)
2344
        ret_order = __create_return_order(order)
2394
        ret_order = __create_return_order(order)
-
 
2395
    elif order.status == OrderStatus.DOA_RECEIVED_DAMAGED:
2345
        order.status = OrderStatus.DOA_RESHIPPED_RCVD_DAMAGED
2396
        order.status = OrderStatus.DOA_RESHIPPED_RCVD_DAMAGED
2346
        order.statusDescription = "Order Reshipped Received Damaged"
2397
        order.statusDescription = "Order Reshipped Received Damaged"
2347
        session.commit()
2398
        if not alreadyReshipped:
-
 
2399
            new_order = __clone_order(order, False, False)
-
 
2400
        ret_order = __create_return_order(order)
2348
    elif order.status == OrderStatus.DOA_LOST_IN_TRANSIT:
2401
    elif order.status == OrderStatus.DOA_LOST_IN_TRANSIT:
2349
        new_order = __clone_order(order, False, False)
-
 
2350
        order.status = OrderStatus.DOA_RESHIPPED_LOST_IN_TRANSIT
2402
        order.status = OrderStatus.DOA_RESHIPPED_LOST_IN_TRANSIT
2351
        order.statusDescription = "Order Reshipped Lost In Transit"
2403
        order.statusDescription = "Order Reshipped Lost In Transit"
2352
        session.commit()
2404
        if not alreadyReshipped:
-
 
2405
            new_order = __clone_order(order, False, False)
2353
    elif order.status == OrderStatus.RET_PRODUCT_USABLE:
2406
    elif order.status == OrderStatus.RET_PRODUCT_USABLE:
2354
        new_order = __clone_order(order, False, False)
-
 
2355
        order.status = OrderStatus.RET_PRODUCT_USABLE_RESHIPPED
2407
        order.status = OrderStatus.RET_PRODUCT_USABLE_RESHIPPED
2356
        order.statusDescription = "Order Reshipped"
2408
        order.statusDescription = "Order Reshipped"
2357
        session.commit()
2409
        if not alreadyReshipped:
-
 
2410
            new_order = __clone_order(order, False, False)
2358
    elif order.status == OrderStatus.RET_PRODUCT_UNUSABLE:
2411
    elif order.status == OrderStatus.RET_PRODUCT_UNUSABLE:
2359
        new_order = __clone_order(order, False, False)
-
 
2360
        ret_order = __create_return_order(order)
-
 
2361
        order.status = OrderStatus.RET_PRODUCT_UNUSABLE_RESHIPPED
2412
        order.status = OrderStatus.RET_PRODUCT_UNUSABLE_RESHIPPED
2362
        order.statusDescription = "Order Reshipped"
2413
        order.statusDescription = "Order Reshipped"
2363
        session.commit()
2414
        if not alreadyReshipped:
2364
    elif order.status == OrderStatus.RET_RECEIVED_DAMAGED:
-
 
2365
        new_order = __clone_order(order, False, False)
2415
            new_order = __clone_order(order, False, False)
2366
        ret_order = __create_return_order(order)
2416
        ret_order = __create_return_order(order)
-
 
2417
    elif order.status == OrderStatus.RET_RECEIVED_DAMAGED:
2367
        order.status = OrderStatus.RET_RESHIPPED_RCVD_DAMAGED
2418
        order.status = OrderStatus.RET_RESHIPPED_RCVD_DAMAGED
2368
        order.statusDescription = "Order Reshipped Received Damaged"
2419
        order.statusDescription = "Order Reshipped Received Damaged"
2369
        session.commit()
2420
        if not alreadyReshipped:
-
 
2421
            new_order = __clone_order(order, False, False)
-
 
2422
        ret_order = __create_return_order(order)
2370
    elif order.status == OrderStatus.RET_LOST_IN_TRANSIT:
2423
    elif order.status == OrderStatus.RET_LOST_IN_TRANSIT:
2371
        new_order = __clone_order(order, False, False)
-
 
2372
        order.status = OrderStatus.RET_RESHIPPED_LOST_IN_TRANSIT
2424
        order.status = OrderStatus.RET_RESHIPPED_LOST_IN_TRANSIT
2373
        order.statusDescription = "Order Reshipped Lost In Transit"
2425
        order.statusDescription = "Order Reshipped Lost In Transit"
2374
        session.commit()
2426
        if not alreadyReshipped:
-
 
2427
            new_order = __clone_order(order, False, False)
2375
    else:
2428
    else:
2376
        raise TransactionServiceException(112, "This order can't be reshipped")
2429
        raise TransactionServiceException(112, "This order can't be reshipped")
2377
    
2430
    
-
 
2431
    if not alreadyReshipped:
2378
    order.reship_timestamp = datetime.datetime.now()
2432
        order.reship_timestamp = datetime.datetime.now()
2379
    order.new_order_id = new_order.id
2433
        order.new_order_id = new_order.id
2380
    session.commit()
2434
        session.commit()
-
 
2435
        return new_order.id
-
 
2436
    else:
-
 
2437
        return order.new_order_id
2381
    
2438
    
2382
    return new_order.id
-
 
2383
 
2439
 
2384
def __scan_for_reship_order(order_id, new_order):
2440
def __scan_for_reship_order(order_id, new_order):
2385
    inventoryClient = InventoryClient().get_client()
2441
    inventoryClient = InventoryClient().get_client()
2386
    warehouse = inventoryClient.getWarehouse(new_order.warehouse_id)
2442
    warehouse = inventoryClient.getWarehouse(new_order.warehouse_id)
2387
    if warehouse.billingType == BillingType.OURS:
2443
    if warehouse.billingType == BillingType.OURS:
Line 2612... Line 2668...
2612
                storeOrderDetail.payStatus = StorePaymentStatus.REFUND_REQUESTED
2668
                storeOrderDetail.payStatus = StorePaymentStatus.REFUND_REQUESTED
2613
                
2669
                
2614
            if storeOrderDetail.cashRefundAmount > 0:
2670
            if storeOrderDetail.cashRefundAmount > 0:
2615
                __push_store_collection_to_hotspot(order, "RefundFromStore", -storeOrderDetail.cashRefundAmount, 0)
2671
                __push_store_collection_to_hotspot(order, "RefundFromStore", -storeOrderDetail.cashRefundAmount, 0)
2616
                
2672
                
-
 
2673
    elif order.source == 2 and order.status in (OrderStatus.RTO_RECEIVED_PRESTINE, OrderStatus.RTO_RECEIVED_DAMAGED, \
-
 
2674
                                                OrderStatus.RET_PRODUCT_UNUSABLE, OrderStatus.RET_PRODUCT_USABLE, \
-
 
2675
                                                OrderStatus.RET_RECEIVED_DAMAGED, OrderStatus.RET_LOST_IN_TRANSIT ,\
-
 
2676
                                                OrderStatus.DOA_CERT_INVALID, OrderStatus.DOA_CERT_VALID, \
-
 
2677
                                                OrderStatus.DOA_RECEIVED_DAMAGED, OrderStatus.DOA_LOST_IN_TRANSIT):
-
 
2678
        storeOrderDetail = StoreOrderDetail.query.filter(StoreOrderDetail.orderId == order.id).filter(StoreOrderDetail.storeId == order.storeId).first()
-
 
2679
        if storeOrderDetail.payStatus not in (StorePaymentStatus.ADV_REFUNDED , StorePaymentStatus.REFUND_INITIATED, \
-
 
2680
                                          StorePaymentStatus.REFUND_REQUESTED, StorePaymentStatus.REFUNDED):
-
 
2681
            storeOrderDetail.payStatus = StorePaymentStatus.REFUND_REQUESTED
-
 
2682
        else:
-
 
2683
            order.status = status_transition[order.status]
-
 
2684
            order.refund_reason = reason
-
 
2685
            session.commit()
-
 
2686
            return True
-
 
2687
        
2617
    order.status = status_transition[order.status]
2688
    order.status = status_transition[order.status]
2618
    order.refund_timestamp = datetime.datetime.now()
2689
    order.refund_timestamp = datetime.datetime.now()
2619
    order.refunded_by = refunded_by
2690
    order.refunded_by = refunded_by
2620
    order.refund_reason = reason
2691
    order.refund_reason = reason
2621
    session.commit()
2692
    session.commit()
Line 2719... Line 2790...
2719
        new_order.lineitems[0].item_number   = order.lineitems[0].item_number
2790
        new_order.lineitems[0].item_number   = order.lineitems[0].item_number
2720
        new_order.accepted_timestamp = current_time
2791
        new_order.accepted_timestamp = current_time
2721
        new_order.billing_timestamp = current_time    
2792
        new_order.billing_timestamp = current_time    
2722
        new_order.status = OrderStatus.BILLED
2793
        new_order.status = OrderStatus.BILLED
2723
        new_order.statusDescription = 'Order Billed'
2794
        new_order.statusDescription = 'Order Billed'
-
 
2795
        session.commit()
2724
    else:
2796
    else:
2725
        session.commit()       
2797
        session.commit()       
2726
        inventoryClient = InventoryClient().get_client()
2798
        inventoryClient = InventoryClient().get_client()
2727
        inventoryClient.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, sourceId, new_order.id, to_java_date(new_order.created_timestamp), to_java_date(new_order.promised_shipping_time), new_order.lineitems[0].quantity)
2799
        inventoryClient.reserveItemInWarehouse(item_id, logistics_info.fulfilmentWarehouseId, sourceId, new_order.id, to_java_date(new_order.created_timestamp), to_java_date(new_order.promised_shipping_time), new_order.lineitems[0].quantity)
2728
 
2800
    
-
 
2801
    if order.source == 2:
-
 
2802
        new_order.advanceAmount = order.advanceAmount
-
 
2803
        new_order.storeId = order.storeId   
-
 
2804
        oldSod = StoreOrderDetail.query.filter(StoreOrderDetail.orderId == order.id).filter(StoreOrderDetail.storeId == order.storeId).first()
-
 
2805
        newSod = StoreOrderDetail()
-
 
2806
        newSod.orderId = new_order.id
-
 
2807
        newSod.storeId = oldSod.storeId
-
 
2808
        newSod.advanceAmount = oldSod.advanceAmount
-
 
2809
        newSod.approvalCode = oldSod.approvalCode
-
 
2810
        newSod.cardAmount = oldSod.cardAmount
-
 
2811
        newSod.cashAmount = oldSod.cashAmount
-
 
2812
        newSod.cashRefundAmount = oldSod.cashRefundAmount
-
 
2813
        newSod.cardRefundAmount = oldSod.cardRefundAmount
-
 
2814
        newSod.edcBank = oldSod.edcBank
-
 
2815
        newSod.payStatus = oldSod.payStatus
-
 
2816
        newSod.cardType = oldSod.cardType 
-
 
2817
        session.commit()
-
 
2818
    
2729
    return new_order
2819
    return new_order
2730
 
2820
 
2731
def __create_return_order(order):
2821
def __create_return_order(order):
2732
    ret_order = ReturnOrder(order)
2822
    ret_order = ReturnOrder(order)
2733
    return ret_order
2823
    return ret_order
Line 5678... Line 5768...
5678
def get_orders_by_mobile_number(mobileNumber):
5768
def get_orders_by_mobile_number(mobileNumber):
5679
    return Order.query.filter(Order.customer_mobilenumber == mobileNumber).all()
5769
    return Order.query.filter(Order.customer_mobilenumber == mobileNumber).all()
5680
 
5770
 
5681
def get_orders_by_amazon_id(amazonId):
5771
def get_orders_by_amazon_id(amazonId):
5682
    orderIds = []
5772
    orderIds = []
5683
    amazonOrders = AmazonOrder.query.filter(AmazonOrder.amazonOrderItemCode == amazonId).all()
5773
    amazonOrders = AmazonOrder.query.filter(AmazonOrder.amazonOrderCode == amazonId).all()
5684
    for amazonOrder in amazonOrders:
5774
    for amazonOrder in amazonOrders:
5685
        orderIds.append(amazonOrder.orderId)
5775
        orderIds.append(amazonOrder.orderId)
5686
    return get_order_list(orderIds)
5776
    return get_order_list(orderIds)
5687
    
5777
    
5688
if __name__ == '__main__':
5778
if __name__ == '__main__':