...
This commit is contained in:
parent
8759159925
commit
9e8fefbf1f
@ -5,7 +5,11 @@ use herodb::models::biz::{
|
|||||||
Product, ProductBuilder, ProductComponentBuilder,
|
Product, ProductBuilder, ProductComponentBuilder,
|
||||||
ProductType, ProductStatus,
|
ProductType, ProductStatus,
|
||||||
Sale, SaleBuilder, SaleItemBuilder, SaleStatus,
|
Sale, SaleBuilder, SaleItemBuilder, SaleStatus,
|
||||||
ExchangeRate, ExchangeRateBuilder, EXCHANGE_RATE_SERVICE
|
ExchangeRate, ExchangeRateBuilder, EXCHANGE_RATE_SERVICE,
|
||||||
|
Service, ServiceBuilder, ServiceItemBuilder, ServiceStatus, BillingFrequency,
|
||||||
|
Customer, CustomerBuilder,
|
||||||
|
Contract, ContractBuilder, ContractStatus,
|
||||||
|
Invoice, InvoiceBuilder, InvoiceItemBuilder, InvoiceStatus, PaymentStatus, Payment
|
||||||
};
|
};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
@ -15,7 +19,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
println!("============================================================");
|
println!("============================================================");
|
||||||
|
|
||||||
// Create a temporary directory for the database
|
// Create a temporary directory for the database
|
||||||
let db_path = PathBuf::from("./tmp/dbexample2");
|
let db_path = PathBuf::from("/tmp/dbexample2");
|
||||||
if db_path.exists() {
|
if db_path.exists() {
|
||||||
fs::remove_dir_all(&db_path)?;
|
fs::remove_dir_all(&db_path)?;
|
||||||
}
|
}
|
||||||
@ -28,6 +32,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
.register_model::<Currency>()
|
.register_model::<Currency>()
|
||||||
.register_model::<Sale>()
|
.register_model::<Sale>()
|
||||||
.register_model::<ExchangeRate>()
|
.register_model::<ExchangeRate>()
|
||||||
|
.register_model::<Service>()
|
||||||
|
.register_model::<Customer>()
|
||||||
|
.register_model::<Contract>()
|
||||||
|
.register_model::<Invoice>()
|
||||||
.build()?;
|
.build()?;
|
||||||
|
|
||||||
println!("\n1. Creating Products with Builder Pattern");
|
println!("\n1. Creating Products with Builder Pattern");
|
||||||
@ -281,6 +289,176 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
println!(" - {}", product.name);
|
println!(" - {}", product.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
println!("\n8. Creating a Customer");
|
||||||
|
println!("--------------------");
|
||||||
|
|
||||||
|
// Create a customer using the builder
|
||||||
|
let customer = CustomerBuilder::new()
|
||||||
|
.id(1001)
|
||||||
|
.name("Jane Smith")
|
||||||
|
.description("Enterprise customer")
|
||||||
|
.pubkey("abc123def456")
|
||||||
|
.add_contact(5001)
|
||||||
|
.add_contact(5002)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Insert the customer
|
||||||
|
db.insert_customer(&customer)?;
|
||||||
|
println!("Customer created: {} (ID: {})", customer.name, customer.id);
|
||||||
|
println!("Contacts: {:?}", customer.contact_ids);
|
||||||
|
|
||||||
|
println!("\n9. Creating a Service");
|
||||||
|
println!("-------------------");
|
||||||
|
|
||||||
|
// Create service items using the builder
|
||||||
|
let service_item1 = ServiceItemBuilder::new()
|
||||||
|
.id(301)
|
||||||
|
.service_id(2001)
|
||||||
|
.product_id(1)
|
||||||
|
.name("Standard Plan - Monthly")
|
||||||
|
.quantity(1)
|
||||||
|
.unit_price(CurrencyBuilder::new()
|
||||||
|
.amount(29.99)
|
||||||
|
.currency_code("USD")
|
||||||
|
.build()?)
|
||||||
|
.tax_rate(0.07) // 7% tax
|
||||||
|
.is_taxable(true)
|
||||||
|
.active_till(now + Duration::days(30))
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Create a service using the builder
|
||||||
|
let service = ServiceBuilder::new()
|
||||||
|
.id(2001)
|
||||||
|
.customer_id(1001)
|
||||||
|
.currency_code("USD")
|
||||||
|
.status(ServiceStatus::Active)
|
||||||
|
.billing_frequency(BillingFrequency::Monthly)
|
||||||
|
.add_item(service_item1)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Insert the service
|
||||||
|
db.insert_service(&service)?;
|
||||||
|
println!("Service created: #{} for customer #{}", service.id, service.customer_id);
|
||||||
|
println!("Total amount: ${} USD (including tax)", service.total_amount.amount);
|
||||||
|
println!("Billing frequency: {:?}", service.billing_frequency);
|
||||||
|
|
||||||
|
println!("\n10. Creating a Contract");
|
||||||
|
println!("---------------------");
|
||||||
|
|
||||||
|
// Create a contract using the builder
|
||||||
|
let contract = ContractBuilder::new()
|
||||||
|
.id(3001)
|
||||||
|
.customer_id(1001)
|
||||||
|
.service_id(2001)
|
||||||
|
.terms("Monthly service contract with auto-renewal")
|
||||||
|
.start_date(now)
|
||||||
|
.end_date(now + Duration::days(365))
|
||||||
|
.auto_renewal(true)
|
||||||
|
.renewal_terms("Renews automatically for 1 year unless cancelled 30 days prior")
|
||||||
|
.status(ContractStatus::Active)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Insert the contract
|
||||||
|
db.insert_contract(&contract)?;
|
||||||
|
println!("Contract created: #{} for customer #{}", contract.id, contract.customer_id);
|
||||||
|
println!("Contract period: {} to {}",
|
||||||
|
contract.start_date.format("%Y-%m-%d"),
|
||||||
|
contract.end_date.format("%Y-%m-%d")
|
||||||
|
);
|
||||||
|
println!("Auto-renewal: {}", if contract.auto_renewal { "Yes" } else { "No" });
|
||||||
|
|
||||||
|
println!("\n11. Creating an Invoice");
|
||||||
|
println!("---------------------");
|
||||||
|
|
||||||
|
// Create invoice items using the builder
|
||||||
|
let invoice_item1 = InvoiceItemBuilder::new()
|
||||||
|
.id(401)
|
||||||
|
.invoice_id(4001)
|
||||||
|
.description("Monthly service fee - Standard Plan")
|
||||||
|
.amount(CurrencyBuilder::new()
|
||||||
|
.amount(32.09) // Price with tax
|
||||||
|
.currency_code("USD")
|
||||||
|
.build()?)
|
||||||
|
.service_id(2001)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Create an invoice using the builder
|
||||||
|
let invoice = InvoiceBuilder::new()
|
||||||
|
.id(4001)
|
||||||
|
.customer_id(1001)
|
||||||
|
.currency_code("USD")
|
||||||
|
.issue_date(now)
|
||||||
|
.due_date(now + Duration::days(15))
|
||||||
|
.add_item(invoice_item1)
|
||||||
|
.build()?;
|
||||||
|
|
||||||
|
// Insert the invoice
|
||||||
|
db.insert_invoice(&invoice)?;
|
||||||
|
println!("Invoice created: #{} for customer #{}", invoice.id, invoice.customer_id);
|
||||||
|
println!("Total amount: ${} USD", invoice.total_amount.amount);
|
||||||
|
println!("Balance due: ${} USD", invoice.balance_due.amount);
|
||||||
|
println!("Status: {:?}, Payment status: {:?}", invoice.status, invoice.payment_status);
|
||||||
|
|
||||||
|
println!("\n12. Processing a Payment");
|
||||||
|
println!("----------------------");
|
||||||
|
|
||||||
|
// Retrieve the invoice, add a payment, and save it back
|
||||||
|
let mut retrieved_invoice = db.get_invoice(4001)?;
|
||||||
|
|
||||||
|
// Create a payment
|
||||||
|
let payment = Payment::new(
|
||||||
|
CurrencyBuilder::new()
|
||||||
|
.amount(32.09)
|
||||||
|
.currency_code("USD")
|
||||||
|
.build()?,
|
||||||
|
"Credit Card".to_string()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add the payment to the invoice
|
||||||
|
retrieved_invoice.add_payment(payment);
|
||||||
|
|
||||||
|
// Save the updated invoice
|
||||||
|
db.insert_invoice(&retrieved_invoice)?;
|
||||||
|
|
||||||
|
println!("Payment processed for invoice #{}", retrieved_invoice.id);
|
||||||
|
println!("New balance due: ${} USD", retrieved_invoice.balance_due.amount);
|
||||||
|
println!("New status: {:?}, Payment status: {:?}",
|
||||||
|
retrieved_invoice.status,
|
||||||
|
retrieved_invoice.payment_status
|
||||||
|
);
|
||||||
|
|
||||||
|
println!("\n13. Retrieving Related Objects");
|
||||||
|
println!("----------------------------");
|
||||||
|
|
||||||
|
// Retrieve customer and related objects
|
||||||
|
let retrieved_customer = db.get_customer(1001)?;
|
||||||
|
println!("Customer: {} (ID: {})", retrieved_customer.name, retrieved_customer.id);
|
||||||
|
|
||||||
|
// Retrieve service for this customer
|
||||||
|
let retrieved_service = db.get_service(2001)?;
|
||||||
|
println!("Service: #{} with {} items",
|
||||||
|
retrieved_service.id,
|
||||||
|
retrieved_service.items.len()
|
||||||
|
);
|
||||||
|
|
||||||
|
// Retrieve contract for this customer
|
||||||
|
let retrieved_contract = db.get_contract(3001)?;
|
||||||
|
println!("Contract: #{} ({})",
|
||||||
|
retrieved_contract.id,
|
||||||
|
if retrieved_contract.is_active() { "Active" } else { "Inactive" }
|
||||||
|
);
|
||||||
|
|
||||||
|
// Retrieve invoice for this customer
|
||||||
|
let retrieved_invoice = db.get_invoice(4001)?;
|
||||||
|
println!("Invoice: #{} ({})",
|
||||||
|
retrieved_invoice.id,
|
||||||
|
match retrieved_invoice.payment_status {
|
||||||
|
PaymentStatus::Paid => "Paid",
|
||||||
|
PaymentStatus::PartiallyPaid => "Partially Paid",
|
||||||
|
PaymentStatus::Unpaid => "Unpaid",
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
println!("\nExample completed successfully!");
|
println!("\nExample completed successfully!");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
@ -1,4 +0,0 @@
|
|||||||
segment_size: 524288
|
|
||||||
use_compression: false
|
|
||||||
version: 0.34
|
|
||||||
vQÁ
|
|
Binary file not shown.
@ -1,4 +0,0 @@
|
|||||||
segment_size: 524288
|
|
||||||
use_compression: false
|
|
||||||
version: 0.34
|
|
||||||
vQÁ
|
|
Binary file not shown.
@ -1,4 +0,0 @@
|
|||||||
segment_size: 524288
|
|
||||||
use_compression: false
|
|
||||||
version: 0.34
|
|
||||||
vQÁ
|
|
Binary file not shown.
@ -1,4 +0,0 @@
|
|||||||
segment_size: 524288
|
|
||||||
use_compression: false
|
|
||||||
version: 0.34
|
|
||||||
vQÁ
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user