roadmap/farmer_model_documentation.md

258 lines
8.9 KiB
Markdown

# Farmer Model Documentation
## Overview
The Farmer model adalah entitas inti dalam sistem Happy Farmer yang menyimpan informasi lengkap tentang petani yang tergabung dalam platform. Model ini dirancang untuk mendukung manajemen data petani yang komprehensif, mulai dari informasi pribadi hingga aktivitas pertanian.
## Business Context
Model Farmer berfungsi sebagai:
- **Central Profile**: Profil utama petani dalam ekosistem Happy Farmer
- **Data Hub**: Pusat data yang menghubungkan semua aktivitas pertanian
- **Verification System**: Sistem untuk memverifikasi identitas dan kredibilitas petani
- **Business Intelligence**: Sumber data untuk analisis bisnis dan decision making
## Model Structure
### Primary Fields
#### **Identification & Basic Info**
- **`id`** (String, Primary Key): Unique identifier menggunakan CUID
- **`userId`** (String, Foreign Key): Referensi ke tabel User untuk autentikasi
- **`farmerCode`** (String, Unique): Kode unik petani format YYMMDDHHMM + sequence number (16 digit)
- **`name`** (String): Nama lengkap petani
- **`phone`** (String, Optional): Nomor telepon utama
- **`email`** (String, Optional): Email address (bisa berbeda dengan User.email)
#### **Personal Information**
- **`birthPlace`** (String, Optional): Tempat kelahiran
- **`dateOfBirth`** (DateTime, Optional): Tanggal lahir
- **`gender`** (Gender Enum, Optional): Jenis kelamin (MALE/FEMALE/OTHER)
- **`maritalStatus`** (MaritalStatus Enum, Optional): Status pernikahan
- **`spouseName`** (String, Optional): Nama pasangan (jika menikah)
- **`familySize`** (Integer, Default: 0): Jumlah anggota keluarga
- **`religionId`** (String, Foreign Key): Referensi ke tabel Religion
- **`nationalityId`** (String, Default: "indonesia"): Kewarganegaraan
#### **Address & Location**
- **`address`** (String, Optional): Alamat lengkap
- **`village`** (String, Optional): Desa/kelurahan
- **`district`** (String, Optional): Kecamatan
- **`subDistrict`** (String, Optional): Kabupaten/kota
- **`province`** (String, Optional): Provinsi
- **`postalCode`** (String, Optional): Kode pos
- **`countryId`** (String, Default: "indonesia"): Negara
- **`latitude`** (Float, Optional): Koordinat lintang
- **`longitude`** (Float, Optional): Koordinat bujur
- **`addressGeoJson`** (JSON, Optional): Data lokasi dalam format GeoJSON
#### **Documentation & Attachments**
- **`profilePhotoUrl`** (String, Optional): URL foto profil
- **`idCardFrontUrl`** (String, Optional): URL foto KTP bagian depan
- **`idCardBackUrl`** (String, Optional): URL foto KTP bagian belakang
#### **Verification System**
- **`isVerified`** (Boolean, Default: false): Status verifikasi
- **`verificationDate`** (DateTime, Optional): Tanggal verifikasi
- **`verifiedBy`** (String, Optional): ID admin yang memverifikasi
- **`verificationNotes`** (String, Optional): Catatan verifikasi
#### **Agricultural Background**
- **`farmingExperience`** (Integer, Optional): Pengalaman bertani (tahun)
- **`farmingStartDate`** (DateTime, Optional): Tanggal mulai bertani
- **`educationLevelId`** (String, Foreign Key): Tingkat pendidikan
- **`occupation`** (String, Optional): Pekerjaan utama selain bertani
- **`monthlyIncome`** (Decimal, Optional): Estimasi pendapatan bulanan
- **`landOwnership`** (LandOwnership Enum, Optional): Status kepemilikan lahan
- **`primaryCrop`** (String, Optional): Komoditas utama
- **`farmingMethods`** (String Array): Metode bertani (organic, conventional, etc.)
- **`internetAccess`** (Boolean, Default: true): Akses internet
#### **Emergency Contact**
- **`emergencyContactName`** (String, Optional): Nama kontak darurat
- **`emergencyContactPhone`** (String, Optional): Nomor telepon kontak darurat
- **`emergencyContactRelation`** (String, Optional): Hubungan dengan kontak darurat
#### **Status & Metadata**
- **`status`** (FarmerStatus Enum, Default: ACTIVE): Status petani
- **`notes`** (String, Optional): Catatan tambahan
- **`joinedAt`** (DateTime, Default: now()): Tanggal bergabung
- **`createdAt`** (DateTime, Default: now()): Tanggal dibuat
- **`updatedAt`** (DateTime, Auto-update): Tanggal terakhir diupdate
- **`createdBy`** (String, Optional): ID user yang membuat record
- **`updatedBy`** (String, Optional): ID user yang terakhir mengupdate
## Enums Definition
### FarmerStatus
- **ACTIVE**: Petani aktif dan dapat bertransaksi
- **INACTIVE**: Petani tidak aktif sementara
- **SUSPENDED**: Petani disuspen karena pelanggaran
- **PENDING_VERIFICATION**: Menunggu verifikasi
- **BLACKLISTED**: Petani di-blacklist
### LandOwnership
- **OWNER**: Pemilik lahan
- **TENANT**: Penyewa lahan
- **SHARECROPPER**: Bagi hasil
- **COOPERATIVE_MEMBER**: Anggota koperasi
- **GOVERNMENT_LEASE**: Sewa dari pemerintah
- **FAMILY_LAND**: Lahan keluarga
- **OTHER**: Lainnya
## Relationships
### One-to-One Relationships
- **User**: Setiap farmer memiliki satu user account
- **Religion**: Referensi ke agama (optional)
- **Country**: Referensi ke negara (nationality dan country)
- **EducationLevel**: Referensi ke tingkat pendidikan
### One-to-Many Relationships
- **FarmerIdentity**: Dokumen identitas petani
- **FarmerBankAccount**: Rekening bank petani
- **FarmerVehicle**: Kendaraan yang dimiliki
- **Farm**: Lahan pertanian yang dikelola
- **FarmerTraining**: Pelatihan yang diikuti
- **FarmerCertification**: Sertifikasi yang dimiliki
- **Procurement**: Transaksi pembelian
- **Harvest**: Hasil panen
- **Contract**: Kontrak dengan buyer
- **Equipment**: Peralatan pertanian
- **Asset**: Aset yang dimiliki
- **FinancialRecord**: Catatan keuangan
- **LaborRecord**: Catatan tenaga kerja
- **Reviews**: Ulasan dari buyer
## Database Indexes
### Primary Indexes
- `farmerCode`: Pencarian berdasarkan kode petani
- `userId`: Relasi dengan user
- `status`: Filter berdasarkan status
- `joinedAt`: Sorting berdasarkan tanggal bergabung
### Geographic Indexes
- `latitude, longitude`: Pencarian berdasarkan lokasi geografis
## Business Rules
### Validation Rules
1. **Unique Constraints**:
- `farmerCode` harus unik dalam sistem
- `userId` harus unik (one-to-one dengan User)
2. **Required Fields**:
- `name`: Wajib diisi
- `userId`: Wajib diisi (foreign key)
3. **Optional but Important**:
- `phone`: Sangat disarankan untuk komunikasi
- `email`: Untuk notifikasi dan komunikasi
- Lokasi (latitude/longitude): Untuk mapping dan logistik
### Status Transitions
```
PENDING_VERIFICATION → ACTIVE (setelah verifikasi)
ACTIVE → INACTIVE (temporary suspension)
ACTIVE → SUSPENDED (violation)
ACTIVE → BLACKLISTED (serious violation)
SUSPENDED → ACTIVE (reinstatement)
```
## Use Cases
### 1. Farmer Registration
- Admin atau sistem membuat record Farmer baru
- Status awal: PENDING_VERIFICATION
- Upload dokumen identitas
- Verifikasi oleh admin
- Status berubah menjadi ACTIVE
### 2. Profile Management
- Update informasi pribadi
- Manage dokumen dan attachments
- Update informasi pertanian
- Maintain emergency contacts
### 3. Verification Process
- Upload dokumen identitas
- Admin review dan verifikasi
- Update status verifikasi
- Catat siapa yang memverifikasi dan kapan
### 4. Business Operations
- Tracking aktivitas pertanian
- Manajemen kontrak dan procurement
- Financial record keeping
- Performance analytics
## Integration Points
### External Systems
- **Payment Systems**: Integrasi dengan bank accounts
- **Mapping Services**: Menggunakan koordinat GPS
- **Communication**: SMS/Email notifications
- **Document Management**: File storage untuk attachments
### Internal Systems
- **User Management**: Autentikasi dan otorisasi
- **Farm Management**: Manajemen lahan dan produksi
- **Procurement**: Transaksi pembelian
- **Financial**: Tracking keuangan
- **Training**: Sistem pelatihan
- **Certification**: Manajemen sertifikasi
## Data Privacy & Security
### Sensitive Data
- Personal information (birth date, family size)
- Financial information (income, bank accounts)
- Identity documents (KTP photos)
- Contact information
### Security Measures
- Enkripsi untuk data sensitif
- Access control berdasarkan role
- Audit trail untuk perubahan data
- Regular backup dan disaster recovery
## Performance Considerations
### Query Optimization
- Index pada field yang sering digunakan untuk filter
- Pagination untuk list queries
- Caching untuk data yang sering diakses
### Data Archival
- Soft delete untuk maintain referential integrity
- Archive old records untuk performance
- Purge strategy untuk GDPR compliance
## Reporting & Analytics
### Key Metrics
- Farmer acquisition rate
- Verification completion rate
- Geographic distribution
- Activity levels
- Financial performance
### Reports
- Farmer demographics
- Geographic analysis
- Performance dashboards
- Compliance reports
## Future Enhancements
### Planned Features
- Multi-language support
- Advanced analytics
- AI-powered recommendations
- Integration with IoT devices
- Blockchain for traceability
### Scalability Considerations
- Database sharding by region
- Read replicas for reporting
- Microservices architecture
- Event-driven updates