Subversion Repositories SmartDukaan

Rev

Rev 23120 | 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
from shop2020.thriftpy.model.v1.order.ttypes import RechargeMode
from suds.cache import NoCache
import ssl
from functools import wraps

def sslwrap(func):
    @wraps(func)
    def bar(*args, **kw):
        kw['ssl_version'] = ssl.PROTOCOL_TLSv1
        return func(*args, **kw)
    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)

logging.basicConfig(level=logging.INFO)

username = base64.b64encode('saholic20')
password = base64.b64encode('ap2020sh')
account_url = "file:///recharge-wsdls/AccountApiMcomm.xml"
recharge_url = "file:///recharge-wsdls/RechargeApiMcomm.xml"
aclient = None
raclient = None
allow_recharge = False

store_map = {
             'H01':'105',
'H02':'109',
'H03':'113',
'H04':'115',
'H05':'116',
'H06':'119',
'H07':'120',
'H08':'125',
'H09':'129',
'H10':'130',
'H11':'131',
'H12':'132',
'H13':'133',
'H14':'134',
'H15':'135',
'H16':'141',
'H17':'143',
'H18':'144',
'H19':'146',
'H20':'147',
'H21':'150',
'H22':'151',
'H23':'153',
'H24':'159',
'H25':'164',
'H26':'189',
'H27':'226',
'H28':'230',
'H29':'253',
'H30':'254',
'H31':'265',
'H32':'281',
'H33':'296',
'H34':'327',
'H35':'358',
'H36':'425',
'H37':'427',
'H38':'440',
'H39':'441',
'H40':'469',
'H41':'475',
'H42':'502',
'H43':'C31',
'H44':'C33',
'H45':'C34',
'H46':'C52',
'H47':'C70',
'H48':'C76',
'H49':'C86',
'H50':'C87',
'H51':'CA6',
'H52':'CB7',
'H53':'CC5',
'H54':'CC9',
'H55':'CE0',
'H56':'CF6',
'H57':'CF8',
'H58':'CG3',
'H59':'CQ0',
'H60':'CQ9',
'H61':'CR4',
'H62':'CS0',
'H70':'M01',
'H71':'M02',
'H72':'M07',
'H73':'M08',
'H74':'MB5',
'H75':'CM8',
'H76':'M78',
'H77':'112',
'H78':'137',
'H79':'138',
'H80':'165',
'H81':'255',
'H82':'317',
'H83':'347',
'H84':'476',
'H85':'477',
'H86':'518',
'H87':'C49',
'H88':'CC4',
'H89':'CF9',
'H90':'178',
'H91':'183',
'H92':'200',
'H93':'239',
'H94':'309',
'H95':'CD1',
'H96':'CD8',
'H97':'CE1',
'H98':'CI5',
'H99':'CK6',
'HA0':'CL2',
'HA1':'CN5',
'HA2':'G02',
'HA3':'G03',
'HA4':'G04',
'HA5':'G05',
'HA6':'G06',
'HA7':'G07',
'HA8':'G10',
'HA9':'G12',
'HB0':'G14',
'HB1':'G15',
'HB2':'G17',
'HB3':'M49',
'HB4':'M51',
'HB5':'M54',
'HB6':'353',
'HB7':'414',
'HB8':'431',
'HB9':'CA0',
'HC0':'CK4',
'HC1':'M26',
'HC2':'M27',
'HC3':'208',
'HC4':'215',
'HC5':'231',
'HC6':'240',
'HC7':'252',
'HC8':'289',
'HC9':'383',
'HD0':'CB3',
'HD1':'CD7',
'HD2':'CJ0',
'HD3':'CM3',
'HD4':'CN9',
'HD5':'CO3',
'HD6':'CQ1',
'HD7':'M46',
'HD8':'424',
'HD9':'M64',
'HE0':'145',
'HE1':'160',
'HE2':'328',
'HE3':'331',
'HE4':'343',
'HE5':'393',
'HE6':'460',
'HE7':'C25',
'HE8':'C84',
'HE9':'CB2',
'HF0':'CC3',
'HF1':'CC7',
'HF2':'CH5',
'HF3':'CP3',
'HF7':'M15',
'HF8':'471',
'HF9':'472',
'HG0':'481',
'HG1':'483',
'HG2':'484',
'HG3':'486',
'HG4':'C14',
'HG5':'C15',
'HG6':'C21',
'HG7':'C23',
'HG8':'C98',
'HG9':'CD2',
'HH0':'CD4',
'HH1':'CD5',
'HH2':'CG4',
'HH3':'CG5',
'HH4':'CG7',
'HH5':'CG8',
'HH6':'CI1',
'HH7':'CJ1',
'HH8':'CJ7',
'HH9':'CK1',
'HI0':'CK2',
'HI1':'CM1',
'HI2':'CM2',
'HI3':'CM5',
'HI4':'CN0',
'HI5':'CN4',
'HI6':'CO0',
'HI7':'CQ4',
'HI8':'CQ5',
'HI9':'CR8',
'H64':'CS3',
'H68':'CT4',
'H63':'CS1',
'H65':'CS6'
            }

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

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

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

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

def rechargeDevice(transactionId, rechargeType, strProviderCode, deviceNumber, amount, plan, storeCode = '', rechargeMode=None):
    if not allow_recharge:
        return 'S', '00', 'spiceTID', 'SUCCESS', 'aggTID', 'providerTID'
    if storeCode:
        if store_map.get(storeCode) is not None:
            storeCode = store_map.get(storeCode)
    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 = ''
    
    if (retCode !='00' or retStatus !='S') and rechargeMode == RechargeMode._NAMES_TO_VALUES.get('SYNC'):
        try:
            if (checkTransactionStatus('',transactionId))[0]:
                return 'S','00', spiceTID, retDesc, aggTID, providerTID
        except:
            pass
    
    return retStatus, retCode, spiceTID, retDesc, aggTID, providerTID

def checkTransactionStatus(spiceTID='', merchantTxnId=''):
    if not allow_recharge:
        return True, ''
    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 == 'STP' and transStatus == 'S':
        raise Exception(111, "Still status is not known")
    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 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 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

def getAllTransactions(startDate, endDate):
    spString = getRechargeClient().service.getTransactionHistory(username, password, startDate.strftime("%d-%m-%Y"), endDate.strftime("%d-%m-%Y"))
    txnDetails = {}
    transactions = []
    if spString is None or spString == "":
        return txnDetails
    spString = re.sub('<\?.*\?>','',spString)
    spString = "<dom>" + spString + "</dom>"
    dom = parseString(spString)
    try:
        transactions = dom.getElementsByTagName('TransactionHistoryPojo')
    except:
        pass
    return transactions

def getRechargeStatus(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 = ""
    return responseCode, responseDescription

def main():
    getBalance()
    print rechargeDevice(9999999999,'MTP','ART','9811524460',10,'')
    #print rechargeDevice(20180102,'RCH','ATV','3010059202',100,'')
    print checkTransactionStatus("", 9999999999)
    getBalance()

if __name__=='__main__':
    main()