User:Woozle/blog/2009-09-05 0823 Balancing without a paddle
<hide> <let name=data index=Title>Balancing without a paddle</let> <let name=data index=User>Woozle</let> <let name=data index=TopicsUser></let> <let name=data index=TopicsGlobal>\online banking\finance</let> <let name=data index=TextAbove>So here's the kind of thing I mean about needing daily balances.</let> <let name=data index=TextBelow>On 9/1, I calculate a balance of $2490.43, which agrees with the online balance on that date.
4 days and 10 transactions later, I get that today's balance should be $1320.16 -- but the bank shows $1007.26. The problem is this: with all the things that will be coming out in the next few days, my balance by early next week will be something like $172.07 -- but that's assuming I actually have $1320.16 right now. If the bank's balance is correct, I'll go negative before that.
And I need to take out $100 for the Farmers' Market this morning. Do I have the money, or should I just be skipping the market this weekend? Too bad, I already ordered $100 worth of chicken from Fickle Creek.
I think I have to assume that the bank's balance is wrong. I've checked every transaction amount against the online list, and can't find any problems -- but all I have is *my* record that their balance was $2490.43 on 9/1, so I can't just go forward from that to show the error; I have to go reconcile against the last statement -- which hasn't arrived yet -- unless I want to go all the way back to 8/1.
Maybe they slipped in another transaction while I wasn't looking, so their balance for 9/1 isn't $2490.43 anymore.
*headdesk*
Updates
- 09:47 Bank statements are available online, and the last one was 8/15 -- where my balance agrees with theirs. So we just have to look at a little over 2 weeks -- some 33 transactions.
- 09:58 Downloaded a CSV of the last month of transactions, plonked it into OpenOffice, ran the balance forward from 8/15 -- and it agrees with the bank's balance ($1007.26). So now I can compare the balance line-by-line and see where the discrepancy pops up. It's after the $2490.43, because it still agrees at that point. That just leaves a dozen or so lines...
- 10:06 Turned out to be simple enough -- in my haste, I somehow didn't reconcile the last 3 transactions. They were already accounted for in my figuring through to next week, but not in the balance I was comparing to... so I won't go negative, as I suspected.
</let>
<let name=data index=TimeStamp>2009-09-05 0823</let> </hide><if not flag=including>==GetLinkBrief()== <func GetLinkBrief>
<let name=links.out>
- </let>
<let name=links.out append copy=data[Date] /> <let name=links.out append> :[[</let> <let name=links.out append copy=pg_title /> <let name=links.out append>|more]]:[[Talk:</let> <let name=links.out append copy=pg_title /> <let name=links.out append>|talk]]: </let>
<if flag=$data[wpage]>
<let name=wtLink>[[</let>
<let name=wtLink append copy=data[wpage] />
<let name=wtLink append>|</let>
<let name=wtLink append copy=data[Title] />
<let name=wtLink append>]] § </let>
</if><else>
<let name=wtLink>[</let>
<let name=wtLink append copy=data[URL] />
<let name=wtLink append> </let>
<let name=wtLink append copy=data[Title] />
<let name=wtLink append>]</let>
</else>
<let name=links.out append copy=wtLink /> <let name=links.out append> § </let>
<let name=text copy=data[TextShort] />
<if flag=$text></if><else>
<let name=text copy=data[Text] len=200 />
</else>
<let name=links.out append copy=text trim /> <let name=links.out append> [[</let> <let name=links.out append copy=pg_title /> <let name=links.out append>|more...]]</let>
</func>
ShowRecentLinks(max)
<func ShowRecentLinks max>
<let name=idx />
<let name=including val=1 />
<for table="qryW3_Titles_Catgs" where="(cl_to='Data/links') AND (page_namespace=0)" sort="page_title DESC" limit=$max name=pg hide>
<let name=pg_title val="@row.page_title" />
<let name=idx inc />
<if not flag=$noLoad>
<load page=$pg_title />
</if>
<if flag=$data[Title]>
<call GetLinkBrief />
</if><else>
<let name=links.out>
- [[</let>
<let name=links.out append copy=pg_title />
<let name=links.out append>]]</let>
</else>
<let name=links.rtn append copy=links.out />
<let name=links.out />
<let name=data />
</for>
</func>
ShowTopic(iTopic,iMax)
This should eventually be able to show data in any format: news links, blog entries... <func ShowTopic iTopic iMax>
<let name=idx /> <let name=including val=1 /> <let name=topic farg=iTopic /> <if not flag=$topic> <let name=topic parse>Woozle/blog/2009-09-05 0823 Balancing without a paddle</let> </if> <let name=topic self with="_"> </let>
<let name=sqlWhere>(page_namespace=0) AND (cl_to='</let> <let name=sqlWhere append copy=topic /> <let name=sqlWhere append>')</let>
<for table="qryW3_Titles_Catgs" where=$sqlWhere sort="page_title DESC" name=pg empty="no items yet" limit=$iMax hide>
<let name=pg_title val="@row.page_title" />
<let name=idx inc />
<if not flag=$noLoad>
<load page=$pg_title local />
</if>
<if flag=$data[Title]>
<call GetBrief />
</if><else>
<let name=links.out>
- [[</let>
<let name=links.out append copy=pg_title />
<let name=links.out append>]]</let>
</else>
<let name=exclude val=0 />
<let name=links.rtn append copy=links.out />
<let name=data null />
</for>
</func>
GetBlogEntryBrief()
<func GetBlogEntryBrief> INPUT:
data[*] - from blog entry page pg_name - full name of page being displayed (including namespace)
<if not flag=$noLoad>
<load page=$pg_name />
</if>
<let name=e.out>
- </let>
<let name=e.out append copy=data[TimeStamp] /> <let name=e.out append> [[</let> <let name=e.out append copy=pg_name /> <let name=e.out append>|</let> <let name=e.out append copy=data[Title] /> <let name=e.out append>]] § </let>
<let name=text copy=data[TextAbove] />
<if flag=$text></if><else>
<let name=text copy=data[TextBelow] len=200 />
</else>
<let name=e.out append copy=text trim /> <let name=e.out append> [[</let> <let name=e.out append copy=pg_name /> <let name=e.out append>|more...]]</let>
</func>
GetBlogEntryBriefChrisFormat()
<func GetBlogEntryBriefChrisFormat> INPUT:
data[*] - from blog entry page pg_name - full name of page being displayed (including namespace)
<if not flag=$noLoad>
<load page=$pg_name />
</if>
<let name=e.out></let> <let name=e.out append>[[</let> <let name=e.out append copy=pg_name /> <let name=e.out append>|</let> <let name=e.out append copy=data[Title] /> <let name=e.out append>]], </let> <let name=e.out append copy=data[TimeStamp] /> <let name=e.out append>
</let>
<let name=text copy=data[TextAbove] />
<if flag=$text></if><else>
<let name=text copy=data[TextBelow] len=200 />
</else>
<let name=e.out append copy=text trim /> <let name=e.out append> [[</let> <let name=e.out append copy=pg_name /> <let name=e.out append>|more...]]
</let> </func>
GetBlogEntryFull()
<func GetBlogEntryFull> INPUT:
data[*] - from blog entry page pg_name - full name of page being displayed (including namespace)
<if not flag=$noLoad>
<load page=$pg_name />
</if>
<let name=e.out>
==</let>
<let name=e.out append copy=data[Title] /> <let name=e.out append>==
posted at </let>
<let name=e.out append copy=data[TimeStamp] /> <let name=e.out append>
</let>
<let name=e.out append copy=data[TextAbove] /> <let name=e.out append copy=BlogFoldDivider /> <let name=e.out append copy=data[TextBelow] />
-- category display
<let name=e.out append copy=BlogFoldDivider /> <let name=e.out append>
Categories –</let>
<let name=noCat val=1 />
<call MakeBlogCatgs />
<if flag=$wtCatGlob>
<let name=e.out append> general: </let>
<let name=e.out append copy=wtCatGlob>
</if>
<if flag=$wtCatUser>
<let name=e.out append> user: </let>
<let name=e.out append copy=wtCatUser>
</if>
<let name=e.out append></let>
</let> </func>
ShowRecentBlogEntries(max,funcEntry)
<func ShowRecentBlogEntries max funcEntry>
<let name=idx />
<if not flag=$funcEntry>
<let name=funcEntry val="GetBlogEntryBrief" />
</if>
<let name=including val=1 />
<for table="qryW3_Titles_Catgs" where="(cl_to='Data/blog/post')" sort="page_title DESC" limit=$max name=pg hide>
<let name=pg_nspace_code>{{ns:</let>
<let name=pg_nspace_code append val=@row.page_namespace />
<let name=pg_nspace_code append>}}</let>
<let name=pg_nspace copy=pg_nspace_code parse />
<let name=pg_title val="@row.page_title" />
<let name=pg_name copy=pg_nspace />
<let name=pg_name append>:</let>
<let name=pg_name append copy=pg_title />
<let name=idx inc />
<call func=$funcEntry />
<let name=e.rtn append copy=e.out />
<let name=data />
</for>
</func>
ShowRecentBlogEntriesFull(max)
<func ShowRecentBlogEntriesFull max>
<let name=idx />
<let name=including val=1 />
<for table="qryW3_Titles_Catgs" where="(cl_to='Data/blog/post')" sort="page_title DESC" limit=$max name=pg hide>
<let name=pg_nspace_code>{{ns:</let>
<let name=pg_nspace_code append val=@row.page_namespace />
<let name=pg_nspace_code append>}}</let>
<let name=pg_nspace copy=pg_nspace_code parse />
<let name=pg_title val="@row.page_title" />
<let name=pg_name copy=pg_nspace />
<let name=pg_name append>:</let>
<let name=pg_name append copy=pg_title />
<let name=idx inc />
<call GetBlogEntryFull />
<let name=e.rtn append copy=e.out />
<let name=data />
</for>
</func>
ShowRecentBlogEntriesByTopic(max,topic)
<func ShowRecentBlogEntriesByTopic max topic>
<let name=topic self with="_"> </let>
<let name=sql>(cl_to='</let> <let name=sql>SELECT q1.* FROM qryW3_Titles_Catgs AS q1 LEFT JOIN qryW3_Titles_Catgs AS q2 ON q1.cl_from=q2.cl_from WHERE (q1.cl_to='Data/blog/post') AND (q2.cl_to='</let> <let name=sql append copy=topic /> <let name=sql append>') ORDER BY page_title DESC LIMIT </let> <let name=sql append copy=max />
<for sql=$sql>
<let name=pg_nspace_code>{{ns:</let>
<let name=pg_nspace_code append val=@row.page_namespace />
<let name=pg_nspace_code append>}}</let>
<let name=pg_nspace copy=pg_nspace_code parse />
<let name=pg_title val="@row.page_title" />
<let name=pg_name copy=pg_nspace />
<let name=pg_name append>:</let>
<let name=pg_name append copy=pg_title />
<let name=idx inc />
<let name=data[Title] null />
<load page=$pg_name />
<if flag=$data[Title]>
<call GetBlogEntryBrief />
<let name=e.rtn append copy=e.out />
</if>
<let name=data />
</for>
</func>
MakeBlogCatgs()
<func MakeBlogCatgs>
<let name=catUser copy=data[TopicsUser] /> <let name=catGlob copy=data[TopicsGlobal] /> <let name=wtCatUser null /> <xploop list=$catUser var=topic> <let name=wtCatUser append> [[user:</let> <let name=wtCatUser append copy=data[User] /> <let name=wtCatUser append>/</let> <let name=wtCatUser append copy=topic /> <let name=wtCatUser append>|</let> <let name=wtCatUser append copy=topic /> <let name=wtCatUser append>]]</let>
<let name=wtCatUser append>[[:category:user/</let> <let name=wtCatUser append copy=data[User] /> <let name=wtCatUser append>/</let> <let name=wtCatUser append copy=topic /> <let name=wtCatUser append>|c]]</let>
<if not flag=$noCat>
<let name=wtCatUser append> [[category:user/</let>
<let name=wtCatUser append copy=data[User] />
<let name=wtCatUser append>/</let>
<let name=wtCatUser append copy=topic />
<let name=wtCatUser append>|</let>
<let name=wtCatUser append copy=topic />
<let name=wtCatUser append>]]</let>
</if>
</xploop>
<let name=wtCatGlob null />
<xploop list=$catGlob var=topic>
<let name=wtCatGlob append> [[</let>
<let name=wtCatGlob append copy=topic />
<let name=wtCatGlob append>]]</let>
<let name=wtCatGlob append>[[:category:</let> <let name=wtCatGlob append copy=topic /> <let name=wtCatGlob append>|c]]</let>
<if not flag=$noCat>
<let name=wtCatGlob append>[[category:</let>
<let name=wtCatGlob append copy=topic />
<let name=wtCatGlob append>]]</let>
</if>
</xploop>
</func>
ShowBlogPostPage()
<func ShowBlogPostPage>
<let name=PostDate copy=data[TimeStamp] len=10 /> <let name=wtDate>[[</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]] ([[:category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>|category]])</let>
<let name=wtDate append>[[category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]]</let>
<let name=wtTitle>
==</let>
<let name=wtTitle append copy=data[Title] /> <let name=wtTitle append>==</let> <if flag=$data[TextAbove]> <let name=wtTextBrief>
In Brief </let>
<let name=wtTextFull>
The Rest </let>
<let name=wtTextBrief append copy=data[TextAbove] /> </if><else> <let name=wtTextBrief null /> </else> <let name=wtTextFull append copy=data[TextBelow] />
<call MakeBlogCatgs />
General categories for blog posts: -- the fact that it's a post:
<let name=wtCatGlob append></let>
-- date:
<let name=wtCatGlob append>[[category:</let> <let name=wtCatGlob append copy=PostDate len=10 /> -- just the date for the category <let name=wtCatGlob append>|]]</let> <let name=wtCatGlob append copy=PostDate /> -- full timestamp for sorting <let name=wtCatGlob append>]]</let>
<let name=user copy=data[User] /> <if flag=$user> <let name=wtUser>[[user:</let> <let name=wtUser append copy=user /> <let name=wtUser append>|</let> <let name=wtUser append copy=user /> <let name=wtUser append>]]</let> </if><else> <let name=wtUser>unknown</let> </else> <echo>
<get name=wtTitle /> <get name=data index=Text /><get name=wtTextBrief /><get name=wtTextFull />
</func>
ShowBlogPostPage_v2()
<func ShowBlogPostPage_v2>
<let name=PostDate copy=data[TimeStamp] len=10 /> <let name=wtDate>[[</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]] ([[:category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>|category]])</let>
<let name=wtDate append>[[category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]]</let>
<let name=wtTitle>
==</let>
<let name=wtTitle append copy=data[Title] /> <let name=wtTitle append>==</let> <if flag=$data[TextAbove]> <let name=wtTextBrief>
In Brief </let>
<let name=wtTextFull>
The Rest </let>
<let name=wtTextBrief append copy=data[TextAbove] /> </if><else> <let name=wtTextBrief null /> </else> <let name=wtTextFull append copy=data[TextBelow] />
<call MakeBlogCatgs />
General categories for blog posts: -- the fact that it's a post:
<let name=wtCatGlob append></let>
-- date:
<let name=wtCatGlob append>[[category:</let> <let name=wtCatGlob append copy=PostDate len=10 /> -- just the date for the category <let name=wtCatGlob append>|]]</let> <let name=wtCatGlob append copy=PostDate /> -- full timestamp for sorting <let name=wtCatGlob append>]]</let>
<let name=user copy=data[User] /> <if flag=$user> <let name=wtUser>[[user:</let> <let name=wtUser append copy=user /> <let name=wtUser append>|</let> <let name=wtUser append copy=user /> <let name=wtUser append>]]</let> </if><else> <let name=wtUser>unknown</let> </else> <echo>
<get name=wtTitle /> <get name=data index=Text /><get name=wtTextBrief /><get name=wtTextFull />
Specs | |
| Timestamp: | <get name=PostDate /> |
| Author: | <get name=wtUser /> |
| User topics: | <get name=wtCatUser /> |
| Global topics: | <get name=wtCatGlob /> |
</func>
ShowBlogPostPage_v1()
<func ShowBlogPostPage_v1>
<let name=PostDate copy=data[TimeStamp] len=10 /> <let name=wtDate>[[</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]] ([[:category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>|category]])</let>
<let name=wtDate append>[[category:</let> <let name=wtDate append copy=PostDate /> <let name=wtDate append>]]</let>
<let name=wtTitle>
==</let>
<let name=wtTitle append copy=data[Title] /> <let name=wtTitle append>==</let> <if flag=$data[TextAbove]> <let name=wtTextBrief>
In Brief
</let>
<let name=wtTextFull>
Full Story
</let>
<let name=wtTextBrief append copy=data[TextAbove] /> </if><else> <let name=wtTextBrief null /> </else> <let name=wtTextFull append copy=data[TextBelow] />
<call MakeBlogCatgs />
General categories for blog posts: -- the fact that it's a post:
<let name=wtCatGlob append></let>
-- date:
<let name=wtCatGlob append>[[category:</let> <let name=wtCatGlob append copy=PostDate len=10 /> -- just the date for the category <let name=wtCatGlob append>|]]</let> <let name=wtCatGlob append copy=PostDate /> -- full timestamp for sorting <let name=wtCatGlob append>]]</let>
<let name=user copy=data[User] /> <if flag=$user> <let name=wtUser>[[user:</let> <let name=wtUser append copy=user /> <let name=wtUser append>|</let> <let name=wtUser append copy=user /> <let name=wtUser append>]]</let> </if><else> <let name=wtUser>unknown</let> </else> <echo>
Specs
| Timestamp: | <get name=PostDate /> |
| Author: | <get name=wtUser /> |
| User topics: | <get name=wtCatUser /> |
| Global topics: | <get name=wtCatGlob /> |
<get name=wtTitle /> <get name=data index=Text /><get name=wtTextBrief /><get name=wtTextFull /></echo> </func><call ShowBlogPostPage></if>
