class CLOSUREOPT(INVTRAN, SECID): optaction = OneOf('EXERCISE', 'ASSIGN', 'EXPIRE') units = Decimal(required=True) shperctrct = Integer(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) relfitid = String(255) gain = Decimal()
class INCOME(INVTRAN, SECID, ORIGCURRENCY): incometype = OneOf(*INCOMETYPES, required=True) total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) taxexempt = Bool() withholding = Decimal() inv401ksource = OneOf(*INV401KSOURCES)
class SPLIT(INVTRAN, SECID): subacctsec = OneOf(*INVSUBACCTS, required=True) oldunits = Decimal(required=True) newunits = Decimal(required=True) numerator = Decimal(required=True) denominator = Decimal(required=True) fraccash = Decimal() subacctfund = OneOf(*INVSUBACCTS) inv401ksource = OneOf(*INV401KSOURCES)
class TRANSFER(INVTRAN, SECID): subacctsec = OneOf(*INVSUBACCTS, required=True) units = Decimal(required=True) tferaction = OneOf('IN', 'OUT', required=True) postype = OneOf('SHORT', 'LONG', required=True) avgcostbasis = Decimal() unitprice = Decimal() dtpurchase = DateTime() inv401ksource = OneOf(*INV401KSOURCES)
class INVPOS(SECID, CURRENCY): heldinacct = OneOf(*INVSUBACCTS, required=True) postype = OneOf('SHORT', 'LONG', required=True) units = Decimal(required=True) unitprice = Decimal(4, required=True) mktval = Decimal(required=True) dtpriceasof = DateTime(required=True) memo = String(255) inv401ksource = OneOf(*INV401KSOURCES)
class DEBTINFO(SECINFO): parvalue = Decimal(required=True) debttype = OneOf('COUPON', 'ZERO', required=True) debtclass = OneOf('TREASURY', 'MUNICIPAL', 'CORPORATE', 'OTHER') couponrt = Decimal(4) dtcoupon = DateTime() couponfreq = OneOf('MONTHLY', 'QUARTERLY', 'SEMIANNUAL', 'ANNUAL', 'OTHER') callprice = Decimal(4) yieldtocall = Decimal(4) dtcall = DateTime() calltype = OneOf('CALL', 'PUT', 'PREFUND', 'MATURITY') ytmat = Decimal(4) dtmat = DateTime() assetclass = OneOf(*ASSETCLASSES) fiassetclass = String(32)
class STOCKINFO(SECINFO): stocktype = OneOf('COMMON', 'PREFERRED', 'CONVERTIBLE', 'OTHER') yld = Decimal(4) dtyieldasof = DateTime() typedesc = String(32) assetclass = OneOf(*ASSETCLASSES) fiassetclass = String(32) def __init__(self, elem): """ Rename 'yield' (Python reserved word) to 'yld' """ extra_attrs = {} # Do all XPath searches before removing nodes from the tree # which seems to mess up the DOM in Python3 and throw an # AttributeError on subsequent searches. yld = elem.find('./YIELD') if yld is not None: # Rename; save for later extra_attrs['yld'] = yld.text elem.remove(yld) super(STOCKINFO, self).__init__(elem) # Add back data previously stripped/mangled for attr, val in extra_attrs.items(): setattr(self, attr, val)
class OPTINFO(SECINFO): opttype = OneOf('CALL', 'PUT', required=True) strikeprice = Decimal(required=True) dtexpire = DateTime(required=True) shperctrct = Integer(required=True) assetclass = OneOf(*ASSETCLASSES) fiassetclass = String(32) def __init__(self, elem): """ Strip SECID of underlying so it doesn't overwrite SECID of option during _flatten() """ # Do all XPath searches before removing nodes from the tree # which seems to mess up the DOM in Python3 and throw an # AttributeError on subsequent searches. secid = elem.find('./SECID') if secid is not None: # A <SECID> aggregate referring to the security underlying the # option is, in general, *not* going to be contained in <SECLIST> # (because you don't necessarily have a position in the underlying). # Since the <SECID> for the underlying only gives us fields for # (uniqueidtype, uniqueid) we can't really go ahead and use this # information to create a corresponding SECINFO instance (since we # lack information about the security subclass). It's unclear that # the SECID of the underlying is really needed for anything, so we # disregard it. elem.remove(secid) super(OPTINFO, self).__init__(elem)
class STOCKINFO(SECINFO): stocktype = OneOf('COMMON', 'PREFERRED', 'CONVERTIBLE', 'OTHER') yld = Decimal(4) dtyieldasof = DateTime() typedesc = String(32) assetclass = OneOf(*ASSETCLASSES) fiassetclass = String(32)
class OPTINFO(SECINFO): opttype = OneOf('CALL', 'PUT', required=True) strikeprice = Decimal(required=True) dtexpire = DateTime(required=True) shperctrct = Integer(required=True) assetclass = OneOf(*ASSETCLASSES) fiassetclass = String(32)
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 SECINFO(CURRENCY, SECID): # FIs abuse SECNAME/TICKER # Relaxing the length constraints from the OFX spec does little harm #secname = String(120, required=True) #ticker = String(32) secname = String(255, required=True) ticker = String(255) fiid = String(32) rating = String(10) unitprice = Decimal() dtasof = DateTime() memo = String(255)
class REINVEST(INVTRAN, SECID, ORIGCURRENCY): incometype = OneOf(*INCOMETYPES, required=True) total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS) units = Decimal(required=True) unitprice = Decimal(4, required=True) commission = Decimal() taxes = Decimal() fees = Decimal() load = Decimal() taxexempt = Bool() inv401ksource = OneOf(*INV401KSOURCES)
class STMTTRN(TRAN, ORIGCURRENCY): trntype = OneOf('CREDIT', 'DEBIT', 'INT', 'DIV', 'FEE', 'SRVCHG', 'DEP', 'ATM', 'POS', 'XFER', 'CHECK', 'PAYMENT', 'CASH', 'DIRECTDEP', 'DIRECTDEBIT', 'REPEATPMT', 'OTHER', required=True) dtposted = DateTime(required=True) dtuser = DateTime() dtavail = DateTime() trnamt = Decimal(required=True) correctfitid = Decimal() correctaction = OneOf('REPLACE', 'DELETE') checknum = String(12) refnum = String(32) sic = Integer() payeeid = String(12) name = String(32) memo = String(255) inv401ksource = OneOf(*INV401KSOURCES) payee = None bankacctto = None ccacctto = None
class MFINFO(SECINFO): mftype = OneOf('OPENEND', 'CLOSEEND', 'OTHER') yld = Decimal(4) dtyieldasof = DateTime() mfassetclass = [] fimfassetclass = [] def __init__(self, elem): """ Strip MFASSETCLASS/FIMFASSETCLASS - lists that will blow up _flatten() Rename 'yield' (Python reserved word) to 'yld' """ extra_attrs = {} # Do all XPath searches before removing nodes from the tree # which seems to mess up the DOM in Python3 and throw an # AttributeError on subsequent searches. mfassetclass = elem.find('./MFASSETCLASS') fimfassetclass = elem.find('./FIMFASSETCLASS') yld = elem.find('./YIELD') if mfassetclass is not None: # Convert PORTIONs; save for later extra_attrs['mfassetclass'] = [ Aggregate.from_etree(p) for p in mfassetclass ] elem.remove(mfassetclass) if fimfassetclass is not None: # Convert FIPORTIONs; save for later extra_attrs['fimfassetclass'] = [ Aggregate.from_etree(p) for p in fimfassetclass ] elem.remove(fimfassetclass) if yld is not None: # Rename; save for later extra_attrs['yld'] = yld.text elem.remove(yld) super(MFINFO, self).__init__(elem) # Add back data previously stripped/mangled for attr, val in extra_attrs.items(): setattr(self, attr, val)
class MFINFO(SECINFO): mftype = OneOf('OPENEND', 'CLOSEEND', 'OTHER') yld = Decimal(4) dtyieldasof = DateTime() mfassetclass = [] fimfassetclass = [] def __init__(self, elem, strict=True): """ Strip MFASSETCLASS/FIMFASSETCLASS - lists that will blow up _flatten() """ extra_attrs = {} # Do all XPath searches before removing nodes from the tree # which seems to mess up the DOM in Python3 and throw an # AttributeError on subsequent searches. mfassetclass = elem.find('./MFASSETCLASS') fimfassetclass = elem.find('./FIMFASSETCLASS') if mfassetclass is not None: # Convert PORTIONs; save for later extra_attrs['mfassetclass'] = [ Aggregate.from_etree(p) for p in mfassetclass ] elem.remove(mfassetclass) if fimfassetclass is not None: # Convert FIPORTIONs; save for later extra_attrs['fimfassetclass'] = [ Aggregate.from_etree(p) for p in fimfassetclass ] elem.remove(fimfassetclass) super(MFINFO, self).__init__(elem, strict=strict) # Staple MFASSETCLASS/FIMFASSETCLASS onto MFINFO for attr, val in extra_attrs.items(): setattr(self, attr, val)
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 BAL(CURRENCY): name = String(32, required=True) desc = String(80, required=True) baltype = OneOf('DOLLAR', 'PERCENT', 'NUMBER', required=True) value = Decimal(required=True) dtasof = DateTime()
class INVBAL(Aggregate): availcash = Decimal(required=True) marginbalance = Decimal(required=True) shortbalance = Decimal(required=True) buypower = Decimal()
class SELLDEBT(INVSELL): sellreason = OneOf('CALL', 'SELL', 'MATURITY', required=True) accrdint = Decimal()
class SELLMF(INVSELL): selltype = OneOf(*SELLTYPES, required=True) avgcostbasis = Decimal() relfitid = String(255)
class PORTION(Aggregate): assetclass = OneOf(*ASSETCLASSES) percent = Decimal()
class RETOFCAP(INVTRAN, SECID, ORIGCURRENCY): total = Decimal(required=True) subacctsec = OneOf(*INVSUBACCTS, required=True) subacctfund = OneOf(*INVSUBACCTS, required=True) inv401ksource = OneOf(*INV401KSOURCES)
class MARGININTEREST(INVTRAN, ORIGCURRENCY): total = Decimal(required=True) subacctfund = OneOf(*INVSUBACCTS, required=True)
class JRNLSEC(INVTRAN, SECID): subacctto = OneOf(*INVSUBACCTS, required=True) subacctfrom = OneOf(*INVSUBACCTS, required=True) units = Decimal(required=True)
class JRNLFUND(INVTRAN): subacctto = OneOf(*INVSUBACCTS, required=True) subacctfrom = OneOf(*INVSUBACCTS, required=True) total = Decimal(required=True)
class FIPORTION(Aggregate): fiassetclass = String(32) percent = Decimal()
class POSMF(INVPOS): unitsstreet = Decimal() unitsuser = Decimal() reinvdiv = Bool() reinvcg = Bool()
class POSSTOCK(INVPOS): unitsstreet = Decimal() unitsuser = Decimal() reinvdiv = Bool()
class BUYDEBT(INVBUY): accrdint = Decimal()