tax-ato-2026.1: CHANGELOG.md
## Version 2026.1
### CGT overhaul
Capital gains tax (CGT) received a significant overhaul.
Enhancements include:
- Added the a `CGTAsset` data type, which includes `CGTAssetType`
for tracking different categories of CGT assets.
- Implemented a separate loss carry-forward for collectables. The
new `CapitalLossCarryForward` data type has separate fields for
capital losses on collectables and other capital losses.
- Capital losses on personal use assets (`AssetTypePersonalUse`) are
disregarded.
- Added the `EntityType` data type. This ensures the correct CGT
discount proportion is used depending on whether the taxed entity
is an `Individual`, `Company`, `Trust` or `SuperFund`.
- The `assessCGTEvents` function now has an `EntityType` argument.
- Capital gains from trusts can now be included in CGT calculations.
The `CapitalGainsFromTrust` data type represents capital gains
from trust distributions. The 'prepTrustCGT' function converts
`CapitalGainsFromTrust` values into CGT events that represent the
grossed-up gain, including eligibility for the CGT discount or
small business concession.
- Added convenience constructors for various kinds of CGT events.
- Added some data types that will support the implementation (in a
future release) of various CGT exemptions and small business CGT
concessions.
- The `Data.Tax.ATO.Pretty.summariseCGTSchedule` prints the *CGT
schedule* for a given `CGTAssessment`.
### Personal services income (PSI)
Added module `Data.Tax.ATO.BPI` (*Business and professional items*),
which provides for declaring personal services income and associated
deductions.
Usage:
```haskell
info =
newTaxReturnInfoForTables tables
& set
( businessAndProfessionalItems
. personalServicesIncome
. psiOther )
( Money 18000 )
& set
( businessAndProfessionalItems
. personalServicesIncome
. psiTotalAmountOfOtherDeductions
)
( Money 2000 )
```
### "Other income"
Added the `otherIncome` field and the `OtherIncome` data type, which
contains a number of fields for declaring various kinds of income
(including FHSS released amounts).
Example usage:
```haskell
info =
newTaxReturnInfoForTables tables
& set (otherIncome . otherIncomeCategory4) [("Airdrop", Money 5000)]
```
### Other features and enhancements
- Add `FY2026` module. Apart from the usual Medicare levy and
private health insurance rebate adjustments, study loan repayments
changed to a marginal tax (previously a threshold tax).
- Add preliminary `FY2027` module. Values are not final. The
new *$1,000 instant deduction* is not yet implemented.
### Bug fixes
- FY2020+ now calculate study and training loan repayment correctly
where individual has both HELP and SFSS balances.
- Pretty-printers updated to omit various line items when zero.
## Version 2025.1
### Features and enhancements
- Overhauled payment summaries. More comprehensive data types and
optics are provided in module `Data.Tax.ATO.PaymentSummary`.
The old `PaymentSummary` constructor persists as a (deprecated)
pattern synonym, for backwards compatibility. It will be removed
in a future release.
- Implemented **reportable fringe benefits**. . Use the
`fringeBenefitsEmployerNotExempt` or
`fringeBenefitsEmployerExempt` constructors, along with the
`reportableFringeBenefits` lens to add it to the payment summary.
The amount is properly included in the surcharge and student loan
repayment income calculations.
- Implemented **allowances**. A list of allowances can be added to
a payment summary via the `allowances` lens. Construct allowance
values with `allowance :: String -> Money a -> Allowance a`.
- Implemented **non-super lump sum A, B, D and E** payments.
- Implemented additional payment summary types:
- Foreign Employment
- Business and personal services income
- Withholding where ABN not quoted
- New module `Data.Tax.ATO.Depreciation` provides types and
functions for calculating decline in value (for deductions).
Use the `DepreciatingAsset` data type to define depreciating
assets, and the `declineInValue` function for calculating the
decline in value in a given financial year.
- Added the "cents-per-kilometre" method for car expense deductions.
Usage: `applyCentsPerKilometreMethod @FY kms`. ([#13])
- Added home office expense deduction methods ([#7]). Usage
```
applyFixedRateMethod @FY hours
applyShortcutMethod @FY hours
applyFixedRateMethodPre2023 @FY hours
```
- Implement Medicare levy low income family thresholds, including
increase based on number of dependents. Senior and pensioners
individual and family thresholds remain unimplemented.
- CGT assessment types were overhauled and now contain more
information about total capital gain and applied / unapplied
losses. This is step toward a more complete CGT implementation.
Remaining gaps include foreign withholding credits and separate
treatment of collectables.
- Multiple ESS statements can now be added to a tax return. Also,
the `essEmployeeDetails` field has been added, and
`newESSStatement` was updated to take a `PayerDetails`. This is a
breaking change. ([#16])
- Added `division293Income` which calculates the income component of
Division 293 tax calculations. Some elements are not included
because the relevant feature is not yet implemented (e.g. rental
losses or FHSS releases). ([#12])
- Added `paygInstalmentIncome`, which calculates the PAYG instalment
income. Some elements are not included because the relevant
features are not yet implement (e.g. rent, partnership and trust
income, PSI).
- Added the `Data.Tax.ATO.ABN` and `Data.Tax.ATO.TFN` modules, which
have more representative data types, conversion functions, and
proper validation. `IsString` instances are provided for
compatibility with existing code.
- `TaxReturnInfo` pretty printing now includes more detailed ESS and
CGT data, to help with preparation of tax returns.
- `TaxAssessment` pretty printing now separately reports Medicare
levy, Medicare levy surcharge, and the various non-refundable and
refundable tax offsets. The formatting closely resembles the ATO
*notice of assessment* layout.
- Add `FY2025` module. All rates and thresholds are up to date.
- Added some new helper functions to the `Data.Tax.ATO.FY` module:
- `fromProxy :: (FinancialYear y) => Proxy y -> Year`
- `daysInYear :: Year -> Integer`
- `daysInYearFromProxy :: FinancialYear y => Proxy y -> Integer`
### Bug fixes
- Non-refundable offsets now cannot reduce liability below $0, and
the order of application of the various liabilities, offsets and
credits has been fixed.
- Employee share scheme TFN amounts withheld are now included in
assessment calculations ([#8]).
- Fix FY2024 private health insurance rebate tier thresholds.
[#7]: https://github.com/frasertweedale/hs-tax-ato/issues/7
[#8]: https://github.com/frasertweedale/hs-tax-ato/issues/8
[#12]: https://github.com/frasertweedale/hs-tax-ato/issues/12
[#13]: https://github.com/frasertweedale/hs-tax-ato/issues/13
[#16]: https://github.com/frasertweedale/hs-tax-ato/issues/16
## Version 2024.1
- The minimum supported version of GHC is now 9.2, due to a
dependency on more recent versions of the *time* library.
- Update the `Dividend` type to use store gross payment amount and
tax withheld, rather than net amount, franking portion and (other)
tax withheld. Add new helper functions for construction:
- `dividendFromGross` takes gross amount and tax withheld
- `dividendFromNet` takes net amount and tax withheld
- `dividendFromNetFranked` takes net amount, franked proportion and
applicable corporate tax rate for working out the franking credit.
- `dividendFromNetFranked30` is a shortcut that uses the standard
corporate tax rate of 30%.
- Change the type of `dividendDate` field from `String` to
`Data.Time.Day`.
- Rename the `HasIncome` class to `HasTaxableIncome`, and its
member function `income` to `taxableIncome`.
- Add functions for getting the `Day` range of a financial year,
and a function for getting the financial year of a given day.
- Move the `Data.Tax.ATO.Days` module to `Data.Tax.ATO.FY` and
rename the `DaysInYear` type synonym to `FinancialYear`, to
reflect the additional behaviour.
- Each `FY.<YYYY>` module now exports an `FY` type synonym for its
type-level `Nat` representing the financial year, and the `fyProxy
:: Proxy FY` value.
- Add `Functor` instance for `CGTEvent`.
- Add `FY2024` module.
- Add `Data.Tax.ATO.Pretty` module, which provides pretty printers
for `TaxReturnInfo`, `TaxAssessment`, and other data types.
## Version 2023.2
- Add support for PAYG Instalments, which are specified in aggregate
as a refundable tax offset via the `paygInstalments` field.
- Add the `Deductions` type, which expresses the various deduction
types, as well as the (aggregate) amount of deductions related to
foreign income.
- Implement the Foreign Income Tax Offset Limit. The limit will be
calculated and the `foreignTaxOffset` field in the `TaxReturnInfo`
will be clamped to it.
## Older versions
See Git commit history