Packages
phoenix_kit
1.7.21
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/modules/billing/web/README.md
# Billing Module
The PhoenixKit Billing module provides a complete solution for managing orders, invoices, and payments with EU Standard support.
## Features
### Phase 1 (Current)
- **Orders** - Create and manage orders with line items
- **Invoices** - Generate invoices from orders, track status
- **Billing Profiles** - EU-compliant billing profiles (Individual/Company)
- **Currencies** - Multi-currency support with exchange rates
- **Manual Payments** - Bank transfer workflow with admin confirmation
- **Receipts** - Automatic receipt generation after payment
### Future Phases
- Payment Methods (saved cards, wallets)
- Stripe Integration
- PayPal Integration
- Razorpay Integration
- Subscriptions & Recurring Payments
## Workflow
```
1. User fills Billing Profile (personal or company details)
2. Admin creates Order for user
3. Invoice is generated from Order
4. Invoice is sent to user (email)
5. User pays via bank transfer
6. User notifies admin about payment
7. Admin marks Invoice as "paid"
8. Receipt is automatically generated
```
## Database Schema
### Tables
- `phoenix_kit_currencies` - Currency definitions (EUR, USD, etc.)
- `phoenix_kit_billing_profiles` - User billing information
- `phoenix_kit_orders` - Orders with line items
- `phoenix_kit_invoices` - Invoices with receipt support
### Order Statuses
| Status | Description |
|--------|-------------|
| `draft` | Order created, not yet confirmed |
| `pending` | Awaiting confirmation |
| `confirmed` | Order confirmed, ready for payment |
| `paid` | Payment received |
| `cancelled` | Order cancelled |
| `refunded` | Payment refunded |
### Invoice Statuses
| Status | Description |
|--------|-------------|
| `draft` | Invoice created, not sent |
| `sent` | Invoice sent to customer |
| `paid` | Payment received |
| `void` | Invoice cancelled |
| `overdue` | Past due date |
## Admin Routes
| Path | Description |
|------|-------------|
| `/admin/billing` | Billing dashboard with statistics |
| `/admin/billing/orders` | Orders list with filters |
| `/admin/billing/orders/new` | Create new order |
| `/admin/billing/orders/:id` | Order details |
| `/admin/billing/orders/:id/edit` | Edit order |
| `/admin/billing/invoices` | Invoices list with filters |
| `/admin/billing/invoices/:id` | Invoice details |
| `/admin/billing/profiles` | Billing profiles list |
| `/admin/billing/currencies` | Currency management |
| `/admin/settings/billing` | Module settings |
## Configuration
### Settings (via Admin UI)
- **Default Currency** - Default currency for new orders (EUR)
- **Invoice Prefix** - Prefix for invoice numbers (INV)
- **Order Prefix** - Prefix for order numbers (ORD)
- **Receipt Prefix** - Prefix for receipt numbers (RCP)
- **Invoice Due Days** - Default days until invoice due date (14)
- **Default Tax Rate** - Default tax rate for new orders (0%)
- **Company Information** - Your company billing details
- **Bank Details** - Bank account for payments
## API Usage
### Enable/Disable Module
```elixir
# Check if billing is enabled
PhoenixKit.Modules.Billing.enabled?()
# Enable billing module
PhoenixKit.Modules.Billing.enable_system()
# Disable billing module
PhoenixKit.Modules.Billing.disable_system()
```
### Orders
```elixir
# Create order
{:ok, order} = PhoenixKit.Modules.Billing.create_order(user, %{
currency: "EUR",
payment_method: "bank",
line_items: [
%{name: "Service", quantity: 1, unit_price: "100.00"}
]
})
# Get order with preloads
order = PhoenixKit.Modules.Billing.get_order(id, preload: [:user, :billing_profile])
# List orders with pagination
{orders, total} = PhoenixKit.Modules.Billing.list_orders_with_count(
page: 1,
per_page: 25,
status: "confirmed",
search: "customer@example.com"
)
# Update order status
{:ok, order} = PhoenixKit.Modules.Billing.confirm_order(order)
{:ok, order} = PhoenixKit.Modules.Billing.mark_order_paid(order)
{:ok, order} = PhoenixKit.Modules.Billing.cancel_order(order)
```
### Invoices
```elixir
# Generate invoice from order
{:ok, invoice} = PhoenixKit.Modules.Billing.create_invoice_from_order(order)
# Update invoice status
{:ok, invoice} = PhoenixKit.Modules.Billing.send_invoice(invoice)
{:ok, invoice} = PhoenixKit.Modules.Billing.mark_invoice_paid(invoice)
{:ok, invoice} = PhoenixKit.Modules.Billing.void_invoice(invoice)
# Generate receipt after payment
{:ok, invoice} = PhoenixKit.Modules.Billing.generate_receipt(invoice)
# List invoices with pagination
{invoices, total} = PhoenixKit.Modules.Billing.list_invoices_with_count(
page: 1,
per_page: 25,
status: "sent"
)
```
### Billing Profiles
```elixir
# Create individual profile
{:ok, profile} = PhoenixKit.Modules.Billing.create_billing_profile(user, %{
type: "individual",
first_name: "John",
last_name: "Doe",
address_line1: "123 Main St",
city: "Tallinn",
country: "EE"
})
# Create company profile (EU Standard)
{:ok, profile} = PhoenixKit.Modules.Billing.create_billing_profile(user, %{
type: "company",
company_name: "Acme OÜ",
company_vat_number: "EE123456789",
company_registration_number: "12345678",
address_line1: "Business St 1",
city: "Tallinn",
country: "EE"
})
# Get user's billing profiles
profiles = PhoenixKit.Modules.Billing.list_user_billing_profiles(user_id)
# Set default profile
{:ok, profile} = PhoenixKit.Modules.Billing.set_default_billing_profile(profile)
```
### Currencies
```elixir
# List enabled currencies
currencies = PhoenixKit.Modules.Billing.list_currencies(enabled: true)
# Get default currency
currency = PhoenixKit.Modules.Billing.get_default_currency()
# Update currency
{:ok, currency} = PhoenixKit.Modules.Billing.update_currency(currency, %{
exchange_rate: Decimal.new("1.08")
})
```
## Components
### Status Badges
```heex
<%!-- Order status badge --%>
<.order_status_badge status={@order.status} />
<.order_status_badge status={@order.status} size={:sm} />
<.order_status_badge status={@order.status} size={:lg} />
<%!-- Invoice status badge --%>
<.invoice_status_badge status={@invoice.status} />
<.invoice_status_badge status={@invoice.status} size={:md} />
```
### Currency Display
```heex
<%!-- Format currency amount --%>
<.currency_amount amount={@invoice.total} currency="EUR" />
<%!-- Output: €100.00 --%>
<%!-- Compact format (smaller) --%>
<.currency_compact amount={@order.subtotal} currency="USD" />
<%!-- Currency badge --%>
<.currency_badge code="EUR" />
<.currency_badge code="USD" size={:sm} />
```
## Events (PubSub)
The billing module broadcasts events for real-time updates:
```elixir
# Subscribe to billing events
PhoenixKit.Modules.Billing.Events.subscribe()
# Events broadcasted:
# {:order_created, order}
# {:order_updated, order}
# {:order_confirmed, order}
# {:order_paid, order}
# {:order_cancelled, order}
# {:invoice_created, invoice}
# {:invoice_sent, invoice}
# {:invoice_paid, invoice}
# {:invoice_voided, invoice}
```
## EU Compliance
The billing module supports EU Standard requirements:
- **VAT Number** - Company VAT registration (format: CC123456789)
- **Registration Number** - Company registration number
- **Legal Address** - Company legal address
- **Individual Data** - First name, last name, personal ID
- **Address Fields** - Full address with country codes
## Files Structure
```
lib/phoenix_kit/
├── billing/
│ ├── billing.ex # Main context API
│ ├── currency.ex # Currency schema
│ ├── billing_profile.ex # Billing profile schema
│ ├── order.ex # Order schema
│ ├── invoice.ex # Invoice schema
│ └── events.ex # PubSub events
│
├── migrations/postgres/
│ └── v29.ex # Billing tables migration
lib/phoenix_kit_web/
├── live/modules/billing/
│ ├── README.md # This file
│ ├── index.ex # Dashboard
│ ├── orders.ex # Orders list
│ ├── order_detail.ex # Order details
│ ├── order_form.ex # Create/Edit order
│ ├── invoices.ex # Invoices list
│ ├── invoice_detail.ex # Invoice details
│ ├── billing_profiles.ex # Profiles list
│ ├── currencies.ex # Currency management
│ └── settings.ex # Module settings
│
└── components/core/
├── order_status_badge.ex
├── invoice_status_badge.ex
└── currency_display.ex
```