Exemplo n.º 1
0
def submit_inquiry(account):
    client = soap.get_client(WFRS_INQUIRY_WSDL, 'WFRS')

    request = client.factory.create('ns2:Inquiry')
    request.userName = WFRS_USER_NAME
    request.setupPassword = WFRS_PASSWORD
    request.merchantNumber = WFRS_MERCHANT_NUM
    request.uuid = uuid.uuid1()
    request.transactionCode = TRANS_TYPE_INQUIRY
    request.localeString = account.wfrs_metadata.locale
    request.accountNumber = account.wfrs_metadata.account_number

    # Submit
    resp = client.service.submitInquiry(request)

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.error(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip() if resp.sorErrorDescription else None
    if error_msg:
        raise ValidationError(error_msg)

    # Build response
    result = AccountInquiryResult()
    result.account = account
    result.balence = _as_decimal(resp.accountBalance)
    result.open_to_buy = _as_decimal(resp.openToBuy)
    return result
Exemplo n.º 2
0
def submit_transaction(trans_request,
                       current_user=None,
                       transaction_uuid=None,
                       persist=True):
    client = soap.get_client(WFRS_TRANSACTION_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'Transaction')
    request = client.factory.create(type_name)

    # If a uuid was given, use that instead of generating a new one. This allows tracing fraud responses through to transactions.
    request.uuid = transaction_uuid if transaction_uuid else uuid.uuid1()

    creds = APICredentials.get_credentials(current_user)
    request.userName = creds.username
    request.setupPassword = creds.password
    request.merchantNumber = creds.merchant_num

    request.transactionCode = trans_request.type_code
    request.localeString = trans_request.locale
    request.accountNumber = trans_request.account_number
    request.planNumber = trans_request.plan_number
    request.amount = _as_decimal(trans_request.amount)
    request.authorizationNumber = trans_request.auth_number
    request.ticketNumber = trans_request.ticket_number

    # Submit
    resp = client.service.submitTransaction(request)

    # Persist transaction data and WF specific metadata
    transfer = TransferMetadata()
    transfer.user = trans_request.user
    transfer.credentials = creds
    transfer.account_number = resp.accountNumber
    transfer.merchant_reference = resp.uuid
    transfer.amount = _as_decimal(resp.amount)
    transfer.type_code = resp.transactionCode
    transfer.ticket_number = resp.ticketNumber
    transfer.financing_plan = FinancingPlan.objects.filter(
        plan_number=resp.planNumber).first()
    transfer.auth_number = resp.authorizationNumber
    transfer.status = resp.transactionStatus
    transfer.message = resp.transactionMessage
    transfer.disclosure = resp.disclosure or ''
    if persist:
        transfer.save()

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for approval
    if resp.transactionStatus != TRANS_APPROVED:
        exc = TransactionDenied(
            '%s: %s' % (resp.transactionStatus, resp.transactionMessage))
        exc.status = resp.transactionStatus
        raise exc

    return transfer
Exemplo n.º 3
0
def submit_inquiry(account_number, current_user=None, locale=EN_US):
    client = soap.get_client(WFRS_INQUIRY_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'Inquiry')
    request = client.factory.create(type_name)
    request.uuid = uuid.uuid1()
    request.transactionCode = TRANS_TYPE_INQUIRY

    creds = APICredentials.get_credentials(current_user)
    request.userName = creds.username
    request.setupPassword = creds.password
    request.merchantNumber = creds.merchant_num

    request.localeString = locale
    request.accountNumber = account_number

    # Submit
    resp = client.service.submitInquiry(request)

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip() if resp.sorErrorDescription else None
    if error_msg:
        raise ValidationError(error_msg)

    # Build response
    result = AccountInquiryResult()

    result.status = resp.transactionStatus

    result.account_number = resp.wfAccountNumber

    result.first_name = resp.firstName or ''
    result.middle_initial = resp.middleInitial or ''
    result.last_name = resp.lastName or ''

    # This is kind of awful, but WFRS only uses national phone number (with an implied +1 country code). So, we
    # add back the country code to make it valid to store in the DB.
    # E.g. Take "5559998888" and convert it to "+15559998888"
    result.phone_number = '+1{}'.format(resp.phone)

    result.address = resp.address or ''

    result.credit_limit = (_as_decimal(resp.accountBalance) + _as_decimal(resp.openToBuy))
    result.balance = _as_decimal(resp.accountBalance)
    result.open_to_buy = _as_decimal(resp.openToBuy)

    result.last_payment_date = _as_date(resp.lastPaymentDate)
    result.last_payment_amount = _as_decimal(resp.lastPayment)

    result.payment_due_date = _as_date(resp.lastPaymentDate)
    result.payment_due_amount = _as_decimal(resp.paymentDue)

    result.save()
    return result
Exemplo n.º 4
0
    def test_basic_soap_method_call(self):
        wsdl = 'http://www.webservicex.net/uszip.asmx?WSDL'
        client = soap.get_client(wsdl, 'LOCATIONS')
        client.set_options(port='USZipSoap')

        resp = client.service.GetInfoByZIP('10305')
        self.assertEquals(resp.NewDataSet.Table.CITY, 'Staten Island')
        self.assertEquals(resp.NewDataSet.Table.STATE, 'NY')
Exemplo n.º 5
0
def check_pre_qualification_status(prequal_request, return_url=None, current_user=None):
    client = soap.get_client(WFRS_PRE_QUAL_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'WFRS_InstantPreScreenRequest')
    data = client.factory.create(type_name)

    data.localeString = prequal_request.locale
    data.uuid = prequal_request.uuid
    data.behaviorVersion = "1"

    creds = APICredentials.get_credentials(current_user)
    data.userName = creds.username
    data.servicePassword = creds.password
    data.merchantNumber = creds.merchant_num

    data.transactionCode = 'P1'
    data.entryPoint = prequal_request.entry_point
    if return_url:
        data.returnUrl = return_url

    data.firstName = prequal_request.first_name
    data.lastName = prequal_request.last_name
    data.address1 = prequal_request.line1
    data.city = prequal_request.city
    data.state = prequal_request.state
    data.postalCode = prequal_request.postcode
    data.phone = _format_phone(prequal_request.phone)

    # Save the credentials used to make the request
    prequal_request.credentials = creds
    prequal_request.save()

    # Submit the pre-qualification request
    resp = client.service.instantPreScreen(data)

    # Check for faults
    if resp.faults and resp.faults.item:
        for fault in resp.faults.item:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Sanity check the response
    if resp.transactionStatus is None or resp.uniqueId is None:
        logger.info('WFRS pre-qualification request return null data for pre-request[{}]'.format(prequal_request.pk))
        return None

    # Save the pre-qualification response data
    response = PreQualificationResponse()
    response.request = prequal_request
    response.status = resp.transactionStatus
    response.message = resp.message or ''
    response.offer_indicator = resp.offerIndicator or ''
    response.credit_limit = _as_decimal(resp.upToLimit)
    response.response_id = resp.uniqueId
    response.application_url = urllib.parse.unquote(resp.url or '')
    response.customer_response = PREQUAL_CUSTOMER_RESP_NONE
    response.save()
    return response
Exemplo n.º 6
0
 def test_private_soap_with_proxy(self):
     """ Intended for local and private use only
     Set SOAP_PROXY_URL in sandbox/settings too.
     """
     private_ip = ''
     if not private_ip:
         return
     wsdl = 'http://{}/TAXCCH/Service3.5.svc?singleWsdl'.format(private_ip)
     client = soap.get_client(wsdl, 'CCH')
Exemplo n.º 7
0
    def __init__(self, wsdl, merchant_id, transaction_security_key, soap_log_prefix='CYBERSOURCE'):
        self.merchant_id = merchant_id

        # Build a SOAP client
        self.client = soap.get_client(wsdl, soap_log_prefix)

        # Add WSSE Security Header to client
        security = Security()
        token = UsernameToken(self.merchant_id, transaction_security_key)
        security.tokens.append(token)
        self.client.set_options(wsse=security)
Exemplo n.º 8
0
def submit_transaction(trans_request, current_user=None, transaction_uuid=None, persist=True):
    client = soap.get_client(WFRS_TRANSACTION_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'Transaction')
    request = client.factory.create(type_name)

    # If a uuid was given, use that instead of generating a new one. This allows tracing fraud responses through to transactions.
    request.uuid = transaction_uuid if transaction_uuid else uuid.uuid1()

    creds = APICredentials.get_credentials(current_user)
    request.userName = creds.username
    request.setupPassword = creds.password
    request.merchantNumber = creds.merchant_num

    request.transactionCode = trans_request.type_code
    request.localeString = trans_request.locale
    request.accountNumber = trans_request.account_number
    request.planNumber = trans_request.plan_number
    request.amount = _as_decimal(trans_request.amount)
    request.authorizationNumber = trans_request.auth_number
    request.ticketNumber = trans_request.ticket_number

    # Submit
    resp = client.service.submitTransaction(request)

    # Persist transaction data and WF specific metadata
    transfer = TransferMetadata()
    transfer.user = trans_request.user
    transfer.credentials = creds
    transfer.account_number = resp.accountNumber
    transfer.merchant_reference = resp.uuid
    transfer.amount = _as_decimal(resp.amount)
    transfer.type_code = resp.transactionCode
    transfer.ticket_number = resp.ticketNumber
    transfer.financing_plan = FinancingPlan.objects.filter(plan_number=resp.planNumber).first()
    transfer.auth_number = resp.authorizationNumber
    transfer.status = resp.transactionStatus
    transfer.message = resp.transactionMessage
    transfer.disclosure = resp.disclosure or ''
    if persist:
        transfer.save()

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for approval
    if resp.transactionStatus != TRANS_APPROVED:
        exc = TransactionDenied('%s: %s' % (resp.transactionStatus, resp.transactionMessage))
        exc.status = resp.transactionStatus
        raise exc

    return transfer
Exemplo n.º 9
0
    def __init__(self,
                 wsdl,
                 merchant_id,
                 transaction_security_key,
                 soap_log_prefix="CYBERSOURCE"):
        self.merchant_id = merchant_id

        # Build a SOAP client
        self.client = soap.get_client(wsdl, soap_log_prefix)

        # Add WSSE Security Header to client
        security = Security()
        token = UsernameToken(self.merchant_id, transaction_security_key)
        security.tokens.append(token)
        self.client.set_options(wsse=security)
Exemplo n.º 10
0
def submit_transaction(trans_request):
    client = soap.get_client(WFRS_TRANSACTION_WSDL, 'WFRS')

    request = client.factory.create('ns2:Transaction')
    request.userName = WFRS_USER_NAME
    request.setupPassword = WFRS_PASSWORD
    request.merchantNumber = WFRS_MERCHANT_NUM
    request.uuid = uuid.uuid1()
    request.transactionCode = trans_request.type_code
    request.localeString = trans_request.source_account.wfrs_metadata.locale
    request.accountNumber = trans_request.source_account.wfrs_metadata.account_number
    request.planNumber = trans_request.plan_number
    request.amount = _as_decimal(trans_request.amount)
    request.authorizationNumber = trans_request.auth_number
    request.ticketNumber = trans_request.ticket_number

    # Submit
    resp = client.service.submitTransaction(request)

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.error(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for approval
    if resp.transactionStatus != TRANS_APPROVED:
        raise TransactionDenied('%s: %s' % (resp.transactionStatus, resp.transactionMessage))

    # Persist transaction data and WF specific metadata
    with transaction.atomic():
        transfer = facade.transfer(
            source=trans_request.source_account,
            destination=trans_request.dest_account,
            amount=_as_decimal(resp.amount),
            user=trans_request.user,
            merchant_reference=resp.uuid)
        TransferMetadata.objects.create(
            transfer=transfer,
            type_code=resp.transactionCode,
            ticket_number=resp.ticketNumber,
            plan_number=resp.planNumber,
            auth_number=resp.authorizationNumber,
            status=resp.transactionStatus,
            message=resp.transactionMessage,
            disclosure=resp.disclosure)
    return transfer
Exemplo n.º 11
0
def check_pre_qualification_account_status(prequal_response):
    client = soap.get_client(WFRS_OTB_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'WFRS_OTBRequest')
    data = client.factory.create(type_name)

    data.localeString = prequal_response.request.locale
    data.uuid = uuid.uuid1()
    data.behaviorVersion = "1"

    data.userName = prequal_response.request.credentials.username
    data.servicePassword = prequal_response.request.credentials.password
    data.merchantNumber = prequal_response.request.credentials.merchant_num

    data.transactionCode = 'C1'

    data.uniqueId = prequal_response.response_id
    data.firstName = prequal_response.request.first_name
    data.lastName = prequal_response.request.last_name

    # Submit the pre-qualification request
    resp = client.service.submitOTB(data)

    # Check for faults
    if resp.faults and resp.faults.item:
        for fault in resp.faults.item:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # If the returned status isn't successful, theres nothing else to do.
    if resp.transactionStatus != OTB_SUCCESS:
        logger.info('Received OTB Response with unsuccessful transaction status. Status: {}. Message: {}'.format(
            resp.transactionStatus, resp.message))
        return None

    # If no account number was returned, theres nothing else to do.
    if not resp.accountNumber:
        logger.info('Received OTB Response without account number. Status: {}. Message: {}'.format(
            resp.transactionStatus, resp.message))
        return None

    # Build response
    result = AccountInquiryResult()
    result.prequal_response_source = prequal_response
    result.status = resp.transactionStatus

    result.account_number = resp.accountNumber

    result.first_name = prequal_response.request.first_name
    result.middle_initial = ""
    result.last_name = prequal_response.request.last_name
    result.phone_number = prequal_response.request.phone
    result.address = resp.mainAddress1 or prequal_response.request.line1

    result.credit_limit = _as_decimal(resp.creditLimit)
    result.balance = (_as_decimal(resp.creditLimit) - _as_decimal(resp.availableCredit))
    result.open_to_buy = _as_decimal(resp.availableCredit)

    result.save()
    logger.info('Saved OTB Response as AccountInquiryResult[{}]. Status: {}. Message: {}'.format(
        result.pk, result.status, resp.message))
    return result
Exemplo n.º 12
0
def submit_credit_application(app, current_user=None):
    client = soap.get_client(WFRS_CREDIT_APP_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'CreditApp')
    data = client.factory.create(type_name)

    creds = APICredentials.get_credentials(current_user)
    data.userName = creds.username
    data.setupPassword = creds.password
    data.merchantNumber = creds.merchant_num

    data.uuid = uuid.uuid1()
    data.transactionCode = TRANS_TYPE_APPLY
    data.checkStatus = '0'

    data.localeString = app.locale
    data.languagePreference = app.language

    data.purchasePrice = app.purchase_price
    data.optionalInsurance = '1' if app.insurance else '0'
    data.salesPerson = app.sales_person_id
    data.newSalesPerson = app.new_sales_person
    data.emailAddress = app.email

    data.mainFirstName = app.main_first_name
    data.mainLastName = app.main_last_name
    data.mainMiddleInitial = app.main_middle_initial
    data.mainDOB = _format_date(app.main_date_of_birth)
    data.mainSSN = _format_ssn(app.main_ssn)
    data.mainAddress1 = app.main_address_line1
    data.mainAddress2 = app.main_address_line2
    data.mainCity = app.main_address_city
    data.mainStateOrProvince = app.main_address_state
    data.mainPostalCode = app.main_address_postcode
    data.mainHomePhone = _format_phone(app.main_home_phone)
    data.mainTimeAtAddress = app.main_time_at_address
    data.mainHousingStatus = app.main_housing_status
    data.mainHomeValue = app.main_home_value
    data.mainMortgageBalance = app.main_mortgage_balance
    data.mainEmployerName = app.main_employer_name
    data.mainTimeAtEmployer = app.main_time_at_employer
    data.mainEmployerPhone = _format_phone(app.main_employer_phone)
    data.mainAnnualIncome = app.main_annual_income
    data.mainCellPhone = _format_phone(app.main_cell_phone)
    data.mainOccupation = app.main_occupation
    data.mainPhotoIdType = getattr(app, 'main_photo_id_type', None)
    data.mainPhotoIdNumber = getattr(app, 'main_photo_id_number', None)
    data.mainDLStateOrProvince = getattr(app, 'main_drivers_license_province', None)
    data.mainPhotoIdExpDate = _format_date( getattr(app, 'main_photo_id_expiration', None) )

    data.individualJointIndicator = 'J' if app.is_joint else 'I'
    if app.is_joint:
        data.jointFirstName = app.joint_first_name
        data.jointLastName = app.joint_last_name
        data.jointMiddleInitial = app.joint_middle_initial
        data.jointDOB = _format_date(app.joint_date_of_birth)
        data.jointSSN = _format_ssn(app.joint_ssn)
        data.jointAddress1 = app.joint_address_line1
        data.jointAddress2 = app.joint_address_line2
        data.jointCity = app.joint_address_city
        data.jointStateOrProvince = app.joint_address_state
        data.jointPostalCode = app.joint_address_postcode
        data.jointEmployerName = app.joint_employer_name
        data.jointTimeAtEmployer = app.joint_time_at_employer
        data.jointEmployerPhone = _format_phone(app.joint_employer_phone)
        data.jointAnnualIncome = app.joint_annual_income
        data.jointCellPhone = _format_phone(app.joint_cell_phone)
        data.jointOccupation = app.joint_occupation
        data.jointPhotoIdType = getattr(app, 'joint_photo_id_type', None)
        data.jointPhotoIdNumber = getattr(app, 'joint_photo_id_number', None)
        data.jointDLStateOrProvince = getattr(app, 'joint_drivers_license_province', None)
        data.jointPhotoIdExpDate = _format_date( getattr(app, 'joint_photo_id_expiration', None) )

    # Submit
    resp = client.service.submitCreditApp(data)

    # Save the status and credentials used to apply
    app.status = resp.transactionStatus or ''
    app.credentials = creds
    app.save()

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip() if resp.sorErrorDescription else None
    if error_msg:
        logger.info(error_msg)
        raise ValidationError(error_msg)

    # Check for any other errors we didn't catch already for any reason
    if resp.transactionStatus in (CREDIT_APP_FORMAT_ERROR, CREDIT_APP_WFF_ERROR):
        raise ValidationError('An unknown error occurred.')

    # If the status is not either Approved or Pending, it must be denied
    if resp.transactionStatus not in (CREDIT_APP_APPROVED, CREDIT_APP_DECISION_DELAYED):
        raise CreditApplicationDenied('Credit Application was denied by Wells Fargo.')

    # Save the suffix of the account number
    app.account_number = resp.wfAccountNumber
    app.save()

    # Record an account inquiry
    result = AccountInquiryResult()
    result.credit_app_source = app
    result.status = INQUIRY_SUCCESS
    result.account_number = resp.wfAccountNumber
    result.first_name = app.main_first_name
    result.middle_initial = app.main_middle_initial
    result.last_name = app.main_last_name
    result.phone_number = '+1{}'.format(data.mainHomePhone)
    result.address = app.main_address_line1
    result.credit_limit = _as_decimal(resp.creditLimit)
    result.balance = Decimal('0.00')
    result.open_to_buy = result.credit_limit
    result.save()

    # Check if application approval is pending
    if resp.transactionStatus == CREDIT_APP_DECISION_DELAYED:
        pending = CreditApplicationPending('Credit Application is approval is pending.')
        pending.inquiry = result
        raise pending

    return result
Exemplo n.º 13
0
def submit_inquiry(account_number, current_user=None, locale=EN_US):
    client = soap.get_client(WFRS_INQUIRY_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'Inquiry')
    request = client.factory.create(type_name)
    request.uuid = uuid.uuid1()
    request.transactionCode = TRANS_TYPE_INQUIRY

    creds = APICredentials.get_credentials(current_user)
    request.userName = creds.username
    request.setupPassword = creds.password
    request.merchantNumber = creds.merchant_num

    request.localeString = locale
    request.accountNumber = account_number

    # Submit
    resp = client.service.submitInquiry(request)

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip(
    ) if resp.sorErrorDescription else None
    if error_msg:
        raise ValidationError(error_msg)

    # Build response
    result = AccountInquiryResult()

    result.status = resp.transactionStatus

    result.account_number = resp.wfAccountNumber

    result.first_name = resp.firstName or ''
    result.middle_initial = resp.middleInitial or ''
    result.last_name = resp.lastName or ''

    # This is kind of awful, but WFRS only uses national phone number (with an implied +1 country code). So, we
    # add back the country code to make it valid to store in the DB.
    # E.g. Take "5559998888" and convert it to "+15559998888"
    result.phone_number = '+1{}'.format(resp.phone)

    result.address = resp.address or ''

    result.credit_limit = (_as_decimal(resp.accountBalance) +
                           _as_decimal(resp.openToBuy))
    result.balance = _as_decimal(resp.accountBalance)
    result.open_to_buy = _as_decimal(resp.openToBuy)

    result.last_payment_date = _as_date(resp.lastPaymentDate)
    result.last_payment_amount = _as_decimal(resp.lastPayment)

    result.payment_due_date = _as_date(resp.lastPaymentDate)
    result.payment_due_amount = _as_decimal(resp.paymentDue)

    result.save()
    return result
Exemplo n.º 14
0
def check_pre_qualification_account_status(prequal_response):
    client = soap.get_client(WFRS_OTB_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'WFRS_OTBRequest')
    data = client.factory.create(type_name)

    data.localeString = prequal_response.request.locale
    data.uuid = uuid.uuid1()
    data.behaviorVersion = "1"

    data.userName = prequal_response.request.credentials.username
    data.servicePassword = prequal_response.request.credentials.password
    data.merchantNumber = prequal_response.request.credentials.merchant_num

    data.transactionCode = 'C1'

    data.uniqueId = prequal_response.response_id
    data.firstName = prequal_response.request.first_name
    data.lastName = prequal_response.request.last_name

    # Submit the pre-qualification request
    resp = client.service.submitOTB(data)

    # Check for faults
    if resp.faults and resp.faults.item:
        for fault in resp.faults.item:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # If the returned status isn't successful, theres nothing else to do.
    if resp.transactionStatus != OTB_SUCCESS:
        logger.info(
            'Received OTB Response with unsuccessful transaction status. Status: {}. Message: {}'
            .format(resp.transactionStatus, resp.message))
        return None

    # If no account number was returned, theres nothing else to do.
    if not resp.accountNumber:
        logger.info(
            'Received OTB Response without account number. Status: {}. Message: {}'
            .format(resp.transactionStatus, resp.message))
        return None

    # Build response
    result = AccountInquiryResult()
    result.prequal_response_source = prequal_response
    result.status = resp.transactionStatus

    result.account_number = resp.accountNumber

    result.first_name = prequal_response.request.first_name
    result.middle_initial = ""
    result.last_name = prequal_response.request.last_name
    result.phone_number = prequal_response.request.phone
    result.address = resp.mainAddress1 or prequal_response.request.line1

    result.credit_limit = _as_decimal(resp.creditLimit)
    result.balance = (_as_decimal(resp.creditLimit) -
                      _as_decimal(resp.availableCredit))
    result.open_to_buy = _as_decimal(resp.availableCredit)

    result.save()
    logger.info(
        'Saved OTB Response as AccountInquiryResult[{}]. Status: {}. Message: {}'
        .format(result.pk, result.status, resp.message))
    return result
Exemplo n.º 15
0
 def test_basic_soap_method_call(self):
     wsdl = 'http://www.dataaccess.com/webservicesserver/numberconversion.wso?WSDL'
     client = soap.get_client(wsdl, 'LOCATIONS')
     client.set_options(port='NumberConversionSoap')
     resp = client.service.NumberToWords('42')
     self.assertEqual(str(resp).strip(), 'forty two')
Exemplo n.º 16
0
def submit_credit_application(app, current_user=None):
    client = soap.get_client(WFRS_CREDIT_APP_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'CreditApp')
    data = client.factory.create(type_name)

    creds = APICredentials.get_credentials(current_user)
    data.userName = creds.username
    data.setupPassword = creds.password
    data.merchantNumber = creds.merchant_num

    data.uuid = uuid.uuid1()
    data.transactionCode = TRANS_TYPE_APPLY
    data.checkStatus = '0'

    data.localeString = app.locale
    data.languagePreference = app.language

    data.purchasePrice = app.purchase_price
    data.optionalInsurance = '1' if app.insurance else '0'
    data.salesPerson = app.sales_person_id
    data.newSalesPerson = app.new_sales_person
    data.emailAddress = app.email

    data.mainFirstName = app.main_first_name
    data.mainLastName = app.main_last_name
    data.mainMiddleInitial = app.main_middle_initial
    data.mainDOB = _format_date(app.main_date_of_birth)
    data.mainSSN = _format_ssn(app.main_ssn)
    data.mainAddress1 = app.main_address_line1
    data.mainAddress2 = app.main_address_line2
    data.mainCity = app.main_address_city
    data.mainStateOrProvince = app.main_address_state
    data.mainPostalCode = app.main_address_postcode
    data.mainHomePhone = _format_phone(app.main_home_phone)
    data.mainTimeAtAddress = app.main_time_at_address
    data.mainHousingStatus = app.main_housing_status
    data.mainHomeValue = app.main_home_value
    data.mainMortgageBalance = app.main_mortgage_balance
    data.mainEmployerName = app.main_employer_name
    data.mainTimeAtEmployer = app.main_time_at_employer
    data.mainEmployerPhone = _format_phone(app.main_employer_phone)
    data.mainAnnualIncome = app.main_annual_income
    data.mainCellPhone = _format_phone(app.main_cell_phone)
    data.mainOccupation = app.main_occupation
    data.mainPhotoIdType = getattr(app, 'main_photo_id_type', None)
    data.mainPhotoIdNumber = getattr(app, 'main_photo_id_number', None)
    data.mainDLStateOrProvince = getattr(app, 'main_drivers_license_province',
                                         None)
    data.mainPhotoIdExpDate = _format_date(
        getattr(app, 'main_photo_id_expiration', None))

    data.individualJointIndicator = 'J' if app.is_joint else 'I'
    if app.is_joint:
        data.jointFirstName = app.joint_first_name
        data.jointLastName = app.joint_last_name
        data.jointMiddleInitial = app.joint_middle_initial
        data.jointDOB = _format_date(app.joint_date_of_birth)
        data.jointSSN = _format_ssn(app.joint_ssn)
        data.jointAddress1 = app.joint_address_line1
        data.jointAddress2 = app.joint_address_line2
        data.jointCity = app.joint_address_city
        data.jointStateOrProvince = app.joint_address_state
        data.jointPostalCode = app.joint_address_postcode
        data.jointEmployerName = app.joint_employer_name
        data.jointTimeAtEmployer = app.joint_time_at_employer
        data.jointEmployerPhone = _format_phone(app.joint_employer_phone)
        data.jointAnnualIncome = app.joint_annual_income
        data.jointCellPhone = _format_phone(app.joint_cell_phone)
        data.jointOccupation = app.joint_occupation
        data.jointPhotoIdType = getattr(app, 'joint_photo_id_type', None)
        data.jointPhotoIdNumber = getattr(app, 'joint_photo_id_number', None)
        data.jointDLStateOrProvince = getattr(
            app, 'joint_drivers_license_province', None)
        data.jointPhotoIdExpDate = _format_date(
            getattr(app, 'joint_photo_id_expiration', None))

    # Submit
    resp = client.service.submitCreditApp(data)

    # Save the status and credentials used to apply
    app.status = resp.transactionStatus or ''
    app.credentials = creds
    app.save()

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip(
    ) if resp.sorErrorDescription else None
    if error_msg:
        logger.info(error_msg)
        raise ValidationError(error_msg)

    # Check for any other errors we didn't catch already for any reason
    if resp.transactionStatus in (CREDIT_APP_FORMAT_ERROR,
                                  CREDIT_APP_WFF_ERROR):
        raise ValidationError('An unknown error occurred.')

    # If the status is not either Approved or Pending, it must be denied
    if resp.transactionStatus not in (CREDIT_APP_APPROVED,
                                      CREDIT_APP_DECISION_DELAYED):
        raise CreditApplicationDenied(
            'Credit Application was denied by Wells Fargo.')

    # Save the suffix of the account number
    app.account_number = resp.wfAccountNumber
    app.save()

    # Record an account inquiry
    result = AccountInquiryResult()
    result.credit_app_source = app
    result.status = INQUIRY_SUCCESS
    result.account_number = resp.wfAccountNumber
    result.first_name = app.main_first_name
    result.middle_initial = app.main_middle_initial
    result.last_name = app.main_last_name
    result.phone_number = '+1{}'.format(data.mainHomePhone)
    result.address = app.main_address_line1
    result.credit_limit = _as_decimal(resp.creditLimit)
    result.balance = Decimal('0.00')
    result.open_to_buy = result.credit_limit
    result.save()

    # Check if application approval is pending
    if resp.transactionStatus == CREDIT_APP_DECISION_DELAYED:
        pending = CreditApplicationPending(
            'Credit Application is approval is pending.')
        pending.inquiry = result
        raise pending

    return result
Exemplo n.º 17
0
 def test_soap_with_proxy(self):
     """ Set sandbox/settings to use """
     if settings.PROXY_URL:
         wsdl = 'http://www.dataaccess.com/webservicesserver/numberconversion.wso?WSDL'
         soap.get_client(wsdl, 'LOCATIONS')
Exemplo n.º 18
0
 def test_soap_with_proxy(self):
     """ Set sandbox/settings to use """
     if settings.PROXY_URL:
         wsdl = 'http://www.webservicex.net/uszip.asmx?WSDL'
         client = soap.get_client(wsdl, 'LOCATIONS')
Exemplo n.º 19
0
def check_pre_qualification_status(prequal_request,
                                   return_url=None,
                                   current_user=None):
    client = soap.get_client(WFRS_PRE_QUAL_WSDL, 'WFRS')
    type_name = _find_namespaced_name(client, 'WFRS_InstantPreScreenRequest')
    data = client.factory.create(type_name)

    data.localeString = prequal_request.locale
    data.uuid = prequal_request.uuid
    data.behaviorVersion = "1"

    creds = APICredentials.get_credentials(current_user)
    data.userName = creds.username
    data.servicePassword = creds.password
    data.merchantNumber = creds.merchant_num

    data.transactionCode = 'P1'
    data.entryPoint = prequal_request.entry_point
    if return_url:
        data.returnUrl = return_url

    data.firstName = prequal_request.first_name
    data.lastName = prequal_request.last_name
    data.address1 = prequal_request.line1
    data.city = prequal_request.city
    data.state = prequal_request.state
    data.postalCode = prequal_request.postcode
    data.phone = _format_phone(prequal_request.phone)

    # Save the credentials used to make the request
    prequal_request.credentials = creds
    prequal_request.save()

    # Submit the pre-qualification request
    resp = client.service.instantPreScreen(data)

    # Check for faults
    if resp.faults and resp.faults.item:
        for fault in resp.faults.item:
            logger.info(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Sanity check the response
    if resp.transactionStatus is None or resp.uniqueId is None:
        logger.info(
            'WFRS pre-qualification request return null data for pre-request[{}]'
            .format(prequal_request.pk))
        return None

    # Save the pre-qualification response data
    response = PreQualificationResponse()
    response.request = prequal_request
    response.status = resp.transactionStatus
    response.message = resp.message or ''
    response.offer_indicator = resp.offerIndicator or ''
    response.credit_limit = _as_decimal(resp.upToLimit)
    response.response_id = resp.uniqueId
    response.application_url = urllib.parse.unquote(resp.url or '')
    response.customer_response = PREQUAL_CUSTOMER_RESP_NONE
    response.save()
    return response
Exemplo n.º 20
0
 def client(self):
     """Lazy constructor for SOAP client"""
     return soap.get_client(self.wsdl, 'CCH')
Exemplo n.º 21
0
def submit_credit_application(app):
    client = soap.get_client(WFRS_CREDIT_APP_WSDL, 'WFRS')
    data = client.factory.create('ns2:CreditApp')

    data.userName = WFRS_USER_NAME
    data.setupPassword = WFRS_PASSWORD
    data.merchantNumber = WFRS_MERCHANT_NUM

    data.uuid = uuid.uuid1()
    data.transactionCode = TRANS_TYPE_APPLY
    data.checkStatus = '0'

    data.localeString = app.locale
    data.languagePreference = app.language

    data.purchasePrice = app.purchase_price
    data.optionalInsurance = '1' if app.insurance else '0'
    data.salesPerson = app.sales_person_id
    data.newSalesPerson = app.new_sales_person
    data.emailAddress = app.email

    data.mainFirstName = app.main_first_name
    data.mainLastName = app.main_last_name
    data.mainMiddleInitial = app.main_middle_initial
    data.mainDOB = _format_date(app.main_date_of_birth)
    data.mainSSN = _format_ssn(app.main_ssn)
    data.mainAddress1 = app.main_address_line1
    data.mainAddress2 = app.main_address_line2
    data.mainCity = app.main_address_city
    data.mainStateOrProvince = app.main_address_state
    data.mainPostalCode = app.main_address_postcode
    data.mainHomePhone = _format_phone(app.main_home_phone)
    data.mainTimeAtAddress = app.main_time_at_address
    data.mainHousingStatus = app.main_housing_status
    data.mainHomeValue = app.main_home_value
    data.mainMortgageBalance = app.main_mortgage_balance
    data.mainEmployerName = app.main_employer_name
    data.mainTimeAtEmployer = app.main_time_at_employer
    data.mainEmployerPhone = _format_phone(app.main_employer_phone)
    data.mainAnnualIncome = app.main_annual_income
    data.mainCellPhone = _format_phone(app.main_cell_phone)
    data.mainOccupation = app.main_occupation
    data.mainPhotoIdType = getattr(app, 'main_photo_id_type', None)
    data.mainPhotoIdNumber = getattr(app, 'main_photo_id_number', None)
    data.mainDLStateOrProvince = getattr(app, 'main_drivers_license_province', None)
    data.mainPhotoIdExpDate = _format_date( getattr(app, 'main_photo_id_expiration', None) )

    data.individualJointIndicator = 'J' if app.is_joint else 'I'
    if app.is_joint:
        data.jointFirstName = app.joint_first_name
        data.jointLastName = app.joint_last_name
        data.jointMiddleInitial = app.joint_middle_initial
        data.jointDOB = _format_date(app.joint_date_of_birth)
        data.jointSSN = _format_ssn(app.joint_ssn)
        data.jointAddress1 = app.joint_address_line1
        data.jointAddress2 = app.joint_address_line2
        data.jointCity = app.joint_address_city
        data.jointStateOrProvince = app.joint_address_state
        data.jointPostalCode = app.joint_address_postcode
        data.jointEmployerName = app.joint_employer_name
        data.jointTimeAtEmployer = app.joint_time_at_employer
        data.jointEmployerPhone = _format_phone(app.joint_employer_phone)
        data.jointAnnualIncome = app.joint_annual_income
        data.jointCellPhone = _format_phone(app.joint_cell_phone)
        data.jointOccupation = app.joint_occupation
        data.jointPhotoIdType = getattr(app, 'joint_photo_id_type', None)
        data.jointPhotoIdNumber = getattr(app, 'joint_photo_id_number', None)
        data.jointDLStateOrProvince = getattr(app, 'joint_drivers_license_province', None)
        data.jointPhotoIdExpDate = _format_date( getattr(app, 'joint_photo_id_expiration', None) )

    # Submit
    resp = client.service.submitCreditApp(data)

    # Check for faults
    if resp.faults:
        for fault in resp.faults:
            logger.error(fault.faultDetailString)
            raise ValidationError(fault.faultDetailString)

    # Check for errors
    error_msg = resp.sorErrorDescription.strip() if resp.sorErrorDescription else None
    if error_msg:
        logger.error(error_msg)
        raise ValidationError(error_msg)

    # Check for approval
    if resp.transactionStatus != CREDIT_APP_APPROVED:
        raise CreditApplicationDenied(resp.transactionStatus)

    # Build response
    result = CreditApplicationResult()
    result.application = app
    result.transaction_status = resp.transactionStatus
    result.account_number = resp.wfAccountNumber
    result.credit_limit = _as_decimal(resp.creditLimit)
    return result