Subversion Repositories SmartDukaan

Rev

Rev 7669 | Rev 9345 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

from suds.client import Client
import base64, re
from xml.dom.minidom import parseString
import logging
from datetime import datetime
import time
from shop2020.config.client.ConfigClient import ConfigClient
from decimal import Decimal
logging.basicConfig(level=logging.INFO)

username = base64.b64encode('saholic20')
password = base64.b64encode('ap2020sh')
account_url = 'https://smsapi.spiceharbour.com/McommWebServices/AccountApiMcomm?wsdl'
recharge_url = 'https://smsapi.spiceharbour.com/McommWebServices/RechargeApiMcomm?wsdl'
aclient = None
raclient = None
allow_recharge = False

allow_recharge_string = ConfigClient().get_property('allow_recharge')

if allow_recharge_string in ['True', 'true']:
    allow_recharge = True    

def getAccountClient():
    global aclient
    if aclient is None:
        aclient = Client(account_url, timeout=70)
    return aclient

def getRechargeClient():
    global raclient
    if raclient is None:
        raclient = Client(recharge_url, timeout=70)    
    return raclient

def rechargeDevice(transactionId, rechargeType, strProviderCode, deviceNumber, amount, plan, storeCode = ''):
    if not allow_recharge:
        return 'S', '00', 'spiceTID', 'SUCCESS', 'aggTID', 'providerTID'
    spString = getRechargeClient().service.getRecharge(username, password, '919650889334', 'SOAP', '115.249.47.66', transactionId, rechargeType, strProviderCode, deviceNumber, amount, 'DEBIT', plan, storeCode)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    response = dom.getElementsByTagName('ActiveServicesPojo')[0]
    retStatus = response.getElementsByTagName('resStatus')[0].childNodes[0].data
    retCode = response.getElementsByTagName('respCode')[0].childNodes[0].data
    spiceTID = response.getElementsByTagName('SpiceTID')[0].childNodes[0].data
    retDesc = response.getElementsByTagName('shotDesc')[0].childNodes[0].data
    
    try:
        aggTID = response.getElementsByTagName('aggregatorId')[0].childNodes[0].data
        providerTID = response.getElementsByTagName('ProviderTID')[0].childNodes[0].data
    except:
        aggTID = ''
        providerTID = ''
    return retStatus, retCode, spiceTID, retDesc, aggTID, providerTID 

def getAccountdetail():
    return getAccountClient().service.getAccountdetail(username, password)
    
def getBalance():
    spString = getAccountClient().service.getBalance(username, password)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    response = dom.getElementsByTagName('BalancePojo')[0]
    balanceAmount = response.getElementsByTagName('balance_amt')[0].childNodes[0].data
    return Decimal(balanceAmount)

def checkServiceProviderApi(strServiceCode, strDeviceNumber):
    spString = getAccountClient().service.checkServiceProviderApi(username, password, strServiceCode, strDeviceNumber)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    response = dom.getElementsByTagName('CheckServiceProviderPojo')[0]
    providerCode = response.getElementsByTagName('providerCode')[0].childNodes[0].data
    try:
        operatorCircle = response.getElementsByTagName('operatorCircle')[0].childNodes[0].data
    except:
        operatorCircle = ""
    return providerCode, operatorCircle

def validateService(strServiceCode, strProviderCode, strDeviceNumber, dbAmount, strPlan):
    return getAccountClient().service.validateService(username, password, strServiceCode, strProviderCode, strDeviceNumber, dbAmount, strPlan)

def getAvailableServices():
    spString = getAccountClient().service.getServiceApi(username, password)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    serviceApis = dom.getElementsByTagName('ServiceApiPojo')
    services = {}
    for serviceApi in serviceApis:
        services[serviceApi.getElementsByTagName('serviceCode')[0].childNodes[0].data] = serviceApi.getElementsByTagName('serviceDescription')[0].childNodes[0].data 
    return services
    

def getServiceProvidersForMobile():
    return getServiceProvider('MTP')

def getServiceProvidersForDTH():
    return getServiceProvider('RCH')

def getServiceProvider(strServiceCode):
    spString = getAccountClient().service.getServiceProvider(username, password, strServiceCode)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    providers = dom.getElementsByTagName('ServicesProviderPojo')
    serviceProviders = {}
    for provider in providers:
        serviceProviders[provider.getElementsByTagName('providerCode')[0].childNodes[0].data] = provider.getElementsByTagName('providerDescription')[0].childNodes[0].data 
    return serviceProviders

def getServiceDetails(strServiceCode, strProviderCode):
    spString = getAccountClient().service.getServiceDetail(username, password, strServiceCode, strProviderCode)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    details = dom.getElementsByTagName('ServiceDetailPojo')
    serviceDetails = {}
    for detail in details:
        serviceDetails['Denomination Type'] = detail.getElementsByTagName('DenominationType')[0].childNodes[0].data
        serviceDetails['Denomination Value'] = detail.getElementsByTagName('DenominationValue')[0].childNodes[0].data 
    return serviceDetails

def checkTransactionStatus(spiceTID='', merchantTxnId=''):
    spString = getRechargeClient().service.getCheckStatus(username,password,spiceTID,merchantTxnId)
    print spString
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    response = dom.getElementsByTagName('CheckStatusObj')[0]
    transStatus = response.getElementsByTagName('transStatus')[0].childNodes[0].data
    responseCode = response.getElementsByTagName('ResponseCode')[0].childNodes[0].data
    try:
        responseDescription = response.getElementsByTagName('ResponseDescription')[0].childNodes[0].data
    except:
        responseDescription = ""
    aggregatorRespCode = response.getElementsByTagName('aggregatorRespCode')[0].childNodes[0].data
    if responseCode == '00' and transStatus == 'S':
        return True, responseDescription
    elif responseCode in ('STO','US', 'UP') and transStatus == 'S':
        if aggregatorRespCode == '00':
            return True, responseDescription
        if aggregatorRespCode != 'NA':
            return False, responseDescription
        raise Exception(111, "Still status is not known")
    else:
        return False, responseDescription

def getRefunds(forDate):
    spString = getRechargeClient().service.checkRefundHistory(username, password, '3306', forDate.strftime("%d-%m-%Y"))
    print spString
    refundDetails = {}
    if spString is None or spString == "":
        return refundDetails
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    refunds = dom.getElementsByTagName('checkRefundHistoryPojo')
    for refund in refunds:
        try:
            respStatus = refund.getElementsByTagName('respStatus')[0].childNodes[0].data
            respCode = refund.getElementsByTagName('respCode')[0].childNodes[0].data
            respDesc = refund.getElementsByTagName('respDesc')[0].childNodes[0].data
            refundAmmount = refund.getElementsByTagName('refundAmmount')[0].childNodes[0].data
            transId = refund.getElementsByTagName('transId')[0].childNodes[0].data
            deviceNo = refund.getElementsByTagName('deviceNo')[0].childNodes[0].data
            refundDateString = refund.getElementsByTagName('refundDate')[0].childNodes[0].data
            transactionDate  = refund.getElementsByTagName('transactionDate')[0].childNodes[0].data
            openningBalance  = refund.getElementsByTagName('openningBalance')[0].childNodes[0].data
            closingBalance  = refund.getElementsByTagName('closingBalance')[0].childNodes[0].data
            refundTime = time.strptime(refundDateString, "%Y-%m-%d %H:%M:%S.0")
            refundDate = datetime(*refundTime[0:6])
            refundDetails[transId] = int(refundAmmount), refundDate
        except:
            continue
    return refundDetails