class INVSTMTMSGSETV1(Aggregate): """ OFX section 13.7.1.1 """ msgsetcore = SubAggregate(MSGSETCORE, required=True) trandnld = Bool(required=True) oodnld = Bool(required=True) posdnld = Bool(required=True) baldnld = Bool(required=True) canemail = Bool(required=True) inv401kdnld = Bool() closingavail = Bool() imageprof = Unsupported()
class SIGNONINFO(Aggregate): """ OFX section 7.2.2 """ signonrealm = String(32, required=True) min = Integer(required=True) max = Integer(required=True) chartype = OneOf( "ALPHAONLY", "NUMERICONLY", "ALPHAORNUMERIC", "ALPHAANDNUMERIC", required=True ) casesen = Bool(required=True) special = Bool(required=True) spaces = Bool(required=True) pinch = Bool(required=True) chgpinfirst = Bool() usercred1label = String(64) usercred2label = String(64) clientuidreq = Bool() authtokenfirst = Bool() authtokenlabel = String(64) authtokeninfourl = String(255) mfachallengesupt = Bool() mfachallengefirst = Bool() accesstokenreq = Bool()
class INCOME(Aggregate, Origcurrency): """ OFX section 13.9.2.4.4 """ invtran = SubAggregate(INVTRAN, required=True) secid = SubAggregate(SECID, required=True) incometype = OneOf(*INCOMETYPES, required=True) total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) taxexempt = Bool() withholding = Decimal() currency = SubAggregate(CURRENCY) origcurrency = SubAggregate(ORIGCURRENCY) inv401ksource = OneOf(*INV401KSOURCES)
class TAX1099OID_V100(Aggregate): """OFX tax extensions section 2.2.14""" srvrtid = String(10, required=True) taxyear = Integer(4, required=True) void = Bool() corrected = Bool() origisdisc = Decimal() otherperint = Decimal() erlwithpen = Decimal() fedtaxwh = Decimal() marketdiscount = Decimal() acqpremium = Decimal() description = String(2000) oidonustres = Decimal() investexp = Decimal() bondpremium = Decimal() taxexemptoid = Decimal() origstate = ListAggregate(ORIGSTATE) privactbondamt = Decimal() privactbondint = Decimal() statecode = String(2) stateidnum = String(32) statetaxwheld = Decimal() addlstatetaxwhagg = SubAggregate(ADDLSTATETAXWHAGG) payeraddr = SubAggregate(PAYERADDR) payerid = String(32, required=True) recid = String(32) recacct = String(32) tinnot = Bool() fatca = Bool() optionalMutexes = [ ["statecode", "addlstatetaxwhagg"], ["stateidnum", "addlstatetaxwhagg"], ["statetaxwheld", "addlstatetaxwhagg"], ]
class TAX1099B_V100(Aggregate): """OFX tax extensions section 2.2.11""" srvrtid = String(10, required=True) taxyear = Integer(4, required=True) void = Bool() corrected = Bool() dtsale = DateTime() cusipnum = String(32) stkbnd = SubAggregate(STKBND) bartering = Decimal() fedtaxwh = Decimal() dscr = String(80) profit = Decimal() unrelprofitprev = Decimal() unrelprofit = Decimal() aggprofit = Decimal() extdbinfo_v100 = SubAggregate(EXTDBINFO_V100) payeraddr = SubAggregate(PAYERADDR, required=True) payerid = String(32, required=True) recaddr = SubAggregate(RECADDR) recid = String(32, required=True) recacct = String(32) tinnot = Bool()
class MSGSETCORE(Aggregate): """ OFX section 7.2.1 """ ver = Integer(required=True) url = String(255, required=True) ofxsec = OneOf('NONE', 'TYPE1', required=True) transpsec = Bool(required=True) signonrealm = String(32, required=True) language = OneOf(*LANG_CODES, required=True) syncmode = OneOf('FULL', 'LITE', required=True) refreshsupt = Bool() respfileer = Bool(required=True) spname = String(32) ofxextension = SubAggregate(OFXEXTENSION) @staticmethod def groom(elem): """ Remove proprietary tags e.g. INTU.XXX """ for child in set(elem): if '.' in child.tag: elem.remove(child) return super(MSGSETCORE, MSGSETCORE).groom(elem)
class XFERPROF(ElementList): """OFX section 11.13.2.2""" procdaysoff = ListElement(OneOf(*DAYS)) procendtm = Time(required=True) cansched = Bool(required=True) canrecur = Bool(required=True) canloan = Bool() canschedloan = Bool() canrecurloan = Bool() canmodxfers = Bool(required=True) canmodmdls = Bool(required=True) modelwnd = Integer(3, required=True) dayswith = Integer(3, required=True) dfltdaystopay = Integer(3, required=True)
class INVBUY(INVTRAN, SECID, ORIGCURRENCY): units = Decimal(required=True) unitprice = Decimal(4, required=True) markup = Decimal() commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) loanid = String(32) loanprincipal = Decimal() loaninterest = Decimal() inv401ksource = OneOf(*INV401KSOURCES) dtpayroll = DateTime() prioryearcontrib = Bool()
class REINVEST(Aggregate, Origcurrency): """ OFX section 13.9.2.4.4 """ invtran = SubAggregate(INVTRAN, required=True) secid = SubAggregate(SECID, required=True) incometype = OneOf(*INCOMETYPES, required=True) total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) units = Decimal(required=True) unitprice = Decimal(4, required=True) commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() taxexempt = Bool() currency = SubAggregate(CURRENCY) origcurrency = SubAggregate(ORIGCURRENCY) inv401ksource = OneOf(*INV401KSOURCES)
class INVSELL(INVTRAN, SECID, ORIGCURRENCY): units = Decimal(required=True) unitprice = Decimal(4, required=True) markdown = Decimal() commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() withholding = Decimal() taxexempt = Bool() total = Decimal(required=True) gain = Decimal() subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) loanid = String(32) statewithholding = Decimal() penalty = Decimal() inv401ksource = OneOf(*INV401KSOURCES)
class SONRQ(Aggregate): """ OFX section 2.5.1.5 """ dtclient = DateTime(required=True) userid = String(32) userpass = String(171) userkey = String(64) accesstoken = String(1000) genuserkey = Bool() language = OneOf(*LANG_CODES, required=True) fi = SubAggregate(FI) sesscookie = String(1000) appid = String(5, required=True) appver = String(4, required=True) appkey = String(10000) clientuid = String(36) usercred1 = String(171) usercred2 = String(171) authtoken = String(171) accesskey = String(1000) mfachallengeanswer = Unsupported() ofxextension = Unsupported()
class INVBUY(Aggregate, Origcurrency): """ OFX section 13.9.2.4.3 """ invtran = SubAggregate(INVTRAN, required=True) secid = SubAggregate(SECID, required=True) units = Decimal(required=True) unitprice = Decimal(4, required=True) markup = Decimal() commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() total = Decimal(required=True) currency = SubAggregate(CURRENCY) origcurrency = SubAggregate(ORIGCURRENCY) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) loanid = String(32) loanprincipal = Decimal() loaninterest = Decimal() inv401ksource = OneOf(*INV401KSOURCES) dtpayroll = DateTime() prioryearcontrib = Bool()
class SONRQ(Aggregate): """ OFX section 2.5.1.2 """ dtclient = DateTime(required=True) userid = String(32) userpass = String(171) userkey = String(64) accesstoken = String(1000) genuserkey = Bool() language = OneOf(*LANG_CODES, required=True) fi = SubAggregate(FI) sesscookie = String(1000) appid = String(5, required=True) appver = String(4, required=True) appkey = String(10000) clientuid = String(36) usercred1 = String(171) usercred2 = String(171) authtoken = String(171) accesskey = String(1000) mfachallengea = ListAggregate(MFACHALLENGEA) ofxextension = Unsupported() @classmethod def validate_args(cls, *args, **kwargs): # "Either <USERID> and <USERPASS> or <USERKEY>, but not both" userid = kwargs.get("userid", None) userpass = kwargs.get("userpass", None) userkey = kwargs.get("userkey", None) try: assert (userid and userpass) or userkey assert not ((userid or userpass) and userkey) except AssertionError: msg = ("{} must contain either <USERID> and <USERPASS> " "or <USERKEY>, but not both") raise ValueError(msg.format(cls.__name__)) super().validate_args(*args, **kwargs)
class INVSELL(Aggregate, Origcurrency): """ OFX section 13.9.2.4.3 """ invtran = SubAggregate(INVTRAN, required=True) secid = SubAggregate(SECID, required=True) units = Decimal(required=True) unitprice = Decimal(4, required=True) markdown = Decimal() commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() withholding = Decimal() taxexempt = Bool() total = Decimal(required=True) gain = Decimal() currency = SubAggregate(CURRENCY) origcurrency = SubAggregate(ORIGCURRENCY) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) loanid = String(32) statewithholding = Decimal() penalty = Decimal() inv401ksource = OneOf(*INV401KSOURCES)
class RECINTERCANRQ(Aggregate): """ OFX section 11.10.6.1 """ recsrvrtid = String(10, required=True) canpending = Bool(required=True)
class PMTMAILSYNCRQ(SyncRqList): """ OFX Section 12.8.2.1 """ incimages = Bool(required=True) usehtml = Bool(required=True) pmtmailtrnrq = ListItem(PMTMAILTRNRQ)
class TAX1099MSGSETV1(Aggregate): """ OFX tax extensions section 2.1 """ msgsetcore = SubAggregate(MSGSETCORE, required=True) tax1099dnld = Bool(required=True) extd1099b = Bool(required=True) taxyearsupported = Integer(required=True)
class STKBND(Aggregate): """OFX tax extensions section 2.2.11""" stkbndamt = Decimal(required=True) sbgros = Bool() sbgrosless = Bool()
class EMAILMSGSETV1(Aggregate): """ OFX section 9.4.2 """ msgsetcore = SubAggregate(MSGSETCORE, required=True) mailsup = Bool(required=True) getmimesup = Bool(required=True)
class CLIENTENROLL(Aggregate): """ OFX section 8.8 """ acctrequired = Bool(required=True)
class EMAILPROF(Aggregate): """OFX section 11.13.2.4""" canemail = Bool(required=True) cannotify = Bool(required=True)
class POSSTOCK(Aggregate): """ OFX section 13.9.2.6.1 """ invpos = SubAggregate(INVPOS, required=True) unitsstreet = Decimal() unitsuser = Decimal() reinvdiv = Bool()
class RECINTRACANRS(Aggregate): """ OFX section 11.10.3.2 """ recsrvrtid = String(10, required=True) canpending = Bool(required=True)
class INCPOS(Aggregate): """ OFX section 13.9.1.2 """ dtasof = DateTime() include = Bool(required=True)
class OOBUYDEBT(Aggregate): """ OFX section 13.9.2.5.2 """ oo = SubAggregate(OO, required=True) auction = Bool(required=True) dtauction = DateTime()
class MAILSYNCRQ(SyncRqList): """ OFX section 9.2.4 """ incimages = Bool(required=True) usehtml = Bool(required=True) mailtrnrq = ListItem(MAILTRNRQ)
class SECLISTMSGSETV1(Aggregate): """ OFX section 13.7.2.1 """ msgsetcore = SubAggregate(MSGSETCORE, required=True) seclistrqdnld = Bool(required=True)
class OOSELLMF(Aggregate): """ OFX section 13.9.2.5.2 """ oo = SubAggregate(OO, required=True) selltype = OneOf(*SELLTYPES, required=True) unittype = OneOf(*UNITTYPES, required=True) sellall = Bool(required=True)
class INCTRAN(Aggregate): """ OFX section 11.4.2.1 """ dtstart = DateTime() dtend = DateTime() include = Bool(required=True)
class SWITCHMF(Aggregate): """ OFX section 13.9.2.5.2 """ oo = SubAggregate(OO, required=True) secid = SubAggregate(SECID, required=True) unittype = OneOf(*UNITTYPES, required=True) switchall = Bool(required=True)