swiftops-backend / docs /examples /invoice_pricing_examples.py
kamau1's picture
feat: add flexible invoice pricing system with tiered, flat rate, time-based, and custom pricing models
f18d2f1
"""
Invoice Pricing Examples - Real-world pricing configurations
Examples showing how to configure different pricing models for projects.
"""
# Example 1: Tiered Pricing (Airtel Customer Service)
airtel_tiered_pricing = {
"title": "Airtel Customer Service 2025",
"project_type": "support",
"service_type": "other",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "tiered",
"currency": "KES",
"apply_per_invoice": True, # Reset count per invoice
"tax_rate": 16, # 16% VAT
"tiers": [
{
"tier_number": 1,
"from_ticket": 1,
"to_ticket": 500,
"rate_per_ticket": 3200,
"description": "First 500 tickets @ KES 3,200"
},
{
"tier_number": 2,
"from_ticket": 501,
"to_ticket": 800,
"rate_per_ticket": 2800,
"description": "Next 300 tickets @ KES 2,800"
},
{
"tier_number": 3,
"from_ticket": 801,
"to_ticket": None, # Unlimited
"rate_per_ticket": 2500,
"description": "All remaining tickets @ KES 2,500"
}
],
"notes": "Airtel customer service project - tiered pricing per invoice"
}
}
# Example 2: Cumulative Tiered Pricing
cumulative_tiered_pricing = {
"title": "Safaricom FTTH Rollout",
"project_type": "installation",
"service_type": "ftth",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "tiered",
"currency": "KES",
"apply_per_invoice": False, # Cumulative across project
"tax_rate": 16,
"tiers": [
{
"tier_number": 1,
"from_ticket": 1,
"to_ticket": 1000,
"rate_per_ticket": 5000,
"description": "First 1,000 installations @ KES 5,000"
},
{
"tier_number": 2,
"from_ticket": 1001,
"to_ticket": 5000,
"rate_per_ticket": 4500,
"description": "Next 4,000 installations @ KES 4,500"
},
{
"tier_number": 3,
"from_ticket": 5001,
"to_ticket": None,
"rate_per_ticket": 4000,
"description": "All remaining @ KES 4,000"
}
],
"notes": "Volume discount - cumulative across entire project"
}
}
# Example 3: Flat Rate Pricing
flat_rate_pricing = {
"title": "Standard FTTH Installations",
"project_type": "installation",
"service_type": "ftth",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "flat_rate",
"currency": "KES",
"rate_per_ticket": 5000,
"tax_rate": 16,
"notes": "Standard installation rate - KES 5,000 per installation"
}
}
# Example 4: Time-Based Pricing (Consultant)
time_based_pricing = {
"title": "Network Consulting Services",
"project_type": "maintenance",
"service_type": "other",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "time_based",
"currency": "USD",
"rate_per_unit": 25,
"rate_period": "hour",
"tax_rate": 0,
"notes": "Consultant hourly rate - USD 25/hour"
}
}
# Example 5: Custom Pricing (Distance-Based)
custom_pricing = {
"title": "Rural FTTH Project",
"project_type": "installation",
"service_type": "ftth",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "custom",
"currency": "KES",
"formula": "base_rate + (distance_km * distance_rate)",
"variables": {
"base_rate": 3000,
"distance_rate": 50
},
"tax_rate": 16,
"notes": "Base rate + KES 50 per km from hub"
}
}
# Example 6: No Pricing Rules (Manual Pricing)
no_pricing_rules = {
"title": "Custom Project",
"project_type": "installation",
"service_type": "ftth",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": None # Manual pricing required
}
# ============================================
# INVOICE GENERATION EXAMPLES
# ============================================
# Example: Generate Invoice with Tiered Pricing
generate_invoice_tiered = {
"project_id": "uuid-project",
"contractor_id": "uuid-contractor",
"client_id": "uuid-client",
"ticket_ids": ["uuid1", "uuid2", "..."], # 750 tickets
"title": "December 2025 Invoice",
"notes": "Monthly invoice for customer service tickets"
}
# Expected Result (750 tickets with Airtel pricing):
# Tier 1: 500 tickets × 3,200 = 1,600,000 KES
# Tier 2: 250 tickets × 2,800 = 700,000 KES
# Subtotal: 2,300,000 KES
# Tax (16%): 368,000 KES
# Total: 2,668,000 KES
# Example: Generate Invoice with Flat Rate
generate_invoice_flat = {
"project_id": "uuid-project",
"contractor_id": "uuid-contractor",
"client_id": "uuid-client",
"ticket_ids": ["uuid1", "uuid2", "..."], # 100 tickets
"title": "January 2025 Installations"
}
# Expected Result (100 tickets @ 5,000):
# Subtotal: 500,000 KES
# Tax (16%): 80,000 KES
# Total: 580,000 KES
# ============================================
# API EXAMPLES
# ============================================
# Create Project with Tiered Pricing
"""
POST /api/v1/projects
Content-Type: application/json
{
"title": "Airtel Customer Service 2025",
"project_type": "support",
"service_type": "other",
"client_id": "uuid-client",
"contractor_id": "uuid-contractor",
"invoice_pricing_rules": {
"pricing_model": "tiered",
"currency": "KES",
"apply_per_invoice": true,
"tax_rate": 16,
"tiers": [
{
"tier_number": 1,
"from_ticket": 1,
"to_ticket": 500,
"rate_per_ticket": 3200,
"description": "First 500 tickets"
},
{
"tier_number": 2,
"from_ticket": 501,
"to_ticket": 800,
"rate_per_ticket": 2800,
"description": "Next 300 tickets"
},
{
"tier_number": 3,
"from_ticket": 801,
"to_ticket": null,
"rate_per_ticket": 2500,
"description": "All remaining"
}
]
}
}
"""
# Generate Invoice (Automatic Pricing)
"""
POST /api/v1/invoices/generate
Content-Type: application/json
{
"project_id": "uuid-project",
"contractor_id": "uuid-contractor",
"client_id": "uuid-client",
"ticket_ids": ["uuid1", "uuid2", ...],
"title": "December 2025 Invoice"
}
Response:
{
"invoice": {
"id": "uuid",
"invoice_number": "INV-AIRTEL-2025-00142",
"subtotal": 2300000.00,
"tax_rate": 16.00,
"tax_amount": 368000.00,
"total_amount": 2668000.00,
"currency": "KES",
"line_items": [
{
"type": "pricing_tier",
"description": "First 500 tickets @ KES 3,200",
"quantity": 500,
"unit_price": 3200.00,
"total": 1600000.00,
"tier_number": 1
},
{
"type": "pricing_tier",
"description": "Next 300 tickets @ KES 2,800",
"quantity": 250,
"unit_price": 2800.00,
"total": 700000.00,
"tier_number": 2
}
],
"additional_metadata": {
"pricing_calculation": {
"pricing_model": "tiered",
"total_tickets": 750,
"tiers_applied": [
{
"tier_number": 1,
"from_ticket": 1,
"to_ticket": 500,
"tickets_in_tier": 500,
"rate_per_ticket": 3200,
"subtotal": 1600000
},
{
"tier_number": 2,
"from_ticket": 501,
"to_ticket": 750,
"tickets_in_tier": 250,
"rate_per_ticket": 2800,
"subtotal": 700000
}
]
}
}
}
}
"""
# Update Project Pricing Rules
"""
PUT /api/v1/projects/{project_id}
Content-Type: application/json
{
"invoice_pricing_rules": {
"pricing_model": "flat_rate",
"currency": "KES",
"rate_per_ticket": 4500,
"tax_rate": 16,
"notes": "Updated to flat rate"
}
}
"""
# Remove Pricing Rules (Switch to Manual)
"""
PUT /api/v1/projects/{project_id}
Content-Type: application/json
{
"invoice_pricing_rules": null
}
"""