150 lines
6.7 KiB
Python
150 lines
6.7 KiB
Python
import typing
|
|
|
|
from apps.pos_device.models import Device, StakeHolders
|
|
from apps.product.models import (
|
|
Quota,
|
|
QuotaDistribution,
|
|
Organization, OrganizationQuotaStats
|
|
)
|
|
|
|
|
|
def pos_organizations_sharing_information(
|
|
device: Device,
|
|
quota: Quota = None,
|
|
quota_stat: OrganizationQuotaStats = None,
|
|
distribution: QuotaDistribution = None,
|
|
owner_org: Organization = None
|
|
) -> typing.Any:
|
|
"""
|
|
pos sharing organizations' information,
|
|
device have multiple organizations (sub_accounts) for sharing money
|
|
"""
|
|
stake_holders = device.stake_holders.select_related('broker', 'organization').filter()
|
|
|
|
sharing_information_list = []
|
|
for item in stake_holders:
|
|
if item.broker: # if stakeholder is not an agency, it is a broker
|
|
sharing_information_list.append({
|
|
"organization_name": item.organization.name,
|
|
"bank_account": {
|
|
"credit_card": item.organization.bank_information.first().card,
|
|
"sheba": "IR" + item.organization.bank_information.first().sheba,
|
|
"account": item.organization.bank_information.first().account,
|
|
} if item.organization.bank_information.exists() else {},
|
|
"broker": item.broker.name if item.broker else None,
|
|
"amount": quota.broker_values.filter(
|
|
broker=item.broker,
|
|
# if quota price features was edited for this organization
|
|
org_quota_stat=quota_stat if quota_stat and quota_stat.broker_values.exists() else None
|
|
).first().value if quota.broker_values.filter(broker=item.broker).exists() else None,
|
|
# """
|
|
# if we will need to get agencies share amount, we can use this bellow code
|
|
#
|
|
# # item.holders_share_amount.filter(quota_distribution=distribution).first().share_amount
|
|
# # if item.holders_share_amount.filter(quota_distribution=distribution).exists() else None
|
|
# """
|
|
"agency": False,
|
|
"default_account": item.default
|
|
})
|
|
elif owner_org.type.key == 'AGC':
|
|
agc_stake_holder = owner_org.pos_stake_holders.filter(
|
|
holders_share_amount__org_quota_stat=quota_stat,
|
|
).first()
|
|
stake_holders = agc_stake_holder.device.stake_holders.select_related(
|
|
'broker', 'organization'
|
|
).filter()
|
|
for item in stake_holders:
|
|
if item.broker: # if stakeholder is not an agency, it is a broker
|
|
sharing_information_list.append({
|
|
"organization_name": item.organization.name,
|
|
"bank_account": {
|
|
"credit_card": item.organization.bank_information.first().card,
|
|
"sheba": "IR" + item.organization.bank_information.first().sheba,
|
|
"account": item.organization.bank_information.first().account,
|
|
} if item.organization.bank_information.exists() else {},
|
|
"broker": item.broker.name if item.broker else None,
|
|
"amount": quota.broker_values.filter(
|
|
broker=item.broker,
|
|
# if quota price features was edited for this organization
|
|
org_quota_stat=quota_stat if quota_stat.broker_values.exists() else None
|
|
).first().value if quota.broker_values.filter(broker=item.broker).exists() else None,
|
|
# """
|
|
# if we will need to get agencies share amount, we can use this bellow code
|
|
#
|
|
# # item.holders_share_amount.filter(quota_distribution=distribution).first().share_amount
|
|
# # if item.holders_share_amount.filter(quota_distribution=distribution).exists() else None
|
|
# """
|
|
"agency": False,
|
|
"default_account": item.default
|
|
})
|
|
|
|
# if device owner is an agency organization
|
|
if owner_org.type.key == 'AGC':
|
|
sharing_information_list_agency = agency_organization_pos_info(
|
|
agency=owner_org,
|
|
pos_sharing_list=sharing_information_list,
|
|
device=device,
|
|
distribution=distribution,
|
|
quota_stat=quota_stat
|
|
)
|
|
if sharing_information_list_agency:
|
|
return sharing_information_list_agency
|
|
|
|
return sharing_information_list
|
|
|
|
|
|
def agency_organization_pos_info(
|
|
agency: Organization = None,
|
|
pos_sharing_list: list = None,
|
|
device: Device = None,
|
|
distribution: QuotaDistribution = None,
|
|
quota_stat: OrganizationQuotaStats = None
|
|
) -> typing.Any:
|
|
"""
|
|
if pos org owner is an agency, calculate share amount of agency
|
|
and share amount of parent organization
|
|
"""
|
|
|
|
# get agency share amount
|
|
agc_share_amount = agency.pos_stake_holders.filter(
|
|
holders_share_amount__org_quota_stat=quota_stat
|
|
)
|
|
|
|
agc_share_amount = agc_share_amount.first().holders_share_amount.filter(
|
|
org_quota_stat=quota_stat
|
|
) if agc_share_amount.exists() else None
|
|
|
|
agc_share_amount = agc_share_amount.first().share_amount if agc_share_amount else None
|
|
|
|
if agc_share_amount:
|
|
# calculate agency parent share amount
|
|
agc_parent_amount = next((item for item in pos_sharing_list if item.get('default_account')), None)
|
|
if agc_parent_amount and agc_share_amount:
|
|
agc_parent_amount['amount'] = agc_parent_amount['amount'] - agc_share_amount
|
|
|
|
pos_sharing_list.append({
|
|
"organization_name": agency.name,
|
|
"bank_account": {
|
|
"credit_card": agency.bank_information.first().card,
|
|
"sheba": "IR" + agency.bank_information.first().sheba,
|
|
"account": agency.bank_information.first().account,
|
|
} if agency.bank_information.exists() else {},
|
|
"amount": agc_share_amount,
|
|
"agency": True,
|
|
"default_account": True
|
|
})
|
|
return pos_sharing_list
|
|
return None
|
|
return None
|
|
|
|
|
|
def get_organization_by_stake_holder(id: int = None, stake_holder: StakeHolders = None) -> typing.Any:
|
|
""" get organization object by stake holder """
|
|
|
|
if id:
|
|
stake_holder = StakeHolders.objects.get(id=id)
|
|
organization = get_organization_by_stake_holder(stake_holder=stake_holder)
|
|
return organization
|
|
organization = stake_holder.assignment.client.organization
|
|
return organization
|