예제 #1
0
def showAccountsTable(client):
	total = ClientAccount.getTotalScoreByClient(client=client)

	context = {
		'client': client,
		'total': total,
		'show_action_btn': True,
	}

	return render_to_string('client/profile_accounts_list.html', context)
예제 #2
0
def showAccountsTable(request):
    # Get the user object
    client = request.user
    if (client is None) or (not client.hasRole('ROLE_CLIENT')):
        return JsonResponse({
            'status': 'error',
            'message': 'Client does not exist.',
        })

    total = ClientAccount.getTotalScoreByClient(client=client)

    print(total)
    context = {
        'client': client,
        'total': total,
        'show_action_btn': True,
    }
    return render(request, 'client/profile_accounts_list.html', context)
예제 #3
0
def checkAccountsSum(request):
    if (not request.is_ajax()):
        raise Http404()

    # Get the user object
    client = request.user
    ria = client.profile.ria_user

    riaMinAssetSize = ria.riacompanyinformation.min_asset_size

    total = ClientAccount.getTotalScoreByClient(client=client)

    if riaMinAssetSize > total['value']:
        message = 'You must invest at least $' + '{0:.2f}'.format(
            riaMinAssetSize) + ' with us.'
        return JsonResponse({
            'status': 'error',
            'message': message,
        })

    return JsonResponse({
        'status': 'success',
    })
예제 #4
0
def account_type_text(acc_type):
    return ClientAccount.get_account_type_text(acc_type)
예제 #5
0
def createAccount(request, group):
    if (request.method != 'POST') or (not request.is_ajax()):
        raise Http404("Page not found.")

    # Get the user object
    client = request.user
    if (client is None) or (not client.hasRole('ROLE_CLIENT')):
        return JsonResponse({
            'status': 'error',
            'message': 'Client does not exist.',
        })

    # Check account group is valid or not
    allowedGroups = AccountGroup.getGroupChoices()
    if (group, group) not in allowedGroups:
        return HttpResponseBadRequest('Invalid group type')
    groupTypeId = None
    groupType = None

    clientAccount = ClientAccount(value=0, is_pre_saved=False)

    if (group == AccountGroup.GROUP_DEPOSIT_MONEY) or (
            group == AccountGroup.GROUP_FINANCIAL_INSTITUTION):
        groupType = getAccountGroupType(session=request.session)
        clientAccount.groupType = groupType

    # print("Checkpoint 0: groupType is")
    # print(groupType)
    if request.method == 'POST':
        # print("Checkpoint 1a: Enter into request.method POST")
        ###############
        # Pre-process form data before validation
        ###############
        print("createAccount: ", request.POST)
        post = request.POST.copy()
        post['value'] = float(post['value'].replace(',', ''))
        post['groupType'] = groupType.pk
        request.POST = post
        # print(request.POST.get('value'))
        form = TypedClientAccountForm(request.POST,
                                      user=client,
                                      group=group,
                                      groupType=groupType)
        if form.is_valid():
            # print("Checkpoint 2a: Successfully validate the form")
            clientAccount = form.save(commit=False)
            clientAccount.client = client
            clientAccount.is_pre_saved = False
            clientAccount.save()
            removeAccountGroup(session=request.session)
            removeAccountType(session=request.session)
            removeAccountGroupType(session=request.session)
            removeAccountOwners(session=request.session)

            if group == 'employer_retirement':
                responseData = processEmployerRetirementAccountForm(
                    clientAccount)
            else:
                responseData = processAccountForm(request=request)
                # Check if the group type is deposit and how many accounts the client has applied
                isType = (clientAccount.groupType.group.name ==
                          AccountGroup.GROUP_DEPOSIT_MONEY)
                systemAccounts = SystemAccount.objects.filter(
                    client=client, type=clientAccount.system_type)
                responseData['in_right_box'] = False if (
                    isType or (systemAccounts.count() < 1)) else True
                responseData['transfer_url'] = reverse(
                    'rx_client_dashboard_select_system_account',
                    kwargs={'account_id': clientAccount.pk},
                )

            removeIsConsolidateAccount(session=request.session)
            removeAccountStep(session=request.session)
            return JsonResponse(responseData)
        else:
            print('Checkpoint 2b: Form is not valid')
            print(form.errors)
            print(form.non_field_errors)
    else:
        # print("Checkpoint 1b: Cannot enter into request.method POST")
        form = TypedClientAccountForm(user=client,
                                      group=group,
                                      groupType=groupType)

    message = getTitleMessageForAccountForm(session=request.session,
                                            group=group,
                                            groupType=groupType)

    template = loader.get_template('client/profile_client_accounts_form.html')
    context = {
        'form': form,
        'group': group,
        'hide_submit_button': True,
        'title_message': message,
    }
    content = template.render(context, request)
    data = {
        'status': 'error',
        'content': content,
    }
    return JsonResponse(data)
