Current

Row

Reserve

$76.6K

Operating

$23.8K

Income

$12,910

Expenses

$6,061

Row

BREAKDOWN OF EXPENSES

BUSINESS THIS MONTH

ITEM ANNOTATION
Tuesday 23 February, 2021 (present: N/A)
ATTENTION No board meeting this month. Composite Decks update pushed to March.
VOTING : Y=yes, N=no, A=abstain, U=unavailable

ON THE RADAR

PROJECT ACTION_BY
Lawns Contract Renewal: ML to provide options. 15-Mar-2021
Composite Decks : ML looking for quotes, 2 received so far, 2 to come. 15-Mar-2021
Rear Driveway : ML previously got us prices for complete resurface, both ~$50K. We now have a recommendation on how to resolve drainage issues for about $13K prior to resurfacing. 01-Apr-2021
By-Law repeal : Repeal amendment on board service that says 2 of 5 office-holders serve for 3 years and 3 of 5 serve for 2 years. Investigate how to repeal via 2021 AGM vote. 01-Aug-2021
Condo Docs Amendment #1 : Amendment to our Renting Covenant, we need to get specific wording correct to put to vote at AGM. 01-Aug-2021
Note:
The purpose of this table is to keep important upcoming project and task deadlines in focus.

Row

People

People

History

Row

HISTORY OF BOARD MEETINGS

ITEM ANNOTATION
Meeting on Tuesday 23 February, 2021 (present: N/A)
ATTENTION No board meeting this month. Composite Decks update pushed to March.
Meeting on Thursday 21 January, 2021 (present: JD, BC, GB, SB, JK, ML)
Financial ML has says our Operating account in good financial shape. Replenishment of Reserve should include $12K payback for amount used for operational deficiency ($24K was borrowed in 2019), plus a top-up for lack of replenishment in 2019. As per 2020 AGM minutes, board recommends $25.6K total for 2020, so far $7K put in (as per our 2020 budget), that leaves $18.6K outstanding. This will leave us with about $15K float in Operating coming into 2021.
Decks project ML has quotes from 2 contractors, and is waiting for 2 other contractors to present bids. Board will review when those 2 final bids come in. We have an engineering report to guide roll out. This project is important for safety reasons and to maintain property value. It is a condominium association responsibility but it is expensive and will need to be run over a several years. However, where safety is concerned, we must be prepared to deplete our Reserve.
Lawn Care ML to get quotes in next 30-45 days. Board were happy with previous contractor, at cost of about $7K for the season.
Board processes binder Karen Pauer has suggested: * Monthly meeting protocol, * Annual Meeting protocol, * New Owner process, * Amending the Condo Docs, * Filing a lien and removing a lien, * Communication to all Owners, * Reviewing the Financials. JD will check in with Karen Pauer, receive binder from her when she is ready, and add hardcopies of minutes.
Condo Docs Amendment #1 For voting on at next AGM. * Amendment to our Renting Covenant to allow renting to owner’s adult children (age 21 or older) or owner’s parents in the event the owner cannot live in the condo due to relocation etc. and does not want to sell it.
Condo Docs Amendment #2 For voting on at next AGM. * Amendment to our covenants to include all the rules we identified and sent to owners awhile back. We need to have those somewhere official in case there is a violation and we get pushback. JD will ask Karen Pauer for her wording suggestion so we can vote on its inclusion in next AGM at a future board meeting.
Bank accounts ML says moving acounts to Capitol Bank would save him time, but not a lot, and it will not assist his financial reporting task. ML will check on impact of change to Capitol Bank with regard to fees and will report back to board.
Other Business GB was told by resident that to use TDS fibre needed an approval by board/management, ML will follow up. ML says our pest control service has started. BC says we have a repeat offender dog pooper by our mailbox near buildings 1 & 2. BC says the new blacktop on driveway was laid on top of the old, not saw-cut out and replaced. It has a lip around patch and now the snow plow is damaging the new surface (which is not the snow contractor’s fault). ML will seek clarification that the work was done to spec.
VOTE #1 Reserve replenishment : Amount $18.6K, JD=Y, BC=Y, JK=Y, SB=Y, GB=Y (carried).
VOTE #2 Condo Doc Ammendment #1: Vote on this at AGM, wording must be very specific and is TBD. JD=Y, BC=Y, JK=Y, SB=Y, GB=Y (carried).
VOTING : Y=yes, N=no, A=abstain, U=unavailable

YEAR-TO-DATE BUDGET COMPARISON

ITEM $ Actual to date $ Annual budget
INCOME
Condo Fee Income 11,520 76,320
Misc. Income 190
Unallocated Prepays 1,200
TOTAL 12,910 76,320
EXPENSE
Bank Charges 25
Common Area Cleaning 200 3,000
Fire Safety 2,500
Gas & Electric 338 3,500
Insurance 2,056 10,200
Lawn Care & Landscaping 448 7,000
Legal & Accounting 250
Management Fees 468 5,616
Misc. Admin 27 500
Pest Control 390 1,020
Repairs & Maintenance 455 5,980
Snow Removal 1,488 10,775
Water & Sewer 191 2,000
TOTAL 6,061 52,366
RESERVE
Catch-up for FY:2019 18,600
Replenishment 10,000
CAPEX
As at Sunday 31 January, 2021

PERCENT BUDGET UPTAKE TO DATE

% YEAR ELAPSED

% INCOME RECEIVED

% EXPENSE INCURRED

% RESERVE REPLENISHED

Row

People

People

Year 2020

Row

2020 BOARD MEETINGS

