Subversion Repositories SmartDukaan

Rev

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

Rev 22697 Rev 22703
Line 3676... Line 3676...
3676
        status_transition = refund_status_transition
3676
        status_transition = refund_status_transition
3677
        if order.status not in status_transition.keys():
3677
        if order.status not in status_transition.keys():
3678
            raise TransactionServiceException(114, "This order can't be refunded")
3678
            raise TransactionServiceException(114, "This order can't be refunded")
3679
        
3679
        
3680
        if order.status in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3680
        if order.status in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3681
            __update_inventory_reservation(order)
3681
            __update_inventory_reservation(order, refund=True)
3682
            order.statusDescription = "Order Cancelled"
3682
            order.statusDescription = "Order Cancelled"
3683
            #Shipment Id and Airway Bill No should be none in case of Cancellation
3683
            #Shipment Id and Airway Bill No should be none in case of Cancellation
3684
            order.logisticsTransactionId = None
3684
            order.logisticsTransactionId = None
3685
            order.tracking_id = None
3685
            order.tracking_id = None
3686
            order.airwaybill_no = None  
3686
            order.airwaybill_no = None  
Line 3704... Line 3704...
3704
                __create_return_order(order)
3704
                __create_return_order(order)
3705
            __create_refund(order)
3705
            __create_refund(order)
3706
            order.statusDescription = "Return Refunded"
3706
            order.statusDescription = "Return Refunded"
3707
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
3707
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
3708
            if order.previousStatus in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3708
            if order.previousStatus in [OrderStatus.COD_VERIFICATION_PENDING, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3709
                __update_inventory_reservation(order)
3709
                __update_inventory_reservation(order, refund=True)
3710
                order.statusDescription = "Order Cancelled on customer request"
3710
                order.statusDescription = "Order Cancelled on customer request"
3711
            elif order.previousStatus == OrderStatus.BILLED:
3711
            elif order.previousStatus == OrderStatus.BILLED:
3712
                __create_return_order(order)
3712
                __create_return_order(order)
3713
                order.statusDescription = "Order Cancelled on customer request"
3713
                order.statusDescription = "Order Cancelled on customer request"
3714
                order.received_return_timestamp = datetime.datetime.now()
3714
                order.received_return_timestamp = datetime.datetime.now()
Line 3809... Line 3809...
3809
            if order.status != OrderStatus.RET_LOST_IN_TRANSIT:
3809
            if order.status != OrderStatus.RET_LOST_IN_TRANSIT:
3810
                __create_return_order(order)
3810
                __create_return_order(order)
3811
            __create_refund(order)
3811
            __create_refund(order)
3812
            order.statusDescription = "Return Refunded"
3812
            order.statusDescription = "Return Refunded"
3813
        elif order.status in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3813
        elif order.status in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED]:
3814
            __update_inventory_reservation(order)
3814
            __update_inventory_reservation(order, refund=True)
3815
            order.statusDescription = "Order Refunded"
3815
            order.statusDescription = "Order Refunded"
3816
        elif order.status == OrderStatus.BILLED:
3816
        elif order.status == OrderStatus.BILLED:
3817
            if order.source == OrderSource.SNAPDEAL or order.source == OrderSource.EBAY or order.source == OrderSource.FLIPKART or order.source == OrderSource.HOMESHOP18:
3817
            if order.source == OrderSource.SNAPDEAL or order.source == OrderSource.EBAY or order.source == OrderSource.FLIPKART or order.source == OrderSource.HOMESHOP18:
3818
                order.statusDescription = "Order Cancelled"
3818
                order.statusDescription = "Order Cancelled"
3819
                order.received_return_timestamp = datetime.datetime.now()
3819
                order.received_return_timestamp = datetime.datetime.now()
3820
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
3820
        elif order.status == OrderStatus.CANCEL_REQUEST_CONFIRMED:
3821
            if order.previousStatus in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.PAYMENT_FLAGGED, OrderStatus.ACCEPTED]:
3821
            if order.previousStatus in [OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.PAYMENT_FLAGGED, OrderStatus.ACCEPTED]:
3822
                if order.previousStatus == OrderStatus.ACCEPTED:
3822
                if order.previousStatus == OrderStatus.ACCEPTED:
3823
                    __create_refund(order)
3823
                    __create_refund(order)
3824
                __update_inventory_reservation(order)
3824
                __update_inventory_reservation(order, refund=True)
3825
                order.statusDescription = "Order Cancelled on customer request"
3825
                order.statusDescription = "Order Cancelled on customer request"
3826
            elif order.previousStatus == OrderStatus.BILLED:
3826
            elif order.previousStatus == OrderStatus.BILLED:
