puffin-app/src/types.ts
Matt 4b408986e5
All checks were successful
Build and Push Docker Images / docker (push) Successful in 2m25s
Add complete admin portal implementation with orders management
- Fully implemented OrdersTable with sorting, pagination, and filtering
- Added OrderFilters component for search, status, and date range filtering
- Created OrderStatsCards for dashboard metrics display
- Built OrderDetailsModal for viewing complete order information
- Implemented ExportButton for CSV export functionality
- Updated dashboard and orders pages to use new components
- Enhanced OrderRecord type definitions in src/types.ts
- All components working with NocoDB API integration
2025-11-03 22:24:17 +01:00

251 lines
7.1 KiB
TypeScript

export interface VesselData {
imo: string;
vesselName: string;
type: string;
length: number;
width: number;
estimatedEnginePower: number;
}
export interface CarbonCalculation {
yearlyEmissions: number;
offsetCost: number;
recommendedProjects: Array<{
id: string;
name: string;
description: string;
costPerTon: number;
}>;
}
export interface CarbonEstimate {
fuelConsumption: number; // liters per year
co2Emissions: number; // tons per year
}
export interface TripEstimate {
distance: number; // nautical miles
duration: number; // hours
fuelConsumption: number; // liters
co2Emissions: number; // tons
}
export interface Currency {
code: string;
symbol: string;
rate: number; // Exchange rate relative to USD
}
export type CurrencyCode = 'USD' | 'EUR' | 'GBP' | 'CHF';
export interface Portfolio {
id: number;
name: string;
description: string;
projects: OffsetProject[];
pricePerTon: number;
currency: CurrencyCode;
}
export type CertificationStatus =
| 'standard 2020'
| 'standard 2023'
| 'nonstandard'
| 'in progress';
export interface OffsetProject {
id: string;
name: string;
description: string;
shortDescription: string;
imageUrl: string;
pricePerTon: number;
percentage?: number; // Project's contribution to portfolio
certificationStatus?: CertificationStatus; // Wren certification standard
location: string;
type: string;
verificationStandard: string;
impactMetrics: {
co2Reduced: number;
treesPlanted?: number;
livelihoodsImproved?: number;
};
}
export type OffsetOrderSource =
| 'subscription'
| 'flight'
| 'gift'
| 'custom-duration'
| 'one-off'
| 'referral-bonus'
| 'annual-incentive'
| 'public-api'
| 'special-offer';
export interface OffsetOrder {
id: string;
amountCharged: number; // Amount in cents (amount_paid_by_customer from API)
currency: CurrencyCode;
tons: number;
portfolio: Portfolio;
status: 'pending' | 'completed' | 'failed';
createdAt: string;
dryRun: boolean;
source?: OffsetOrderSource; // Source of the payment
note?: string; // Optional note attached to the order
}
export type CalculatorType = 'trip' | 'annual' | 'mobile';
// Stripe Checkout Types
export interface CheckoutSession {
sessionId: string;
url: string;
orderId: string;
}
export interface StoredOrder {
id: string;
stripeSessionId: string;
stripePaymentIntent: string | null;
wrenOrderId: string | null;
customerEmail: string | null;
tons: number;
portfolioId: number;
baseAmount: number; // in cents
processingFee: number; // in cents
totalAmount: number; // in cents
currency: CurrencyCode;
status: 'pending' | 'paid' | 'fulfilled' | 'failed';
createdAt: string;
updatedAt: string;
}
export interface OrderDetailsResponse {
order: {
id: string;
tons: number;
portfolioId: number;
baseAmount: number;
processingFee: number;
totalAmount: number;
currency: string;
status: string;
wrenOrderId: string | null;
stripeSessionId: string;
createdAt: string;
portfolio?: Portfolio; // Portfolio data with projects for pie chart
};
session: {
paymentStatus: string;
customerEmail?: string;
};
}
// NocoDB Order Record (Admin Portal)
export interface OrderRecord {
// NocoDB metadata
Id: number;
CreatedAt: string;
UpdatedAt: string;
// Order identification
orderId: string;
status: 'pending' | 'paid' | 'fulfilled' | 'cancelled';
source?: string; // 'web', 'mobile-app', 'manual', 'api'
// Payment information
stripeSessionId?: string; // Stripe Checkout Session ID
stripePaymentIntent?: string; // Stripe Payment Intent ID (for refunds)
baseAmount: string; // Pre-fee amount in cents (from Stripe metadata)
processingFee: string; // Stripe processing fee in cents (from Stripe metadata)
totalAmount: string; // Total charged amount in cents (baseAmount + processingFee)
currency: string; // 'USD', 'EUR', 'GBP', 'CHF'
amountUSD?: string; // Amount converted to USD for reporting
paymentMethod?: string; // Payment method type (e.g., "card", "bank_transfer")
// Carbon offset details
co2Tons: string; // Tons of CO2 offset (from Stripe metadata.tons)
portfolioId: string; // Wren portfolio ID (from Stripe metadata)
portfolioName?: string; // Human-readable portfolio name
wrenOrderId?: string; // Wren API order ID (populated after fulfillment)
certificateUrl?: string; // URL to offset certificate
fulfilledAt?: string; // Timestamp when order was fulfilled with Wren
// Customer information
customerName: string; // From Stripe customer_details.name (business_name or individual_name)
customerEmail: string; // From Stripe customer_details.email
customerPhone?: string; // From Stripe customer_details.phone (if phone collection enabled)
businessName?: string; // From Stripe customer_details.business_name (B2B purchases)
stripeCustomerId?: string; // From Stripe customer (reusable customer ID)
taxIdType?: string; // From Stripe customer_details.tax_ids[0].type (e.g., "eu_vat", "us_ein")
taxIdValue?: string; // From Stripe customer_details.tax_ids[0].value
billingCity?: string; // From Stripe address.city
billingCountry?: string; // From Stripe address.country
billingLine1?: string; // From Stripe address.line1
billingLine2?: string; // From Stripe address.line2
billingPostalCode?: string; // From Stripe address.postal_code
billingState?: string; // From Stripe address.state
// Vessel information (optional - for yacht calculations)
vesselName?: string; // Name of vessel
imoNumber?: string; // IMO vessel identification number
vesselType?: string; // Type of vessel (e.g., "Motor Yacht")
vesselLength?: string; // Vessel length in meters
// Trip details (optional - for trip-based calculations)
departurePort?: string; // Departure port name
arrivalPort?: string; // Arrival port name
distance?: string; // Distance in nautical miles
avgSpeed?: string; // Average speed in knots
duration?: string; // Trip duration in hours
enginePower?: string; // Engine power in horsepower
// Admin notes
notes?: string; // Internal admin notes
}
// QR Code System Types
export interface QRCalculatorData {
// Calculator mode
calculationType: 'fuel' | 'distance' | 'custom';
// Distance-based inputs
distance?: number; // nautical miles
speed?: number; // knots
fuelRate?: number; // liters/hour
// Fuel-based inputs
fuelAmount?: number; // liters or gallons
fuelUnit?: 'liters' | 'gallons';
// Custom amount
customAmount?: number; // USD dollar amount for direct offsetting
// Vessel information (optional, for context)
vessel?: {
imo?: string;
name?: string;
type?: string;
enginePower?: number;
};
// Metadata
timestamp?: string; // ISO timestamp for tracking
source?: string; // e.g., "marina-api", "broker-portal"
}
export interface QRGenerationResponse {
qrCodeDataURL: string; // PNG as data URL
qrCodeSVG: string; // SVG markup
url: string; // The full URL with encoded data
expiresAt: string; // ISO timestamp
}
export interface QRValidationResult {
valid: boolean;
error?: string;
data?: QRCalculatorData;
}