ITEM ANNOTATION
Meeting on Thursday 17 December, 2020 (present: JD, BC, GB, SB, JK[belated])
OBSERVERS New to board in 2021 : Gary Buehler (GB) and Shaun Byrnes (SB).
Financial Operating account in good shape, we have surplus to replenish Reserve, we put in $7K already and expect to replenish about another $20K
By-Law repeal By-Law Amendment on board service that says 2/5 office-holders serve for 3 years and 3/5 serve for 2 years. JD thinks, now we are under management, we would be better served by previous rule of 1 year appointments. Motion to investigate HOW to repeal.
2021 Board Slate as follows : President=Gary Buehler (GB), Secretary=James Davies (JD), Treasurer=Shaun Byrnes (SB), VP#1=Jamie Karls (JK), VP#2=Bob Christensen (BC).
Board processes binder JD suggested as secretary he maintain binder after received from KP. JD to liaise with KP to resolve.
Manager meeting invite Bruner include 4 manager-attended meetings per year in contract, consider inviting ML to January meeting for end-of-year financial wrap, update on decks/railings project and to introduce new board.
Snow contractor concerns BC sent email to ML who will address with contractor. Specifically, late snow removal, bad position of snow pile where we put bins for trash pick-up, snow left un-shoveled by door on deck of single story end units. Board to continue to apprise ML of concerns as necessary.
Bank accounts Moving association bank accounts to Capitol Bank (where majority of Bruner-managed properties have accounts) could benefit association by access to Bruner’s system for reporting. ML communicated that would save him time, but not a lot. Discussion deferred to next month’s meeting.
VOTE #1 By-Law repeal : Investigate WHAT we need to do to repeal this Condo By-Law Amendment AND to put up as a votable item at next AGM. JD=Y, BC=Y, [JK offline] (carried).
VOTE #2 Manager meeting invite : Invite ML to January 2021 meeting. JD=Y, BC=Y, JK=Y (carried).
Meeting on Monday 23 November, 2020 (present: N/A)
NOTICE No November meeting, date above is dashboard publication date. Thus there are no board deliberations to report. Instead below is a quick note on the AGM followed by some explanation of October expenses.
AGM Held on 05-Nov-2020 @ 7pm via Zoom and telephone, minutes due for distributiion week of 23-Nov-2020.
R&M Repairs & Maintenance is high this month at $1,473; it includes: Menards supplies (dehumidifier) $278, sump pump redirect $475, exterior light repairs $720.
LEGAL Legal retainers were returned to the association, reducing our year-to-date spend in category “Legal & Accounting” to about $300.
INSURANCE Our new insurance premiums are now paid quarterly. $3,860 represents 25% of primary policy premium plus 100% of some additional coverages. The annual total premium for period Oct-2020 to Sep-2021 is $10.2K, as shown in the budget adopted at the AGM.
Meeting on Monday 26 October, 2020 (present: ML, KP, BC, JK, JD)
AGM Planning ML showed plans for AGM agenda and info packet. We agreed to re-order agenda items so that a review of the year and future plans were expounded before financials were discussed. We agreed to in-meeting voting (rather than by mail) and that at meeting end ML would call on each attendee in turn to respond to all votable items en bloc. Two budgets to be presented.
Drainage ML showed quote for underground drainage beneath rear driveway. The proposal gathers all backward directed building downpipes (including those currently directed into retaining wall area between buildings) and runs them underground to the other side of rear driveway. It also calls for swales to be built at strategic locations. The work would sensibly be done about one month before a driveway re-surfacing. Cost estimate is approx. $13K, contractor is A.L. Landscaping.
Rear Driveway ML presented a quote to patch one or two very bad parts of the rear driveway to tide us over until we have the funds for complete asphalt re-surface. Contractor is Hallman Asphalt & Sealing and cost estimate is $5.5K for main problem area behind building #2 (red zone), add $900 for the bad patch up by top of building #1 (blue zone).
VOTE #1 Driveway : Patch the worst area behind building #2, identified on Hallman Asphalt & Sealing quote as “red zone”, for $5.5K. JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #2 Driveway (via email on 28-Oct): Patch the second bad area close to (our neighbor) Stratton Glen’s driveway behind building #1, identified on Hallman Asphalt & Sealing quote as “blue zone”, for additional $900. JD=A, KP=N, BC=Y, JK=Y (carried).
Meeting on Monday 21 September, 2020 (present: ML, KP, BC, JK, JD)
Actions from last meeting ML followed up with Dave Miller re deck slope on recently installed deck + resident reported still some water ingress on very wet days, ML to reach out to contractor again. Also waiting for same contractor to advise/fix railings wobble on new decks.
Financial Status ML says we are in pretty good shape for neutral or better Operating costs compared to Budget for 2020. Resident fees all up to date. Received retainer refunds from lawyers, should go into Operating and will reduce our annual legal bill to just a few hundred $.
Email vote confirmation See Fire Alarm Monitoring & Snow Removal VOTE #1 & #2 below.
Insurance Contract Reviewed proposal from Robertson Ryan & Associates decided to go with them and save at least $6K/year compared to renewal quote from current broker. See VOTE #3 below.
Projects Driveway – status is that drainage engineer offered a free but informal appraisal saying that if we employed a specialist/experienced grading contractor to work alongside asphalt contractor then our drainage issues should be resolved at the time of driveway replacement. BC reminded us that we do still have an option to heat patch. Railings - no quotes yet for railings project, ML to arrange and to include guard rails for lower-level units near the retaining wall edge. KP said to expect this to be expensive, but agreed that we would like to see in a quote. Drywall replacement - new quote for $1,050 much better than original of almost $3K, board agreed (without vote) to move forward with this contractor.
Miscellaneous Items Do we have occupants not on property title? - how does this relate to Condo rules on owner-occupiers only, ML to investigate. Raccoons sighted on resident’s deck, might be due to spillage from bird-feeders, ML to investigate.
Annual Meeting Logistics Various options discussed, decided on Zoom meeting hosted on Bruner’s paid Zoom account with phone-in option for those who do not want to use computer (so just like a telephone conference call). ML will run meeting. Date/time set to Thursday 5 November @7pm. Notices to be mailed 30 days prior with supporting materials mailed about 1 week prior. N.B. We will test technology by having ML host next meeting (see next). [Note, to get early votes and proxies in for AGM, maybe info packet must be 2 weeks prior?]
Budget ML will prepare a few budget options, board will vet & adjust with aim to find two candidates for residents to vote on at AGM. ML to host Zoom meeting when we are ready to discuss his budget options and to finalize AGM plans.
VOTE #1 Email vote on September 10/11 : Upgrade alarm system to full monitoring at annual cost of $2,500 ($175/building/year for testing; $450/building/year for monitoring). This will be safer and will improve our insurance quotes : JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #2 Email vote on September 17 : Change our snow removal contractor to ALT’s for fixed priced snow removal 5 months (1-Nov to 31-Mar) at $1,488/month PLUS salt at $145 per application : JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #3 Change our insurance broker : To Ryan P. Maloney and accept annual quote of $8,515 (buildings) + $1,115 (Option 3 crime/liability) + $504 (Option 1 umbrella) (but pass on $975 workers comp. with refundable $750 on no claim). Only unresolved is whether to pay quarterly (only if $ penalty very small, ML to ask) : JD=Y, KP=Y, BC=Y, JK=Y (carried).
Meeting on Monday 31 August, 2020 (present: Not applicable)
NOTICE This is a supplemental entry; there was no meeting on 31-Aug-2020. Our meetings are slated for the first Monday of each month. But we do not get the previous month’s financials from Bruner until mid-month at earliest. The board wants to meet later in the month so we have the most recently available financials in front of us. This entry is just a vehicle to get July’s numbers onto the dashboard. When we meet in mid/late September, we will post August’s numbers.
CURRENT The board’s work over the next month is to review plans for two major projects; 1) Sitewide composite decks, 2) Back driveway resurfacing. Then to put together some budget alternatives for 2021 and, potentially, beyond. We are getting ready for the AGM, date to be announced shortly. See AGM tab at top of page for preparation and ideas as they unfold.
FINANCE Not shown in plot at left is the $8.8K CapEx representing #3035 and #3037 deck balance. For Dashboard purposes we have adjusted the at-bank Operating and Reserve balances to reflect this CapEx being drawn down from Reserve and the requisite reimbursement to Operating (even though Bank does not yet show this). Next month will see a lump sum Reserve replenishment followed by monthly contributions to meet our 2020 Budget target. Please note this is just a dashboard - it does not replace the detailed financial statements prepared each month by our condo manager. The purpose of the dashboard is to provide residents with a snapshot of our broad financial position and the association business currently under consideration.
Meeting on Monday 10 August, 2020 (present: KP, BC, JD)
Financial status Board discussed getting financials sooner from Bruner and moving meeting to later in month so that we can meet with fresher financials. KP to investigate with ML. KP says we are expecting legal retainer rebate of about $2K+. Our high Repairs & Maintenance for May & June are due to structural repairs.
Contracts ML has started to look for next year’s snow contract.
Property Assessment Driveway: ML has told us we are awaiting report from hydrological engineer for drainage solutions, one cheap/easy, one more extensive/costly. Decks: ML posted notices about deck inspections happening this Thursday 13 August. BC & KP noted high cost of about $4K, but all board agreed that we really need this reliable information for planning deck replacement project.
Legal Legal issues with former resident of #3021 is resolved. Agreement signed by JD on 9 July, Judge signed order on 28 July.
Resident Issues #3035 reported new deck sloping back toward residence, ML was to check up on this with contractor, KP to follow up with ML.
Rules/Regs On July 11, critter-feeding resident agreed to stop feeding, we thanked him for his decision.
Other Business AGM/Budget: AGM normally mid-September. We don’t yet know how to hold AGM under COVID-19. We need reports to come back on decks and on roadway before we can make budget. We should work toward the stipulated AGM date, but we can slip to October if we need to. Without roadway and deck information, we cannot prepare a meaningful budget. Insurance: ML has given to brokers what they need to requote. We must push on this as our renewal date is EARLY October. KP to ask ML. Dashboard: This is already live on our Bruner web page. JD still has some tinkering to do, we can announce later to residents via email, certainly before AGM.
Meeting on Wednesday 08 July, 2020 (present: ML, KP, BC, JK, JD)
Resignation For personal and health reasons, JS has resigned from the board. We thank her for her service and wish her well.
Taxes KP offered to file Condo taxes.
Decks ML to pay outstanding $8K for units #3035 and #3037.
Property assessment For around $4K we can get all remaining 22 decks inspected, access from outside residences (may need garage access for “garden level” deck inspections.
Legal ML is working to ensure all residents in good standing, but will file lien where warranted. One lien ready to file, KP can handle to save association legal fees. Case involving former resident of #3021 is still pending, ML will continue to follow.
Insurance review Brokers still waiting on some required documents, this is ongoing with a hard deadline of our renewal date in October.
Resident Issues ML provided a high-resolution PDF version of lot survey from state/county records office. JD thinks our boundary is 20 feet out from the edge of our driveway near where critter feeding occurs. ML will draft letter advising resident that we believe feeding of critters is on condo property and needs to stop, KP will review letter for board before it is sent.
Dehumidifiers BC cleaned filters, can repeat for his building.
Back Drive ML got 2 prices, both ~$50K, can get heat patches for $4.5K. Board want hydrology engineer report before proceed further, JD has seen engineer on property, ML awaits his report.
Minor Maint. Cleaners do change light bulbs, but wait up to two weeks (their revisit time) may not work for us. ML to seek board assist before dispatch Bruner staff.
Trash Garage door pick up by Pellitteri $10/mo trash, add $5.83 for recyclables. Requires all residents or none. No action yet, this resident requested investigation is complete.
VOTE #1 Pay $4K for remaining 22 deck inspections and engineers report : JD=Y, KP=Y, BC=Y, JK=Y (carried).
Meeting on Monday 01 June, 2020 (present: KP, BC, JK, JD)
Finance Still waiting for from ML.
Ongoing Work #3035 garage water damage: Dave Miller workers were onsite Thursday 28 May,this part of job is complete. #3035 & #3037 decks: Still waiting, ask ML for update.
Contracts No current issues, contract renegotiation on radar for ML.
Property Assessment Board agree that we need to push Bruner to at least start an assessment of decks so that we can plan. Deck assessment is high priority because there maybe safety issues with railings. And it give residents confidence that SOMETHING is happening around the place that is different to BEFORE Bruner were on board. We need to roll out a costed plan.
Legal Awaiting advice yet about resolution of pending case. KP to investigate.
Resident Issues Feed back from circular to residents?: It has not been sent yet. Resident reported being woken by critters, possibly squabbling over food left out. JS reported chipmunks and mice in past, but hard to know if critter feeding is implicated in attracting these animals.
Delinquency ML has made plan and is dealing with this issue for the association.
Rules & Regs Critter feeding: Because jurisdiction is unclear, we relaxed a rules violation letter for feeding critters just outside the condo property to a voluntary request to stop. But feeding persists. It looks to be taking place about 10 to 15 feet inside condo property boundary, JD thinks that we should use the survey map to establish our boundary and review.
Other Business ML to attend next virtual board meeting? BC reported dehumidifier issues at both ends of building #3025-#3035. At the #3025 end the dehumidifier unit is excessively noisy and vibrating. It may need replacing. At the #3035 end, the unit is not plugged in nor correctly plumbed to drain. Ask Bruner to advise and repair/replace.
VOTE#1 For KP to become our Communications Director: JS=Y, JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE#2 To ask ML to attend next board meeting: JS=Y, JD=Y, KP=Y, BC=Y, JK=Y (carried).
Meeting on Monday 04 May, 2020 (present: KP, BC, JK, JD, JS)
Insurance Claim on #3035 water damage: Beam repair estimate was $4,462. We are close to being dropped by our insurer. Hand over contracting for drywall to complete job Bruner. Review: Ongoing with ML.
Ongoing Work #3035 garage and contracted decks for #3035 and #3037: (This contract has been in place since October last year). Dave Miller plans to hopefully start week of May 4th, ML to make sure he honors his new timeline.
Contracts Fire alarm testing service: KP queried price, ML was able to get price reduced from $1,500 to $700. Snow: Status OK and ongoing with ML. Lawn care: Status OK and ongoing with ML.’)
Property Assessment JD says this was a big part of Bruner’s pitch - a 5 year needs assessment for our budgeting. The back drive and decks are a big part of this, but we don’t want to lose the big picture needs here - we need to have an actionable, getting-stuff-done budget by August and we need to press Bruner to help make that happen.
Legal KP reported phone call with our lawyer to resolve case against former resident of #3021.
Resident Issues Pathway lighting for lower level units: Board decided to tell ML that the floodlights were our solution to the lighting problem, that unless there was a bigger issue at stake that we did not understand, this is not something that the board wants to address right now. BC offered to assist safely dealing with defunct lights. Trash pickup alternatives: ML is checking into this, will report back.
Delinquency ML is making a plan and will deal with these issues for the association.
Rules & Regs Board discussed idea of a general circular to remind residents of rules/regs and the reasons for them. KP can supply a summary list of common transgressions, JD can pen introductory paragraph. Circulate for comment to rest of board before passing on to Bruner as a draft for ML to finalize and distribute. On the specific issue of dog pee damaging grass, ML can send an information/warning letter. On the issue of critter feeding, that needs to be addressed with an immediate warning as it is roundly seen as a health issue, an issue which could increase condo costs (pest control) and even potential property damage. Wisconsin DNR advises against feeding wild citters in the urban environment. We all live here and the board’s view is that we cannot be encouraging pests onto our shared property.
VOTE#1 An email vote on 12 April, 2020; to resolve legal issues with former resident of #3021 by reciprocal agreement: JS=U, JD=Y, KP=Y, BC=Y, JK=Y (carried).
Meeting on Monday 06 April, 2020 (present: ML, KP, BC, JK, JD, JS)
Finance Financial hand-off to Bruner Administrative system: KP sent info to ML to allow Bruner owners to become signatories to Heights of Stratton BMO account within a few days. KP to deposit April fees and pay last snow account. KP provide ML with physical banking items, check books etc. Bruner to have full control of Operational, deposit only to Reserve (withdrawal to require board approval).
Documents Uploading documents to Bruner: KP & JD to email ML current relevant documentation, e.g. minutes of special meeting, budgets, board minutes, contracts, anything we have.
Garage #3035 Structural stabilization and repair for water damage: Engineer inspected last Monday, report due this coming Wednesday. Once ML has report, he will contact Dave Miller for quote on doing work, and at least one other quote, bring to board as soon as he can for vote. ML to provide insurance adjuster information on quotes for structural repair & board later to decide claim or no claim.
Decks Underway Need to resolve water damage with contractor before work underway on #3035 & #3037 decks can resume.
Routine Contracts Snow: ML to provide options. Lawn: We have no current contract (correction, we do for this season), ML to provide options. Pest Control: No action defer to AGM. Cleaning: No action, our current contract is working.
Back driveway ML to initiate investigations, report back to board.
New decks Board members to forward any existing quotes, ML to flesh out plan for identifying decks that are dangerous, and (once financial position clear) work with board to make a plan for deck replacements in a time frame that we can afford.
General maint. No action on this, we will deal with problems as they arise and are reported by residents. Consider developing a routine check-list in the future.
Resident issues Trash pickup options: ML will reach out to his trash collection contacts to scope what options are available to us, and their costs, either as individual owners or as an association. Resident reported dog waste being tossed into land at rear: Board believe offenders are likely NOT Heights residents. JD suggested signage. Dog waste issue not really resolved at this time. JS pointed to dog pee problem, big dogs let out to pee on grass out front and killing the lawn. JS to supply Matt with dog pee problem unit number(s).
VOTING : Y=yes, N=no, A=abstain, U=unavailable

2020 BUDGET COMPARISON

ITEM $ Actual to date $ Annual budget
INCOME
Condo Fee Income 78,885 72,480
Insurance Proceeds 1,962
Unallocated Prepays -1,290
TOTAL 79,557 72,480
EXPENSE
Bank Charges 25
Common Area Cleaning 2,600 2,500
Fire Safety 1,972
Gas & Electric 3,963 3,500
Insurance 3,860 16,000
Lawn Care & Landscaping 7,006 7,000
Legal & Accounting 301
Management Fees 3,744 4,212
Misc. Admin 131 500
Pest Control 899
Repairs & Maintenance 5,639 10,000
Snow Removal 11,949 12,000
Water & Sewer 2,161 2,000
TOTAL 44,225 57,737
RESERVE
Replenishment 6,996 7,000
CAPEX
Deck Engineer Report 4,000
Decks 8,811
Driveway asphalt patch 6,380
Fire alarm equipment 1,234
Water Damage 4,462
TOTAL 24,887
As at Thursday 31 December, 2020

2020 BUDGET COMPARISON

% YEAR ELAPSED

% INCOME RECEIVED

% EXPENSE INCURRED

% RESERVE REPLENISHED

Row

People

People

Technical

Row

THE R MARKDOWN DEVELOPMENT ENVIRONMENT IS SHOWN BELOW

R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.7

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRblas.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] flexdashboard_0.5.2 RColorBrewer_1.1-2  kableExtra_1.1.0    forcats_0.5.0      
 [5] stringr_1.4.0       dplyr_1.0.1         purrr_0.3.4         readr_1.3.1        
 [9] tidyr_1.1.1         tibble_3.0.3        ggplot2_3.3.2       tidyverse_1.3.0    
[13] lubridate_1.7.9     getopt_1.20.3       knitr_1.29         

loaded via a namespace (and not attached):
 [1] tidyselect_1.1.0  xfun_0.16         haven_2.3.1       colorspace_1.4-1  vctrs_0.3.2      
 [6] generics_0.0.2    viridisLite_0.3.0 htmltools_0.5.0   yaml_2.2.1        blob_1.2.1       
[11] rlang_0.4.7       pillar_1.4.6      glue_1.4.1        withr_2.2.0       DBI_1.1.0        
[16] dbplyr_1.4.4      modelr_0.1.8      readxl_1.3.1      lifecycle_0.2.0   munsell_0.5.0    
[21] gtable_0.3.0      cellranger_1.1.0  rvest_0.3.6       htmlwidgets_1.5.1 evaluate_0.14    
[26] labeling_0.3      fansi_0.4.1       highr_0.8         broom_0.7.0       Rcpp_1.0.5       
[31] backports_1.1.8   scales_1.1.1      webshot_0.5.2     jsonlite_1.7.0    farver_2.0.3     
[36] fs_1.5.0          hms_0.5.3         digest_0.6.25     stringi_1.4.6     grid_4.0.2       
[41] cli_2.0.2         tools_4.0.2       magrittr_1.5      crayon_1.3.4      pkgconfig_2.0.3  
[46] ellipsis_0.3.1    xml2_1.3.2        reprex_0.3.0      assertthat_0.2.1  rmarkdown_2.3    
[51] httr_1.4.2        rstudioapi_0.11   R6_2.4.1          compiler_4.0.2   
NOTE: A recent version of Pandoc (>= 1.12.3) is required to use the rmarkdown
package. RStudio also automatically includes this so you do not need to download
Pandoc if you plan to use rmarkdown from the RStudio IDE. If not using the
RStudio IDE, you'll need to install Pandoc for your platform.

