Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
This commit is contained in:
1 parent
f790a27cc1
commit
9c99a0cfe8
9 files changed
+30
-84
No files matched your search
@@ -541,13 +541,7 @@ open_at_start = "ask"
|
|||||||
#[test]
|
#[test]
|
||||||
fn what_the_file_leaves_out_is_cleared() {
|
fn what_the_file_leaves_out_is_cleared() {
|
||||||
let s = imported(FERNHILL);
|
let s = imported(FERNHILL);
|
||||||
let i = import(
|
let i = import("[company]\nname = \"Fernhill Labs LLC\"\n", None, &s, "USD").unwrap();
|
||||||
"[company]\nname = \"Fernhill Labs LLC\"\n",
|
|
||||||
None,
|
|
||||||
&s,
|
|
||||||
"USD",
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
assert!(
|
assert!(
|
||||||
i.changes
|
i.changes
|
||||||
.iter()
|
.iter()
|
||||||
|
|||||||
@@ -294,9 +294,7 @@ fn shared_books() -> Shared {
|
|||||||
let dana = l.add_vendor("Dana").unwrap();
|
let dana = l.add_vendor("Dana").unwrap();
|
||||||
l.set_vendor_1099(dana, Some(Form1099::Nec), true).unwrap();
|
l.set_vendor_1099(dana, Some(Form1099::Nec), true).unwrap();
|
||||||
let dana_p = l.party_of_vendor(dana).unwrap();
|
let dana_p = l.party_of_vendor(dana).unwrap();
|
||||||
let tobin = l
|
let tobin = l.add_party("Tobin", &[ledger_core::Role::Member]).unwrap();
|
||||||
.add_party("Tobin", &[ledger_core::Role::Member])
|
|
||||||
.unwrap();
|
|
||||||
Shared {
|
Shared {
|
||||||
l,
|
l,
|
||||||
bank,
|
bank,
|
||||||
|
|||||||
@@ -165,14 +165,8 @@ fn party_members_find_each_members_own_party() {
|
|||||||
let capital = l
|
let capital = l
|
||||||
.add_account("3001", "Capital — Mo", AccountType::Equity, None, false)
|
.add_account("3001", "Capital — Mo", AccountType::Equity, None, false)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
l.add_account(
|
l.add_account("3000", "Capital — Tobin", AccountType::Equity, None, false)
|
||||||
"3000",
|
.unwrap();
|
||||||
"Capital — Tobin",
|
|
||||||
AccountType::Equity,
|
|
||||||
None,
|
|
||||||
false,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
let mo = l.add_party("Mo", &[Role::Member]).unwrap();
|
let mo = l.add_party("Mo", &[Role::Member]).unwrap();
|
||||||
let other = l.add_party("Pat", &[Role::Member]).unwrap();
|
let other = l.add_party("Pat", &[Role::Member]).unwrap();
|
||||||
l.update_party(mo, PartyField::Archived(true)).unwrap();
|
l.update_party(mo, PartyField::Archived(true)).unwrap();
|
||||||
|
|||||||
@@ -1527,9 +1527,7 @@ mod shares {
|
|||||||
let cap_k = add(&mut l, "3001", AccountType::Equity);
|
let cap_k = add(&mut l, "3001", AccountType::Equity);
|
||||||
let exp = add(&mut l, "6050", AccountType::Expense);
|
let exp = add(&mut l, "6050", AccountType::Expense);
|
||||||
let tobin = l.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
let tobin = l.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
||||||
let mo = l
|
let mo = l.add_party("Morgan Ellis", &[Role::Member]).unwrap();
|
||||||
.add_party("Morgan Ellis", &[Role::Member])
|
|
||||||
.unwrap();
|
|
||||||
let acme = l.add_party("Acme", &[Role::Contractor]).unwrap();
|
let acme = l.add_party("Acme", &[Role::Contractor]).unwrap();
|
||||||
let half = d("0.5");
|
let half = d("0.5");
|
||||||
let members = vec![
|
let members = vec![
|
||||||
@@ -1717,11 +1715,7 @@ mod shares {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
resolved(&b, e).unwrap(),
|
resolved(&b, e).unwrap(),
|
||||||
vec![
|
vec![(b.acme, d("33.33")), (b.tobin, d("33.33")), (c, d("33.34"))]
|
||||||
(b.acme, d("33.33")),
|
|
||||||
(b.tobin, d("33.33")),
|
|
||||||
(c, d("33.34"))
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
b.l.set_entry_parties(
|
b.l.set_entry_parties(
|
||||||
e,
|
e,
|
||||||
@@ -1730,11 +1724,7 @@ mod shares {
|
|||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
resolved(&b, e).unwrap(),
|
resolved(&b, e).unwrap(),
|
||||||
vec![
|
vec![(b.acme, d("33.34")), (b.tobin, d("33.33")), (c, d("33.33"))]
|
||||||
(b.acme, d("33.34")),
|
|
||||||
(b.tobin, d("33.33")),
|
|
||||||
(c, d("33.33"))
|
|
||||||
]
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,12 +105,8 @@ fn the_company_page_shows_how_the_books_are_kept() {
|
|||||||
d(2026, 10, 12),
|
d(2026, 10, 12),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
s.retire_convention(
|
s.retire_convention("old-way", "replaced", &src("Tobin Harlow", d(2026, 10, 14)))
|
||||||
"old-way",
|
.unwrap();
|
||||||
"replaced",
|
|
||||||
&src("Tobin Harlow", d(2026, 10, 14)),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
let first = s
|
let first = s
|
||||||
.record_decision(&NewDecision {
|
.record_decision(&NewDecision {
|
||||||
subject: "Materiality, first cut".into(),
|
subject: "Materiality, first cut".into(),
|
||||||
@@ -214,12 +210,8 @@ fn nothing_kept_shows_no_cards() {
|
|||||||
d(2026, 10, 12),
|
d(2026, 10, 12),
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
s.retire_convention(
|
s.retire_convention("old-way", "replaced", &src("Tobin Harlow", d(2026, 10, 14)))
|
||||||
"old-way",
|
.unwrap();
|
||||||
"replaced",
|
|
||||||
&src("Tobin Harlow", d(2026, 10, 14)),
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
let only = s.raise_open_item(&item("Done already", None)).unwrap();
|
let only = s.raise_open_item(&item("Done already", None)).unwrap();
|
||||||
s.resolve_open_item(only, "done", &src("Tobin Harlow", d(2026, 10, 17)))
|
s.resolve_open_item(only, "done", &src("Tobin Harlow", d(2026, 10, 17)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
@@ -263,8 +255,5 @@ fn books_that_keep_their_settings_say_where_facts_come_from() {
|
|||||||
let h = company(&dir);
|
let h = company(&dir);
|
||||||
assert!(!shows(&h, "No company facts"), "the facts are there");
|
assert!(!shows(&h, "No company facts"), "the facts are there");
|
||||||
assert!(shows(&h, "Fernhill Labs LLC"));
|
assert!(shows(&h, "Fernhill Labs LLC"));
|
||||||
assert!(shows(
|
assert!(shows(&h, &format!("Tobin Harlow · {}", fmt::date(today()))));
|
||||||
&h,
|
|
||||||
&format!("Tobin Harlow · {}", fmt::date(today()))
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
@@ -1020,9 +1020,7 @@ fn member_books(tag: &str) -> MemberBooks {
|
|||||||
let rev = acct(&mut s, "4000", "App Revenue", AccountType::Revenue);
|
let rev = acct(&mut s, "4000", "App Revenue", AccountType::Revenue);
|
||||||
let exp = acct(&mut s, "6050", "Domain & Hosting", AccountType::Expense);
|
let exp = acct(&mut s, "6050", "Domain & Hosting", AccountType::Expense);
|
||||||
let tobin = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
let tobin = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
||||||
let mo = s
|
let mo = s.add_party("Morgan Ellis", &[Role::Member]).unwrap();
|
||||||
.add_party("Morgan Ellis", &[Role::Member])
|
|
||||||
.unwrap();
|
|
||||||
let both = [
|
let both = [
|
||||||
ledger_core::PartyShare::whole(tobin),
|
ledger_core::PartyShare::whole(tobin),
|
||||||
ledger_core::PartyShare::whole(mo),
|
ledger_core::PartyShare::whole(mo),
|
||||||
@@ -1157,10 +1155,7 @@ fn entries_list_every_party_with_its_resolved_share() {
|
|||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
vec![(m.tobin, Some(cents(5_000))), (m.mo, Some(cents(5_000)))]
|
vec![(m.tobin, Some(cents(5_000))), (m.mo, Some(cents(5_000)))]
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(e.party.as_deref(), Some("Tobin Harlow & Morgan Ellis"));
|
||||||
e.party.as_deref(),
|
|
||||||
Some("Tobin Harlow & Morgan Ellis")
|
|
||||||
);
|
|
||||||
// Property: net zero, shares of the total.
|
// Property: net zero, shares of the total.
|
||||||
let e = b.entry(m.property).unwrap();
|
let e = b.entry(m.property).unwrap();
|
||||||
assert_eq!(e.parties[1].resolved, Some(cents(60_000)));
|
assert_eq!(e.parties[1].resolved, Some(cents(60_000)));
|
||||||
@@ -1236,9 +1231,7 @@ fn a_members_page_is_their_capital_statement() {
|
|||||||
assert_eq!((kinds[2].1, kinds[2].2), (K::IncomeShare, cents(35_000)));
|
assert_eq!((kinds[2].1, kinds[2].2), (K::IncomeShare, cents(35_000)));
|
||||||
// Over all time: the 2025 contribution is cash (1000 is
|
// Over all time: the 2025 contribution is cash (1000 is
|
||||||
// [books] cash_accounts), the laptop property.
|
// [books] cash_accounts), the laptop property.
|
||||||
let all = b
|
let all = b.capital_statement(m.mo, (d(2025, 1, 1), today())).unwrap();
|
||||||
.capital_statement(m.mo, (d(2025, 1, 1), today()))
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(all.opening, Decimal::ZERO);
|
assert_eq!(all.opening, Decimal::ZERO);
|
||||||
assert_eq!(all.contributions_cash, cents(100_000));
|
assert_eq!(all.contributions_cash, cents(100_000));
|
||||||
assert_eq!(all.contributions_property, cents(60_000));
|
assert_eq!(all.contributions_property, cents(60_000));
|
||||||
@@ -1284,15 +1277,14 @@ fn the_capital_statement_is_the_k1_worksheet_row() {
|
|||||||
let b = load(&m.dir.0);
|
let b = load(&m.dir.0);
|
||||||
let chart = b.ledger.chart();
|
let chart = b.ledger.chart();
|
||||||
let id = |c: &str| chart.find_by_code(c).unwrap().id;
|
let id = |c: &str| chart.find_by_code(c).unwrap().id;
|
||||||
let members =
|
let members = [("Tobin Harlow", "3000"), ("Morgan Ellis", "3001")].map(|(name, code)| {
|
||||||
[("Tobin Harlow", "3000"), ("Morgan Ellis", "3001")].map(|(name, code)| {
|
ledger_core::MemberCapital {
|
||||||
ledger_core::MemberCapital {
|
name: name.into(),
|
||||||
name: name.into(),
|
capital_account: id(code),
|
||||||
capital_account: id(code),
|
distribution_account: None,
|
||||||
distribution_account: None,
|
share: Decimal::new(5, 1),
|
||||||
share: Decimal::new(5, 1),
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
let cash: Vec<_> = if fallback {
|
let cash: Vec<_> = if fallback {
|
||||||
let mut all: Vec<_> = ledger_core::parties::money_accounts(&b.ledger, &[])
|
let mut all: Vec<_> = ledger_core::parties::money_accounts(&b.ledger, &[])
|
||||||
.cash
|
.cash
|
||||||
@@ -1392,9 +1384,7 @@ fn the_capital_statement_counts_income_not_yet_closed() {
|
|||||||
(cents(175_000), cents(5_000), cents(180_000))
|
(cents(175_000), cents(5_000), cents(180_000))
|
||||||
);
|
);
|
||||||
assert!(july.lines.is_empty());
|
assert!(july.lines.is_empty());
|
||||||
let aug = b
|
let aug = b.capital_statement(m.mo, (d(2026, 8, 1), today())).unwrap();
|
||||||
.capital_statement(m.mo, (d(2026, 8, 1), today()))
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
(aug.opening, aug.income_share, aug.closing),
|
(aug.opening, aug.income_share, aug.closing),
|
||||||
(cents(180_000), Decimal::ZERO, cents(180_000))
|
(cents(180_000), Decimal::ZERO, cents(180_000))
|
||||||
@@ -1472,9 +1462,7 @@ fn without_cash_accounts_the_capital_statement_reads_money_as_core_does() {
|
|||||||
ledger_gui::books::CapitalKind::CashContribution
|
ledger_gui::books::CapitalKind::CashContribution
|
||||||
);
|
);
|
||||||
assert_eq!(st.closing, cents(175_000));
|
assert_eq!(st.closing, cents(175_000));
|
||||||
let all = b
|
let all = b.capital_statement(m.mo, (d(2025, 1, 1), today())).unwrap();
|
||||||
.capital_statement(m.mo, (d(2025, 1, 1), today()))
|
|
||||||
.unwrap();
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
(all.contributions_cash, all.contributions_property),
|
(all.contributions_cash, all.contributions_property),
|
||||||
(cents(160_000), Decimal::ZERO)
|
(cents(160_000), Decimal::ZERO)
|
||||||
|
|||||||
@@ -1592,10 +1592,7 @@ fn under_require_several_parties_satisfy_the_policy() {
|
|||||||
"books.reverse_entry",
|
"books.reverse_entry",
|
||||||
json!({"entry_id": id, "date": "2026-07-02", "description": "undo", "confirmed": true}),
|
json!({"entry_id": id, "date": "2026-07-02", "description": "undo", "confirmed": true}),
|
||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(m.party("Morgan Ellis", 2026)["totals"]["paid"], "0.00");
|
||||||
m.party("Morgan Ellis", 2026)["totals"]["paid"],
|
|
||||||
"0.00"
|
|
||||||
);
|
|
||||||
m.read_only("books.verify", json!({}));
|
m.read_only("books.verify", json!({}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1504,8 +1504,8 @@ fn set_tin_refusals_write_nothing() {
|
|||||||
("Mo", json!(SSN), "itin"), // not an ITIN
|
("Mo", json!(SSN), "itin"), // not an ITIN
|
||||||
("Mo", json!(SSN), "passport"), // no such type
|
("Mo", json!(SSN), "passport"), // no such type
|
||||||
("Mo", json!(291122846.0), "ssn"), // a float
|
("Mo", json!(291122846.0), "ssn"), // a float
|
||||||
("Nobody", json!(SSN), "ssn"), // no such party
|
("Nobody", json!(SSN), "ssn"), // no such party
|
||||||
("Acme Design", json!(SSN), "ssn"), // W-9 says 1111
|
("Acme Design", json!(SSN), "ssn"), // W-9 says 1111
|
||||||
] {
|
] {
|
||||||
let why = m.refuse(
|
let why = m.refuse(
|
||||||
"books.set_tin",
|
"books.set_tin",
|
||||||
|
|||||||
@@ -794,9 +794,7 @@ mod shares {
|
|||||||
let dir = test_dir("shares-event");
|
let dir = test_dir("shares-event");
|
||||||
let (mut s, fx) = fixture(&dir);
|
let (mut s, fx) = fixture(&dir);
|
||||||
let a = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
let a = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
||||||
let b = s
|
let b = s.add_party("Morgan Ellis", &[Role::Member]).unwrap();
|
||||||
.add_party("Morgan Ellis", &[Role::Member])
|
|
||||||
.unwrap();
|
|
||||||
let ((), pl) = one_event(&mut s, &dir, "entry.parties_set", |s| {
|
let ((), pl) = one_event(&mut s, &dir, "entry.parties_set", |s| {
|
||||||
s.set_entry_parties(fx.entry, &[PartyShare::whole(a), PartyShare::whole(b)])
|
s.set_entry_parties(fx.entry, &[PartyShare::whole(a), PartyShare::whole(b)])
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -904,9 +902,7 @@ mod shares {
|
|||||||
let dir = test_dir("shares-replay");
|
let dir = test_dir("shares-replay");
|
||||||
let (mut s, fx) = fixture(&dir);
|
let (mut s, fx) = fixture(&dir);
|
||||||
let a = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
let a = s.add_party("Tobin Harlow", &[Role::Member]).unwrap();
|
||||||
let b = s
|
let b = s.add_party("Morgan Ellis", &[Role::Member]).unwrap();
|
||||||
.add_party("Morgan Ellis", &[Role::Member])
|
|
||||||
.unwrap();
|
|
||||||
let v = s.add_vendor("Contractor").unwrap();
|
let v = s.add_vendor("Contractor").unwrap();
|
||||||
let pv = s.ledger().party_of_vendor(v).unwrap();
|
let pv = s.ledger().party_of_vendor(v).unwrap();
|
||||||
s.set_entry_parties(
|
s.set_entry_parties(
|
||||||
|
|||||||
Reference in new issue
Block a user