@hackage / tax-ato

Tax types and computations for Australia

Latest2026.1

Changelog

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:

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:

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.

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