THE STRUCTURED TEXT INPUT FILE IS SHOWN BELOW

# HoS_Dashboard.txt
# =================
#
# This is the one and only data file needed by HoS_Dashboard.Rmd to make
# HoS_Dashboard.html.  HoS_Dashboard.Rmd is an R markdown file. R is an open
# source language, available 100% free on Win, Mac and Linux platforms.
# 
# HoS_Dashboard.html can be created in RStudio or in an R console like this:
# 
# library(knitr)
# setwd('/path/to/HoS_Dashboard.Rmd')
# rmarkdown::render('HoS_Dashboard.Rmd')
#
# This file is structured text, some tags are significicant in value & location
# with respect to left margin. I hope the pattern is self evident. The first
# comma after an ITEM (in lists under TAGs ending with colon) is a delimiter.
# Block delimeters START/END-BUDGETS and START/END-MEETINGS are crucial, as
# are "Budget Year:" and "Meeting Date:". The two-space indents are significant
# for demarking a continued line-item. Lines beginning with # are comments and
# can be anywhere. I also use them to mark out the meeting blocks, just to make
# it easier to read & navigate. I hope the structure is mostly self-evident. So
# long as you follow the pattern, this will work for new data as it is added.
# The order does not matter, but I have preferred to put more recent on top.
#
# JED, August 2020

START-BUDGETS

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#   BUDGET-2021    BUDGET-2021    BUDGET-2021    BUDGET-2021    BUDGET-2021   #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Budget Year: 2021

reserve:
Replenishment,           10000

income:
Condo Fee Income,        76320

expense:
Insurance,               10200
Repairs & Maintenance,    5980
Snow Removal,            10775
Lawn Care & Landscaping,  7000
Gas & Electric,           3500
Water & Sewer,            2000
Management Fees,          5616
Fire Safety,              2500
Common Area Cleaning,     3000
Misc. Admin,               500
Bank Charges,               25
Legal & Accounting,        250
Pest Control,             1020
Taxes,                       0

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#   BUDGET-2020    BUDGET-2020    BUDGET-2020    BUDGET-2020    BUDGET-2020   #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Budget Year: 2020

reserve:
Replenishment,            7000

income:
Condo Fee Income,        72480

expense:
Insurance,               16000
Repairs & Maintenance,   10000
Snow Removal,            12000
Lawn Care & Landscaping,  7000
Gas & Electric,           3500
Water & Sewer,            2000
Management Fees,          4212
Common Area Cleaning,     2500
Misc. Admin,               500
Bank Charges,               25
Legal & Accounting,          0
Taxes,                       0

END-BUDGETS


START-MEETINGS

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Feb-2021    Feb-2021    Feb-2021    Feb-2021    Feb-2021    Feb-2021     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 23-Feb-2021

present:
Initials, N/A

bruner:
ML, Matt Lindholm

board:
JD, James Davies
BC, Bob Christensen
JK, Jamie Karls
GB, Gary Buehler
SB, Shaun Byrnes

dates:
Finance, 31-Jan-2021
P&Lperiod, Jan-2021

balances:
Operating, 19319.43
Operating,  4505.00
Reserve,   76636.04

income:
Condo Fee Income,       11520.00
Misc. Income,             190.50
Unallocated Prepays,     1200.00

expense:
Repairs & Maintenance,    455.00
Snow Removal,            1488.00
Lawn Care & Landscaping,  448.38
Gas & Electric,           338.01
Water & Sewer,            191.48
Insurance,               2055.75
Management Fees,          468.00
Misc. Admin,               26.82
Common Area Cleaning,     200.00
Pest Control,             390.00

reserve:
Catch-up for FY:2019,   18600.00


#capex:
#Fire alarm equipment,    1234.00
#Driveway asphalt patch,  6380.00

#enote:
#Note,

# Note-to-self:
# $18,600 is in compliance with KPs recommendation from 2020 Operating surplus.
# We now need to put in $1K/month Mar-Dec to achieve our budgeted replenishment,
#   of $10K, but that does not include the final $12,000 "Payback for amount used
#   for operational deficiency" still owing from FY2019 and which must come at
#   end FY2021 from that year's Operating surplus.

news:
ATTENTION, No board meeting this month. Composite Decks update pushed to March.

votes:

radar:
15-Mar-2021, Lawns Contract Renewal: ML to provide options.
15-Mar-2021, Composite Decks :  ML looking for quotes, 2 received so far, 2 to come.
01-Apr-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K. We now have a recommendation on how to resolve
  drainage issues for about $13K prior to resurfacing. 
01-August-2021, By-Law repeal : Repeal amendment on board service that says 2 of 5
  office-holders serve for 3 years and 3 of 5 serve for 2 years. Investigate
  how to repeal via 2021 AGM vote.
01-August-2021, Condo Docs Amendment #1 : Amendment to our Renting Covenant, we need
  to get specific wording correct to put to vote at AGM.


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Jan-2021    Jan-2021    Jan-2021    Jan-2021    Jan-2021    Jan-2021     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 21-Jan-2021

present:
Initials, JD, BC, GB, SB, JK, ML

bruner:
ML, Matt Lindholm

board:
JD, James Davies
BC, Bob Christensen
JK, Jamie Karls
GB, Gary Buehler
SB, Shaun Byrnes

dates:
Finance, 31-Dec-2020
P&Lperiod, Dec-2020

balances:
Operating, 35575.37
Reserve,   58033.84

income:
Condo Fee Income,        4300.00
Unallocated Prepays,      -60.00

expense:
Repairs & Maintenance,    525.00
Snow Removal,            2976.00
Gas & Electric,           293.99
Water & Sewer,            191.31
Management Fees,          468.00
Misc. Admin,                1.96
Common Area Cleaning,     200.00
Fire Safety,             1234.00

reserve:
Replenishment,              0.00

capex:
Fire alarm equipment,    1234.00
Driveway asphalt patch,  6380.00

#enote:
#Note,

# Note-to-self:
# $25,600 is KPs recommended TOTAL Reserve replenishment for 2020 which
#   includes $12,000 "Payback for amount used for operational deficiency".
#   What have done is put in $7,000 as per our 2020 budget.  If we go with
#   KP suggestion, we need to add $18,600.

news:
Financial, ML has says our Operating account in good financial shape. Replenishment
  of Reserve should include $12K payback for amount used for operational deficiency
  ($24K was borrowed in 2019), plus a top-up for lack of replenishment in 2019.
  As per 2020 AGM minutes, board recommends $25.6K total for 2020, so far $7K put in
  (as per our 2020 budget), that leaves $18.6K outstanding.  This will leave us with
  about $15K float in Operating coming into 2021.
Decks project, ML has quotes from 2 contractors, and is waiting for 2 other contractors
  to present bids.  Board will review when those 2 final bids come in.  We have an
  engineering report to guide roll out.  This project is important for safety reasons
  and to maintain property value.  It is a condominium association responsibility but
  it is expensive and will need to be run over a several years.  However, where safety
  is concerned, we must be prepared to deplete our Reserve.
Lawn Care, ML to get quotes in next 30-45 days.  Board were happy with previous
  contractor, at cost of about $7K for the season.
Board processes binder, Karen Pauer has suggested:
  * Monthly meeting protocol,
  * Annual Meeting protocol,
  * New Owner process,
  * Amending the Condo Docs,
  * Filing a lien and removing a lien,
  * Communication to all Owners,
  * Reviewing the Financials.
  JD will check in with Karen Pauer, receive binder from her when she is ready,
  and add hardcopies of minutes.
Condo Docs Amendment #1, For voting on at next AGM.
  * Amendment to our Renting Covenant to allow renting to owner's adult children
  (age 21 or older) or owner's parents in the event the owner cannot live in the
  condo due to relocation etc. and does not want to sell it.
Condo Docs Amendment #2, For voting on at next AGM.
   * Amendment to our covenants to include all the rules we identified and sent to
   owners awhile back. We need to have those somewhere official in case there is a
   violation and we get pushback.  JD will ask Karen Pauer for her wording suggestion
   so we can vote on its inclusion in next AGM at a future board meeting.
Bank accounts, ML says moving acounts to Capitol Bank would save him time, but not a lot,
  and it will not assist his financial reporting task.  ML will check on impact of change
  to Capitol Bank with regard to fees and will report back to board.