예제 #6
0
def get_account_balance_chart(plan, has_partner):
    try:
        p = plan.projection

        base_idx = 0
        last_idx = plan.selected_life_expectancy - plan.client.age - 1

        max_limit = 0
        sum_value = [0] * (last_idx - base_idx + 1)
        if p.list_of_account_balances is not None:
            list_of_account_balances = list(
                filter(lambda item: item['data'] is not None,
                       p.list_of_account_balances))
        else:
            list_of_account_balances = []
        if has_partner:
            part_list_of_account_balances = list(
                filter(lambda item: item['data'] is not None,
                       p.part_list_of_account_balances))

        for idx in range(base_idx, last_idx):
            for acc in list_of_account_balances:
                sum_value[idx] += value_at(acc['data'], idx)
            if has_partner:
                for acc in part_list_of_account_balances:
                    sum_value[idx] += value_at(acc['data'], idx)
        max_limit = max(sum_value)

        colors = get_random_colors(len(list_of_account_balances))
        legends = list(
            map(
                lambda item: ClientAccount.get_account_type_text(item[
                    'account_type']), list_of_account_balances))

        if has_partner:
            partner_colors = get_random_colors(
                len(part_list_of_account_balances))
            partner_legends = list(
                map(
                    lambda item: 'Partner ' + ClientAccount.
                    get_account_type_text(item['account_type']),
                    part_list_of_account_balances))
            colors += partner_colors
            legends += partner_legends
            partner_age = int(tax_helpers.get_age(plan.partner_data['dob']))

        values = []
        if max_limit > 0:
            y_interval_0 = max_limit / 10
            y_interval = pow(10, np.floor(np.log10(y_interval_0)))
            y_interval = y_interval * 5 if y_interval_0 < y_interval * 5 else y_interval * 10
            max_limit = int(np.ceil(max_limit / y_interval) * y_interval)
        else:
            y_interval = 1
            max_limit = 1
        y_axis = range(0, max_limit + 1, int(y_interval))
        y_axis = list(reversed(list(y_axis)))
        y_height = y_interval / max_limit * 100
        x_num = last_idx - base_idx
        x_interval = min(40, 560 / x_num)
        x_width = x_interval * x_num + 42

        for idx in range(base_idx, last_idx):
            y_values = []
            for acc in list_of_account_balances:
                y_values.append(value_at(acc['data'], idx) / max_limit * 100)
            x_label = str(plan.client.age + 1 + idx)
            if has_partner:
                for acc in part_list_of_account_balances:
                    y_values.append(
                        value_at(acc['data'], idx) / max_limit * 100)
                x_label += ' / ' + str(partner_age + 1 + idx)

            values += [{
                'x_label': x_label,
                'y_values': y_values,
                'y_offset': 100 - sum(y_values)
            }]
        return {
            'values': values,
            'colors': colors,
            'legends': legends,
            'y_axis': list(y_axis),
            'y_height': y_height,
            'x_interval': x_interval,
            'x_width': x_width
        }
    except ObjectDoesNotExist:
        return None
