merge: P4b S5, sent tracking (branch S5, ad649be3)
The second of the paused branches. invoice.sent, Ledger::mark_sent (with its Lean step), books.mark_sent in its own group, the two attention items, schema 17. Conflicts, resolved as plan 8.0.2 says: the shared over-the-wire test file crates/ledger-cli/tests/documents.rs (S4.4's file kept whole, S5's test appended, its create call given the confirmed: true the S4.4 contract now needs), types.rs (both appends kept), docs/parity.md (the review's oracle row and S5's new row). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HS8WZziDnyxunC23MUxrLp
This commit is contained in:
commit
3a3f03d884
44 files changed
+1847
-30
No files matched your search
@@ -709,3 +709,89 @@ fn an_invoice_bill_to_uses_the_billing_details() {
|
||||
assert_eq!(bill_to["phone"], "555-0100", "{bill_to}");
|
||||
assert_eq!(bill_to["shipping_address"], "Gate 2", "{bill_to}");
|
||||
}
|
||||
|
||||
// P4b S5: sent tracking (merged from branch S5).
|
||||
|
||||
/// Two sends on one invoice: the first the original (defaults: the
|
||||
/// token's name, email, today's company day), the second a reminder with
|
||||
/// the channel's message id; then `books.documents` shows the last send
|
||||
/// and `books.document` the whole record.
|
||||
#[test]
|
||||
fn mark_sent_records_who_and_how() {
|
||||
let books = common::Books::new("p4b-s5-mark-sent");
|
||||
let mut wire = books.session("p4b-s5");
|
||||
let customer =
|
||||
common::answer_of(&wire.call("books.add_customer", json!({"name": "Fernhill Labs"})))
|
||||
.unwrap()["id"]
|
||||
.as_u64()
|
||||
.unwrap();
|
||||
let invoice = common::answer_of(&wire.call(
|
||||
"books.create_invoice",
|
||||
json!({"party_id": customer, "date": "2026-03-01", "due_date": "2026-03-31",
|
||||
"lines": [{"description": "Design", "amount": "1200.00"}], "confirmed": true}),
|
||||
))
|
||||
.unwrap()["id"]
|
||||
.as_u64()
|
||||
.unwrap();
|
||||
|
||||
let first = common::answer_of(&wire.call(
|
||||
"books.mark_sent",
|
||||
json!({"invoice": format!("invoice:{invoice}"), "on": "2026-03-05",
|
||||
"by": "Avery Quill", "recipients": ["billing@fernhill.example"]}),
|
||||
))
|
||||
.unwrap();
|
||||
assert_eq!(first["invoice"], json!(format!("invoice:{invoice}")));
|
||||
assert_eq!(first["sends"][0]["on"], json!("2026-03-05"));
|
||||
assert_eq!(first["sends"][0]["by"], json!("Avery Quill"));
|
||||
assert_eq!(
|
||||
first["sends"][0]["via"],
|
||||
json!("email"),
|
||||
"the default channel"
|
||||
);
|
||||
assert_eq!(first["sends"][0]["to"], json!(["billing@fernhill.example"]));
|
||||
assert_eq!(
|
||||
first["sends"][0]["kind"],
|
||||
json!("original"),
|
||||
"the first send is the original"
|
||||
);
|
||||
|
||||
// The second names no `by`, `via` or `kind`: this session's token
|
||||
// (the agent), email, and a reminder now that one send is recorded.
|
||||
let second = common::answer_of(&wire.call(
|
||||
"books.mark_sent",
|
||||
json!({"invoice": invoice.to_string(), "on": "2026-03-20",
|
||||
"recipients": ["billing@fernhill.example"], "reference": "msg-2",
|
||||
"note": "Second copy"}),
|
||||
))
|
||||
.unwrap();
|
||||
let sends = second["sends"].as_array().unwrap();
|
||||
assert_eq!(sends.len(), 2, "{second}");
|
||||
assert_eq!(sends[1]["by"], json!("test"), "the token's name");
|
||||
assert_eq!(sends[1]["via"], json!("email"));
|
||||
assert_eq!(sends[1]["kind"], json!("reminder"));
|
||||
assert_eq!(sends[1]["reference"], json!("msg-2"));
|
||||
assert_eq!(sends[1]["note"], json!("Second copy"));
|
||||
|
||||
let listed =
|
||||
common::answer_of(&wire.call("books.documents", json!({"kind": "invoices"}))).unwrap();
|
||||
assert_eq!(
|
||||
listed["documents"][0]["ref"],
|
||||
json!(format!("invoice:{invoice}"))
|
||||
);
|
||||
assert_eq!(
|
||||
listed["documents"][0]["last_sent"],
|
||||
json!("2026-03-20"),
|
||||
"the list shows the latest send"
|
||||
);
|
||||
let one = common::answer_of(&wire.call(
|
||||
"books.document",
|
||||
json!({"ref": format!("invoice:{invoice}"), "as_of": "2026-03-31"}),
|
||||
))
|
||||
.unwrap();
|
||||
assert_eq!(one["sends"].as_array().unwrap().len(), 2);
|
||||
assert_eq!(
|
||||
one["outstanding"],
|
||||
json!("1200.00"),
|
||||
"a send changes no figure"
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user