Other Business, GB was told by resident that to use TDS fibre needed an approval
  by board/management,  ML will follow up.  ML says our pest control service has started.
  BC says we have a repeat offender dog pooper by our mailbox near buildings 1 & 2.
  BC says the new blacktop on driveway was laid on top of the old, not saw-cut out and
  replaced. It has a lip around patch and now the snow plow is damaging the new surface
  (which is not the snow contractor's fault). ML will seek clarification that the work
  was done to spec.

votes:
VOTE #1, Reserve replenishment : Amount $18.6K, JD=Y, BC=Y, JK=Y, SB=Y, GB=Y (carried).
VOTE #2, Condo Doc Ammendment #1: Vote on this at AGM, wording must be very specific
  and is TBD. JD=Y, BC=Y, JK=Y, SB=Y, GB=Y (carried).

radar:
15-Mar-2021, Lawns Contract Renewal: ML to provide options.
15-Feb-2021, Composite Decks :  ML looking for quotes, 2 received so far, 2 to come.
01-Apr-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K. We now have a recommendation on how to resolve
  drainage issues for about $13K prior to resurfacing. 
01-August-2021, By-Law repeal : Repeal amendment on board service that says 2 of 5
  office-holders serve for 3 years and 3 of 5 serve for 2 years. Investigate
  how to repeal via 2021 AGM vote.
01-August-2021, Condo Docs Amendment #1 : Amendment to our Renting Covenant, we need
  to get specific wording correct to put to vote at AGM.


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Dec-2020    Dec-2020    Dec-2020    Dec-2020    Dec-2020    Dec-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 17-Dec-2020

present:
Initials, JD, BC, GB, SB, JK[belated]

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 30-Nov-2020
P&Lperiod, Nov-2020

balances:
Operating, 35991.63
Reserve,   65645.38

income:
Condo Fee Income,        4825.00
Unallocated Prepays,       15.00

expense:
Repairs & Maintenance,   1140.00
Gas & Electric,           339.93
Water & Sewer,            191.33
Management Fees,          468.00
Misc. Admin,                1.91
Common Area Cleaning,     200.00

reserve:
Replenishment,           1166.00

#capex:
#CapEx/Improvements,       150.00

enote:
Note, R&M $1140 is for drywall and sump pump repair 

# Note-to-self:
# $1,140.00 R&M is high for us, it includes:
# 3037 sump pump repair $90
# 3037 drywall repair $1050 

news:
OBSERVERS, New to board in 2021 : Gary Buehler (GB) and  Shaun Byrnes (SB).
Financial, Operating account in good shape, we have surplus to replenish Reserve,
  we put in $7K already and expect to replenish about another $20K 
By-Law repeal, By-Law Amendment on board service that says 2/5 office-holders serve
  for 3 years and 3/5 serve for 2 years. JD thinks, now we are under management, we
  would be better served by previous rule of 1 year appointments. Motion to investigate
  HOW to repeal.
2021 Board, Slate as follows :
  President=Gary Buehler  (GB),
  Secretary=James Davies (JD),
  Treasurer=Shaun Byrnes (SB),
  VP#1=Jamie Karls (JK),
  VP#2=Bob Christensen (BC).
Board processes binder, JD suggested as secretary he maintain binder after
  received from KP. JD to liaise with KP to resolve.
Manager meeting invite, Bruner include 4 manager-attended meetings per year in contract,
  consider inviting ML to January meeting for end-of-year financial wrap, update on
  decks/railings project and to introduce new board.
Snow contractor concerns, BC sent email to ML who will address with contractor. Specifically,
  late snow removal, bad position of snow pile where we put bins for trash pick-up,
  snow left un-shoveled by door on deck of single story end units. Board to continue
  to apprise ML of concerns as necessary.
Bank accounts, Moving association bank accounts to Capitol Bank (where majority of
  Bruner-managed properties have accounts) could benefit association by access to
  Bruner’s system for reporting. ML communicated that would save him time, but
  not a lot. Discussion deferred to next month's meeting.

#votes:
VOTE #1, By-Law repeal : Investigate WHAT we need to do to repeal this Condo By-Law
  Amendment AND to put up as a votable item at next AGM. JD=Y, BC=Y, [JK offline] (carried).
VOTE #2, Manager meeting invite : Invite ML to January 2021 meeting. JD=Y, BC=Y, JK=Y (carried).

radar:
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
15-Jan-2021, Composite Decks :  ML looking for quotes, "Gathering multiple quotes
  from multiple contractors, it was been tough to track contractors but I hope
  to have quotes soon." (ML email 14-Dec).
15-Jan-2021, Bank account : Pros and Cons of moving our accounts to Capitol Bank.
01-Mar-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K. We now have a recommendation on how to resolve
  drainage issues for about $13K prior to resurfacing. [ Meantime asphalt patches
  were applied to two worst areas on 18-Nov-2020. ]


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Nov-2020    Nov-2020    Nov-2020    Nov-2020    Nov-2020    Nov-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 23-Nov-2020

present:
Initials, N/A

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 31-Oct-2020
P&Lperiod, Oct-2020

balances:
Operating, 35983.80
Reserve,   64476.71

income:
Condo Fee Income,        4425.00
Unallocated Prepays,     -185.00

expense:
Repairs & Maintenance,   1472.62
Gas & Electric,           342.85
Water & Sewer,            191.35
Insurance,               3859.75
Management Fees,          468.00
Common Area Cleaning,     200.00
Pest Control,             200.00
Legal & Accounting,     -2287.95

reserve:
Replenishment,            583.00

#capex:
#CapEx/Improvements,       150.00

enote:
Note, Not shown $2,287 legal retainer REFUND

# Note-to-self:
# $1,472.62 R&M is high for us, it includes:
# Capital One Commercial: Menards supplies (dehumidifier) $277.62
# Moccasin Ridge Remodeling, LLC: Sump pump redirect $475.00
# Bruner Realty & Management, Inc: Exterior light repairs/new $720.00

news:
NOTICE, No November meeting, date above is dashboard publication date.  Thus there
  are no board deliberations to report.  Instead below is a quick note on the AGM
  followed by some explanation of October expenses.
AGM, Held on 05-Nov-2020 @ 7pm via Zoom and telephone, minutes due for distributiion
  week of 23-Nov-2020.
R&M, Repairs & Maintenance is high this month at $1,473; it includes: Menards supplies
  (dehumidifier) $278, sump pump redirect $475, exterior light repairs $720.
LEGAL, Legal retainers were returned to the association, reducing our year-to-date
  spend in category "Legal & Accounting" to about $300.
INSURANCE, Our new insurance premiums are now paid quarterly. $3,860 represents 25%
  of primary policy premium plus 100% of some additional coverages.  The annual total
  premium for period Oct-2020 to Sep-2021 is $10.2K, as shown in the budget adopted
  at the AGM.

#votes:

radar:
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks : Report received, under review.  But first priority
  is railings for safety, ML looking for quotes.
01-Mar-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K. We now have a recommendation on how to resolve
  drainage issues for about $13K prior to resurfacing. [ Meantime asphalt patches
  were applied to two worst areas on 18-Nov-2020. ]


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Oct-2020    Oct-2020    Oct-2020    Oct-2020    Oct-2020    Oct-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 26-Oct-2020

present:
Initials, ML, KP, BC, JK, JD


bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 30-Sep-2020
P&Lperiod, Sep-2020

balances:
Operating, 33148.05
Operating, +4000.00
Reserve,   65603.02
Reserve,   -4000.00

income:
Condo Fee Income,        7533.00
Unallocated Prepays,    -1060.00

expense:
Repairs & Maintenance,     90.00
Gas & Electric,           328.14
Water & Sewer,            191.78
Management Fees,          468.00
Common Area Cleaning,     300.00
Fire Safety,              738.32
Pest Control,             200.00

reserve:
Replenishment,            583.00

capex:
Deck Engineer Report,    4000.00

# Note-to-self:  $4,000 Capex is the engineers report on the decks.  I am going to
# adjust balances to reflect that this comes out of Reserve because at 30-Sep-2020
# the $4K was taken from Operating.
#
# enote:
# Note, $4,462 for water damage recouped from R&M
#   and funded out of Reserve
# Title, NOTE: Repairs & Maintenance
# Subtitle,  Over budget for reasons stated below
# Caption, Balance of $2,231 paid for structural repair.

news:
AGM Planning, ML showed plans for AGM agenda and info packet. We agreed to re-order
  agenda items so that a review of the year and future plans were expounded before
  financials were discussed. We agreed to in-meeting voting (rather than by mail)
  and that at meeting end ML would call on each attendee in turn to respond to all
  votable items en bloc. Two budgets to be presented.
Drainage, ML showed quote for underground drainage beneath rear driveway.  The
  proposal gathers all backward directed building downpipes (including those
  currently directed into retaining wall area between buildings) and runs them
  underground to the other side of rear driveway.  It also calls for swales
  to be built at strategic locations.  The work would sensibly be done about
  one month before a driveway re-surfacing. Cost estimate is approx. $13K,
  contractor is A.L. Landscaping.
Rear Driveway, ML presented a quote to patch one or two very bad parts of the rear
  driveway to tide us over until we have the funds for complete asphalt re-surface.
  Contractor is Hallman Asphalt & Sealing and cost estimate is $5.5K for main
  problem area behind building #2 (red zone), add $900 for the bad patch up by
  top of building #1 (blue zone).
  
votes:
VOTE #1, Driveway : Patch the worst area behind building #2, identified on Hallman
  Asphalt & Sealing quote as "red zone", for $5.5K. JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #2, Driveway (via email on 28-Oct): Patch the second bad area close to (our neighbor)
  Stratton Glen's driveway behind building #1, identified on Hallman Asphalt & Sealing
  quote as "blue zone", for additional $900. JD=A, KP=N, BC=Y, JK=Y (carried).

radar:
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks : Report received, under review.  But first priority
  is railings for safety, ML looking for quotes.
01-Mar-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K. We now have a recommendation on how to resolve
  drainage issues for about $13K prior to resurfacing.
05-Nov-2020, AGM 2020 : 05-Nov-2020 @ 7pm via Zoom and telephone.  Proxies and
  early voting done before by non-attendees. Info packets out one week prior.

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Sep-2020    Sep-2020    Sep-2020    Sep-2020    Sep-2020    Sep-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 21-Sep-2020

present:
Initials, ML, KP, BC, JK, JD

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 31-Aug-2020
P&Lperiod, Aug-2020

balances:
Operating, 37770.29
Reserve,   65017.35

income:
Condo Fee Income,     10872.00

expense:
Repairs & Maintenance,    120.00
Repairs & Maintenance,  -4462.00
Gas & Electric,           405.66
Water & Sewer,            183.36
Management Fees,          468.00
Common Area Cleaning,     200.00
Pest Control,             499.00

reserve:
Replenishment,         4664.00

capex:
Water Damage,          4462.00

# Note-to-self:  4462 is 2*2231 (the water damage costs previously
# assigned to R&M but which belong to reserve spending).

enote:
Note, $4,462 for water damage recouped from R&M
  and funded out of Reserve
# Title, NOTE: Repairs & Maintenance
# Subtitle,  Over budget for reasons stated below
# Caption, Balance of $2,231 paid for structural repair.

news:
Actions from last meeting, ML followed up with Dave Miller re deck slope on recently
  installed deck + resident reported still some water ingress on very wet days, ML to
  reach out to contractor again.  Also waiting for same contractor to advise/fix railings
  wobble on new decks.
Financial Status, ML says we are in pretty good shape for neutral or better Operating
  costs compared to Budget for 2020.  Resident fees all up to date.  Received retainer
  refunds from lawyers, should go into Operating and will reduce our annual legal bill
  to just a few hundred $.
Email vote confirmation, See Fire Alarm Monitoring & Snow Removal VOTE #1 & #2 below.
Insurance Contract, Reviewed proposal from Robertson Ryan & Associates decided to
  go with them and save at least $6K/year compared to renewal quote from current
  broker.  See VOTE #3 below.
Projects, Driveway – status is that drainage engineer offered a free but informal
  appraisal saying that if we employed a specialist/experienced grading contractor
  to work alongside asphalt contractor then our drainage issues should be resolved
  at the time of driveway replacement.  BC reminded us that we do still have an option
  to heat patch.  Railings - no quotes yet for railings project, ML to arrange and
  to include guard rails for lower-level units near the retaining wall edge.  KP said
  to expect this to be expensive, but agreed that we would like to see in a quote.
  Drywall replacement - new quote for $1,050 much better than original of almost $3K,
  board agreed (without vote) to move forward with this contractor.
Miscellaneous Items, Do we have occupants not on property title? - how
  does this relate to Condo rules on owner-occupiers only, ML to investigate.
  Raccoons sighted on resident's deck, might be due to spillage from bird-feeders,
  ML to investigate.
Annual Meeting Logistics, Various options discussed, decided on Zoom meeting hosted
  on Bruner's paid Zoom account with phone-in option for those who do not want
  to use computer (so just like a telephone conference call).  ML will run
  meeting.  Date/time set to Thursday 5 November @7pm.  Notices to be mailed 30
  days prior with supporting materials mailed about 1 week prior.  N.B. We will
  test technology by having ML host next meeting (see next). [Note, to get early
  votes and proxies in for AGM, maybe info packet must be 2 weeks prior?]
Budget, ML will prepare a few budget options, board will vet & adjust with aim to
  find two candidates for residents to vote on at AGM.  ML to host Zoom meeting
  when we are ready to discuss his budget options and to finalize AGM plans.
  
votes:
VOTE #1, Email vote on September 10/11 : Upgrade alarm system to full monitoring
  at annual cost of $2,500 ($175/building/year for testing; $450/building/year
  for monitoring).  This will be safer and will improve our insurance quotes :
  JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #2, Email vote on September 17 : Change our snow removal contractor to ALT's
  for fixed priced snow removal 5 months (1-Nov to 31-Mar) at $1,488/month PLUS
  salt at $145 per application : JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE #3, Change our insurance broker : To Ryan P. Maloney and accept annual quote of
  $8,515 (buildings) + $1,115 (Option 3 crime/liability) + $504 (Option 1 umbrella)
  (but pass on $975 workers comp. with refundable $750 on no claim).  Only unresolved
  is whether to pay quarterly (only if $ penalty very small, ML to ask) : JD=Y,
  KP=Y, BC=Y, JK=Y (carried).

radar:
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks : Report received, under review.  But first priority
  is railings for safety, ML looking for quotes.
01-Mar-2021, Rear Driveway : ML previously got us prices for 
  complete resurface, both ~$50K, and we can get a heat patch temporary fix for
  about $4.5K. The groundwater hydrology problem has been deemed by drainage
  engineer (in an informal & free communication) as within the scope of grading
  contractor to resolve.
01-Oct-2020, AGM 2020 : Date set for AGM is 5 Nov, need to advise residents 30
  days prior by mail.  And send information packet a week prior by mail(?)
05-Nov-2020, AGM 2020 : 05-Nov-2020 @ 7pm via Zoom and telephone.  Proxies and
  early voting done before by non-attendees.  This means we need info packets out
  maybe two weeks ahead of AGM.

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Aug-2020    Aug-2020    Aug-2020    Aug-2020    Aug-2020    Aug-2020     #
#                                                                             #
#                          S U P P L E M E N T A L                            #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 31-Aug-2020

present:
Initials, Not applicable

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 31-Jul-2020
P&Lperiod, Jul-2020

balances:
Operating, 22987.31
Reserve,   64812.50

income:
Condo Fee Income,      6890.00
Unallocated Prepays,   -265.00

expense:
Repairs & Maintenance,  215.00
Gas & Electric,         385.13
Water & Sewer,          183.17
Management Fees,        468.00
Common Area Cleaning,   200.00

capex:
Decks, 8811.42


# Note-to-self:  8811.42 of CapEx listed as non-operatinf expenses on Bruner
# accounts.  This split between -5915.00 of undeposited funds and 2896.42 to
# be reimbursed to Operating.  So Bruners balance were adjusted thus:
# Operating <- 20090.89 (Bruner) + 2896.42 = 22987.31
# Reserve   <- 73623.92 (Bruner) - 8811.42 = 64812.50
# Combined we aggree on Total Assests of 87799.81

#enote:
#Note, R & M is high due to $2,231 for balance of
#  water damage structural repair.
#
# Title, NOTE: Repairs & Maintenance
# Subtitle,  Over budget for reasons stated below
# Caption, Balance of $2,231 paid for structural repair.

news:
NOTICE, This is a supplemental entry; there was no meeting on 31-Aug-2020.  Our
  meetings are slated for the first Monday of each month.  But we do not get the
  previous month's financials from Bruner until mid-month at earliest.  The board
  wants to meet later in the month so we have the most recently available financials
  in front of us.  This entry is just a vehicle to get July's numbers onto the
  dashboard.  When we meet in mid/late September, we will post August's numbers.
CURRENT, The board's work over the next month is to review plans for two major
  projects; 1) Sitewide composite decks, 2) Back driveway resurfacing. Then to
  put together some budget alternatives for 2021 and, potentially, beyond.  We
  are getting ready for the AGM, date to be announced shortly.  See AGM tab at
  top of page for preparation and ideas as they unfold.
FINANCE, Not shown in plot at left is the $8.8K CapEx representing
  #3035 and #3037 deck balance. For Dashboard purposes we have
  adjusted the at-bank Operating and Reserve balances to reflect this CapEx being
  drawn down from Reserve and the requisite reimbursement to Operating (even
  though Bank does not yet show this). Next month will see a lump sum Reserve
  replenishment followed by monthly contributions to meet our 2020 Budget target.
  Please note this is just a dashboard - it does not replace the detailed
  financial statements prepared each month by our condo manager. The purpose
  of the dashboard is to provide residents with a snapshot of our broad financial
  position and the association business currently under consideration.

radar:
01-Aug-2020, Snow Contract Renewal: ML got us 3 bids, now under review.
01-Sep-2020, Insurance Renegotiation: Our insurance renewal date is EARLY October,
  so that is a hard deadline for this action, ML says 3 brokers now have our 
  information.
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks : Report received, under review.
01-Mar-2021, Rear Driveway : ML previously got us prices for
  complete resurface, both ~$50K, and we can get a heat patch temporary fix for
  about $4.5K. There is a groundwater hydrology problem that needs to be
  diagnosed before we can risk $50K and before we could even get pothole patches
  to stick. We await report from hydrologist/engineer. He has informally related
  that he will be suggesting two solutions, one comprehensive/costly, another
  simpler/cheaper that he thinks can meet our goals.