3827
                __create_return_order(order)
3827
                __create_return_order(order)
3828
                __create_refund(order)
3828
                __create_refund(order)
3829
                order.statusDescription = "Order Cancelled on customer request"
3829
                order.statusDescription = "Order Cancelled on customer request"
3830
                order.received_return_timestamp = datetime.datetime.now()
3830
                order.received_return_timestamp = datetime.datetime.now()
3831
            
3831
            
3832
        elif order.status == OrderStatus.PAYMENT_FLAGGED:
3832
        elif order.status == OrderStatus.PAYMENT_FLAGGED:
3833
            __update_inventory_reservation(order)
3833
            __update_inventory_reservation(order, refund=True)
3834
            order.statusDescription = "Order Cancelled due to payment flagged"
3834
            order.statusDescription = "Order Cancelled due to payment flagged"
3835
            
3835
            
3836
        if order.transaction.payment_option == capitalFloatPayMethod and order.status in [OrderStatus.PAYMENT_FLAGGED, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED, OrderStatus.CANCEL_REQUEST_CONFIRMED]:    
3836
        if order.transaction.payment_option == capitalFloatPayMethod and order.status in [OrderStatus.PAYMENT_FLAGGED, OrderStatus.SUBMITTED_FOR_PROCESSING, OrderStatus.INVENTORY_LOW, OrderStatus.LOW_INV_PO_RAISED, OrderStatus.LOW_INV_REVERSAL_IN_PROCESS, OrderStatus.LOW_INV_NOT_AVAILABLE_AT_HOTSPOT, OrderStatus.ACCEPTED, OrderStatus.CANCEL_REQUEST_CONFIRMED]:    
3837
            total_amount = order.total_amount + order.shippingCost - order.gvAmount
3837
            total_amount = order.total_amount + order.shippingCost - order.gvAmount
3838
            shipping_id = str(order.id)
3838
            shipping_id = str(order.id)
Line 3902... Line 3902...
3902
    order.status = status_transition[order.status]
3902
    order.status = status_transition[order.status]
3903
    order.refund_timestamp = datetime.datetime.now()
3903
    order.refund_timestamp = datetime.datetime.now()
3904
    order.refunded_by = refunded_by
3904
    order.refunded_by = refunded_by
3905
    order.refund_reason = reason
3905
    order.refund_reason = reason
3906
    #to re evaluate the shipping charge if any order is being cancelled.
3906
    #to re evaluate the shipping charge if any order is being cancelled.
3907
    _revaluate_shiping(order_id)
3907
    #_revaluate_shiping(order_id)
3908
    session.commit()
3908
    session.commit()
3909
    return True
3909
    return True
3910
 
3910
 
3911
def _revaluate_shiping(orderId):
3911
def _revaluate_shiping(orderId):
3912
    orders = Order.get_by(id = orderId)
3912
    orders = Order.get_by(id = orderId)
Line 3942... Line 3942...
3942
                if diff>0:
3942
                if diff>0:
3943
                    shipUpdateOrder.shippingCost = shipUpdateOrder.shippingCost + diff
3943
                    shipUpdateOrder.shippingCost = shipUpdateOrder.shippingCost + diff
3944
            
3944
            
3945
            
3945
            
3946
 
3946
 
3947
def __update_inventory_reservation(order):
3947
def __update_inventory_reservation(order, refund=False):
3948
    '''
3948
    '''
3949
    Reduce the reservation count for all line items of the given order.
3949
    Reduce the reservation count for all line items of the given order.
3950
    '''
3950
    '''
-
 
3951
    
-
 
3952
    if refund:
-
 
3953
        if order.wallet_amount > 0:
-
 
3954
            refund_to_wallet(order.customer_id, order.wallet_amount, order.transaction.id, WalletReferenceType.PURCHASE, "Refunded angainst cancellation of Order Id -" + order.id)
-
 
3955
        if order.cod == False and order.status == OrderStatus.PAYMENT_FLAGGED_DENIED:
-
 
3956
            order.net  
3951
    try:
3957
    try:
3952
        inventoryClient = InventoryClient().get_client()
3958
        inventoryClient = InventoryClient().get_client()
3953
        for lineitem in order.lineitems:
3959
        for lineitem in order.lineitems:
3954
            inventoryClient.reduceReservationCount(lineitem.item_id, order.fulfilmentWarehouseId, sourceId, order.id, lineitem.quantity)
3960
            inventoryClient.reduceReservationCount(lineitem.item_id, order.fulfilmentWarehouseId, sourceId, order.id, lineitem.quantity)
3955
    except:
3961
    except:
