Donation Data Model Analysis
Current State Comparison
Documentation vs Seeding Script vs API
| Field | Documentation | Seeding Script | API Route | Legacy App | Status |
|---|---|---|---|---|---|
id | ✅ Required | ✅ Required | ✅ Auto-generated | ✅ Required | ✅ Match |
caseId | ✅ Required | ⚠️ Optional (70%) | ✅ Required | ✅ Required | ⚠️ INCONSISTENT |
guardianId | ✅ Required | ⚠️ Optional (30%) | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
userId | ✅ Optional | ✅ Required | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
donorId | ❌ Not in docs | ❌ Missing | ✅ Required | ✅ Optional | ⚠️ INCONSISTENT |
userName | ✅ Optional | ✅ Optional | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
donorName | ❌ Not in docs | ❌ Missing | ❌ Missing | ✅ Optional | ⚠️ INCONSISTENT |
userEmail | ✅ Optional | ✅ Optional | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
donorEmail | ❌ Not in docs | ❌ Missing | ❌ Missing | ✅ Optional | ⚠️ INCONSISTENT |
amount | ✅ Required | ✅ Required | ✅ Required | ✅ Required | ✅ Match |
currency | ✅ Required | ✅ Required | ✅ Optional (default ARS) | ❌ Missing | ⚠️ INCONSISTENT |
originalAmount | ✅ Required | ✅ Required | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
convertedAmount | ✅ Required | ✅ Required | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
paymentProvider | ✅ Required | ✅ Required | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
paymentMethod | ❌ Not in docs | ❌ Missing | ✅ Required | ✅ Required | ⚠️ INCONSISTENT |
transactionId | ✅ Required | ✅ Required | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
partnerTransactionId | ✅ Required | ✅ Optional | ❌ Missing | ❌ Missing | ⚠️ INCONSISTENT |
paymentIntentId | ❌ Not in docs | ❌ Missing | ❌ Missing | ✅ Optional | ⚠️ INCONSISTENT |
status | ✅ Required | ✅ Required | ✅ Required | ✅ Required | ⚠️ VALUE MISMATCH |
isAnonymous | ✅ Required | ✅ Required | ❌ Missing | ✅ Required | ⚠️ INCONSISTENT |
message | ✅ Optional | ✅ Optional | ❌ Missing | ✅ Optional | ✅ Match |
createdAt | ✅ Required | ✅ Required | ✅ Required | ✅ Required | ✅ Match |
updatedAt | ❌ Missing | ❌ Missing | ✅ Required | ❌ Missing | ❌ MISSING |
completedAt | ✅ Optional | ❌ Missing | ❌ Missing | ✅ Optional | ⚠️ INCONSISTENT |
Issues Identified
1. Field Naming Inconsistencies
userIdvsdonorId: Different names for the same conceptuserName/userEmailvsdonorName/donorEmail: Different naming conventionspaymentProvidervspaymentMethod: Different concepts or same?
2. Required vs Optional Conflicts
caseIdandguardianId: Docs say both required, but logically should be either/oruserId/donorId: Required in seeding, optional in docs/legacy (for anonymous)currency: Required in docs/seeding, optional in API (defaults to ARS)
3. Missing Fields
updatedAt: Present in API, missing in seeding/docscompletedAt: Present in docs/legacy, missing in seeding/API
4. Stellar Integration Fields
originalAmountandconvertedAmount: Present in seeding/docs for Stellar conversion- Not present in API - is Stellar integration still used?
5. Payment Processing Fields
paymentProvider(seeding/docs): 'moonpay' | 'stellar' | 'manual'paymentMethod(API/legacy): 'credit_card' | 'paypal' | 'other' | 'unknown'transactionId: Internal transaction IDpartnerTransactionId: Partner transaction IDpaymentIntentId: Payment provider reference (legacy)
6. Status Value Mismatch
- Most use:
'pending' | 'completed' | 'failed' | 'refunded' - Some use:
'cancelled'instead of'refunded'
Questions to Resolve
-
Donation target: Can donations be to cases OR guardians directly?
- Option A: Only to cases (simpler,
caseIdrequired) - Option B: Either to cases or guardians (
caseIdORguardianId) - Recommendation: Only to cases (guardian can be derived from case)
- Option A: Only to cases (simpler,
-
Field naming: Standardize on
userId/userName/userEmailordonorId/donorName/donorEmail?- Recommendation:
userId/userName/userEmail(consistent with user model)
- Recommendation:
-
Stellar integration: Are
originalAmountandconvertedAmountstill needed?- If yes: Keep them
- If no: Remove them
- Recommendation: Keep if Stellar is still used, otherwise remove
-
Payment fields: Which payment fields are actually used?
paymentProvidervspaymentMethod- which is correct?transactionIdvspaymentIntentId- which is used?- Recommendation: Need to check actual implementation
-
Status values: Include
'cancelled'or only'refunded'?- Recommendation: Use
'refunded'(cancelled = failed before completion)
- Recommendation: Use
-
Timestamps: Should we have
updatedAtandcompletedAt?- Recommendation: Yes to both -
updatedAtfor any change,completedAtfor completion
- Recommendation: Yes to both -
-
Anonymous donations: How are anonymous donations handled?
userIdshould be optional for anonymoususerName/userEmailshould be optional (not stored if anonymous)