Build a populated non-resident tax workbook from an Interhome payment-statement .xlsx and an Interhome guest check-in/check-out PDF, using the skill's bundled clean template automatically. Use this skill whenever the user wants to combine those Interhome income and arrival files into a tax workbook, income table, owner workbook, or repeatable merged spreadsheet workflow, especially when the payment statement and the arrivals list need to be matched together before filling Excel.
Use this skill to coordinate the two Interhome extraction workflows and merge their outputs into a workbook shaped like the user's tax template.
Identify these tagged files:
.xlsx.pdfAn optional tagged template .xlsx may also be supplied as an override, but it is not required.
If either required source file is missing, stop and say which file is missing.
Write:
.xlsx workbook based on a copied templatemerge_summary.json file describing what matched and what did notThe workbook must contain:
Income sheet shaped like the templateExceptions sheet listing unmatched or ambiguous income rowsBy default, use the bundled clean template at . Never write into the bundled template itself; always create and fill a copy.
assets/non-resident-tax-template.xlsxKeep responsibilities narrow:
When the task tool is available, prefer spawning two subagents in parallel so extraction stays isolated:
interhome-income-extraction workflowinterhome-arrival-csv workflowIf those installed skills are not available in the current environment but local repo copies exist, read the local child SKILL.md files directly and run their bundled scripts yourself.
The income extraction must yield:
checkin_date,type,match_key,amount
The arrival extraction must yield:
arrival_date,leaving_date,invoice_no,guest,owner_booking
Populate the Income sheet with one row per arrival row, ordered by arrival_date.
Columns:
Start Date = arrival_dateStop Date = leaving_dateNumber of DaysName of TenantBooking IDIncomeCommissionWhen owner_booking=true:
Number of Days = 0Name of Tenant = PrivateBooking ID = invoice_noIncome blankCommission blankWhen owner_booking=false:
Number of Days should remain a formula: =DAYS(Bn,An)Name of Tenant = guestBooking ID = invoice_noIncome = matched rental amountCommission = sum of matched non-rental amountsUse the payment-statement rental rows to populate Income.
Priority:
Exceptions instead of guessing silentlyUse non-rental payment-statement rows (Charge, Adjustment) to populate Commission.
Priority:
match_key equals the booking ID from arrivalsmatch_key matches the guest name after normalizationmatch_key rows match by date proximity:
If the match is weak or ambiguous, keep the row in Exceptions.
For matching only:
Do not rewrite the visible tenant name in the workbook using the normalized form. Keep the PDF guest name as the visible tenant name.
Income sheetIdentify the tagged payment-statement .xlsx and arrivals .pdf.
If the user also tagged a workbook template override, use that as the source template. Otherwise use the bundled clean template.
Choose output paths for:
income.csvarrivals.csvmerge_summary.jsonRun the two child extraction workflows in parallel when possible.
Run the bundled merge script:
PYENV_VERSION=3.10.14 python scripts/build_tax_workbook.py \
--income-csv /path/to/income.csv \
--arrivals-csv /path/to/arrivals.csv \
--output /path/to/output.xlsx \
--summary /path/to/merge_summary.json
If the user supplied a template override, add:
--template /path/to/user-template.xlsx
If soffice is available, recalculate the workbook. If it is not available locally, keep the formulas intact and say that recalculation could not be performed in this environment.
Return the workbook path and the summary path.