P3: dated 1099 decisions, payment methods and the card exception (defects 23, 12, 18, D-40)

A vendor's 1099 decision is its own dated fact (files NEC or MISC, not
reportable with its reason, or undetermined), applied by each payment's
date. Payment methods are recorded; card and network payments are left
out and listed; a member's check through financing counts; a bank payment
with no method counts (D-40); $2,000 for payments after 2025. One
worksheet for the tool, the viewer and the CPA package.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
This commit is contained in:
swaitsandClaude Opus 5.5 committed 2026-10-21 12:12:26 -06:00
1 parent 52555262a8
commit 249e216fc0
9 files changed
+848 -16

No files matched your search

+33 -8
View File
@@ -103,9 +103,9 @@ the side gives the direction.
- `cash_accounts`, `financing_accounts`, `investing_accounts` (in
`[setup]`): arrays of account codes, the statement of cash flows'
account roles (ASC 230-10-45-10 to 45-15). The cash and financing
accounts are also what a payee is paid from, for `vendor_1099_paid` (a
payment card is neither: its charges go on Form 1099-K; rules.md B-19);
with the cards, what party money is, for
accounts are also what a payee is paid from, for `vendor_1099_paid` and
`vendor_1099` (a payment card is neither: its charges go on Form
1099-K; rules.md B-19); with the cards, what party money is, for
`party_part` and `party_totals` (B-35 item 5: no `cash_accounts`, every
asset account but receivables); the cash accounts are what the K-1
worksheet reads as money (`k1`) and an IIF file's bank accounts (B-34).
@@ -138,6 +138,20 @@ the side gives the direction.
return from the beginning, `form` `"1099-NEC"` or `"1099-MISC"`; each
name once. A payee in `setup.parties` with the `vendor` role is that
party's vendor record; any other is a vendor record of its own.
- `[[setup.status_changes]]` `{ payee, effective, decision, reason_kind?,
reason? }`: a payee's 1099 decision from `effective` (`YYYY-MM-DD`) on
(rules.md B-19, D-40: an LLC's corporate election, say): `decision`
`"1099-NEC"`, `"1099-MISC"`, `"undetermined"` or `"not_reportable"`,
the last with `reason_kind` (`corporation`, `tax_exempt`,
`united_states`, `state`, `foreign_government`, `foreign_person`,
`merchandise`, `employee`, `other`) and the facts in words (`reason`).
Each payment takes the decision in force on its date.
- `[[setup.instruments]]` `{ label, kind, account, last4?, owner? }`: a
payment method (B-19): `kind` `bank`, `business_card`, `member_card`,
`member_cash_or_check` or `platform`; `account` the code it pays
through; `owner` a party's name (informational). A business card's
liability is a card account (B-35 item 5): while none is recorded, a
liability whose name says "card", not "gift card", is.
- `payee` on an event: the payee (by name, one of `setup.payees`) the
entry paid. Not on a reversal, which takes its original's, nor on a
close.
@@ -148,7 +162,9 @@ the side gives the direction.
capital lines or income shares for several: B-35). An entry naming a
party with a vendor record is tagged with that payee too; with
`payee` as well, the payee's party is one of the parties.
Not on a reversal, which takes its original's.
- `instrument` on an event: the payment method (a `setup.instruments`
label) the entry was paid with. Neither `parties` nor `instrument` on a
reversal, which takes its original's.
- `close = { start, to, rounding? }` as an event: closes the period from
`start` through the event's `date` (rules.md B-11, B-13), `to`
`"members"` (split by share, in the order listed) or
@@ -174,14 +190,22 @@ the side gives the direction.
the changes made after it), not after the last event and every change
(1 to the number of events; not on a format query).
Party totals and the 1099 worksheet answer different questions (B-35
item 9): a member paying a contractor through the members' financing
account is, in party totals, paid to the contractor (money, the
members' financing being money) and nothing to the member until the
company reimburses them; on the 1099 worksheet it is the company's
payment, counted toward the contractor's 1099 unless it was made by card
(B-19), and undetermined until its payment method is recorded.
### Queries and their values
A query over a period takes `from` and `to`; a query as of a day takes
`as_of`; the other is refused. A date left out is resolved by the one
rule (rules.md B-30) on `setup.today`: an omitted `to` is today, an
omitted `from` the first day of the fiscal year that holds `to`, an
omitted `as_of` today (`vendor_1099_paid`, `party_totals` and the
format queries give theirs). A query no crate
omitted `as_of` today (`vendor_1099_paid`, `vendor_1099`,
`party_totals` and the format queries give theirs). A query no crate
answers is refused, never skipped.
| query | dates | values | checked by |
@@ -194,6 +218,7 @@ answers is refused, never skipped.
| `members_equity` | `from`, `to` | the statement of changes in members' equity (rules.md B-13): `"<member>.beginning"`, `.contributions`, `.net_income`, `.distributions`, `.other`, `.ending`; the example names the figures it shows | `ledger-core` `tests/bookspec.rs` |
| `k1` | `from`, `to` | the K-1 worksheet (B-13; Schedule K-1 Item L): `"<member>.beginning"`, `.contributions_cash`, `.contributions_property`, `.net_income`, `.distributions`, `.other`, `.ending`; the example names the figures it shows (`cash_accounts` required) | `ledger-core` `tests/bookspec.rs` |
| `vendor_1099_paid` | `from` (January 1 of `to`'s year), `to` | each payee's payments that count toward its 1099, by name: out of the cash and financing accounts (`cash_accounts` required), a card's or payment network's left out (B-19), every payee listed | `ledger-core` `tests/bookspec.rs` |
| `vendor_1099` | `payee`; `from` (January 1 of `to`'s year), `to` | one payee's line of the 1099 worksheet (B-19): `status` (`reportable`, `under_threshold`, `not_reportable` or `undetermined`), `threshold`, `paid` (counts toward its 1099), `excluded_card` (a card's or payment network's: Form 1099-K), `undetermined` (through a financing account, its payment method not recorded), `not_reportable` (paid while decided not reportable), every one given | `ledger-core` `tests/bookspec.rs` |
| `party_part` | `entry = N`, `party`, no dates | entry N's part for the party (B-35): `resolved`, signed as a line on the party's own account would be (paid or given positive, received negative), the entry's `direction` (`paid`, `received` or `neither`), and what of it moved as money (`cash`) and as property (`in_kind`), every one given | `ledger-core` `tests/bookspec.rs` |
| `party_totals` | `party`, `basis` (`cash` or `all`), `from`, `to` | what was `paid` to the party and `received` from it over the period (B-35 item 4: basis `cash` money, `all` money and property in kind; each entry on its first original's side), both given | `ledger-core` `tests/bookspec.rs` |
| `party_tin_last4` | `party`, no dates | `tin_last4`: the party's TIN facts' last four, else its W-9's, `""` for none (B-26) | `ledger-core` `tests/bookspec.rs` |
@@ -208,8 +233,8 @@ answers is refused, never skipped.
A figure query is a table (`[expect.values]`, or `values = { ... }`); a
format query, and `uncategorized_accounts`, an array (`values = [ ...
]`). `period`, `day` and `calendar_year` give dates and a year,
`account_names` names, `party_part`'s `direction` and
`party_tin_last4` words, not figures.
`account_names` names, `party_part`'s `direction`, `vendor_1099`'s
`status` and `party_tin_last4` words, not figures.
A command is tried on a copy of the books, as the books' own command
does it, and changes nothing checked after it. It shows no values: it is
@@ -0,0 +1,94 @@
id = "1099-a-dated-status-applies-by-payment-date"
title = "A payee's 1099 status applies to each payment as of the payment's date"
rule = """
Whether a payee is exempt (a corporation) is judged as of each payment: the
payer may treat a payee as a corporation when the condition is met before
the payment is made. An LLC that elects to be taxed as a corporation keeps
its EIN and becomes a corporation on the election's effective date (the
date its Form 8832 specifies). Payments before that date count toward its
1099-NEC; payments from it on are payments to a corporation, for which no
return is required. (A payee that incorporates is a new legal person: a new
payee, with its own W-9.)
"""
status = "AUTHORITY"
sources = [
"Treas. Reg. §1.6041-3(p)(1) (docs/spec/sources/irs-1099-payment-method.md)",
"Treas. Reg. §1.6049-4(c)(1)(ii)(A) (\"before a payment is made\")",
"Treas. Reg. §301.7701-2(b)(2), §301.7701-3(c)(1)(iii)",
"DECISION D-40 (wanderbooks owner, 2026-10-20): dated statuses",
]
tags = ["1099", "dated-status", "corporation", "election"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.payees]]
name = "Harbor Design LLC"
form = "1099-NEC"
[[setup.status_changes]]
payee = "Harbor Design LLC"
effective = "2026-07-01"
decision = "not_reportable"
reason_kind = "corporation"
reason = "elected to be taxed as a corporation (Form 8832), effective July 1"
[[events]]
date = "2026-03-01"
description = "Design work"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "1500.00" },
{ account = "1000", side = "credit", amount = "1500.00" },
]
[[events]]
date = "2026-06-30"
description = "Design work, the day before the election"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "1000.00" },
{ account = "1000", side = "credit", amount = "1000.00" },
]
[[events]]
date = "2026-07-01"
description = "Design work, the election's day"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "800.00" },
{ account = "1000", side = "credit", amount = "800.00" },
]
[[events]]
date = "2026-09-15"
description = "Design work"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "1200.00" },
{ account = "1000", side = "credit", amount = "1200.00" },
]
# By hand: before July 1, 1,500.00 + 1,000.00 = 2,500.00 counts (at least
# 2,000.00: reportable); from July 1 on, 800.00 + 1,200.00 = 2,000.00 paid
# to a corporation, not reportable.
[[expect]]
query = "vendor_1099"
payee = "Harbor Design LLC"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "reportable", threshold = "2000.00", paid = "2500.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "2000.00" }
@@ -0,0 +1,99 @@
id = "1099-a-members-check-through-financing-counts"
title = "A member's own check for the company counts toward the payee's 1099; their card doesn't; unknown stays unknown"
rule = """
The payer is the person who makes the payment in the course of its trade or
business. A person paying on another's behalf is the payer only if it
performs management or oversight functions or has a significant economic
interest; writing checks at another's direction is neither. A member who
pays a company bill from their own funds at the company's direction, the
company bearing the cost through its liability to the member, leaves the
company the payer: the member's check counts toward the payee's 1099. The
member's personal card is a payment card: excluded (Form 1099-K). A
member's payment whose method isn't recorded is undetermined, never
guessed; the payee is reportable only if what certainly counts reaches the
threshold.
"""
status = "AUTHORITY"
sources = [
"Treas. Reg. §1.6041-1(a)(1)(i), (e)(1) (docs/spec/sources/irs-1099-payment-method.md)",
"Treas. Reg. §1.6041-1(a)(1)(iv)",
"26 U.S.C. §6041(a), as amended by Pub. L. 119-21 §70433 (docs/spec/sources/irs-1099-thresholds.md)",
]
tags = ["1099", "financing", "member-paid", "instruments"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
financing_accounts = ["2100"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "2100"
name = "Due to Members"
type = "liability"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.instruments]]
label = "Riley's checks"
kind = "member_cash_or_check"
account = "2100"
[[setup.instruments]]
label = "Riley's Visa"
kind = "member_card"
account = "2100"
[[setup.payees]]
name = "Dana Studio"
form = "1099-NEC"
[[events]]
date = "2026-05-01"
description = "Logo, paid by a member's personal check"
payee = "Dana Studio"
instrument = "Riley's checks"
lines = [
{ account = "6000", side = "debit", amount = "2500.00" },
{ account = "2100", side = "credit", amount = "2500.00" },
]
[[events]]
date = "2026-06-01"
description = "Icons, charged to a member's personal card"
payee = "Dana Studio"
instrument = "Riley's Visa"
lines = [
{ account = "6000", side = "debit", amount = "800.00" },
{ account = "2100", side = "credit", amount = "800.00" },
]
[[events]]
date = "2026-07-01"
description = "Revisions, paid by a member (how not recorded)"
payee = "Dana Studio"
lines = [
{ account = "6000", side = "debit", amount = "300.00" },
{ account = "2100", side = "credit", amount = "300.00" },
]
# By hand: counts 2,500.00 (the member's check); excluded 800.00 (their
# card); undetermined 300.00. What certainly counts, 2,500.00, is at least
# 2,000.00 however the 300.00 turns out: reportable, on 2,500.00 (or
# 2,800.00 once the 300.00 is known to be a check).
[[expect]]
query = "vendor_1099"
payee = "Dana Studio"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "reportable", threshold = "2000.00", paid = "2500.00", excluded_card = "800.00", undetermined = "300.00", not_reportable = "0.00" }
@@ -0,0 +1,219 @@
# How a payee's party totals and its 1099 amount relate (wanderbooks
# rules.md B-35 item 9, B-19): a member paying a contractor for the
# company through the members' financing account, by check, by their own
# card and with no method recorded; a company card charge; a company
# check; then the member reimbursed. Party totals count every payment as
# paid to the contractor, in money; the 1099 worksheet counts the
# company's payments that aren't by card, and holds the unrecorded one
# undetermined. The shape: bookspec/README.md.
id = "1099-and-party-totals-for-a-members-payment"
title = "A payee's party total is its 1099 amount plus its card payments plus its payments of unknown method"
rule = """
A member who pays a payee for the company from their own funds, the
company owing them for it through its financing account, leaves the
company the payer: on the 1099 worksheet the member's own cash or check
counts toward the payee's 1099, the member's own card is excluded (Form
1099-K), and a payment whose method isn't recorded is undetermined. Party
totals report what moved with each party, whoever handled the money: every
one of those payments is paid to the payee, in money, on its date, and the
member is paid when the company reimburses them. So the payee's party
total paid is its 1099 amount plus what was paid by card or payment
network plus what is undetermined; the reimbursement is paid to the
member and pays no payee.
"""
status = "CHOICE"
sources = [
"Treas. Reg. §1.6041-1(e)(1): a person paying on another's behalf who only writes the check at its direction isn't the payor (wanderbooks docs/spec/sources/irs-1099-payment-method.md)",
"Treas. Reg. §1.6041-1(a)(1)(iv): a payment card transaction is reported under §6050W, not §6041 (docs/spec/sources/irs-1099-payment-method.md)",
"DECISION (owner, 2026-10-20): money is cash, cards, the members' financing and loans (wanderbooks rules.md B-35 item 5)",
"DECISION D-40 (owner, 2026-10-20): payment methods; an untagged payment through financing is undetermined (rules.md B-19)",
]
tags = ["1099", "parties", "member-paid", "instruments", "cards"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
financing_accounts = ["2100"]
[[setup.accounts]]
code = "1000"
name = "Checking"
type = "asset"
[[setup.accounts]]
code = "2050"
name = "Company Visa"
type = "liability"
[[setup.accounts]]
code = "2100"
name = "Due to Members"
type = "liability"
[[setup.accounts]]
code = "3000"
name = "Capital — Tobin Harlow"
type = "equity"
[[setup.accounts]]
code = "3001"
name = "Capital — Morgan Ellis"
type = "equity"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.parties]]
name = "Tobin Harlow"
roles = ["member"]
[[setup.parties]]
name = "Morgan Ellis"
roles = ["member"]
[[setup.parties]]
name = "Dana Studio"
roles = ["vendor", "contractor"]
[[setup.members]]
name = "Tobin Harlow"
capital_account = "3000"
share = "0.5"
[[setup.members]]
name = "Morgan Ellis"
capital_account = "3001"
share = "0.5"
# The contractor's vendor record, marked for a 1099-NEC.
[[setup.payees]]
name = "Dana Studio"
form = "1099-NEC"
[[setup.instruments]]
label = "Company Visa"
kind = "business_card"
account = "2050"
[[setup.instruments]]
label = "Tobin's checks"
kind = "member_cash_or_check"
account = "2100"
owner = "Tobin Harlow"
[[setup.instruments]]
label = "Tobin's Visa"
kind = "member_card"
account = "2100"
owner = "Tobin Harlow"
# 1. Tobin pays the contractor by personal check.
[[events]]
date = "2026-03-02"
description = "Design work, paid by Tobin's check"
parties = [{ party = "Dana Studio" }]
instrument = "Tobin's checks"
lines = [
{ account = "6000", side = "debit", amount = "1500.00" },
{ account = "2100", side = "credit", amount = "1500.00" },
]
# 2. Tobin pays on his own card.
[[events]]
date = "2026-04-01"
description = "Icons, charged to Tobin's own card"
parties = [{ party = "Dana Studio" }]
instrument = "Tobin's Visa"
lines = [
{ account = "6000", side = "debit", amount = "400.00" },
{ account = "2100", side = "credit", amount = "400.00" },
]
# 3. Tobin pays; how is not recorded.
[[events]]
date = "2026-05-01"
description = "Revisions, paid by Tobin"
parties = [{ party = "Dana Studio" }]
lines = [
{ account = "6000", side = "debit", amount = "300.00" },
{ account = "2100", side = "credit", amount = "300.00" },
]
# 4. Charged to the company card.
[[events]]
date = "2026-06-01"
description = "Banner, on the company card"
parties = [{ party = "Dana Studio" }]
lines = [
{ account = "6000", side = "debit", amount = "200.00" },
{ account = "2050", side = "credit", amount = "200.00" },
]
# 5. The company's own check.
[[events]]
date = "2026-06-15"
description = "Brochure, company check"
parties = [{ party = "Dana Studio" }]
lines = [
{ account = "6000", side = "debit", amount = "600.00" },
{ account = "1000", side = "credit", amount = "600.00" },
]
# 6. The company reimburses Tobin for events 1 to 3.
[[events]]
date = "2026-07-01"
description = "Tobin reimbursed"
parties = [{ party = "Tobin Harlow" }]
lines = [
{ account = "2100", side = "debit", amount = "2200.00" },
{ account = "1000", side = "credit", amount = "2200.00" },
]
[[expect]]
query = "party_part"
entry = 2
party = "Dana Studio"
values = { resolved = "400.00", direction = "paid", cash = "400.00", in_kind = "0.00" }
# By hand: 1,500.00 + 400.00 + 300.00 + 200.00 + 600.00 = 3,000.00, every
# payment paid to the contractor, in money.
[[expect]]
query = "party_totals"
party = "Dana Studio"
basis = "cash"
from = "2026-01-01"
to = "2026-12-31"
values = { paid = "3000.00", received = "0.00" }
# By hand: counts 1,500.00 (Tobin's check) + 600.00 (the company's check)
# = 2,100.00; excluded 400.00 (Tobin's card) + 200.00 (the company card)
# = 600.00; undetermined 300.00. 2,100.00 + 600.00 + 300.00 = 3,000.00,
# the party total. What certainly counts, 2,100.00, is at least 2,000.00:
# reportable.
[[expect]]
query = "vendor_1099"
payee = "Dana Studio"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "reportable", threshold = "2000.00", paid = "2100.00", excluded_card = "600.00", undetermined = "300.00", not_reportable = "0.00" }
# The reimbursement is paid to Tobin, and pays no payee.
[[expect]]
query = "party_totals"
party = "Tobin Harlow"
basis = "cash"
from = "2026-01-01"
to = "2026-12-31"
values = { paid = "2200.00", received = "0.00" }
[[expect]]
query = "vendor_1099_paid"
from = "2026-01-01"
to = "2026-12-31"
values = { "Dana Studio" = "2100.00" }
@@ -0,0 +1,101 @@
id = "1099-card-payments-are-excluded"
title = "Payments by card are left off Form 1099-NEC, and listed"
rule = """
A payment made by payment card (credit, debit or stored-value) or through a
third party payment network that section 6041 would otherwise cover is
reported by the payment settlement entity on Form 1099-K under section 6050W,
not by the payer on Form 1099-NEC or 1099-MISC, whoever's card it was. A
payment by check, ACH or transfer counts toward the payee's 1099-NEC. A
bank payment with no payment method recorded is presumed a check, ACH or
transfer; a debit-card payment from the bank is excluded once tagged with
the card.
"""
status = "AUTHORITY"
sources = [
"Treas. Reg. §1.6041-1(a)(1)(iv) (docs/spec/sources/irs-1099-payment-method.md)",
"Treas. Reg. §1.6050W-1(b)(1), (b)(3) (payment card; accepted as payment)",
"IRS, Understanding your Form 1099-K (credit, debit or stored value cards)",
"Instructions for Forms 1099-MISC and 1099-NEC (Rev. 12/2026), Form 1099-K",
"DECISION D-40 (wanderbooks owner, 2026-10-20): an untagged bank payment counts",
]
tags = ["1099", "payment-card", "instruments"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
financing_accounts = ["2100"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "2050"
name = "Company card"
type = "liability"
[[setup.accounts]]
code = "2100"
name = "Due to Members"
type = "liability"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.instruments]]
label = "Harbor Visa"
kind = "business_card"
account = "2050"
[[setup.instruments]]
label = "Harbor debit card"
kind = "business_card"
account = "1000"
[[setup.payees]]
name = "Harbor Design LLC"
form = "1099-NEC"
[[events]]
date = "2026-02-10"
description = "Design work, charged to the company card"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "2500.00" },
{ account = "2050", side = "credit", amount = "2500.00" },
]
[[events]]
date = "2026-03-10"
description = "Design work, paid with the debit card"
payee = "Harbor Design LLC"
instrument = "Harbor debit card"
lines = [
{ account = "6000", side = "debit", amount = "1200.00" },
{ account = "1000", side = "credit", amount = "1200.00" },
]
[[events]]
date = "2026-04-10"
description = "Design work, paid by check"
payee = "Harbor Design LLC"
lines = [
{ account = "6000", side = "debit", amount = "900.00" },
{ account = "1000", side = "credit", amount = "900.00" },
]
# By hand: counts 900.00 (the check); excluded 2,500.00 + 1,200.00 =
# 3,700.00 (the card's account, and the bank payment tagged with the debit
# card); 900.00 < 2,000.00: no 1099 is due.
[[expect]]
query = "vendor_1099"
payee = "Harbor Design LLC"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "under_threshold", threshold = "2000.00", paid = "900.00", excluded_card = "3700.00", undetermined = "0.00", not_reportable = "0.00" }
@@ -0,0 +1,92 @@
id = "1099-money-between-own-accounts-pays-no-one"
title = "Paying the card bill, reimbursing a member, or paying down a loan pays no payee"
rule = """
A 1099 reports payments made to the payee. Money moved between the payer's
own payment sources (its bank paying its card's balance, reimbursing a
member who paid for it, paying down a loan's principal) pays no payee, even
when the entry is tagged with the card issuer, the member's payee record or
the lender: the movement out of one source is offset by the movement into
the other.
"""
status = "CONVENTION"
sources = [
"26 U.S.C. §6041(a) (payments made to the payee: docs/spec/sources/irs-1099-thresholds.md)",
"wanderbooks P3 review R1 (2026-10-20): netting an entry's payment buckets",
]
tags = ["1099", "netting"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
financing_accounts = ["2100", "2500"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "2050"
name = "Company card"
type = "liability"
[[setup.accounts]]
code = "2100"
name = "Due to Members"
type = "liability"
[[setup.accounts]]
code = "2500"
name = "Equipment loan"
type = "liability"
[[setup.instruments]]
label = "Harbor Visa"
kind = "business_card"
account = "2050"
[[setup.payees]]
name = "Harbor Card Services"
form = "1099-NEC"
[[setup.payees]]
name = "Harbor Equipment Finance"
form = "1099-NEC"
[[events]]
date = "2026-05-25"
description = "Card bill paid from the bank"
payee = "Harbor Card Services"
lines = [
{ account = "2050", side = "debit", amount = "1200.00" },
{ account = "1000", side = "credit", amount = "1200.00" },
]
[[events]]
date = "2026-06-01"
description = "Loan principal"
payee = "Harbor Equipment Finance"
lines = [
{ account = "2500", side = "debit", amount = "3000.00" },
{ account = "1000", side = "credit", amount = "3000.00" },
]
# By hand: the bill: +1,200.00 out of the bank, −1,200.00 into the card's
# account: nets to 0.00 in every bucket. The loan: +3,000.00 out of the
# bank, −3,000.00 into the loan (a financing account): 0.00.
[[expect]]
query = "vendor_1099"
payee = "Harbor Card Services"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "under_threshold", threshold = "2000.00", paid = "0.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
[[expect]]
query = "vendor_1099"
payee = "Harbor Equipment Finance"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "under_threshold", threshold = "2000.00", paid = "0.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
@@ -0,0 +1,108 @@
id = "1099-money-from-a-payee-is-netted-only-as-a-refund"
title = "Money received from a payee lowers its 1099 only when it refunds what was paid"
rule = """
A 1099 reports the payments the payer made to the payee in the calendar
year. Money the payee gives back of a payment (a refund crediting the
expense, or a deposit returned) reduces what was paid. Money received from
the payee for anything else (its payment of the payer's invoice, a sale to
it, an asset disposed of to it, a loan from it) is not a refund of a
payment and is not netted against the payments; it is listed beside them.
"""
status = "CONVENTION"
sources = [
"26 U.S.C. §6041(a) (payments made in the course of the trade or business: docs/spec/sources/irs-1099-thresholds.md)",
"wanderbooks P3 review R6 (2026-10-20): a sale to a payee doesn't lower its 1099",
]
tags = ["1099", "netting", "refund"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "1200"
name = "Accounts Receivable"
type = "asset"
[[setup.accounts]]
code = "1400"
name = "Deposits"
type = "asset"
[[setup.accounts]]
code = "2600"
name = "Loan payable"
type = "liability"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.payees]]
name = "Dana Studio"
form = "1099-NEC"
[[events]]
date = "2026-02-01"
description = "Design work"
payee = "Dana Studio"
lines = [
{ account = "6000", side = "debit", amount = "3000.00" },
{ account = "1000", side = "credit", amount = "3000.00" },
]
[[events]]
date = "2026-03-01"
description = "Dana Studio pays the company's invoice"
payee = "Dana Studio"
lines = [
{ account = "1000", side = "debit", amount = "450.00" },
{ account = "1200", side = "credit", amount = "450.00" },
]
[[events]]
date = "2026-04-01"
description = "Dana Studio lends the company money"
payee = "Dana Studio"
lines = [
{ account = "1000", side = "debit", amount = "1000.00" },
{ account = "2600", side = "credit", amount = "1000.00" },
]
[[events]]
date = "2026-05-01"
description = "Deposit for the next project"
payee = "Dana Studio"
lines = [
{ account = "1400", side = "debit", amount = "500.00" },
{ account = "1000", side = "credit", amount = "500.00" },
]
[[events]]
date = "2026-06-01"
description = "Deposit returned: the project was cancelled"
payee = "Dana Studio"
lines = [
{ account = "1000", side = "debit", amount = "500.00" },
{ account = "1400", side = "credit", amount = "500.00" },
]
# By hand: paid 3,000.00 + 500.00 (the deposit, paid when made) − 500.00
# (its return, a refund) = 3,000.00: reportable. The invoice payment
# (450.00) and the loan (1,000.00) are listed, not netted (netting them
# would leave 1,550.00, under the threshold).
[[expect]]
query = "vendor_1099"
payee = "Dana Studio"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "reportable", threshold = "2000.00", paid = "3000.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
@@ -0,0 +1,92 @@
id = "1099-the-threshold-is-the-years"
title = "The 1099-NEC threshold is the one in force for the year the payments were made"
rule = """
A payer reports payments to a payee aggregating the threshold or more in a
calendar year: $600 for payments made through December 31, 2025, and
$2,000 ("of $2,000 or more") for payments made after it (indexed for
inflation for calendar years after 2026, not yet known: never guessed). The
threshold is met at exactly the amount.
"""
status = "AUTHORITY"
sources = [
"26 U.S.C. §6041(a), (h), §6041A(a)(2) (docs/spec/sources/irs-1099-thresholds.md)",
"Pub. L. 119-21 §70433(a), (f): \"shall apply with respect to payments made after December 31, 2025\" (docs/spec/sources/irs-1099-payment-method.md)",
"Instructions for Forms 1099-MISC and 1099-NEC (Rev. April 2025): $600",
]
tags = ["1099", "threshold"]
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "cash"
rounding = "half-away-from-zero"
cash_accounts = ["1000"]
[[setup.accounts]]
code = "1000"
name = "Bank"
type = "asset"
[[setup.accounts]]
code = "6000"
name = "Contract Labor"
type = "expense"
[[setup.payees]]
name = "Riley Chen"
form = "1099-NEC"
[[setup.payees]]
name = "Cedar Studio"
form = "1099-NEC"
[[events]]
date = "2025-11-01"
description = "Illustration"
payee = "Riley Chen"
lines = [
{ account = "6000", side = "debit", amount = "600.00" },
{ account = "1000", side = "credit", amount = "600.00" },
]
[[events]]
date = "2026-02-01"
description = "Illustration"
payee = "Riley Chen"
lines = [
{ account = "6000", side = "debit", amount = "1999.99" },
{ account = "1000", side = "credit", amount = "1999.99" },
]
[[events]]
date = "2026-02-01"
description = "Photography"
payee = "Cedar Studio"
lines = [
{ account = "6000", side = "debit", amount = "2000.00" },
{ account = "1000", side = "credit", amount = "2000.00" },
]
# By hand: 2025, Riley 600.00 against $600: reportable (exactly the
# threshold). 2026, Riley 1,999.99 against $2,000: under; Cedar 2,000.00:
# reportable.
[[expect]]
query = "vendor_1099"
payee = "Riley Chen"
from = "2025-01-01"
to = "2025-12-31"
values = { status = "reportable", threshold = "600.00", paid = "600.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
[[expect]]
query = "vendor_1099"
payee = "Riley Chen"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "under_threshold", threshold = "2000.00", paid = "1999.99", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
[[expect]]
query = "vendor_1099"
payee = "Cedar Studio"
from = "2026-01-01"
to = "2026-12-31"
values = { status = "reportable", threshold = "2000.00", paid = "2000.00", excluded_card = "0.00", undetermined = "0.00", not_reportable = "0.00" }
+10 -8
View File
@@ -1,7 +1,7 @@
# P3 defect 24 and the card rule (found in review, 2026-10-21): the
# company's cards are the liabilities whose names say "card", so a gift
# card the company sold (deferred revenue) read as money: received when
# sold and again when redeemed. Regression
# P3 defect 24 and the card rule (found in review, 2026-10-21): with no
# business card recorded, the company's cards are the liabilities whose
# names say "card", so a gift card the company sold (deferred revenue)
# read as money: received when sold and again when redeemed. Regression
# test: ledger-core tests/spec_party_totals.rs
# defect24_a_gift_card_sold_is_received_once.
# The shape: bookspec/README.md.
@@ -9,10 +9,12 @@
id = "p3-party-gift-card-is-a-promise"
title = "A gift card the company sold is a promise, not a card it pays with"
rule = """
The company's cards are liability accounts whose names say "card", but not
"gift card": gift cards the company sold are revenue it owes its customers
in service (deferred revenue), a promise. Selling one is money received
from the buyer; redeeming it moves no money and counts nothing.
The company's cards are the business cards its books record as payment
methods; while they record none, the liability accounts whose names say
"card", but not "gift card": gift cards the company sold are revenue it
owes its customers in service (deferred revenue), a promise. Selling one
is money received from the buyer; redeeming it moves no money and counts
nothing.
"""
status = "CONVENTION"
sources = [