01-Oct-2020, AGM 2020 : Information packet to be mailed to all residents. Set date
  for AGM.  Are were going for: in-person?, virtual?, phone-in?, mail-in? TBD!!!


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Aug-2020    Aug-2020    Aug-2020    Aug-2020    Aug-2020    Aug-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 10-Aug-2020

present:
Initials, KP, BC, JD

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 30-Jun-2020
P&Lperiod, Jun-2020

balances:
Operating, 17813.61
Reserve,   73620.80

income:
Condo Fee Income,      5910.00
Unallocated Prepays,  -1670.00
Insurance Proceeds,    1962.00

expense:
Repairs & Maintenance, 2876.00
Gas & Electric,         340.67
Water & Sewer,          183.04
Management Fees,        468.00
Common Area Cleaning,     200.00

enote:
Note, R & M is high due to $2,231 for balance of
  water damage structural repair.

# Title, NOTE: Repairs & Maintenance
# Subtitle,  Over budget for reasons stated below
# Caption, Balance of $2,231 paid for structural repair.

news:
Financial status, Board discussed getting financials sooner from
  Bruner and moving meeting to later in month so that we can meet with fresher
  financials. KP to investigate with ML. KP says we are expecting legal retainer
  rebate of about $2K+. Our high Repairs & Maintenance for May & June are due
  to structural repairs.
Contracts, ML has started to look for next year’s snow contract.
Property Assessment, Driveway: ML has told us we are awaiting report from
  hydrological engineer for drainage solutions, one cheap/easy, one more
  extensive/costly. Decks: ML posted notices about deck inspections happening
  this Thursday 13 August.  BC & KP noted high cost of about $4K, but all board
  agreed that we really need this reliable information for planning deck
  replacement project.
Legal, Legal issues with former resident of #3021 is resolved. Agreement signed
  by JD on 9 July, Judge signed order on 28 July.
Resident Issues, #3035 reported new deck sloping back toward residence, ML was
  to check up on this with contractor, KP to follow up with ML.
Rules/Regs, On July 11, critter-feeding resident agreed to stop feeding, we
  thanked him for his decision.
Other Business, AGM/Budget: AGM normally mid-September.  We don’t yet know how
  to hold AGM under COVID-19. We need reports to come back on decks and on
  roadway before we can make budget.  We should work toward the stipulated AGM
  date, but we can slip to October if we need to.  Without roadway and deck
  information, we cannot prepare a meaningful budget.  Insurance: ML has given
  to brokers what they need to requote.  We must push on this as our renewal
  date is EARLY October.  KP to ask ML. Dashboard: This is already live on our
  Bruner web page. JD still has some tinkering to do, we can announce later to
  residents via email, certainly before AGM.

radar:
01-Sep-2020, Insurance Renegotiation: Our insurance renewal date is EARLY October,
  so that is a hard deadline for this action, ML says brokers have our information.
01-Aug-2020, Snow Contract Renewal: ML looking into options now, August 2020.
01-Nov-2020, Lawns Contract Renewal: ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks : ML has engineer contracted to inspect
  remaining 22 on 13 August. The engineer report is crucial to inform plan for
  identifying decks that are dangerous, and making a plan for deck replacements
  in a time frame that we can afford.
01-Mar-2021, Rear Driveway : We are waiting for report from
  hydrologist/engineer. He has informally related that he will be suggesting
  two solutions, one comprehensive/costly another simpler/cheaper that he
  thinks can meet our goals.
  

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Jul-2020    Jul-2020    Jul-2020    Jul-2020    Jul-2020    Jul-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 08-Jul-2020

present:
Initials, ML, KP, BC, JK, JD

bruner:
ML, Matt Lindholm

board:
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 31-May-2020
P&Lperiod, May-2020

balances:
Operating, 14452
Reserve,   73617

income:
Condo Fee Income,     4730
Unallocated Prepays,   875

expense:
Repairs & Maintenance, 2813
Gas & Electric,         304
Water & Sewer,          183
Management Fees,        468
Common Area Cleaning,   200

enote:
Note, Repairs & Maintenance are over budget mainly due to a $2,231 down payment
  for water damage structural repair.

news:
Resignation, For personal and health reasons, JS has resigned from the board.
  We thank her for her service and wish her well.
