diff --git a/README.md b/README.md index f1b760c..70b2ea6 100644 --- a/README.md +++ b/README.md @@ -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): `".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): `".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 diff --git a/examples/1099-a-dated-status-applies-by-payment-date.toml b/examples/1099-a-dated-status-applies-by-payment-date.toml new file mode 100644 index 0000000..afed987 --- /dev/null +++ b/examples/1099-a-dated-status-applies-by-payment-date.toml @@ -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" } diff --git a/examples/1099-a-members-check-through-financing-counts.toml b/examples/1099-a-members-check-through-financing-counts.toml new file mode 100644 index 0000000..224383a --- /dev/null +++ b/examples/1099-a-members-check-through-financing-counts.toml @@ -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" } diff --git a/examples/1099-and-party-totals-for-a-members-payment.toml b/examples/1099-and-party-totals-for-a-members-payment.toml new file mode 100644 index 0000000..2a4b101 --- /dev/null +++ b/examples/1099-and-party-totals-for-a-members-payment.toml @@ -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" } diff --git a/examples/1099-card-payments-are-excluded.toml b/examples/1099-card-payments-are-excluded.toml new file mode 100644 index 0000000..0c05693 --- /dev/null +++ b/examples/1099-card-payments-are-excluded.toml @@ -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" } diff --git a/examples/1099-money-between-own-accounts-pays-no-one.toml b/examples/1099-money-between-own-accounts-pays-no-one.toml new file mode 100644 index 0000000..c4595a9 --- /dev/null +++ b/examples/1099-money-between-own-accounts-pays-no-one.toml @@ -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" } diff --git a/examples/1099-money-from-a-payee-is-netted-only-as-a-refund.toml b/examples/1099-money-from-a-payee-is-netted-only-as-a-refund.toml new file mode 100644 index 0000000..c084509 --- /dev/null +++ b/examples/1099-money-from-a-payee-is-netted-only-as-a-refund.toml @@ -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" } diff --git a/examples/1099-the-threshold-is-the-years.toml b/examples/1099-the-threshold-is-the-years.toml new file mode 100644 index 0000000..10b12a4 --- /dev/null +++ b/examples/1099-the-threshold-is-the-years.toml @@ -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" } diff --git a/examples/p3-party-gift-card-is-a-promise.toml b/examples/p3-party-gift-card-is-a-promise.toml index 852eaab..99d0cda 100644 --- a/examples/p3-party-gift-card-is-a-promise.toml +++ b/examples/p3-party-gift-card-is-a-promise.toml @@ -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 = [