119 lines
5.4 KiB
Rust
119 lines
5.4 KiB
Rust
use heromodels::models::legal::{
|
|
Contract, ContractRevision, ContractSigner, ContractStatus, SignerStatus,
|
|
};
|
|
// If BaseModelData's touch method or new method isn't directly part of the public API
|
|
// of heromodels crate root, we might need to import heromodels_core.
|
|
// For now, assuming `contract.base_data.touch()` would work if BaseModelData has a public `touch` method.
|
|
// Or, if `heromodels::models::BaseModelData` is the path.
|
|
|
|
// A helper for current timestamp (seconds since epoch)
|
|
fn current_timestamp_secs() -> u64 {
|
|
std::time::SystemTime::now()
|
|
.duration_since(std::time::UNIX_EPOCH)
|
|
.unwrap_or_default()
|
|
.as_secs()
|
|
}
|
|
|
|
fn main() {
|
|
println!("Demonstrating Legal Contract Model Usage");
|
|
|
|
// Create contract signers
|
|
let signer1 = ContractSigner::new(
|
|
"signer-uuid-alice-001".to_string(),
|
|
"Alice Wonderland".to_string(),
|
|
"alice@example.com".to_string(),
|
|
)
|
|
.status(SignerStatus::Pending)
|
|
.comments("Awaiting Alice's review and signature.");
|
|
|
|
let signer2 = ContractSigner::new(
|
|
"signer-uuid-bob-002".to_string(),
|
|
"Bob The Builder".to_string(),
|
|
"bob@example.com".to_string(),
|
|
)
|
|
.status(SignerStatus::Signed)
|
|
.signed_at(current_timestamp_secs() - 86400) // Signed yesterday
|
|
.comments("Bob has signed the agreement.");
|
|
|
|
// Create contract revisions
|
|
let revision1 = ContractRevision::new(
|
|
1,
|
|
"Initial draft: This Service Agreement outlines the terms...".to_string(),
|
|
current_timestamp_secs() - (86400 * 2), // 2 days ago
|
|
"user-uuid-creator-charlie".to_string(),
|
|
)
|
|
.comments("Version 1.0 - Initial draft for review.");
|
|
|
|
let revision2 = ContractRevision::new(
|
|
2,
|
|
"Updated draft: Added clause 5.b regarding data privacy...".to_string(),
|
|
current_timestamp_secs() - 86400, // 1 day ago
|
|
"user-uuid-editor-diana".to_string(),
|
|
)
|
|
.comments("Version 2.0 - Incorporated feedback from legal team.");
|
|
|
|
// Create a new contract
|
|
// base_id (u32 for BaseModelData) and contract_id (String for UUID)
|
|
let mut contract = Contract::new(101, "contract-uuid-main-789".to_string())
|
|
.title("Master Service Agreement (MSA) - Q3 2025")
|
|
.description("Agreement for ongoing IT support services between TechSolutions Inc. and ClientCorp LLC.")
|
|
.contract_type("MSA".to_string())
|
|
.status(ContractStatus::PendingSignatures)
|
|
.created_by("user-uuid-admin-eve".to_string())
|
|
.terms_and_conditions("The full terms are detailed in the attached PDF, referenced as 'MSA_Q3_2025_Full.pdf'. This string can hold markdown or JSON summary.")
|
|
.start_date(current_timestamp_secs() + (86400 * 7)) // Starts in 7 days
|
|
.end_date(current_timestamp_secs() + (86400 * (365 + 7))) // Ends in 1 year + 7 days
|
|
.renewal_period_days(30)
|
|
.next_renewal_date(current_timestamp_secs() + (86400 * (365 + 7 - 30))) // Approx. 30 days before end_date
|
|
.current_version(2)
|
|
.add_signer(signer1.clone())
|
|
.add_signer(signer2.clone())
|
|
.add_revision(revision1.clone())
|
|
.add_revision(revision2.clone());
|
|
|
|
// The `#[model]` derive handles `created_at` and `updated_at` in `base_data`.
|
|
// `base_data.touch()` might be called internally by setters or needs explicit call if fields are set directly.
|
|
// For builder pattern, the final state of `base_data.updated_at` reflects the time of the last builder call if `touch()` is implicit.
|
|
// If not, one might call `contract.base_data.touch()` after building.
|
|
|
|
println!("\n--- Initial Contract Details ---");
|
|
println!("{:#?}", contract);
|
|
|
|
// Simulate a status change and signing
|
|
contract.set_status(ContractStatus::Signed); // This should call base_data.touch()
|
|
contract = contract.last_signed_date(current_timestamp_secs());
|
|
// If set_status doesn't touch, and last_signed_date is not a builder method that touches:
|
|
// contract.base_data.touch(); // Manually update timestamp if needed after direct field manipulation
|
|
|
|
println!("\n--- Contract Details After Signing ---");
|
|
println!("{:#?}", contract);
|
|
|
|
println!("\n--- Accessing Specific Fields ---");
|
|
println!("Contract Title: {}", contract.title);
|
|
println!("Contract Status: {:?}", contract.status);
|
|
println!("Contract ID (UUID): {}", contract.contract_id);
|
|
println!("Base Model ID (u32): {}", contract.base_data.id); // From BaseModelData
|
|
println!("Created At (timestamp): {}", contract.base_data.created_at); // From BaseModelData
|
|
println!("Updated At (timestamp): {}", contract.base_data.modified_at); // From BaseModelData
|
|
|
|
if let Some(first_signer_details) = contract.signers.first() {
|
|
println!(
|
|
"\nFirst Signer: {} ({})",
|
|
first_signer_details.name, first_signer_details.email
|
|
);
|
|
println!(" Status: {:?}", first_signer_details.status);
|
|
if let Some(signed_time) = first_signer_details.signed_at {
|
|
println!(" Signed At: {}", signed_time);
|
|
}
|
|
}
|
|
|
|
if let Some(latest_rev) = contract.revisions.iter().max_by_key(|r| r.version) {
|
|
println!("\nLatest Revision (v{}):", latest_rev.version);
|
|
println!(" Content Snippet: {:.60}...", latest_rev.content);
|
|
println!(" Created By: {}", latest_rev.created_by);
|
|
println!(" Revision Created At: {}", latest_rev.created_at);
|
|
}
|
|
|
|
println!("\nLegal Contract Model demonstration complete.");
|
|
}
|