예제 #7
0
def index(request):
	print("-----http-----",request.__dict__)
	clientPortfolioManager = ClientPortfolioManager()

	# Get the user object
	email = Email.objects.last().email
	client = get_object_or_404(User, email=email)
	ria = client.profile.ria_user
	
	# Get client's portfolio
	clientPortfolio = clientPortfolioManager.getCurrentPortfolio(client=client)

	if clientPortfolio is None:
		clientPortfolio = clientPortfolioManager.getActivePortfolio(client=client)

	if clientPortfolio is None:
		raise Http404()

	companyInformation = ria.riacompanyinformation
	portfolio = clientPortfolio.portfolio
	isQualified = manageQualified(
		session=request.session,
		companyInformation=companyInformation,
		isQualified=request.GET.get('is_qualified')
	)
	isFinal = False

	# If client has final portfolio
	if clientPortfolio.isAdvisorApproved():
		isFinal = True
		if client.profile.registration_step < 4:
			profile = client.profile
			profile.registration_step = 4
			profile.save()
	elif clientPortfolio.isProposed():
		existWorkflow = None # Skip implementing workflow at this moment

	portfolioInformationManager = PortfolioInformationManager()
	clientAccounts = ClientAccount.objects.filter(client=client)
	retirementAccounts = ClientAccount.objects.filter(client=client, groupType__group__name=AccountGroup.GROUP_EMPLOYER_RETIREMENT)
	form = PortfolioForm()

	# Skip document at this moment
	documents = {
		'ria_investment_management_agreement': '#',
	}

	portfolio_information = portfolioInformationManager.getPortfolioInformation(user=client, model=portfolio, isQualified=isQualified)
	client.appointedBillingSpec.calcFeeTier()
	
	data = {
		'is_final': isFinal,
		'client': client,
		'client_accounts': clientAccounts,
		'total': ClientAccount.getTotalScoreByClient(client=client),
		'ria_company_information': companyInformation,
		'has_retirement_account': True if retirementAccounts.exists() else False,
		'portfolio_information': portfolio_information,
		'show_sas_cash': containsSasCash(clientAccounts),
		'is_use_qualified_models': companyInformation.is_use_qualified_models,
		'form': form,
		'signing_date': datetime.now(),
		'documents': documents,
		'action': 'client_portfolio',
	}

	return render(request, 'client/portfolio_index.html', data)
예제 #8
0
def suggestedPortfolio(request, client_id, client_view=0):
    clientPortfolioManager = ClientPortfolioManager()
    # Get the ria and client objects
    ria = request.user
    client = get_object_or_404(User, pk=client_id)

    clientPortfolio = clientPortfolioManager.getActivePortfolio(client=client)

    if clientPortfolio is None:
        raise Http404("This client does not have suggested portfolio.")

    # Skip implementing mailer at this moment

    portfolio = clientPortfolio.portfolio

    if request.method == 'POST':
        settingsForm = SuggestedPortfolioForm(request.POST,
                                              instance=client.profile,
                                              clientPortfolio=clientPortfolio)
        if settingsForm.is_valid():
            portfolio = settingsForm.save(commit=False)
    else:
        settingsForm = SuggestedPortfolioForm(instance=client.profile,
                                              clientPortfolio=clientPortfolio)

    companyInformation = ria.riacompanyinformation
    isUseQualified = companyInformation.isUseQualifiedModels()
    isQualified = False

    if isUseQualified:
        # Skip implementing isQualified setting logic at this moment
        pass

    form = RiaClientAccountForm(client=client)

    clientAccounts = ClientAccount.findConsolidatedAccountsByClient(
        client=client)
    portfolioInformationManager = PortfolioInformationManager()
    portfolio_information = portfolioInformationManager.getPortfolioInformation(
        user=client, model=portfolio, isQualified=isQualified)
    client.appointedBillingSpec.calcFeeTier()

    if bool(client_view):
        parent_template = 'ria/clear_layout.html'
    else:
        parent_template = 'ria/dashboard_index.html'

    context = {
        'is_client_view': bool(client_view),
        'user': ria,
        'form': form,
        'total': ClientAccount.getTotalScoreByClient(client=client),
        'client': client,
        'client_accounts': clientAccounts,
        'settings_form': settingsForm,
        'client_answers':
        ClientQuestionnaireAnswer.objects.filter(client=client),
        'has_retirement_account':
        ClientAccount.hasRetirementAccount(client=client),
        'ria_company_information': ria.riacompanyinformation,
        'client_has_final_portfolio': clientPortfolio.isAdvisorApproved(),
        'portfolio_information': portfolio_information,
        'is_use_qualified_models': isUseQualified,
        'action': 'ria_suggested_portfolio',
        'billing_spec': client.appointedBillingSpec,
        'parent_template': parent_template,
    }

    return render(request, 'ria/prospects_suggested_portfolio.html', context)