Taxes, KP offered to file Condo taxes.
Decks, ML to pay outstanding $8K for units #3035 and #3037.
Property assessment, For around $4K we can get all remaining 22 decks inspected,
  access from outside residences (may need garage access for “garden level” deck
  inspections.
Legal, ML is working to ensure all residents in good standing, but will file lien
  where warranted.  One lien ready to file, KP can handle to save association
  legal fees.  Case involving former resident of #3021 is still pending, ML
  will continue to follow.
Insurance review, Brokers still waiting on some required documents, this is ongoing
  with a hard deadline of our renewal date in October.
Resident Issues, ML provided a high-resolution PDF version of lot survey from
  state/county records office. JD thinks our boundary is 20 feet out from the edge
  of our driveway near where critter feeding occurs.  ML will draft letter advising
  resident that we believe feeding of critters is on condo property and needs to stop,
  KP will review letter for board before it is sent.
Dehumidifiers, BC cleaned filters, can repeat for his building.
Back Drive, ML got 2 prices, both ~$50K, can get heat patches for $4.5K. Board
  want hydrology engineer report before proceed further, JD has seen engineer
  on property, ML awaits his report.
Minor Maint., Cleaners do change light bulbs, but wait up to two weeks (their
  revisit time) may not work for us. ML to seek board assist before dispatch
  Bruner staff.
Trash, Garage door pick up by Pellitteri $10/mo trash, add $5.83 for
  recyclables. Requires all residents or none. No action yet, this resident
  requested investigation is complete.

votes:
VOTE #1, Pay $4K for remaining 22 deck inspections and engineers report : JD=Y,
  KP=Y, BC=Y, JK=Y (carried).

radar:
01-Sep-2020, Insurance Renegotiation : Our insurance renewal date is October,
  so that is a hard deadline for this action, 2 brokers are awaiting information.
01-Aug-2020, Snow Contract Renewal : ML to provide options, around August 2020.
01-Nov-2020, Lawns Contract Renewal : ML to provide options, but he says we can
  delay until late 2020 or early 2021.
01-Sep-2020, Composite Decks Replacement : ML to flesh out plan for identifying
  decks that are dangerous, and (once financial position clear) work with board
  to make a plan for deck replacements in a time frame that we can afford.
01-Mar-2021, Back Drive Drainage and Resurface : This is going to be a costly
  job and we must be sure that our drainage issues are resolved before we
  commit $. Asphalt contractors have no opinion on groundwaterhydrology issues,
  an engineer known to Bruner has been contracted to advise.


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Jun-2020    Jun-2020    Jun-2020    Jun-2020    Jun-2020    Jun-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 01-Jun-2020

present:
Initials, KP, BC, JK, JD

bruner:
ML, Matt Lindholm

board:
JS, Judy Setzkorn
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

dates:
Finance, 26-May-2020
P&Lperiod, 01-Jan-2020 to 30-Apr-2020

balances:
Operating, 16130
Reserve,   73614

income:
Condo Fee Income,    29400
Unallocated Prepays,  1060

expense:
Repairs & Maintenance,     849
Snow Removal,             8973
Lawn Care & Landscaping,  7006
Gas & Electric,           1223
Water & Sewer,             663
Legal & Accounting,       2589
#Management Fees,           468
Common Area Cleaning,      900
Misc. Admin,               127

news:
Finance, Still waiting for from ML.
Ongoing Work, #3035 garage water damage: Dave Miller workers
  were onsite Thursday 28 May,this part of job is complete. #3035 & #3037
  decks: Still waiting, ask ML for update.
Contracts, No current issues, contract renegotiation on radar for ML.
Property Assessment, Board agree that we need to push Bruner
  to at least start an assessment of decks so that we can plan. Deck assessment
  is high priority because there maybe safety issues with railings. And it
  give residents confidence that SOMETHING is happening around the place that
  is different to BEFORE Bruner were on board. We need to roll out a costed plan.
Legal, Awaiting advice yet about resolution of pending case. KP to investigate.
Resident Issues, Feed back from circular to residents?: It
  has not been sent yet. Resident reported being woken by critters,
  possibly squabbling over food left out. JS reported chipmunks
  and mice in past, but hard to know if critter feeding is
  implicated in attracting these animals.
Delinquency, ML has made plan and is dealing with this issue for the association.
Rules & Regs, Critter feeding: Because jurisdiction is
  unclear, we relaxed a rules violation letter for feeding critters just
  outside the condo property to a voluntary request to stop. But feeding
  persists. It looks to be taking place about 10 to 15 feet inside condo
  property boundary, JD thinks that we should use the survey map to
  establish our boundary and review.
Other Business, ML to attend next virtual board meeting?
  BC reported dehumidifier issues at both ends of building #3025-#3035.
  At the #3025 end the dehumidifier unit is excessively noisy and vibrating.
  It may need replacing. At the #3035 end, the unit is not plugged in nor
  correctly plumbed to drain. Ask Bruner to advise and repair/replace.

votes:
VOTE#1, For KP to become our Communications Director: JS=Y,
  JD=Y, KP=Y, BC=Y, JK=Y (carried).
VOTE#2, To ask ML to attend next board meeting: JS=Y, JD=Y,
  KP=Y, BC=Y, JK=Y (carried).


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    May-2020    May-2020    May-2020    May-2020    May-2020    May-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 04-May-2020

present:
Initials, KP, BC, JK, JD, JS

bruner:
ML, Matt Lindholm

board:
JS, Judy Setzkorn
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

news:
Insurance, Claim on #3035 water damage: Beam repair estimate
  was $4,462. We are close to being dropped by our insurer. Hand over
  contracting for drywall to complete job Bruner.  Review: Ongoing with ML.
Ongoing Work, #3035 garage and contracted decks for
  #3035 and #3037:  (This contract has been in place since October last year).
  Dave Miller plans to hopefully start week of May 4th, ML to make sure he
  honors his new timeline.
Contracts, Fire alarm testing service: KP queried price, ML
  was able to get price reduced from $1,500 to $700. Snow: Status OK and
  ongoing with ML. Lawn care: Status OK and ongoing with ML.')
Property Assessment, JD says this was a big part of
  Bruner’s pitch - a 5 year needs assessment for our budgeting. The back
  drive and decks are a big part of this, but we don’t want to lose the big
  picture needs here - we need to have an actionable, getting-stuff-done budget
  by August and we need to press Bruner to help make that happen.
Legal, KP reported phone call with our lawyer to resolve case against former
  resident of #3021.
Resident Issues, Pathway lighting for lower level units:
  Board decided to tell ML that the floodlights were our solution to the
  lighting problem, that unless there was a bigger issue at stake that we
  did not understand, this is not something that the board wants to address
  right now. BC offered to assist safely dealing with defunct lights.
  Trash pickup alternatives: ML is checking into this, will report back.
Delinquency, ML is making a plan and will deal with these
  issues for the association.
Rules & Regs, Board discussed idea of a general circular
  to remind residents of rules/regs and the reasons for them.  KP can supply
  a summary list of common transgressions, JD can pen introductory paragraph.
  Circulate for comment to rest of board before passing on to Bruner as a
  draft for ML to finalize and distribute.  On the specific issue of dog pee
  damaging grass, ML can send an information/warning letter. On the issue of
  critter feeding, that needs to be addressed with an immediate warning as it
  is roundly seen as a health issue, an issue which could increase condo
  costs (pest control) and even potential property damage. Wisconsin DNR advises
  against feeding wild citters in the urban environment. We all live here and the
  board’s view is that we cannot be encouraging pests onto our shared property.

votes:
VOTE#1, An email vote on 12 April, 2020; to resolve legal issues with
  former resident of #3021 by reciprocal agreement: JS=U, JD=Y, KP=Y, BC=Y,
  JK=Y (carried).


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#    Apr-2020    Apr-2020    Apr-2020    Apr-2020    Apr-2020    Apr-2020     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

Meeting Date: 06-Apr-2020

present:
Initials, ML, KP, BC, JK, JD, JS

bruner:
ML, Matt Lindholm

board:
JS, Judy Setzkorn
JD, James Davies
KP, Karen Pauer
BC, Bob Christensen
JK, Jamie Karls

news:
Finance, Financial hand-off to Bruner Administrative system: KP sent info to ML
  to allow Bruner owners to become signatories to Heights of Stratton BMO
  account within a few days. KP to deposit April fees and pay last snow
  account. KP provide ML with physical banking items, check books etc. Bruner
  to have full control of Operational, deposit only to Reserve (withdrawal to
  require board approval).
Documents, Uploading documents to Bruner: KP & JD to email ML current relevant
  documentation, e.g. minutes of special meeting, budgets, board minutes,
  contracts, anything we have.
Garage #3035, Structural stabilization and repair for water damage: Engineer
  inspected last Monday, report due this coming Wednesday. Once ML has report,
  he will contact Dave Miller for quote on doing work, and at least one other
  quote, bring to board as soon as he can for vote. ML to provide insurance
  adjuster information on quotes for structural repair & board later to decide
  claim or no claim.
Decks Underway, Need to resolve water damage with contractor before work
  underway on #3035 & #3037 decks can resume.
Routine Contracts, Snow: ML to provide options. Lawn: We have no current
  contract (correction, we do for this season), ML to provide options. Pest
  Control: No action defer to AGM. Cleaning: No action, our current contract
  is working.
Back driveway, ML to initiate investigations, report back to board.
New decks, Board members to forward any existing quotes, ML to flesh out plan
  for identifying decks that are dangerous, and (once financial position clear)
  work with board to make a plan for deck replacements in a time frame that we
  can afford.
General maint., No action on this, we will deal with problems as they arise and
  are reported by residents. Consider developing a routine check-list in the
  future.
Resident issues, Trash pickup options: ML will reach out to his trash collection
  contacts to scope what options are available to us, and their costs, either as
  individual owners or as an association. Resident reported dog waste being tossed
  into land at rear: Board believe offenders are likely NOT Heights residents.
  JD suggested signage. Dog waste issue not really resolved at this time. 
  JS pointed to dog pee problem, big dogs let out to pee on grass out front and
  killing the lawn. JS to supply Matt with dog pee problem unit number(s).
Rule/Regs, ML has our regulations. Board members have observed that animal
  feeding is attracting vermin (racoons). ML to review regulations and to advise
  owner how this behaviour could be contrary to regulations.

END-MEETINGS

Row

Status

Version 1.0
---
title: "Heights of Stratton : Dashboard"
output: 
  flexdashboard::flex_dashboard:
    theme: cosmo
    social: ["twitter", "facebook"]
    orientation: rows
    source_code: embed
    navbar:
      - { title: "Email Condo Manager",
           icon: "fa-at",
          align: "left",
           href: "mailto:MatthewL@brunerrealtyinc.com" }
      - { title: "Email Board",
           icon: "fa-at",
          align: "right",
           href: "mailto:heightsofstratton@gmail.com" }
---

```{r setup, include=FALSE}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#     L I B R A R Y     L I B R A R Y     L I B R A R Y     L I B R A R Y     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
library(knitr)
library(getopt)
library(lubridate)
library(tidyverse)
library(kableExtra)
library(RColorBrewer)
library(flexdashboard)
```

```{r functions, include=FALSE}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#   F U N C T I O N    F U N C T I O N    F U N C T I O N    F U N C T I O N  #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# ---------------------------------------------------------------
  budget_tibble_from_tag_keyval <- function(tagtib, kvtib, inbuf)
# ===============================================================
# budget_tibble <- budget_tibble_from_tag_keyval(tag_tibble, keyval_tibble, inbuf)
{
  # tagtib is the tag tibble
  # kvtib is the keyval_tibble
  # inbuf is the linebuffer
  # returns a tibble that is a structured representation of dashboard data
  tagtib$LINETO <- c(tagtib$LINE[2:nrow(tagtib)], max(kvtib$LINE))
  tibout <- tibble(DATE=NULL, TAG=NULL, KEY=NULL, VALUE=NULL)
  budget <- NA
  for (i in seq(nrow(tagtib))) {
    if (tagtib$TAG[i] == 'Budget Year:') {
      budget <- budget_year_from_linebuffer(inbuf, tagtib$LINE[i])
    } else {
      tag <- tagtib$TAG[i]
      tib <- filter(kvtib, LINE > tagtib$LINE[i] & LINE < tagtib$LINETO[i])
      j <- str_locate(tib$KEYVAL, ',')[,1L]
      stopifnot(!any(is.na(j)))
      key <- trimws(substr(tib$KEYVAL, 1L, j-1L))
      value <-  trimws(substr(tib$KEYVAL, j+1L, nchar(tib$KEYVAL)))
      rec <- tibble(YEAR=budget, TAG=tag, KEY=key, VALUE=as.numeric(value))
      tibout <- bind_rows(tibout, rec)
    }
  }
  return(tibout)
}

# ---------------------------------------------------
  budget_year_from_linebuffer <- function(inbuf, idx)
# ===================================================
# budget <- budget_year_from_linebuffer(inbuf, idx)
{
  # return meeting as class date from inbuf[idx]
  # (this is a special purpose and specific function)
  s <- unlist(strsplit(trimws(inbuf[idx]), ' +'))
  y <- as.integer(s[3])
  return(y)
}

# ----------------------------------------------
  decode_PLperiod_description <- function(tibin)
# ==============================================
# tibout <- decode_PLperiod_description(tibin)
{
  # tibin is tibble(DATE, TAG, KEY, VALUE) where VALUEs are character strings.
  # Once filtered for 'P&Lperiod' the VALUEs are a month like "Apr-2020", or
  #   a month range like "Apr-2020 to May-2020", or a date range like 
  #   "01-Apr-2020 to 31-May-2020". N.B. These are the ONLY supported
  #   "P&Lperiod" formats.
  # tibout is tibin with two added date columns, START & END of decoded period.
  PLperiod <- filter(tibin, TAG=='dates:' & KEY=='P&Lperiod')
  tib <- tibble()
  for (value in PLperiod$VALUE) {
    if(nchar(value)==8) { # "mmm-YYYY"
      from <- as.Date(sprintf("01-%s", value), format="%d-%b-%Y")
      to <- from + months(1) - days(1)
      rec <- tibble(START=from, END=to)
      tib <- bind_rows(tib, rec)
    } else {
      parts <- unlist(strsplit(value, ' +'))
      if (nchar(parts[1])==11) { # "dd-mmm-YYYY"
        from <- as.Date(parts[1], format="%d-%b-%Y")
      }
      if (nchar(parts[1])==8) { # "mmm-YYYY"
        from <- as.Date(sprintf("01-%s", parts[1]), format="%d-%b-%Y")
      }
      if (nchar(parts[3])==11) { # "dd-mmm-YYYY"
        to <- as.Date(parts[3], format="%d-%b-%Y")
      }
      if (nchar(parts[3])==8) { # "mmm-YYYY"
        tmp <- as.Date(sprintf("01-%s", parts[3]), format="%d-%b-%Y")
        to <- tmp + months(1) - days(1)
      }
      rec <- tibble(START=from, END=to)
      tib <- bind_rows(tib, rec)
    }
  }
  stopifnot(nrow(PLperiod)==nrow(tib))
  tibout <- bind_cols(PLperiod, tib)
  return(tibout)
}

# -------------------------------------------------------------
  item_tibble_from_tag_keyval <- function(tagtib, kvtib, inbuf)
# =============================================================
# item_tibble <- item_tibble_from_tag_keyval(tag_tibble, keyval_tibble, inbuf)
{
  # tagtib is the tag_tibble
  # kvtib is the keyval_tibble
  # inbuf is the line buffer
  # returns a tibble that is a sructured representation of dashboard data
  tagtib$LINETO <- c(tagtib$LINE[2:nrow(tagtib)], max(kvtib$LINE))
  tibout <- tibble(DATE=NULL, TAG=NULL, KEY=NULL, VALUE=NULL)
  meeting <- NA
  for (i in seq(nrow(tagtib))) {
    if (tagtib$TAG[i] == 'Meeting Date:') {
      meeting <- meeting_date_from_linebuffer(inbuf, tagtib$LINE[i])
    } else {
      tag <- tagtib$TAG[i]
      tib <- filter(kvtib, LINE > tagtib$LINE[i] & LINE < tagtib$LINETO[i])
      j <- str_locate(tib$KEYVAL, ',')[,1L]
      stopifnot(!any(is.na(j)))
      key <- trimws(substr(tib$KEYVAL, 1L, j-1L))
      value <-  trimws(substr(tib$KEYVAL, j+1L, nchar(tib$KEYVAL)))
      rec <- tibble(DATE=meeting, TAG=tag, KEY=key, VALUE=value)
      tibout <- bind_rows(tibout, rec)
    }
  }
  return(tibout)
}

# -------------------------------------------------------
  keyval_tibble_from_linebuffer <- function(tibin, inbuf)
# =======================================================
# keyval_tibble <- keyval_tibble_from_linebuffer(type_tibble, inbuf)
{
  # return combined keyvalue as tibble
  tibout <- tibble()
  i <- 0L ; n <- nrow(tibin)
  while (i < n) {
    i <- i + 1L
    if (tibin$TYPE[i] == 'ITEM') {
      keyval <- inbuf[type_tibble$LINE[i]]
      i <- i + 1L
      if (i <= n)
      while (tibin$TYPE[i] == 'next') {
        keyval <- paste(keyval, inbuf[tibin$LINE[i]])
        i <- i + 1L
      }
      i <- i - 1L
      rec <- tibble(LINE=tibin$LINE[i], KEYVAL=tidy_string(keyval))
      tibout <- bind_rows(tibout, rec)
    }
  }
  return(tibout)
}

# ----------------------------------------------------
  meeting_date_from_linebuffer <- function(inbuf, idx)
# ====================================================
# meeting <- meeting_date_from_linebuffer(inbuf, idx)
{
  # return meeting as class date from inbuf[idx]
  # (this is a special purpose and specific function)
  s <- unlist(strsplit(trimws(inbuf[idx]), ' +'))
  d <- as.Date(s[3], '%d-%b-%Y', tz='CST')
  return(d)
}

# ---------------------------------
  strip_comments <- function(inbuf)
# =================================
# outbuf <- strip_comments(inbuf)
{
  # remove lines beginning with '#' from inbuf
  tib <- as_tibble(str_locate(inbuf, '#'))
  tib$line <- seq(nrow(tib))
  kdx <- seq(nrow(tib))
  tib <- filter(tib, start==1)
  mdx <- setdiff(kdx, tib$line)
  return(inbuf[mdx])
}

# ----------------------------------------
  summarize_in_out <- function(tibin, tag)
# ========================================
# tibout <- summarize_in_out(tibin, tag)
{
  # tibin is tibble(TAG, KEY, VALUE)
  tib <- filter(tibin, TAG==tag) %>% group_by(KEY) %>%
    summarize(TOTAL=sum(VALUE), .groups = 'drop')
  rec <- tibble(TAG=toupper(tag), KEY="----------------", TOTAL=sum(tib$TOTAL))
  tibout <- mutate(tib, TAG=tag) %>% bind_rows(rec) %>% select(TAG, KEY, TOTAL)
  return(tibout)
}

# ---------------------------------------------------
  tag_tibble_from_linebuffer <- function(tags, inbuf)
# ===================================================
# tag_tibble <- tag_tibble_from_linebuffer(tags, inbuf)
{
  # returns a tibble of tags in line order
  tibout <- tibble(LINE=NULL, TAG=NULL)
  for (tag in tags) {
    tib <- as_tibble(str_locate(inbuf, tag))
    tib$line <- seq(nrow(tib))
    rec <- tibble(LINE=filter(tib, start==1)$line, TAG=tag)
    tibout <- bind_rows(tibout, rec)
  }
  return(arrange(tibout, LINE))
}

# ---------------------------------
  tidy_string <- function(instring)
# =================================
# outstring <- tidy_string(instring)
{
  # instring is a string with long spaces and line-feeds to remove
  outstring <- trimws(gsub('\n', ' ', instring))
  for (i in seq(10)) { outstring <- gsub('  ', ' ', outstring) }
  return(outstring)
}

# -----------------------------------------------------
  type_tibble_from_linebuffer <- function(tibin, inbuf)
# =====================================================
# type_tibble <- type_tibble_from_linebuffer(tag_tibble, inbuf)
{
  # returns a tibble of tags in line order
  tib <- as_tibble(str_locate(inbuf, '..')) # regex any two characters
  tib$line <- seq(nrow(tib))
  idx <- filter(tib, start==1)$line
  tib <- as_tibble(str_locate(inbuf, '  ')) # specifically two spaces
  tib$line <- seq(nrow(tib))
  jdx <- filter(tib, start==1)$line
  kdx <- tag_tibble$LINE
  mdx <- setdiff(idx, union(jdx, kdx))
  tibout <- bind_rows(tibble(LINE=mdx, TYPE='ITEM'),
    tibble(LINE=jdx, TYPE='next'))
  return(arrange(tibout, LINE))
}
```

```{r display, include=FALSE}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#     D I S P L A Y     D I S P L A Y     D I S P L A Y     D I S P L A Y     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

# -----------------------------------------------
  add_present_to_label <- function(tibrow, tibin)
# ===============================================
# add_present_to_label(r, tibin)
{
  # Adds initials of those listed as present (if they are recorded)
  # tibrow is tibble(DATE, LABEL, START, END)
  # tibin is tibble(DATE, TAG, KEY, VALUE), the meeting tibble for one+ months
  for (i in seq(nrow(tibrow))) {
    p <- filter(tibin, DATE==tibrow$DATE[i] & TAG=='present:' & KEY=='Initials')
    if (nrow(p)==1L) { 
      tibrow$LABEL[i] <- paste(tibrow$LABEL[i], sprintf("(present: %s)", p$VALUE))
    }
  }
  return(tibrow)
}

# ----------------------------------
  bracketed_dates <- function(tibin)
# ==================================
# people <- bracketed_dates(tibin)
{
  # tibin is tibble with DATE as meeting dates
  tib <- select(tibin, DATE) %>% distinct() %>% arrange(DATE)
  d <- paste(strftime(unique(range(tib$DATE)), '%d-%b-%Y'), collapse=' to ')
  return(sprintf("[ %s ]", d))
}

# -----------------------------------
  bracketed_people <- function(tibin)
# ===================================
# people <- bracketed_people(tibin)
{
  # tibin is tibble (TAG, KEY, VALUE) for people
  tib <- select(tibin, TAG, KEY, VALUE) %>% distinct() %>% arrange(KEY)
  k <- str_to_title(tib$TAG[1])
  p <- paste(sprintf("%s=%s", tib$KEY, tib$VALUE), collapse=', ')
  return(sprintf("[ %s %s ]", k, p))
}

# -----------------------------------
  business_missing <- function(tibin)
# ===================================
# tibout <- business_missing(tibin)
{
  # tibin is tibble(ITEM, ANNOTATION)
  if (nrow(tibin) == 0) {
    tibin <- tibble(ITEM="", ANNOTATION="")
  }
  return(tibin)
}

# --------------------------------------------
  gauge_prorata <- function(tibin, tag, color)
# ============================================
# gauge_prorata(ytd_tibble, 'expense:', 'red')
{
  # I am not going to color code for warning, but rather force
  # to a fixed color consistent with earlier value_box usage.
  q <- filter(tibin, TAG==toupper(tag))
  bud <- q$BUDGET_ANNUAL
  val <- q$ACTUAL_YTD
  if (bud==0) { bud <- 1; val <- 0}
  percent_valu <- round(val / bud * 100)
  g <- gauge(percent_valu, min=0, max=100, symbol='%', gaugeSectors(
    success=c(0, 39), warning=c(40, 79), danger=c(80, 100),
    colors=c(color, color, color)))
  return(g)
}

# -----------------------------------------------
  pie_chart_of_monthly_expense <- function(tibin)
# ===============================================
# grob <- pie_chart_of_monthly_expenses(tibin)
{
  # tibin is tibble for specific meeting date
  enote <- filter(tibin, TAG=='enote:')
  if (nrow(filter(enote, KEY=='Note'))==1) {
    note <- strwrap(filter(enote, KEY=='Note')$VALUE, width=40, indent=0)
    cat(paste(note, collapse="\n"))
  }
  expense <- filter(tibin, TAG=='expense:' & VALUE>0) %>% arrange(KEY)
  blank_theme <- theme_minimal()+
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        panel.border = element_blank(),
        panel.grid = element_blank(),
        axis.ticks = element_blank(),
        plot.title.position = 'panel')
  g <- tibble(); cum <- 0
  for (i in seq(nrow(expense))) {
    key <- expense$KEY[i]
    value <- as.numeric(expense$VALUE[i])
    cum <- cum + value
    g <- bind_rows(g, tibble(KEY=key, VALUE=value, CUM=cum))
  }
  g$LABEL <- sprintf("$%s", round(g$VALUE))
  mypal <- colorRampPalette(rev(brewer.pal(10, 'Spectral')))
  n <- nrow(g)
  nudge <- rep(c(1,0,-1,0),10)[seq(n)]*0.3
  if (nudge[n]==nudge[1]) { nudge[n] <- (-1)*nudge[n] }
  g$COLOR <- mypal(n)
  g$YPOS <- sum(g$VALUE) - g$CUM + g$VALUE/2
  p <- ggplot(g, aes(x="", y=VALUE, fill=KEY))
  p <- p + blank_theme
  p <- p + theme(axis.text.x=element_blank())
  p <- p + geom_bar(width = 1, stat = "identity")
  p <- p + scale_fill_manual(values=g$COLOR)
  p <- p + coord_polar("y", start=0)
  p <- p + geom_label(aes(y=YPOS, label=LABEL), show.legend=FALSE,
    nudge_x=nudge, size=5)
  p <- p + theme(legend.position="right")
  p <- p + theme(legend.box.margin=margin(0, 0, 0, -1, "cm"))
  p <- p + theme(legend.title=element_text(size=13))
  p <- p + theme(legend.text=element_text(size=11))
  p <- p + theme(plot.margin=margin(-1, 0, -1, -1, "cm"))
  p <- p + geom_text(aes(x=0, y=0, label="   "), size=14)
  return(p)
}

# --------------------------------
  radar_missing <- function(tibin)
# ================================
# tibout <- radar_missing(tibin)
{
  # tibin is tibble(PROJECT, ACTION_BY)
  if (nrow(tibin) == 0) {
    tibin <- tibble(PROJECT="", ACTION_BY="")
  }
  return(tibin)
}

# ------------------------------------
  row_group_history <- function(tibin)
# ====================================
# tibout <- row_group_history(tibin)
{
  # tibin is tibble(DATE, TAG, KEY, VALUE)
  tib <- tibin
  tib$ROW <- seq(nrow(tib))
  tibout <- tibble()
  d <- select(tib, DATE) %>% distinct()
  for (i in seq(nrow(d))) {
    rows <- filter(tib, DATE==d$DATE[i])$ROW %>% range()
    label <- sprintf("Meeting on %s", strftime(d$DATE[i], '%A %d %B, %Y', tz='CST'))
    rec <- tibble(DATE=d$DATE[i], LABEL=label, START=rows[1], END=rows[2])
    tibout <- bind_rows(tibout, rec)
  }
  return(tibout)
}

# ------------------------------------------
  table_budget_comparison <- function(tibin)
# ==========================================
# table_budget_comparison(ytd_tibble)
{
  # tibin is tibble(TAG, KEY, ACTUAL_YTD, BUDGET_ANNUAL, END_DATE)
  # It is rather specialized in that TAGs are 'capex:', 'expense:' & 'income:'
  # but I have already summarised and put group totals under TAGs 'CAPEX:',
  # 'EXPENSE:' & 'INCOME:' with a KEY set to '----------------'.
  # I want to drop any rows where there is no budgeted income/expense
  # AND no actual income/expense, and I want to group by those CAPITALIZED
  # TAGs.  This function is specific and ugly - suck it up.
  ytd <- as.Date(tibin$END_DATE[1], format="%d-%b-%Y")
  budget_footnote <- sprintf("As at %s", strftime(ytd, '%A %d %B, %Y', tz='CST'))
  q <- tibin
  q$ACTUAL_YTD[is.na(q$ACTUAL_YTD)] <- 0
  q$BUDGET_ANNUAL[is.na(q$BUDGET_ANNUAL)] <- 0
  q <- filter(q, !(ACTUAL_YTD==0 & q$BUDGET_ANNUAL==0))
  q <- mutate(q, YTD=sprintf("%s", format(round(ACTUAL_YTD), big.mark=","))) %>%
    mutate(BUD=sprintf("%s", format(round(BUDGET_ANNUAL), big.mark=","))) %>%
    select(TAG, KEY, YTD, BUD)
  q$YTD[trimws(q$YTD)=="0"] <- ""
  q$BUD[trimws(q$BUD)=="0"] <- ""
  r <- bind_rows(
    tibble(KEY='', YTD='', BUD=''),
    tibble(KEY='INCOME', YTD='', BUD=''),
    filter(q, TAG %in% c('income:', 'INCOME:')),
    tibble(KEY='', YTD='', BUD=''),
    tibble(KEY='EXPENSE', YTD='', BUD=''),
    filter(q, TAG %in% c('expense:', 'EXPENSE:')),
    tibble(KEY='', YTD='', BUD=''),
    tibble(KEY='RESERVE', YTD='', BUD=''),
    filter(q, TAG %in% c('reserve:')),
    tibble(KEY='', YTD='', BUD=''),
    tibble(KEY='CAPEX', YTD='', BUD=''),
    filter(q, TAG %in% c('capex:', 'CAPEX:')),
    tibble(KEY='', YTD='', BUD='')) %>% select(KEY, YTD, BUD)
  r$KEY[r$KEY=='----------------'] <- 'TOTAL'
  rdx <- seq(nrow(r))[r$KEY==""]
  b <- select(r, ITEM=KEY, '$ Actual to date'=YTD, '$ Annual budget'=BUD) %>%
    kable(align="lrr") %>% 
    kable_styling(bootstrap_options=c("striped", "condensed"), font_size=14) %>%
    column_spec(1, width="45em", bold=TRUE, border_right=TRUE) %>%
    column_spec(2, width="20em", border_right=TRUE, monospace=TRUE) %>%
    column_spec(3, width="20em", border_right=TRUE, monospace=TRUE) %>%
    row_spec(rdx, background="darkgray") %>%
    footnote(general_title=budget_footnote, title_format="bold", general="")
  return(b)
}

# ---------------------------------
  table_business <- function(tibin)
# =================================
# table_business(tibin)
{
  # tibin is tibble(DATE, TAG, KEY, VALUE) for specific meeting date
  # I have added meeting date + people present as group_rows() header
  business_footnote <- 'VOTING : Y=yes, N=no, A=abstain, U=unavailable'
  label <- sprintf("%s", strftime(tibin$DATE[1], '%A %d %B, %Y', tz='CST'))
  p <- filter(tibin, DATE==tibin$DATE[1] & TAG=='present:' & KEY=='Initials')
  if (nrow(p)==1L) { label <- paste(label, sprintf("(present: %s)", p$VALUE)) }
  q <- filter(tibin, TAG %in% c('news:','votes:')) %>% arrange(TAG) %>%
    select(ITEM=KEY, ANNOTATION=VALUE) %>% business_missing()
  b <- kable(q) %>% 
    kable_styling(bootstrap_options=c("striped", "condensed"), font_size=14) %>%
    column_spec(1, width="15em", bold=TRUE, border_right=TRUE) %>%
    column_spec(2, width="60em") %>%
    group_rows(group_label=label, start_row=1L, end_row=nrow(q), indent=FALSE) %>%
    footnote(general_title=business_footnote, title_format="bold", general="")
  return(b)
}

# --------------------------------
  table_history <- function(tibin)
# ================================
# table_table_history(tibin)
{
  # tibin is tibble for a range of meeting dates
  history_footnote <- 'VOTING : Y=yes, N=no, A=abstain, U=unavailable'
  q <- filter(tibin, TAG %in% c('news:','votes:')) %>% arrange(desc(DATE))
  r <- row_group_history(q) %>% add_present_to_label(tibin)
  b <- select(q, ITEM=KEY, ANNOTATION=VALUE) %>% kable() %>% 
    kable_styling(bootstrap_options=c("striped", "condensed"), font_size=14) %>%
    column_spec(1, width="15em", bold=TRUE, border_right=TRUE) %>%
    column_spec(2, width="75em") %>%
    footnote(general_title=history_footnote, title_format="bold", general="")
  for (i in seq(nrow(r))) {
    b <- group_rows(b, group_label=r$LABEL[i], start_row=r$START[i],
      end_row=r$END[i])
  }
  return(b)
}

# ------------------------------------------
  table_radar_no_footnote <- function(tibin)
# ==========================================
# table_radar_no_footnote(tibin)
{
  # tibin is tibble for specific meeting date
  # (footnote is different Current vs Previous, so apply outside function)
  q <- filter(tibin, TAG=='radar:')
  q$SDATE <- as.Date(q$KEY, '%d-%b-%Y')
  q$ACTION_BY <- strftime(q$SDATE, '%d-%b-%Y')
  r <- arrange(q, SDATE) %>% select(PROJECT=VALUE, ACTION_BY) %>%
    radar_missing() %>% kable() %>% 
    kable_styling(bootstrap_options=c("striped", "condensed"), font_size=14) %>%
    column_spec(1, border_right=TRUE) %>%
    column_spec(2, bold=TRUE, width="8em")
  return(r)
}

# -----------------------------------
  value_box_expense <- function(tibin)
# ====================================
# value_box_expense(tibin)
{
  # tibin is tibble for specific meeting date
  tib <- filter(tibin, TAG=='expense:')
  if (nrow(tib)>0L) { value <- sum(as.numeric(tib$VALUE)) } else { value <- NA }
  disp <- sprintf("$%s", format(round(value), big.mark=","))
  tib <- filter(tibin, TAG=='dates:' & KEY=='P&Lperiod')
  if (nrow(tib)==1L) { value <- tib$VALUE } else { value <- NA }
  capn <- sprintf("Expense for period %s", value)
  icon <- "fa-file-invoice-dollar"
  return(valueBox(disp, icon=icon, color="red", caption=capn))
}

# -----------------------------------
  value_box_income <- function(tibin)
# ===================================
# value_box_income(tibin)
{
  # tibin is tibble for specific meeting date
  tib <- filter(tibin, TAG=='income:')
  if (nrow(tib)>0L) { value <- sum(as.numeric(tib$VALUE)) } else { value <- NA }
  disp <- sprintf("$%s", format(round(value), big.mark=","))
  tib <- filter(tibin, TAG=='dates:' & KEY=='P&Lperiod')
  if (nrow(tib)==1L) { value <- tib$VALUE } else { value <- NA }
  capn <- sprintf("Income for period %s", value)
  icon <- "fa-donate"
  return(valueBox(disp, icon=icon, color="mediumblue", caption=capn))
}

# --------------------------------------
  value_box_operating <- function(tibin)
# ======================================
# value_box_operating(tibin)
{
  # tibin is tibble for specific meeting date
  tib <- filter(tibin, TAG=='balances:' & KEY=='Operating')
  if (nrow(tib)>0L) { value <- sum(as.numeric(tib$VALUE)) } else { value <- NA }
  disp <- sprintf("$%sK", round(value/1000, digits=1))
  tib <- filter(tibin, TAG=='dates:' & KEY=='Finance')
  if (nrow(tib)==1L) { value <- tib$VALUE } else { value <- NA }
  capn <- sprintf("Operating as at %s", value)
  icon <- "fa-money-bill-alt"
  return(valueBox(disp, icon=icon, color="green", caption=capn))
}

# -----------------------------------
  value_box_people <- function(tibin)
# ===================================
# value_box_people(tibin)
{
  # tibin is tibble for specific date or range of meeting dates
  bruner <- filter(tibin, TAG=='bruner:') %>% bracketed_people()
  board <- filter(tibin, TAG=='board:') %>% bracketed_people()
  dates <- tibin %>% bracketed_dates()
  capn <- paste(bruner, board, dates)
  icon <- "fa-user-friends"
  return(valueBox("People", icon=icon, color="teal", caption=capn))
}

# ------------------------------------
  value_box_reserve <- function(tibin)
# ====================================
# value_box_reserve(tibin)
{
  # tibin is tibble for specific meeting date
  tib <- filter(tibin, TAG=='balances:' & KEY=='Reserve')
  if (nrow(tib)>0L) { value <- sum(as.numeric(tib$VALUE)) } else { value <- NA }
  disp <- sprintf("$%sK", round(value/1000, digits=1))
  tib <- filter(tibin, TAG=='dates:' & KEY=='Finance')
  if (nrow(tib)==1L) { value <- tib$VALUE } else { value <- NA }
  capn <- sprintf("Reserve as at %s", value)
  icon <- "fa-piggy-bank"
  return(valueBox(disp, icon=icon, color="orange", caption=capn))
}

# -------------------------------------------------------
  value_box_status <- function(version, operational=TRUE)
# =======================================================
# value_box_status(version, operational=FALSE)
{
  # version is the version string
  # operational is TRUE or FALSE
  update <- sprintf("LAST UPDATED: %s", format(file.mtime(DEV), "%d-%b-%Y @ %X"))
  if (operational) {
    icon <- "fa-check-circle"
    color <- "seagreen"
    capn <- sprintf("STATUS: Dashboard is operational | %s", update)
  } else {
    icon <- "fa-drafting-compass"
    color <- "gold"
    capn <- sprintf("STATUS: Dashboard is under construction | %s", update)
  }
  return(valueBox(version, icon=icon, color=color, caption=capn))
}
```

```{r main, include=FALSE}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#                                                                             #
#     M A I N     M A I N     M A I N     M A I N     M A I N     M A I N     #
#                                                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

DEV <<- '~/Dropbox/CondoBoard/Board_Meetings/2020/Dashboard/HoS_Dashboard.Rmd'
SELF <<- get_Rscript_filename()
if (is.na(SELF)) SELF <<- DEV
setwd(dirname(SELF))
fullbuf <- readLines('HoS_Dashboard.txt')

buf <- strip_comments(fullbuf)


# Annual Budget Items
# ```````````````````
inbuf <- buf[grep('START-BUDGETS', buf):grep('END-BUDGETS', buf)]

budget_tags <- c('Budget Year:', 'reserve:', 'income:', 'expense:')
  
tag_tibble <- tag_tibble_from_linebuffer(budget_tags, inbuf)

type_tibble <- type_tibble_from_linebuffer(tag_tibble, inbuf)

keyval_tibble <- keyval_tibble_from_linebuffer(type_tibble, inbuf) %>%
  filter(!(KEYVAL %in% c('START-BUDGETS', 'END-BUDGETS')))

budget_tibble <- budget_tibble_from_tag_keyval(tag_tibble, keyval_tibble, inbuf)


# Monthly Meeting Items
# `````````````````````
inbuf <- buf[grep('START-MEETINGS', buf):grep('END-MEETINGS', buf)]

tags <- c('Meeting Date:', 'bruner:', 'board:', 'present:', 'dates:', 'balances:',
  'income:', 'expense:', 'capex:', 'reserve:', 'news:', 'votes:', 'radar:', 'enote:')

tag_tibble <- tag_tibble_from_linebuffer(tags, inbuf)

type_tibble <- type_tibble_from_linebuffer(tag_tibble, inbuf)

keyval_tibble <- keyval_tibble_from_linebuffer(type_tibble, inbuf) %>%
  filter(!(KEYVAL %in% c('START-MEETINGS', 'END-MEETINGS')))

meeting_tibble <- item_tibble_from_tag_keyval(tag_tibble, keyval_tibble, inbuf)


# Subsets for this dashboard instance
# ```````````````````````````````````
current <- rev(sort(unique(meeting_tibble$DATE)))[1]
current_tibble <- filter(meeting_tibble, DATE==current)

previous <- rev(sort(unique(meeting_tibble$DATE)))[2]
previous_tibble <- filter(meeting_tibble, DATE==previous)

radar_footnote <- tidy_string('The purpose of this table is to keep important
  upcoming project and task deadlines in focus.')


# Budget calculations
# ```````````````````
# 2020
budget_year <- 2020

budget_start <- as.Date(sprintf("01-Jan-%04d", budget_year), format="%d-%b-%Y")
budget_end <- budget_start + years(1) - days(1)

period_tibble <- decode_PLperiod_description(meeting_tibble) %>%
  filter(START >= budget_start) %>% filter(END <= budget_end)

actual_tibble <- filter(meeting_tibble, DATE %in% period_tibble$DATE) %>%
  filter(TAG %in% c('income:', 'expense:', 'capex:', 'reserve:'))
actual_tibble$VALUE <- as.numeric(actual_tibble$VALUE)

actual <- budget <- tibble()
for (tag in c('income:', 'expense:', 'capex:', 'reserve:')) {
  actual <- select(actual_tibble, TAG, KEY, VALUE) %>%
    summarize_in_out(tag) %>% bind_rows(actual)
  budget <- filter(budget_tibble, YEAR==budget_year) %>%
  select(TAG, KEY, VALUE) %>% summarize_in_out(tag) %>% bind_rows(budget)
}

y2020_tibble <- full_join(rename(actual, X=TOTAL), rename(budget, Y=TOTAL),
  by=c("TAG", "KEY")) %>% rename(ACTUAL_YTD=X, BUDGET_ANNUAL=Y) %>% 
  arrange(TAG, KEY) %>% mutate(END_DATE=strftime(max(period_tibble$END), '%d-%b-%Y'))


# 2021
budget_year <- 2021

budget_start <- as.Date(sprintf("01-Jan-%04d", budget_year), format="%d-%b-%Y")
budget_end <- budget_start + years(1) - days(1)

period_tibble <- decode_PLperiod_description(meeting_tibble) %>%
  filter(START >= budget_start) %>% filter(END <= budget_end)

actual_tibble <- filter(meeting_tibble, DATE %in% period_tibble$DATE) %>%
  filter(TAG %in% c('income:', 'expense:', 'capex:', 'reserve:'))
actual_tibble$VALUE <- as.numeric(actual_tibble$VALUE)

actual <- budget <- tibble()
for (tag in c('income:', 'expense:', 'capex:', 'reserve:')) {
  actual <- select(actual_tibble, TAG, KEY, VALUE) %>%
    summarize_in_out(tag) %>% bind_rows(actual)
  budget <- filter(budget_tibble, YEAR==budget_year) %>%
  select(TAG, KEY, VALUE) %>% summarize_in_out(tag) %>% bind_rows(budget)
}

ytd_tibble <- full_join(rename(actual, X=TOTAL), rename(budget, Y=TOTAL),
  by=c("TAG", "KEY")) %>% rename(ACTUAL_YTD=X, BUDGET_ANNUAL=Y) %>% 
  arrange(TAG, KEY) %>% mutate(END_DATE=strftime(max(period_tibble$END), '%d-%b-%Y'))
```

Current {data-navmenu="Meetings" data-icon="fa-list"}
=====================================================

Row
---
### Reserve
```{r current reserve}
value_box_reserve(current_tibble)
```

### Operating
```{r current operating}
value_box_operating(current_tibble)
```

### Income
```{r current income}
value_box_income(current_tibble)
```

### Expenses
```{r current expense}
value_box_expense(current_tibble)
```

Row
---
### BREAKDOWN OF EXPENSES
```{r current pie expense}
pie_chart_of_monthly_expense(current_tibble)
```

### BUSINESS THIS MONTH
```{r current business table}
table_business(current_tibble)
```

### ON THE RADAR
```{r current radar table}
table_radar_no_footnote(current_tibble) %>% footnote(general=radar_footnote)
```

Row
---
### People
```{r current people}
value_box_people(current_tibble)
```

Previous {data-navmenu="Meetings" data-icon="fa-list"}
======================================================

Row
---
### Reserve
```{r previous reserve}
value_box_reserve(previous_tibble)
```

### Operating
```{r previous operating}
value_box_operating(previous_tibble)
```

### Income
```{r previous income}
value_box_income(previous_tibble)
```

### Expenses
```{r previous expense}
value_box_expense(previous_tibble)
```

Row
---
### BREAKDOWN OF LAST MONTH'S EXPENSES 
```{r previous pie expense}
pie_chart_of_monthly_expense(previous_tibble)
```

### BUSINESS LAST MONTH
```{r previous business table}
table_business(previous_tibble)
```

### ON THE RADAR LAST MONTH
```{r previous radar table}
table_radar_no_footnote(previous_tibble) %>% 
  footnote(general_title="WARNING: You are viewing previous month",
    title_format="bold", general=radar_footnote)
```

Row
---
### People
```{r previous people}
value_box_people(previous_tibble)
```

History {data-navmenu="Meetings" data-icon="fa-calendar-check"}
===============================================================

Row
---
### HISTORY OF BOARD MEETINGS
```{r history business table}
table_history(filter(meeting_tibble, year(DATE)==budget_year))
```

### YEAR-TO-DATE BUDGET COMPARISON {data-width=400}
```{r ytd comparison}
table_budget_comparison(ytd_tibble)
```

### PERCENT BUDGET UPTAKE TO DATE {data-width=200}

#### % YEAR ELAPSED 
```{r ytd time}
ytd <- decimal_date(as.Date(ytd_tibble$END_DATE[1], format="%d-%b-%Y")) %% 1
percent_time <- round(ytd * 100)
gauge(percent_time, min=0, max=100, symbol='%', gaugeSectors(
  success=c(0, 39), warning = c(40,79), danger=c(80, 100),
  colors=c("darkslategray", "darkslategray", "darkslategray")))
```

#### % INCOME RECEIVED
```{r ytd income}
gauge_prorata(ytd_tibble, 'income:', 'mediumblue')
```

#### % EXPENSE INCURRED
```{r ytd expense}
gauge_prorata(ytd_tibble, 'expense:', 'red')
```

#### % RESERVE REPLENISHED
```{r ytd reserve}
gauge_replenishment <- filter(ytd_tibble, TAG=='reserve:' & KEY=='Replenishment')$ACTUAL_YTD
if (is.na(gauge_replenishment)) gauge_replenishment <- 0
modifed_ytd_tibble <- filter(ytd_tibble, TAG == 'RESERVE:')
modifed_ytd_tibble$ACTUAL_YTD <- gauge_replenishment
gauge_prorata(modifed_ytd_tibble, 'reserve:', 'orange')
```

Row
---
### People
```{r all people}
value_box_people(filter(meeting_tibble, year(DATE)==budget_year))
```

Year 2020 {data-navmenu="Archive" data-icon="fa-save"}
======================================================

Row
---
### 2020 BOARD MEETINGS
```{r y2020 business table}
table_history(filter(meeting_tibble, year(DATE)==2020))
```

### 2020 BUDGET COMPARISON {data-width=400}
```{r y2020 comparison}
table_budget_comparison(y2020_tibble)
```

### 2020 BUDGET COMPARISON {data-width=200}

#### % YEAR ELAPSED 
```{r y2020 time}
ytd <- decimal_date(as.Date(y2020_tibble$END_DATE[1], format="%d-%b-%Y")) %% 1
percent_time <- round(ytd * 100)
gauge(percent_time, min=0, max=100, symbol='%', gaugeSectors(
  success=c(0, 39), warning = c(40,79), danger=c(80, 100),
  colors=c("darkslategray", "darkslategray", "darkslategray")))
```

#### % INCOME RECEIVED
```{r y2020 income}
gauge_prorata(y2020_tibble, 'income:', 'mediumblue')
```

#### % EXPENSE INCURRED
```{r y2020 expense}
gauge_prorata(y2020_tibble, 'expense:', 'red')
```

#### % RESERVE REPLENISHED
```{r y2020 reserve}
gauge_replenishment <- filter(y2020_tibble, TAG=='reserve:' & KEY=='Replenishment')$ACTUAL_YTD
if (is.na(gauge_replenishment)) gauge_replenishment <- 0
modifed_y2020_tibble <- filter(y2020_tibble, TAG == 'RESERVE:')
modifed_y2020_tibble$ACTUAL_YTD <- gauge_replenishment
gauge_prorata(modifed_y2020_tibble, 'reserve:', 'orange')
```

Row
---
### People
```{r y2020 people}
value_box_people(filter(meeting_tibble, year(DATE)==2020))
```

Technical
=========

Row
---
### THE R MARKDOWN DEVELOPMENT ENVIRONMENT IS SHOWN BELOW
```{r env spec}
options(width=100)
capture.output(print(sessionInfo())) %>% writeLines()
str_wrap("NOTE: A recent version of Pandoc (>= 1.12.3) is required to use the
  rmarkdown package. RStudio also automatically includes this so you do not
  need to download Pandoc if you plan to use rmarkdown from the RStudio IDE.
  If not using the RStudio IDE, you'll need to install Pandoc for your
  platform.", width=80) %>% writeLines()
```

### THE STRUCTURED TEXT INPUT FILE IS SHOWN BELOW
```{r txt header}
options(width=100)
cat(paste(fullbuf, collapse="\n"))
```

Row
---
### Status
```{r dev status}
value_box_status("Version 1.0", operational=TRUE)
```