Line 4148... Line 4154...
4148
def __create_return_order(order):
4154
def __create_return_order(order):
4149
    ret_order = ReturnOrder(order)
4155
    ret_order = ReturnOrder(order)
4150
    return ret_order
4156
    return ret_order
4151
 
4157
 
4152
def __create_refund(order):
4158
def __create_refund(order):
-
 
4159
    if order.net_payable_amount > 0:
4153
    payment_client = PaymentClient().get_client()
4160
        payment_client = PaymentClient().get_client()
4154
    payment_client.createRefund(order.id, order.transaction.id, order.total_amount)
4161
        payment_client.createRefund(order.id, order.transaction.id, order.net_payable_amount)
4155
    return
4162
    return
4156
 
4163
 
4157
def __get_order_address(order):
4164
def __get_order_address(order):
4158
    address = order.customer_name + "\n" + order.customer_address1 + "\n"
4165
    address = order.customer_name + "\n" + order.customer_address1 + "\n"
4159
    if order.customer_address2:
4166
    if order.customer_address2:
Line 5888... Line 5895...
5888
    totalSuccessfulRechargeAmount = session.query(func.sum(RechargeOrder.totalAmount)).filter(RechargeOrder.status == 5).filter(RechargeOrder.ipAddress == clientAddress).filter(RechargeOrder.creationTimestamp  > limittime).scalar()
5895
    totalSuccessfulRechargeAmount = session.query(func.sum(RechargeOrder.totalAmount)).filter(RechargeOrder.status == 5).filter(RechargeOrder.ipAddress == clientAddress).filter(RechargeOrder.creationTimestamp  > limittime).scalar()
5889
    return totalSuccessfulRechargeAmount
5896
    return totalSuccessfulRechargeAmount
5890
 
5897
 
5891
 
5898
 
5892
 
5899
 
-
 
5900
 
-
 
5901
def refund_to_wallet(userId, amount, reference, reference_type, description='Refunded to wallet', commit_session=False):
-
 
5902
    """
-
 
5903
    Commit to be decided by caller
-
 
5904
    """
-
 
5905
    if amount <= 0 or WalletReferenceType._VALUES_TO_NAMES.get(reference_type) is None:
-
 
5906
        return False
-
 
5907
    
-
 
5908
    all_entries = UserWalletHistory.query.filter_by(reference = reference).filter_by(reference_type = WalletReferenceType._VALUES_TO_NAMES.get(reference_type)).all()
-
 
5909
    creditable_amount_for_reference = 0
-
 
5910
    refundable_amount_for_reference = 0
-
 
5911
    for history in all_entries:
-
 
5912
        creditable_amount_for_reference -= history.amount
-
 
5913
        refundable_amount_for_reference -= history.refundable_amount
-
 
5914
    #Refundable amount for reference should be greater than the refund amount
-
 
5915
    if creditable_amount_for_reference < amount:
-
 
5916
        print 'Cant be credited back to wallet as most of it has been already credited'
-
 
5917
        return False
-
 
5918
    
-
 
5919
    wallet = get_user_wallet(userId)
-
 
5920
    wallet.amount = wallet.amount + amount
-
 
5921
    refundable_amount = 0
-
 
5922
    if creditable_amount_for_reference - refundable_amount_for_reference < amount:
-
 
5923
        refundable_amount = amount - (creditable_amount_for_reference - refundable_amount_for_reference)
-
 
5924
    wallet.refundable_amount = wallet.refundable_amount + refundable_amount
-
 
5925
 
-
 
5926
    history = UserWalletHistory()
-
 
5927
    history.amount = amount
-
 
5928
    history.refundable_amount = refundable_amount
-
 
5929
    history.reference = reference
-
 
5930
    history.reference_type = WalletReferenceType._VALUES_TO_NAMES.get(reference_type) 
-
 
5931
    history.wallet = wallet
-
 
5932
    history.timestamp = datetime.datetime.now()
-
 
5933
    history.description = description
-
 
5934
    if commit_session:
-
 
5935
        session.commit()
-
 
5936
 
5893
def add_amount_in_wallet(userId, amount, reference, reference_type, isPromotional, description=None, commit_session=False):
5937
def add_amount_in_wallet(userId, amount, reference, reference_type, isPromotional, description=None, commit_session=False):
5894
    """
5938
    """
5895
    Commit to be decided by caller
5939
    Commit to be decided by caller
5896
    """
5940
    """
5897
    if not amount > 0 or WalletReferenceType._VALUES_TO_NAMES.get(reference_type) is None:
5941
    if not amount > 0 or WalletReferenceType._VALUES_TO_NAMES.get(reference_type) is None: