diff --git a/src/outsetapy/api/billing/subscriptions.py b/src/outsetapy/api/billing/subscriptions.py index 203e828..36f2f4c 100644 --- a/src/outsetapy/api/billing/subscriptions.py +++ b/src/outsetapy/api/billing/subscriptions.py @@ -1,4 +1,3 @@ -from outsetapy.models.billing.plan_family import PlanFamily from outsetapy.util.store import Store from outsetapy.models.wrappers.validation_error import ValidationError from outsetapy.util.request import Request, hasMoreResults @@ -67,9 +66,7 @@ async def get(self, uid: str, options: dict = {}) -> Subscription: json_response = response.json() return Subscription(json_response, self.store) - async def add( - self, subscription: dict - ) -> Subscription: + async def add(self, subscription: dict) -> Subscription: request = ( Request(self.store, "billing/subscriptions/firsttimesubscription") .authenticate_as_server() diff --git a/src/outsetapy/api/crm/accounts.py b/src/outsetapy/api/crm/accounts.py index 11e8ccb..a525ce6 100644 --- a/src/outsetapy/api/crm/accounts.py +++ b/src/outsetapy/api/crm/accounts.py @@ -14,6 +14,7 @@ def __init__(self, store): async def get_all(self, options: dict = {}) -> List[Account]: has_more = True results = [] + fields = "*,PrimaryContact.*,Subscriptions.*,Subscriptions.Plan.*,CurrentSubscription.*," while has_more: request = ( Request(self.store, "crm/accounts") @@ -21,7 +22,8 @@ async def get_all(self, options: dict = {}) -> List[Account]: .with_params( { "fields": options.get( - "fields", "*,PersonAccount.*,PersonAccount.Person.Uid" + "fields", + f"{fields}CurrentSubscription.Plan.*,PersonAccount.*,PersonAccount.Person.Uid", ) } ) @@ -47,6 +49,7 @@ async def get_all(self, options: dict = {}) -> List[Account]: return [Account(json_obj, self.store) for json_obj in results] async def get(self, uid: str, options: dict = {}) -> Account: + fields = "*,PersonAccount.*,BillingAddress.*,MailingAddress.*,PersonAccount.Person.Uid,CurrentSubscription.Uid," request = ( Request(self.store, f"crm/accounts/{uid}") .authenticate_as_server() @@ -54,7 +57,8 @@ async def get(self, uid: str, options: dict = {}) -> Account: { "fields": options.get( # "fields", "*,PersonAccount.*,PersonAccount.Person.Uid" - "fields", "*,PersonAccount.*,BillingAddress.*,MailingAddress.*,PersonAccount.Person.Uid,CurrentSubscription.Uid,LatestSubscription.Uid, PrimarySubscription.Uid, PrimaryContact.*" + "fields", + f"{fields}LatestSubscription.Uid, PrimarySubscription.Uid, PrimaryContact.*", ) } ) diff --git a/src/outsetapy/models/billing/subscription.py b/src/outsetapy/models/billing/subscription.py index bbad5b2..2badabd 100644 --- a/src/outsetapy/models/billing/subscription.py +++ b/src/outsetapy/models/billing/subscription.py @@ -40,6 +40,8 @@ def __init__(self, data: object, store: Store): if "_objectType" in data and data["_objectType"] == "Subscription": self.Uid = data["Uid"] self.BillingRenewalTerm = data["BillingRenewalTerm"] + self.Account_Uid = data["Account"]["Uid"] + self._plan = data["Plan"]["Uid"] if "Account" in data and data['Account'] is not None and '_objectType' in data["Account"] and data["Account"]["_objectType"] == 'Account': self.Account_Uid = data["Account"]['Uid'] else: @@ -56,8 +58,10 @@ def __init__(self, data: object, store: Store): self.Updated = data["Updated"] else: raise ValueError("Invalid object type") - + @property async def Plan(self): - plan_api = importlib.import_module("outsetapy.api.billing.plans").Plans(self.__store) + plan_api = importlib.import_module("outsetapy.api.billing.plans").Plans( + self.__store + ) return await plan_api.get(self._plan) diff --git a/src/outsetapy/models/crm/account.py b/src/outsetapy/models/crm/account.py index 72f1532..25ac232 100644 --- a/src/outsetapy/models/crm/account.py +++ b/src/outsetapy/models/crm/account.py @@ -1,104 +1,90 @@ +from typing import List from datetime import datetime -import importlib -from outsetapy.util.store import Store from outsetapy.models.shared.address import Address -from outsetapy.models.billing.subscription import Subscription -# from .deal import Deal -class Account: - def __init__(self, data: object, store: Store): - self.__store = store - self.Name = None - self.ClientIdentifier = None - self.IsDemo = False - self.BillingAddress = Address() - self.MailingAddress = Address() - self.AccountStage = None - self.PaymentInformation = None - self.PersonAccount = [] - self.Subscriptions = [] - self.Deals = [] - self.LastLoginDateTime = None - self.AccountSpecificPageUrl1 = "" - self.AccountSpecificPageUrl2 = "" - self.AccountSpecificPageUrl3 = "" - self.AccountSpecificPageUrl4 = "" - self.AccountSpecificPageUrl5 = "" - self.RewardFulReferralId = None - self.HasLoggedIn = False - self.AccountStageLabel = "" - self.DomainName = None - self.LatestSubscription = None - self.PrimaryContact = None - self.PrimarySubscription = None - self.RecaptchaToken = None - self.LifetimeRevenue = 0 - self.Uid = "" - self.Created = datetime.now() - self.Updated = datetime.now() +class Deal: + def __init__(self, deal_id: str, deal_name: str): + self.deal_id = deal_id + self.deal_name = deal_name - # Update the account attributes based on the provided dictionary - if "_objectType" in data and data["_objectType"] == "Account": - self.Name = data["Name"] - self.ClientIdentifier = data["ClientIdentifier"] - self.IsDemo = data["IsDemo"] - self.BillingAddress = data["BillingAddress"] - self.MailingAddress = data["MailingAddress"] - self.AccountStage = data["AccountStage"] - self.PaymentInformation = data["PaymentInformation"] - self.PersonAccount = data["PersonAccount"] - self.Subscriptions = data["Subscriptions"] - self.Deals = data["Deals"] - self.LastLoginDateTime = data["LastLoginDateTime"] - self.AccountSpecificPageUrl1 = data["AccountSpecificPageUrl1"] - self.AccountSpecificPageUrl2 = data["AccountSpecificPageUrl2"] - self.AccountSpecificPageUrl3 = data["AccountSpecificPageUrl3"] - self.AccountSpecificPageUrl4 = data["AccountSpecificPageUrl4"] - self.AccountSpecificPageUrl5 = data["AccountSpecificPageUrl5"] - self.RewardFulReferralId = data["RewardFulReferralId"] - self.HasLoggedIn = data["HasLoggedIn"] - self.AccountStageLabel = data["AccountStageLabel"] - self.DomainName = data["DomainName"] - self.LatestSubscription = data["LatestSubscription"] - if "CurrentSubscription" in data and data["CurrentSubscription"] is not None and "Uid" in data["CurrentSubscription"]: - self._current_subscription = data["CurrentSubscription"]["Uid"] - else: - self._current_subscription = data["CurrentSubscription"] +class PersonAccount: + def __init__(self, person_id: str, person_name: str): + self.person_id = person_id + self.person_name = person_name - # if "CurrentSubscription" in data and '_objectType' in data["CurrentSubscription"] and data["Account"]["_objectType"] == 'Subscription': - # self.CurrentSubscription = Subscription(data["CurrentSubscription"], self.__store) - # else: - # self.CurrentSubscription = data["CurrentSubscription"] - self.PrimaryContact = data["PrimaryContact"] - self.PrimarySubscription = data["PrimarySubscription"] - self.RecaptchaToken = data["RecaptchaToken"] - self.LifetimeRevenue = data["LifetimeRevenue"] - self.Uid = data["Uid"] - self.Created = data["Created"] - self.Updated = data["Updated"] - elif "_objectType" in data: - raise Exception(f"Invalid object type: {data['_objectType']}") +class AccountStage: + def __init__(self, stage_id: str, stage_name: str): + self.stage_id = stage_id + self.stage_name = stage_name - # @property - # async def CurrentSubscription(self): - # subscription_api = importlib.import_module("outsetapy.api.billing.subscriptions").Subscriptions(self.__store) - # CurrentSubscription = await subscription_api.get(self._current_subscription) - # return CurrentSubscription - @property - def CurrentSubscription(self) -> Subscription: - if type(self._current_subscription) == Subscription: - return self._current_subscription - if self._current_subscription is None: - return None - subscription_api = importlib.import_module("outsetapy.api.billing.subscriptions").Subscriptions(self.__store) - return subscription_api.get(self._current_subscription) - @CurrentSubscription.setter - def CurrentSubscription(self, value): - if type(value) == Subscription: - self._current_subscription = value - else: - if hasattr(value, "Uid"): - self._current_subscription = value.Uid - else: - self._current_subscription = value +class Subscription: + def __init__(self, subscription_id: str, subscription_name: str): + self.subscription_id = subscription_id + self.subscription_name = subscription_name + +class Account: + def __init__(self, data: object): + self.Name = None + self.ClientIdentifier = None + self.IsDemo = False + self.BillingAddress = Address("", "", "", "") + self.MailingAddress = Address("", "", "", "") + self.AccountStage = AccountStage("", "") + self.PaymentInformation = None + self.PersonAccount = [] + self.Subscriptions = [] + self.Deals = [] + self.LastLoginDateTime = None + self.AccountSpecificPageUrl1 = "" + self.AccountSpecificPageUrl2 = "" + self.AccountSpecificPageUrl3 = "" + self.AccountSpecificPageUrl4 = "" + self.AccountSpecificPageUrl5 = "" + self.RewardFulReferralId = None + self.HasLoggedIn = False + self.AccountStageLabel = "" + self.DomainName = None + self.LatestSubscription = None + self.CurrentSubscription = None + self.PrimaryContact = None + self.PrimarySubscription = None + self.RecaptchaToken = None + self.LifetimeRevenue = 0 + self.Uid = "" + self.Created = datetime.now() + self.Updated = datetime.now() + + # Update the account attributes based on the provided dictionary + if '_objectType' in data and data['_objectType'] == 'Account': + self.Name = data['Name'] + self.ClientIdentifier = data['ClientIdentifier'] + self.IsDemo = data['IsDemo'] + self.BillingAddress = data['BillingAddress'] + self.MailingAddress = data['MailingAddress'] + self.AccountStage = data['AccountStage'] + self.PaymentInformation = data['PaymentInformation'] + self.PersonAccount = data['PersonAccount'] + self.Subscriptions = data['Subscriptions'] + self.Deals = data['Deals'] + self.LastLoginDateTime = data['LastLoginDateTime'] + self.AccountSpecificPageUrl1 = data['AccountSpecificPageUrl1'] + self.AccountSpecificPageUrl2 = data['AccountSpecificPageUrl2'] + self.AccountSpecificPageUrl3 = data['AccountSpecificPageUrl3'] + self.AccountSpecificPageUrl4 = data['AccountSpecificPageUrl4'] + self.AccountSpecificPageUrl5 = data['AccountSpecificPageUrl5'] + self.RewardFulReferralId = data['RewardFulReferralId'] + self.HasLoggedIn = data['HasLoggedIn'] + self.AccountStageLabel = data['AccountStageLabel'] + self.DomainName = data['DomainName'] + self.LatestSubscription = data['LatestSubscription'] + self.CurrentSubscription = data['CurrentSubscription'] + self.PrimaryContact = data['PrimaryContact'] + self.PrimarySubscription = data['PrimarySubscription'] + self.RecaptchaToken = data['RecaptchaToken'] + self.LifetimeRevenue = data['LifetimeRevenue'] + self.Uid = data['Uid'] + self.Created = data['Created'] + self.Updated = data['Updated'] + elif '_objectType' in data: + raise Exception(f"Invalid object type: {data['_objectType']}")