diff --git a/invstmt_test.go b/invstmt_test.go
index 0a97a32..ec06697 100644
--- a/invstmt_test.go
+++ b/invstmt_test.go
@@ -557,3 +557,358 @@ func TestUnmarshalInvStatementResponse(t *testing.T) {
checkResponsesEqual(t, &expected, response)
}
+
+func TestUnmarshalInvStatementResponse102(t *testing.T) {
+ responseReader := strings.NewReader(`OFXHEADER: 100
+DATA: OFXSGML
+VERSION: 102
+SECURITY: NONE
+ENCODING: USASCII
+CHARSET: 1252
+COMPRESSION: NONE
+OLDFILEUID: NONE
+NEWFILEUID: NONE
+
+
+
+
+
+ 0
+ INFO
+
+ 20170403120000
+ ENG
+
+ VV
+ 1000
+
+ 1000
+
+
+
+
+ 1283719872
+
+ 0
+ INFO
+
+
+ 20170403120000
+ USD
+
+ www.exampletrader.com
+ 12341234
+
+
+ 20161206120000
+ 20170403120000
+
+
+
+ 12341234-20161207-1
+ 20161207120000
+ 20161208120000
+
+
+ SPY161216C00226000
+ CUSIP
+
+ -1.0000
+ 0.3500
+ 8.8500
+ 0.2600
+ 200.8900
+ CASH
+ CASH
+
+ SELLTOOPEN
+ 100
+
+
+
+ 12341234-20161215-1
+ 20161215120000
+ 20161220120000
+
+
+ 78462F10
+ CUSIP
+
+ ASSIGN
+ -100.0000
+ 100
+ CASH
+
+
+
+ 12341234-20161215-2
+ 20161215120000
+ 20161215120000
+
+
+ SPY161216C00226000
+ CUSIP
+
+ ASSIGN
+ 1.0000
+ 100
+ CASH
+
+
+
+
+
+
+ 04956010
+ CUSIP
+
+ CASH
+ LONG
+ 100
+ 79.0000
+ 79000
+ 20170403120000
+
+
+
+
+
+ 36960410
+ CUSIP
+
+ CASH
+ LONG
+ 100.00
+ 29.8700
+ 2987.00
+ 20170403120000
+
+
+
+
+ 0.0
+ -0.00
+ 0.00
+
+
+
+
+
+
+
+
+
+ 78462F10
+ CUSIP
+
+ SPDR S&P 500 ETF TRUST
+ SPY
+
+
+
+
+
+ SPY161216C00226000
+ CUSIP
+
+ SPY Dec 16 2016 226.00 Call
+ SPY 161216C00226000
+
+ CALL
+ 226.00
+ 20161216120000
+ 100
+
+
+
+`)
+ var expected ofxgo.Response
+ GMT := time.FixedZone("GMT", 0)
+
+ expected.Version = "102"
+ expected.Signon.Status.Code = 0
+ expected.Signon.Status.Severity = "INFO"
+ expected.Signon.DtServer = ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT))
+ expected.Signon.Language = "ENG"
+ expected.Signon.Org = "VV"
+ expected.Signon.Fid = "1000"
+ // Ignored 1000
+
+ var units1, unitprice1, commission1, fees1, total1, units2, units3 big.Rat
+ units1.SetFrac64(-1, 1)
+ unitprice1.SetFrac64(35, 100)
+ commission1.SetFrac64(885, 100)
+ fees1.SetFrac64(26, 100)
+ total1.SetFrac64(20089, 100)
+ units2.SetFrac64(-100, 1)
+ units3.SetFrac64(1, 1)
+
+ dtsettle1 := ofxgo.Date(time.Date(2016, 12, 8, 12, 0, 0, 0, GMT))
+ dtsettle2 := ofxgo.Date(time.Date(2016, 12, 20, 12, 0, 0, 0, GMT))
+ dtsettle3 := ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT))
+
+ invtranlist := ofxgo.InvTranList{
+ DtStart: ofxgo.Date(time.Date(2016, 12, 6, 12, 0, 0, 0, GMT)),
+ DtEnd: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
+ InvTransactions: []ofxgo.InvTransaction{
+ ofxgo.SellOpt{
+ InvSell: ofxgo.InvSell{
+ InvTran: ofxgo.InvTran{
+ FiTId: "12341234-20161207-1",
+ DtTrade: ofxgo.Date(time.Date(2016, 12, 7, 12, 0, 0, 0, GMT)),
+ DtSettle: &dtsettle1,
+ },
+ SecId: ofxgo.SecurityId{
+ UniqueId: "SPY161216C00226000",
+ UniqueIdType: "CUSIP",
+ },
+ Units: ofxgo.Amount(units1),
+ UnitPrice: ofxgo.Amount(unitprice1),
+ Commission: ofxgo.Amount(commission1),
+ Fees: ofxgo.Amount(fees1),
+ Total: ofxgo.Amount(total1),
+ SubAcctSec: "CASH",
+ SubAcctFund: "CASH",
+ },
+ OptSellType: "SELLTOOPEN",
+ ShPerCtrct: 100,
+ },
+ ofxgo.ClosureOpt{
+ InvTran: ofxgo.InvTran{
+ FiTId: "12341234-20161215-1",
+ DtTrade: ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT)),
+ DtSettle: &dtsettle2,
+ },
+ SecId: ofxgo.SecurityId{
+ UniqueId: "78462F10",
+ UniqueIdType: "CUSIP",
+ },
+ OptAction: "ASSIGN",
+ Units: ofxgo.Amount(units2),
+ ShPerCtrct: 100,
+ SubAcctSec: "CASH",
+ },
+ ofxgo.ClosureOpt{
+ InvTran: ofxgo.InvTran{
+ FiTId: "12341234-20161215-2",
+ DtTrade: ofxgo.Date(time.Date(2016, 12, 15, 12, 0, 0, 0, GMT)),
+ DtSettle: &dtsettle3,
+ },
+ SecId: ofxgo.SecurityId{
+ UniqueId: "SPY161216C00226000",
+ UniqueIdType: "CUSIP",
+ },
+ OptAction: "ASSIGN",
+ Units: ofxgo.Amount(units3),
+ ShPerCtrct: 100,
+ SubAcctSec: "CASH",
+ },
+ },
+ }
+
+ var availcash, marginbalance, shortbalance big.Rat
+ availcash.SetFrac64(0, 1)
+ marginbalance.SetFrac64(-0, 1)
+ shortbalance.SetFrac64(0, 1)
+
+ invbalance := ofxgo.InvBalance{
+ AvailCash: ofxgo.Amount(availcash),
+ MarginBalance: ofxgo.Amount(marginbalance),
+ ShortBalance: ofxgo.Amount(shortbalance),
+ }
+
+ var posunits1, posunitprice1, posmktval1, posunits2, posunitprice2, posmktval2 big.Rat
+ posunits1.SetFrac64(100, 1)
+ posunitprice1.SetFrac64(79, 1)
+ posmktval1.SetFrac64(79000, 1)
+ posunits2.SetFrac64(100, 1)
+ posunitprice2.SetFrac64(2987, 100)
+ posmktval2.SetFrac64(2987, 1)
+
+ statementResponse := ofxgo.InvStatementResponse{
+ TrnUID: "1283719872",
+ Status: ofxgo.Status{
+ Code: 0,
+ Severity: "INFO",
+ },
+ DtAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
+ CurDef: "USD",
+ InvAcctFrom: ofxgo.InvAcct{
+ BrokerId: "www.exampletrader.com",
+ AcctId: "12341234",
+ },
+ InvTranList: &invtranlist,
+ InvPosList: ofxgo.PositionList{
+ ofxgo.StockPosition{
+ InvPos: ofxgo.InvPosition{
+ SecId: ofxgo.SecurityId{
+ UniqueId: "04956010",
+ UniqueIdType: "CUSIP",
+ },
+ HeldInAcct: "CASH",
+ PosType: "LONG",
+ Units: ofxgo.Amount(posunits1),
+ UnitPrice: ofxgo.Amount(posunitprice1),
+ MktVal: ofxgo.Amount(posmktval1),
+ DtPriceAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
+ },
+ },
+ ofxgo.StockPosition{
+ InvPos: ofxgo.InvPosition{
+ SecId: ofxgo.SecurityId{
+ UniqueId: "36960410",
+ UniqueIdType: "CUSIP",
+ },
+ HeldInAcct: "CASH",
+ PosType: "LONG",
+ Units: ofxgo.Amount(posunits2),
+ UnitPrice: ofxgo.Amount(posunitprice2),
+ MktVal: ofxgo.Amount(posmktval2),
+ DtPriceAsOf: ofxgo.Date(time.Date(2017, 4, 3, 12, 0, 0, 0, GMT)),
+ },
+ },
+ },
+ InvBal: &invbalance,
+ }
+ expected.InvStmt = append(expected.InvStmt, &statementResponse)
+
+ var strikeprice big.Rat
+ strikeprice.SetFrac64(226, 1)
+
+ seclist := ofxgo.SecurityList{
+ Securities: []ofxgo.Security{
+ ofxgo.StockInfo{
+ SecInfo: ofxgo.SecInfo{
+ SecId: ofxgo.SecurityId{
+ UniqueId: "78462F10",
+ UniqueIdType: "CUSIP",
+ },
+ SecName: "SPDR S&P 500 ETF TRUST",
+ Ticker: "SPY",
+ },
+ },
+ ofxgo.OptInfo{
+ SecInfo: ofxgo.SecInfo{
+ SecId: ofxgo.SecurityId{
+ UniqueId: "SPY161216C00226000",
+ UniqueIdType: "CUSIP",
+ },
+ SecName: "SPY Dec 16 2016 226.00 Call",
+ Ticker: "SPY 161216C00226000",
+ },
+ OptType: "CALL",
+ StrikePrice: ofxgo.Amount(strikeprice),
+ DtExpire: ofxgo.Date(time.Date(2016, 12, 16, 12, 0, 0, 0, GMT)),
+ ShPerCtrct: 100,
+ },
+ },
+ }
+ expected.SecList = append(expected.SecList, &seclist)
+
+ response, err := ofxgo.ParseResponse(responseReader)
+ if err != nil {
+ t.Fatalf("Unexpected error unmarshalling response: %s\n", err)
+ }
+
+ checkResponsesEqual(t, &expected, response)
+}