diff --git a/base.md b/base.md new file mode 100644 index 0000000..be3cdcb --- /dev/null +++ b/base.md @@ -0,0 +1,70 @@ +# Company Overview + +We are an agricultural technology company that bridges the gap between farmers and markets through direct procurement, comprehensive training programs, and farmer development initiatives. Our mission is to enhance farmer knowledge, improve product quality, and create sustainable agricultural value chains. + +## Core Business Functions + +- **Direct Farmer Procurement**: We purchase agricultural products directly from farmers +- **Farmer Training & Development**: Comprehensive educational programs to enhance farming techniques and product quality +- **Certification Services**: Quality assurance and certification programs +- **Agricultural Consulting**: Supporting farmers in improving their practices and yields + +## Platform Features + +### Data Management + +- **Farmer Profiles**: Complete farmer information and relationship management +- **Training Records**: Track educational programs, certifications, and skill development +- **Farm Operations**: Harvest data, planting schedules, geolocation mapping, and farm boundary polygons +- **Knowledge Base**: Curated articles covering farming techniques, seasonal guidance, weather patterns, and crop-specific information + +### Commercial Operations + +- **Procurement Management**: Purchase order tracking and transaction history +- **Quality Grading System**: Multi-tier quality assessment (Grade A, B, C) +- **Dynamic Pricing**: Price calculation based on quality metrics including: + - Product grade classification + - Water content analysis + - Density measurements + - Market-based premium pricing +- **Analytics Dashboard**: Comprehensive reporting and insights + +## Pricing Model + +Our procurement system features flexible pricing with base rates and premium tiers. For pepper specifically, pricing is determined by: + +- **Quality Grade**: A, B, or C classification +- **Water Content**: Moisture level assessment +- **Density**: Product density measurements +- **Market Conditions**: Dynamic pricing based on supply and demand + +## Technical Architecture + +### Backend Infrastructure + +- **Framework**: NestJS +- **Database**: Prisma ORM +- **API Documentation**: Swagger/OpenAPI integration +- **Architecture**: RESTful API services + +### Frontend Applications + +- **Web Dashboard**: NextJS-based back-office management system +- **Mobile Application**: Flutter cross-platform app serving: + - Farmers (field operations and training) + - Buyers (procurement and quality assessment) + - Administrators (system management) + +## Current Focus & Future Expansion + +Currently specialized in pepper cultivation and procurement, with planned expansion to additional agricultural products. Our scalable platform architecture supports rapid deployment across different crop types and farming communities. + +## Value Proposition + +- **For Farmers**: Access to training, fair pricing, and direct market access +- **For Buyers**: Quality assurance, traceability, and reliable supply chain +- **For the Industry**: Improved agricultural standards and sustainable farming practices + +--- + +This comprehensive platform represents the future of agricultural supply chain management, combining technology with traditional farming expertise to create value for all stakeholders in the agricultural ecosystem. diff --git a/schema-documentation.md b/schema-documentation.md new file mode 100644 index 0000000..8e1035c --- /dev/null +++ b/schema-documentation.md @@ -0,0 +1,922 @@ +# Agricultural Platform Database Schema Documentation + +## Overview + +This comprehensive database schema is designed for a modern agricultural technology platform that connects farmers with markets through direct procurement, training programs, and development initiatives. The schema supports the complete agricultural value chain from farm management to market delivery. + +## Table of Contents + +1. [Core User Management](#core-user-management) +2. [Farm Management](#farm-management) +3. [Product & Variant System](#product--variant-system) +4. [Procurement & Trading](#procurement--trading) +5. [Weather & Climate Data](#weather--climate-data) +6. [Input Management](#input-management) +7. [Labor Management](#labor-management) +8. [Equipment & Asset Management](#equipment--asset-management) +9. [Pest & Disease Management](#pest--disease-management) +10. [Financial Management](#financial-management) +11. [Soil Analysis](#soil-analysis) +12. [Communication System](#communication-system) +13. [Market Intelligence](#market-intelligence) +14. [Training & Certification](#training--certification) +15. [Knowledge Base](#knowledge-base) +16. [Attachment Systems](#attachment-systems) + +--- + +## Core User Management + +### User +**Purpose**: Base user authentication and role management +**Key Features**: +- Role-based access control (Farmer, Buyer, Administrator) +- Email and phone-based authentication +- User status management + +**Fields**: +- `id`: Unique identifier +- `email`: User email (unique) +- `phone`: Contact number +- `name`: Full name +- `role`: User role (enum) +- `isActive`: Account status +- `createdAt`, `updatedAt`: Timestamps + +**Relations**: One-to-one with Farmer, Buyer, or Administrator + +### Farmer +**Purpose**: Comprehensive farmer profile management +**Key Features**: +- Detailed personal information including family details +- Geographic location tracking +- Identity verification system +- Banking information for payments +- Farming experience and education tracking +- Technology access assessment + +**Personal Information**: +- Basic details: name, email, phone, date of birth, gender +- Family: marital status, spouse name, number of children +- Demographics: religion, nationality, education level +- Location: complete address with GPS coordinates + +**Professional Information**: +- Farming experience (years) +- Primary occupation and monthly income +- Land ownership type +- Primary crops and farming methods +- Vehicle and technology access + +**Verification System**: +- Identity document management +- Admin verification workflow +- Photo attachments (profile, ID cards) +- Verification notes and status + +**Relations**: Connected to farms, training, certifications, procurements, equipment, and financial records + +### Buyer +**Purpose**: Enhanced buyer profile for procurement management +**Key Features**: +- Business classification and verification +- Payment terms and credit management +- Quality requirements and preferences +- Logistics and delivery preferences + +**Business Details**: +- Company information and size classification +- Business license and tax registration +- Annual volume and employee count +- Operating radius and warehouse locations + +**Trading Preferences**: +- Preferred products and quality requirements +- Payment terms and credit limits +- Pickup schedules and delivery preferences +- Minimum/maximum order quantities + +**Verification & Status**: +- Business document verification +- Admin approval workflow +- Status management (active, suspended, etc.) + +**Relations**: Connected to procurements and reviews + +### Administrator +**Purpose**: Platform administration and oversight +**Fields**: Basic profile information for system administrators +**Relations**: Connected to User model + +--- + +## Farm Management + +### Farm +**Purpose**: Comprehensive farm property management +**Key Features**: +- Detailed location and boundary mapping +- Agricultural characteristics assessment +- Infrastructure and facility tracking +- Legal ownership documentation +- Financial investment tracking + +**Location & Geography**: +- Complete address with GPS coordinates +- Farm boundaries (GeoJSON polygon) +- Elevation and slope information +- Climate classification + +**Agricultural Characteristics**: +- Soil type and pH levels +- Water source and irrigation systems +- Farm size and established year +- Organic certification status + +**Infrastructure Assessment**: +- Utilities: electricity, water access +- Facilities: storage, processing units +- Road access classification +- Equipment and vehicle access + +**Documentation**: +- Photo management (main, aerial, soil) +- Land certificates and legal documents +- Investment and production tracking + +**Relations**: Connected to plots, harvests, weather data, inputs, labor, equipment, and financial records + +### Plot +**Purpose**: Individual field/plot management within farms +**Key Features**: +- Crop-specific plot management +- Boundary mapping for precision farming +- Product variant tracking +- Planting and harvest scheduling + +**Geographic Data**: +- Plot boundaries (GeoJSON polygon) +- Area measurement in hectares +- GPS coordinate tracking + +**Agricultural Data**: +- Product and variant assignments +- Planting dates and crop cycles +- Growth stage monitoring + +**Relations**: Connected to harvests, weather data, inputs, labor, equipment usage, and soil tests + +--- + +## Product & Variant System + +### Product +**Purpose**: Base product category management (e.g., Pepper) +**Key Features**: +- Product categorization and classification +- Unit standardization +- Modifier configuration + +**Fields**: +- `name`: Product name (e.g., "Pepper") +- `code`: Unique product code +- `category`: Product classification +- `unit`: Standard measurement unit (kg, ton) +- `description`: Product details + +**Relations**: Connected to variants, modifiers, plots, and market data + +### ProductVariant +**Purpose**: Specific product variations (e.g., Black Pepper, White Pepper) +**Key Features**: +- Variant-specific pricing +- Quality differentiation +- Market positioning + +**Fields**: +- `name`: Variant name (e.g., "Black Pepper") +- `code`: Unique variant code +- `basePrice`: Default pricing +- `description`: Variant specifications + +**Relations**: Connected to harvests, procurements, and market pricing + +### ProductModifier +**Purpose**: Dynamic pricing modifiers based on quality metrics +**Key Features**: +- Configurable quality parameters +- Rule-based price adjustments +- Input validation (dropdown/input) +- Unit specification + +**Configuration Options**: +- Selection type: dropdown or manual input +- Value constraints: minimum/maximum +- Nominal vs. percentage adjustments +- Required vs. optional parameters + +**Examples**: +- Water Content: affects pricing based on moisture levels +- Density: quality metric for physical properties +- Purity: percentage-based quality assessment + +**Relations**: Connected to modifier rules and harvest applications + +### ProductModifierRule +**Purpose**: Automated pricing rules based on modifier values +**Key Features**: +- Condition-based pricing (equals, less than, greater than, between) +- Automatic price adjustments +- Business rule enforcement + +**Rule Types**: +- Equals: exact value matching +- Less than: threshold-based reductions +- Greater than: premium pricing +- Between: range-based adjustments + +### HarvestModifier +**Purpose**: Actual modifier values applied to specific harvests +**Key Features**: +- Real-world quality measurements +- Calculated price adjustments +- Traceability and audit trail + +--- + +## Procurement & Trading + +### Procurement +**Purpose**: Complete procurement transaction management +**Key Features**: +- End-to-end transaction tracking +- Quality assessment workflow +- Logistics and delivery management +- Financial settlement processing + +**Transaction Details**: +- Procurement codes and references +- Quantity and quality specifications +- Pricing calculations with modifiers +- Cost breakdowns (transport, processing) + +**Quality Management**: +- Assessment by qualified personnel +- Rejection handling and reasons +- Quality grade verification +- Photo documentation + +**Logistics Coordination**: +- Pickup and delivery scheduling +- Location management +- Transport method tracking +- Route optimization support + +**Financial Processing**: +- Payment method selection +- Reference number tracking +- Multi-stage payment approval +- Invoice and receipt management + +**Status Workflow**: +- Pending → Quality Assessment → Approved → In Transit → Delivered → Invoiced → Paid → Completed + +**Relations**: Connected to farmers, buyers, harvests, variants, and attachments + +### ProcurementAttachment +**Purpose**: Visual documentation throughout procurement process +**Key Features**: +- Photo documentation at each stage +- GPS-tagged evidence +- Document verification +- Quality control support + +**Attachment Types**: +- Product photos and quality assessment +- Weighing and packaging documentation +- Loading and delivery proof +- Contract and payment documents +- Signature verification + +--- + +## Weather & Climate Data + +### WeatherData +**Purpose**: Real-time weather monitoring and historical data +**Key Features**: +- Comprehensive weather metrics +- Farm and plot-specific data +- Multiple data sources +- Historical trend analysis + +**Metrics Tracked**: +- Temperature and humidity +- Rainfall and wind conditions +- Atmospheric pressure and UV index +- Visibility and weather conditions + +**Data Sources**: +- Manual farmer input +- Weather station integration +- Third-party API services +- IoT sensor networks + +**Relations**: Connected to farms and plots for location-specific data + +### WeatherForecast +**Purpose**: Weather prediction and planning support +**Key Features**: +- Multi-day forecasting +- Confidence levels +- Planning assistance +- Risk assessment support + +**Forecast Data**: +- Temperature ranges (min/max) +- Precipitation probability +- Wind and weather conditions +- Forecast accuracy tracking + +--- + +## Input Management + +### FarmInput +**Purpose**: Agricultural input tracking and cost management +**Key Features**: +- Complete input lifecycle management +- Cost tracking and supplier management +- Application rate and method documentation +- Batch tracking and expiry management + +**Input Categories**: +- Seeds and planting materials +- Fertilizers (organic and synthetic) +- Pesticides, herbicides, fungicides +- Equipment rental and fuel +- Irrigation water and other inputs + +**Supplier Management**: +- Supplier contact and terms +- Batch numbers and expiry dates +- Invoice and receipt tracking +- Quality certifications + +**Application Tracking**: +- Application dates and methods +- Application rates per hectare +- Active ingredient concentrations +- Effectiveness monitoring + +**Relations**: Connected to farms, plots, and suppliers + +### InputSchedule +**Purpose**: Planned input applications and scheduling +**Key Features**: +- Application planning and timing +- Resource allocation +- Schedule optimization +- Actual vs. planned tracking + +**Schedule Management**: +- Planned application dates +- Estimated quantities and costs +- Assignment to personnel +- Schedule status tracking + +### Supplier +**Purpose**: Input supplier management and relationships +**Key Features**: +- Supplier classification and contact management +- Payment and delivery terms +- Quality certification tracking +- Performance evaluation + +**Supplier Types**: +- Specialized suppliers (seeds, fertilizers, equipment) +- General suppliers and cooperatives +- Government agencies + +--- + +## Labor Management + +### FarmWorker +**Purpose**: Comprehensive worker profile and contract management +**Key Features**: +- Worker classification and skill assessment +- Contract and payment management +- Emergency contact information +- Performance tracking + +**Worker Classification**: +- Role types: permanent, seasonal, daily, contractor +- Skill levels: beginner to expert +- Specialization areas +- Contract terms and duration + +**Payment Management**: +- Daily and monthly wage structures +- Payment method preferences +- Bank account information +- Performance-based incentives + +**Relations**: Connected to farmers, labor records, and schedules + +### LaborRecord +**Purpose**: Detailed work activity and payment tracking +**Key Features**: +- Time tracking and productivity measurement +- Work quality assessment +- Weather impact documentation +- Approval and payment workflow + +**Work Documentation**: +- Start/end times and hours worked +- Work type and plot assignment +- Supervisor and quality ratings +- Weather conditions during work + +**Payment Processing**: +- Wage calculations and approvals +- Payment status tracking +- Performance bonuses +- Overtime and special rates + +### LaborSchedule +**Purpose**: Work planning and resource allocation +**Key Features**: +- Work scheduling and assignment +- Resource planning and optimization +- Schedule vs. actual comparison +- Productivity analysis + +--- + +## Equipment & Asset Management + +### Equipment +**Purpose**: Farm equipment lifecycle management +**Key Features**: +- Complete equipment inventory +- Maintenance scheduling and tracking +- Usage monitoring and efficiency +- Asset valuation and depreciation + +**Equipment Details**: +- Technical specifications (brand, model, serial) +- Purchase information and current value +- Fuel type, capacity, and power ratings +- Warranty and insurance tracking + +**Maintenance Management**: +- Scheduled maintenance intervals +- Service history and costs +- Parts replacement tracking +- Performance monitoring + +**Relations**: Connected to maintenance records and usage tracking + +### MaintenanceRecord +**Purpose**: Equipment service history and cost tracking +**Key Features**: +- Service type classification +- Cost tracking and budgeting +- Service provider management +- Next service scheduling + +**Maintenance Types**: +- Preventive, corrective, emergency +- Overhauls and inspections +- Calibration services + +### EquipmentUsage +**Purpose**: Equipment utilization and efficiency tracking +**Key Features**: +- Operating hours and fuel consumption +- Work type and productivity measurement +- Operator tracking and performance +- Cost per hour calculations + +### Asset +**Purpose**: Farm asset inventory and valuation +**Key Features**: +- Asset categorization and valuation +- Depreciation tracking +- Insurance and warranty management +- Condition assessment + +**Asset Categories**: +- Buildings and infrastructure +- Land improvements +- Vehicles and machinery +- Technology and equipment + +--- + +## Pest & Disease Management + +### PestDiseaseRecord +**Purpose**: Comprehensive pest and disease tracking +**Key Features**: +- Identification and classification +- Severity assessment and impact measurement +- Treatment tracking and effectiveness +- Prevention strategy documentation + +**Identification Data**: +- Common and scientific names +- Pest/disease type classification +- Affected area and severity levels +- Symptom documentation + +**Treatment Management**: +- Treatment methods and costs +- Application dates and personnel +- Effectiveness monitoring +- Recurrence tracking + +**Photo Documentation**: +- Identification photos +- Treatment application +- Recovery progress +- Prevention measures + +--- + +## Financial Management + +### FinancialRecord +**Purpose**: Complete farm financial tracking and management +**Key Features**: +- Multi-currency transaction support +- Transaction categorization and approval +- Tax calculation and compliance +- Audit trail and documentation + +**Transaction Types**: +- Income: sales, grants, subsidies +- Expenses: inputs, labor, equipment +- Investments: infrastructure, equipment +- Loans and repayments + +**Financial Controls**: +- Approval workflow for large transactions +- Tax calculation and tracking +- Reference number management +- Supporting document attachment + +**Reporting Support**: +- Profit and loss calculations +- Cash flow analysis +- Budget vs. actual comparison +- Tax preparation assistance + +--- + +## Soil Analysis + +### SoilTest +**Purpose**: Comprehensive soil health monitoring and management +**Key Features**: +- Complete nutrient analysis +- Soil physical property assessment +- GPS-tagged sample locations +- Laboratory integration + +**Basic Properties**: +- pH levels and organic matter +- Soil texture and bulk density +- Porosity and water retention + +**Nutrient Analysis**: +- Primary nutrients (N, P, K) +- Secondary nutrients (Ca, Mg, S) +- Micronutrients (Zn, Fe, Mn, Cu, B) + +**Advanced Testing**: +- Cation exchange capacity +- Base saturation levels +- Carbon-nitrogen ratios +- Electrical conductivity + +**Recommendations**: +- Fertilizer recommendations +- Soil amendment suggestions +- pH adjustment requirements +- Organic matter improvement + +--- + +## Communication System + +### Message +**Purpose**: Platform-wide communication and notification system +**Key Features**: +- Multi-type messaging support +- Priority-based delivery +- Attachment support +- Delivery status tracking + +**Message Types**: +- Personal messages between users +- Broadcast announcements +- System notifications and alerts +- Emergency communications + +**Delivery Management**: +- Priority levels (low to critical) +- Read receipt tracking +- Delivery status monitoring +- Failed delivery handling + +--- + +## Market Intelligence + +### MarketPrice +**Purpose**: Real-time market pricing and trend analysis +**Key Features**: +- Multi-market price tracking +- Quality-based pricing +- Trend analysis and forecasting +- Price verification system + +**Price Data**: +- Market-specific pricing +- Quality grade differentiation +- Trading volume information +- Price trend indicators + +**Verification System**: +- Admin price verification +- Source credibility tracking +- Accuracy monitoring + +### MarketDemand +**Purpose**: Market demand forecasting and analysis +**Key Features**: +- Demand level assessment +- Volume estimation +- Seasonal trend analysis +- Price range forecasting + +**Demand Analysis**: +- Current demand levels +- Volume estimates and trends +- Influencing factors +- Forecast accuracy tracking + +--- + +## Training & Certification + +### Training +**Purpose**: Farmer education and skill development +**Key Features**: +- Course content management +- Difficulty level classification +- Duration tracking +- Category organization + +**Course Management**: +- Structured learning content +- Beginner to advanced levels +- Time-based progression +- Category-based organization + +### FarmerTraining +**Purpose**: Individual training progress and achievement tracking +**Key Features**: +- Enrollment and progress tracking +- Score and completion management +- Certificate generation +- Learning analytics + +**Progress Tracking**: +- Enrollment status and progress percentage +- Score tracking and assessments +- Completion certificates +- Learning path optimization + +### Certification +**Purpose**: Professional certification and credential management +**Key Features**: +- Certification program management +- Validity period tracking +- Requirements documentation +- Industry recognition + +### FarmerCertification +**Purpose**: Individual certification status and management +**Key Features**: +- Certification status tracking +- Issue and expiry date management +- Certificate number assignment +- Renewal notifications + +--- + +## Knowledge Base + +### Article +**Purpose**: Agricultural knowledge and information management +**Key Features**: +- Content categorization and tagging +- Publication workflow +- View tracking and analytics +- Search optimization + +**Content Management**: +- Title, content, and excerpt +- Category and tag organization +- Author attribution +- Publication status (draft, published, archived) + +**Analytics**: +- View count tracking +- Popular content identification +- User engagement metrics + +--- + +## Attachment Systems + +### FarmerAttachment +**Purpose**: Farmer document and photo management +**Key Features**: +- Document type classification +- Verification workflow +- File metadata tracking +- Secure storage + +**Attachment Types**: +- Profile photos and ID cards +- Licenses and certificates +- Bank statements and contracts +- Other supporting documents + +### FarmAttachment +**Purpose**: Farm visual documentation and records +**Key Features**: +- Location-tagged photos +- Document verification +- Photo metadata tracking +- GPS coordinate storage + +**Photo Types**: +- Main farm photos and aerial views +- Infrastructure and equipment +- Soil and crop conditions +- Legal documents and surveys + +### ProcurementAttachment +**Purpose**: Procurement process documentation +**Key Features**: +- Process stage documentation +- Quality control photos +- Contract and payment proof +- GPS-tagged evidence + +**Documentation Stages**: +- Product quality and weighing +- Packaging and loading +- Delivery and payment +- Contract and signatures + +--- + +## Enums and Data Types + +### Key Enumerations + +**User Management**: +- `UserRole`: FARMER, BUYER, ADMINISTRATOR +- `Gender`: MALE, FEMALE, OTHER +- `MaritalStatus`: SINGLE, MARRIED, DIVORCED, WIDOWED, SEPARATED +- `IdentityType`: KTP, PASSPORT, DRIVING_LICENSE, OTHER +- `EducationLevel`: NO_FORMAL_EDUCATION to DOCTORATE +- `FarmerStatus`: ACTIVE, INACTIVE, SUSPENDED, PENDING_VERIFICATION, BLACKLISTED + +**Agricultural Operations**: +- `QualityGrade`: A, B, C +- `InputType`: SEED, FERTILIZER, PESTICIDE, HERBICIDE, FUNGICIDE, etc. +- `WorkType`: PLANTING, WEEDING, FERTILIZING, HARVESTING, etc. +- `PestDiseaseType`: PEST, DISEASE, WEED, NUTRIENT_DEFICIENCY, etc. +- `SeverityLevel`: LOW, MEDIUM, HIGH, CRITICAL, CATASTROPHIC + +**Business Operations**: +- `ProcurementStatus`: PENDING to COMPLETED (11 stages) +- `PaymentMethod`: CASH, BANK_TRANSFER, MOBILE_MONEY, etc. +- `BuyerType`: INDIVIDUAL, WHOLESALER, RETAILER, PROCESSOR, etc. +- `TransactionType`: INCOME, EXPENSE, INVESTMENT, LOAN, etc. + +**Equipment and Assets**: +- `EquipmentType`: TRACTOR, HARVESTER, IRRIGATION_SYSTEM, etc. +- `EquipmentCondition`: EXCELLENT, GOOD, FAIR, POOR, etc. +- `MaintenanceType`: PREVENTIVE, CORRECTIVE, EMERGENCY, etc. + +--- + +## Database Relationships + +### Key Relationship Patterns + +**User Hierarchy**: +- User → Farmer/Buyer/Administrator (one-to-one) +- Farmer → Farms (one-to-many) +- Farm → Plots (one-to-many) + +**Agricultural Operations**: +- Plot → Harvests (one-to-many) +- Harvest → Procurement (one-to-one) +- Product → Variants → Harvests (hierarchical) + +**Support Systems**: +- Farm/Plot → Weather Data (location-based) +- Farm/Plot → Input Applications (activity-based) +- Farm/Plot → Labor Records (work-based) + +**Documentation**: +- All major entities → Attachments (comprehensive documentation) +- Financial Records → Multiple entities (cost allocation) + +--- + +## Performance Considerations + +### Indexing Strategy + +**Primary Indexes**: +- All foreign keys for join optimization +- Unique codes for fast lookups +- Date fields for temporal queries +- Geographic coordinates for spatial queries + +**Composite Indexes**: +- Farm + Plot for agricultural operations +- Date + Location for weather data +- Product + Variant for market analysis + +### Data Partitioning + +**Time-based Partitioning**: +- Weather data by month/year +- Financial records by fiscal year +- Market prices by quarter + +**Geographic Partitioning**: +- Regional data separation +- Location-based optimization + +--- + +## Security and Privacy + +### Data Protection + +**Personal Information**: +- Encrypted storage for sensitive data +- Access control for personal details +- Audit logging for data access + +**Financial Data**: +- Secure payment information storage +- Transaction audit trails +- Compliance with financial regulations + +**Business Intelligence**: +- Anonymized market data +- Aggregated reporting +- Privacy-preserving analytics + +--- + +## Integration Points + +### External Systems + +**Weather Services**: +- Weather API integration +- IoT sensor connectivity +- Satellite data integration + +**Financial Services**: +- Payment gateway integration +- Banking API connectivity +- Mobile money platforms + +**Market Data**: +- Price feed integrations +- Commodity exchange connectivity +- Supply chain platforms + +**Government Systems**: +- Agricultural statistics +- Subsidy management +- Certification authorities + +--- + +This comprehensive schema provides the foundation for a complete agricultural technology platform that supports farmers from production planning through market delivery, with integrated training, certification, and financial management capabilities. \ No newline at end of file diff --git a/schema.prisma b/schema.prisma new file mode 100644 index 0000000..44339a4 --- /dev/null +++ b/schema.prisma @@ -0,0 +1,1765 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model User { + id String @id @default(cuid()) + email String @unique + phone String? + name String + role UserRole + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer? + buyer Buyer? + administrator Administrator? + + @@map("users") +} + +model Farmer { + id String @id @default(cuid()) + userId String @unique + farmerCode String @unique + name String + phone String? + email String? + dateOfBirth DateTime? + gender Gender? + maritalStatus MaritalStatus? + spouseName String? + numberOfChildren Int? @default(0) + religion Religion? + nationality String? @default("Indonesian") + address String? + village String? + district String? + province String? + postalCode String? + country String? @default("Indonesia") + + // Location data + latitude Float? + longitude Float? + addressGeoJson Json? // GeoJSON point for precise location + + // Identity information + identityType IdentityType? + identityNumber String? + identityExpiry DateTime? + + // Banking information + bankAccount String? + bankName String? + accountHolderName String? + + // Photos and attachments + profilePhotoUrl String? + idCardFrontUrl String? + idCardBackUrl String? + + // Verification status + isVerified Boolean @default(false) + verificationDate DateTime? + verifiedBy String? // admin ID who verified + verificationNotes String? + + // Farming experience + farmingExperience Int? // years of experience + educationLevel EducationLevel? + occupation String? // primary occupation if not full-time farmer + monthlyIncome Float? // estimated monthly income + landOwnership LandOwnership? + primaryCrop String? + farmingMethods String[] // organic, conventional, etc. + hasVehicle Boolean? // for transportation + vehicleType String? // motorcycle, car, truck, etc. + hasSmartphone Boolean? @default(true) + internetAccess Boolean? @default(true) + + // Emergency contact + emergencyContactName String? + emergencyContactPhone String? + emergencyContactRelation String? + + // Status and metadata + status FarmerStatus @default(ACTIVE) + notes String? + joinedAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + farms Farm[] + trainings FarmerTraining[] + certifications FarmerCertification[] + procurements Procurement[] + harvests Harvest[] + attachments FarmerAttachment[] + workers FarmWorker[] + laborRecords LaborRecord[] + laborSchedules LaborSchedule[] + equipment Equipment[] + assets Asset[] + financialRecords FinancialRecord[] + reviews BuyerReview[] + + @@map("farmers") +} + +model Buyer { + id String @id @default(cuid()) + userId String @unique + buyerCode String @unique + name String + company String? + phone String? + email String? + address String? + + // Enhanced buyer details + buyerType BuyerType? + businessLicense String? + taxNumber String? + contactPerson String? + contactPersonPhone String? + paymentTerms Int? // days + creditLimit Float? + preferredProducts String[] + qualityRequirements String? + + // Location and logistics + warehouseAddress String? + deliveryPreference String? + operatingRadius Float? // km + + // Business details + businessSize BusinessSize? + yearEstablished Int? + annualVolume Float? // estimated annual purchase volume + employeeCount Int? + website String? + + // Financial information + bankAccount String? + bankName String? + accountHolderName String? + + // Verification and status + isVerified Boolean @default(false) + verificationDate DateTime? + verifiedBy String? // admin ID who verified + verificationNotes String? + status BuyerStatus @default(ACTIVE) + + // Photos and documents + profilePhotoUrl String? + businessLicenseUrl String? + taxCertificateUrl String? + + // Preferences + preferredPickupDays String[] // Mon, Tue, Wed, etc. + preferredPickupTime String? + minimumOrderQuantity Float? + maximumOrderQuantity Float? + + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + procurements Procurement[] + reviews BuyerReview[] + + @@map("buyers") +} + +model Administrator { + id String @id @default(cuid()) + userId String @unique + adminCode String @unique + name String + phone String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + @@map("administrators") +} + +model Farm { + id String @id @default(cuid()) + farmerId String + farmCode String @unique + name String + address String? + village String? + district String? + province String? + postalCode String? + area Float? // in hectares + + // Location data + latitude Float? + longitude Float? + boundaries Json? // GeoJSON polygon for farm boundaries + elevation Float? // meters above sea level + + // Farm characteristics + soilType String? + soilPH Float? + waterSource WaterSource? + irrigationType IrrigationType? + slope SlopeType? + climate ClimateType? + + // Infrastructure + hasElectricity Boolean? @default(false) + hasWaterAccess Boolean? @default(false) + hasStorageFacility Boolean? @default(false) + hasProcessingUnit Boolean? @default(false) + accessRoadType RoadType? + + // Photos and documentation + mainPhotoUrl String? + aerialPhotoUrl String? + soilPhotoUrl String? + + // Ownership and legal + ownershipType FarmOwnership? + landCertificateNumber String? + landCertificateUrl String? + + // Agricultural details + establishedYear Int? + totalInvestment Float? + annualProduction Float? // estimated kg per year + mainCrops String[] // primary crops grown + farmingSystem FarmingSystem? + organicCertified Boolean? @default(false) + + description String? + notes String? + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id], onDelete: Cascade) + plots Plot[] + harvests Harvest[] + attachments FarmAttachment[] + weatherData WeatherData[] + weatherForecasts WeatherForecast[] + inputs FarmInput[] + inputSchedules InputSchedule[] + laborRecords LaborRecord[] + laborSchedules LaborSchedule[] + equipmentUsage EquipmentUsage[] + pestDiseaseRecords PestDiseaseRecord[] + financialRecords FinancialRecord[] + soilTests SoilTest[] + + @@map("farms") +} + +model Plot { + id String @id @default(cuid()) + farmId String + name String + area Float? // in hectares + productId String? + variantId String? + plantedDate DateTime? + boundaries Json? // GeoJSON polygon for plot boundaries + description String? + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id], onDelete: Cascade) + product Product? @relation(fields: [productId], references: [id]) + variant ProductVariant? @relation(fields: [variantId], references: [id]) + harvests Harvest[] + weatherData WeatherData[] + weatherForecasts WeatherForecast[] + inputs FarmInput[] + inputSchedules InputSchedule[] + laborRecords LaborRecord[] + laborSchedules LaborSchedule[] + equipmentUsage EquipmentUsage[] + pestDiseaseRecords PestDiseaseRecord[] + financialRecords FinancialRecord[] + soilTests SoilTest[] + + @@map("plots") +} + +model Harvest { + id String @id @default(cuid()) + farmerId String + farmId String + plotId String? + variantId String + quantity Float // in kg + harvestDate DateTime + qualityGrade QualityGrade + waterContent Float? // percentage + density Float? // kg/m3 + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + farm Farm @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + variant ProductVariant @relation(fields: [variantId], references: [id]) + procurement Procurement? + modifiers HarvestModifier[] + + @@map("harvests") +} + +model Procurement { + id String @id @default(cuid()) + procurementCode String @unique + farmerId String + buyerId String? + harvestId String @unique + variantId String + + // Quantity and quality details + quantity Float // in kg + qualityGrade QualityGrade + waterContent Float? // percentage + density Float? // kg/m3 + + // Pricing details + basePrice Float // price per kg + premiumRate Float @default(0) // percentage + totalPrice Float + transportCost Float? @default(0) + processingCost Float? @default(0) + finalAmount Float // total amount to be paid + + // Location and logistics + pickupLocation String? + deliveryLocation String? + pickupDate DateTime? + deliveryDate DateTime? + transportMethod String? // truck, motorcycle, etc. + + // Quality assessment + assessedBy String? // quality assessor ID + assessmentDate DateTime? + assessmentNotes String? + rejectedQuantity Float? @default(0) + rejectionReason String? + + // Payment details + paymentMethod PaymentMethod? + paymentReference String? + bankAccount String? + + // Status and tracking + status ProcurementStatus @default(PENDING) + procurementDate DateTime @default(now()) + approvedDate DateTime? + approvedBy String? // admin ID who approved + paymentDate DateTime? + completedDate DateTime? + + // Documentation + contractNumber String? + invoiceNumber String? + receiptNumber String? + + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + buyer Buyer? @relation(fields: [buyerId], references: [id]) + harvest Harvest @relation(fields: [harvestId], references: [id]) + variant ProductVariant @relation(fields: [variantId], references: [id]) + attachments ProcurementAttachment[] + + @@map("procurements") +} + +model HarvestModifier { + id String @id @default(cuid()) + harvestId String + modifierId String + value String // actual value applied + adjustment Float? // calculated price adjustment + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + harvest Harvest @relation(fields: [harvestId], references: [id], onDelete: Cascade) + modifier ProductModifier @relation(fields: [modifierId], references: [id]) + + @@unique([harvestId, modifierId]) + @@map("harvest_modifiers") +} + +model FarmerAttachment { + id String @id @default(cuid()) + farmerId String + type AttachmentType + title String + description String? + fileUrl String + fileName String + fileSize Int? // in bytes + mimeType String? + uploadedBy String? // user ID who uploaded + isVerified Boolean @default(false) + verifiedBy String? // admin ID who verified + verifiedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id], onDelete: Cascade) + + @@map("farmer_attachments") +} + +model FarmAttachment { + id String @id @default(cuid()) + farmId String + type FarmAttachmentType + title String + description String? + fileUrl String + fileName String + fileSize Int? // in bytes + mimeType String? + uploadedBy String? // user ID who uploaded + takenDate DateTime? // when photo was taken + gpsLocation Json? // GeoJSON point where photo was taken + isVerified Boolean @default(false) + verifiedBy String? // admin ID who verified + verifiedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id], onDelete: Cascade) + + @@map("farm_attachments") +} + +model ProcurementAttachment { + id String @id @default(cuid()) + procurementId String + type ProcurementAttachmentType + title String + description String? + fileUrl String + fileName String + fileSize Int? // in bytes + mimeType String? + uploadedBy String? // user ID who uploaded + takenDate DateTime? // when photo was taken + gpsLocation Json? // GeoJSON point where photo was taken + isVerified Boolean @default(false) + verifiedBy String? // admin ID who verified + verifiedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + procurement Procurement @relation(fields: [procurementId], references: [id], onDelete: Cascade) + + @@map("procurement_attachments") +} + +model Training { + id String @id @default(cuid()) + title String + description String? + content String? + category String + duration Int? // in minutes + level String? // beginner, intermediate, advanced + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmerTrainings FarmerTraining[] + + @@map("trainings") +} + +model FarmerTraining { + id String @id @default(cuid()) + farmerId String + trainingId String + status TrainingStatus @default(ENROLLED) + progress Int @default(0) // percentage + score Float? + completedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id], onDelete: Cascade) + training Training @relation(fields: [trainingId], references: [id], onDelete: Cascade) + + @@unique([farmerId, trainingId]) + @@map("farmer_trainings") +} + +model Certification { + id String @id @default(cuid()) + name String + description String? + validityPeriod Int? // in months + requirements String? + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmerCertifications FarmerCertification[] + + @@map("certifications") +} + +model FarmerCertification { + id String @id @default(cuid()) + farmerId String + certificationId String + status CertificationStatus @default(PENDING) + issuedDate DateTime? + expiryDate DateTime? + certificateNumber String? + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id], onDelete: Cascade) + certification Certification @relation(fields: [certificationId], references: [id], onDelete: Cascade) + + @@unique([farmerId, certificationId]) + @@map("farmer_certifications") +} + +model Article { + id String @id @default(cuid()) + title String + content String + excerpt String? + category String + tags String[] + author String? + status ArticleStatus @default(DRAFT) + views Int @default(0) + publishedAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("articles") +} + +model Product { + id String @id @default(cuid()) + name String // e.g., "Pepper" + code String @unique + description String? + category String + unit String @default("kg") // kg, ton, etc + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + plots Plot[] + variants ProductVariant[] + modifiers ProductModifier[] + priceHistory PriceHistory[] + marketPrices MarketPrice[] + marketDemand MarketDemand[] + + @@map("products") +} + +model ProductVariant { + id String @id @default(cuid()) + productId String + name String // e.g., "Black Pepper", "White Pepper" + code String @unique + description String? + basePrice Float? // default base price + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + product Product @relation(fields: [productId], references: [id], onDelete: Cascade) + plots Plot[] + harvests Harvest[] + procurements Procurement[] + priceHistory PriceHistory[] + marketPrices MarketPrice[] + marketDemand MarketDemand[] + + @@map("product_variants") +} + +model ProductModifier { + id String @id @default(cuid()) + productId String + name String // e.g., "Water Content", "Density" + code String + description String? + selectionType ModifierSelectionType @default(INPUT) + nominalType NominalType @default(NOMINAL) + options String[] // For dropdown selections + minimum Float? + maximum Float? + unit String? // %, kg/m3, etc + isRequired Boolean @default(false) + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + product Product @relation(fields: [productId], references: [id], onDelete: Cascade) + rules ProductModifierRule[] + harvestModifiers HarvestModifier[] + + @@unique([productId, code]) + @@map("product_modifiers") +} + +model ProductModifierRule { + id String @id @default(cuid()) + modifierId String + condition RuleCondition + priceAdjustment Float // amount to adjust price + value String? // For equals condition + minValue Float? // For lessThan or between conditions + maxValue Float? // For greaterThan or between conditions + description String? + isActive Boolean @default(true) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + modifier ProductModifier @relation(fields: [modifierId], references: [id], onDelete: Cascade) + + @@map("product_modifier_rules") +} + +model PriceHistory { + id String @id @default(cuid()) + productId String? + variantId String? + qualityGrade QualityGrade + basePrice Float + marketPrice Float? + premiumRate Float @default(0) + effectiveDate DateTime + region String? + notes String? + createdAt DateTime @default(now()) + + // Relations + product Product? @relation(fields: [productId], references: [id]) + variant ProductVariant? @relation(fields: [variantId], references: [id]) + + @@map("price_history") +} + +model WeatherData { + id String @id @default(cuid()) + farmId String? + plotId String? + latitude Float + longitude Float + date DateTime + temperature Float? // celsius + humidity Float? // percentage + rainfall Float? // mm + windSpeed Float? // km/h + windDirection String? // N, NE, E, SE, S, SW, W, NW + pressure Float? // hPa + uvIndex Float? + visibility Float? // km + weatherCondition String? // sunny, cloudy, rainy, etc. + dataSource String? // manual, weather_station, api + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm? @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("weather_data") +} + +model WeatherForecast { + id String @id @default(cuid()) + farmId String? + plotId String? + latitude Float + longitude Float + forecastDate DateTime + minTemperature Float? + maxTemperature Float? + humidity Float? + rainfall Float? + windSpeed Float? + weatherCondition String? + confidence Float? // percentage + source String + createdAt DateTime @default(now()) + + // Relations + farm Farm? @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("weather_forecasts") +} + +model FarmInput { + id String @id @default(cuid()) + farmId String + plotId String? + inputType InputType + productName String + brand String? + quantity Float + unit String + cost Float + supplier String? + supplierContact String? + batchNumber String? + expiryDate DateTime? + applicationDate DateTime? + applicationMethod String? + applicationRate String? // per hectare or per plant + activeIngredient String? // for pesticides/fertilizers + concentration Float? // percentage + notes String? + invoiceNumber String? + receiptUrl String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("farm_inputs") +} + +model InputSchedule { + id String @id @default(cuid()) + farmId String + plotId String? + inputType InputType + productName String + scheduledDate DateTime + quantity Float + unit String + method String? + status ScheduleStatus @default(PENDING) + appliedDate DateTime? + appliedBy String? + actualQuantity Float? + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("input_schedules") +} + +model Supplier { + id String @id @default(cuid()) + name String + contactPerson String? + phone String? + email String? + address String? + supplierType SupplierType + paymentTerms String? + deliveryTerms String? + qualityCertifications String[] + isActive Boolean @default(true) + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("suppliers") +} + +model FarmWorker { + id String @id @default(cuid()) + farmerId String + workerCode String @unique + name String + phone String? + email String? + address String? + identityNumber String? + role WorkerRole + skillLevel SkillLevel? + dailyWage Float? + monthlyWage Float? + paymentMethod PaymentMethod? + bankAccount String? + emergencyContact String? + emergencyPhone String? + hireDate DateTime? + contractType ContractType? + contractEnd DateTime? + isActive Boolean @default(true) + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + laborRecords LaborRecord[] + laborSchedules LaborSchedule[] + + @@map("farm_workers") +} + +model LaborRecord { + id String @id @default(cuid()) + farmerId String + farmId String + workerId String? + plotId String? + workType WorkType + hoursWorked Float + wages Float + workDate DateTime + startTime DateTime? + endTime DateTime? + description String? + supervisor String? // supervisor name or ID + qualityRating Float? // 1-5 rating + weather String? + notes String? + approved Boolean @default(false) + approvedBy String? + approvedDate DateTime? + paymentStatus PaymentStatus @default(PENDING) + paidDate DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + farm Farm @relation(fields: [farmId], references: [id]) + worker FarmWorker? @relation(fields: [workerId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("labor_records") +} + +model LaborSchedule { + id String @id @default(cuid()) + farmerId String + farmId String + workerId String? + plotId String? + workType WorkType + scheduledDate DateTime + estimatedHours Float + estimatedWage Float? + status ScheduleStatus @default(PENDING) + assignedBy String? + notes String? + actualRecord String? // reference to LaborRecord ID + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + farm Farm @relation(fields: [farmId], references: [id]) + worker FarmWorker? @relation(fields: [workerId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("labor_schedules") +} + +model Equipment { + id String @id @default(cuid()) + farmerId String + equipmentCode String @unique + name String + type EquipmentType + brand String? + model String? + serialNumber String? + purchaseDate DateTime? + purchasePrice Float? + currentValue Float? + condition EquipmentCondition + status EquipmentStatus @default(ACTIVE) + location String? // where equipment is stored + fuelType String? // diesel, petrol, electric, manual + capacity String? // engine capacity, load capacity + powerRating String? // horsepower, wattage + yearManufactured Int? + warranty String? + insurancePolicy String? + insuranceExpiry DateTime? + lastMaintenance DateTime? + nextMaintenance DateTime? + maintenanceCost Float? + operatingHours Float? // total operating hours + isActive Boolean @default(true) + notes String? + photoUrl String? + manualUrl String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + maintenanceRecords MaintenanceRecord[] + usageRecords EquipmentUsage[] + + @@map("equipment") +} + +model MaintenanceRecord { + id String @id @default(cuid()) + equipmentId String + maintenanceType MaintenanceType + description String + cost Float + serviceProvider String? + serviceDate DateTime + nextServiceDue DateTime? + partsReplaced String[] + laborHours Float? + invoiceNumber String? + receiptUrl String? + performedBy String? + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + equipment Equipment @relation(fields: [equipmentId], references: [id]) + + @@map("maintenance_records") +} + +model EquipmentUsage { + id String @id @default(cuid()) + equipmentId String + farmId String? + plotId String? + operatorName String? + usageDate DateTime + startTime DateTime? + endTime DateTime? + hoursUsed Float + fuelConsumed Float? + workType WorkType? + description String? + meterReading Float? // odometer, hour meter reading + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + equipment Equipment @relation(fields: [equipmentId], references: [id]) + farm Farm? @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("equipment_usage") +} + +model Asset { + id String @id @default(cuid()) + farmerId String + assetCode String @unique + name String + type AssetType + category String? // building, land improvement, infrastructure + description String? + purchaseDate DateTime? + purchasePrice Float? + currentValue Float? + depreciation Float? // annual depreciation rate + condition AssetCondition + location String? + size String? // dimensions, area + material String? // construction material + lifespan Int? // expected lifespan in years + warrantyExpiry DateTime? + insurancePolicy String? + insuranceExpiry DateTime? + photoUrls String[] + documentUrls String[] + isActive Boolean @default(true) + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + + @@map("assets") +} + +model BuyerReview { + id String @id @default(cuid()) + buyerId String + farmerId String + rating Float // 1-5 rating + comment String? + reviewType ReviewType + procurementId String? // reference to procurement if applicable + isAnonymous Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + buyer Buyer @relation(fields: [buyerId], references: [id]) + farmer Farmer @relation(fields: [farmerId], references: [id]) + + @@map("buyer_reviews") +} + +model PestDiseaseRecord { + id String @id @default(cuid()) + farmId String + plotId String? + type PestDiseaseType + name String + scientificName String? + severity SeverityLevel + affectedArea Float? // percentage or hectares + identifiedDate DateTime + identifiedBy String? // farmer, expert, etc. + symptoms String? + treatmentApplied String? + treatmentDate DateTime? + treatmentCost Float? + treatmentMethod String? + preventionTaken String? + resolved Boolean @default(false) + resolvedDate DateTime? + recurrence Boolean @default(false) + photos String[] // photo URLs + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("pest_disease_records") +} + +model FinancialRecord { + id String @id @default(cuid()) + farmerId String + farmId String? + plotId String? + type TransactionType + category String + subcategory String? + amount Float + currency String @default("IDR") + description String + transactionDate DateTime + paymentMethod PaymentMethod? + receiptNumber String? + invoiceNumber String? + referenceNumber String? + taxAmount Float? @default(0) + bankAccount String? + payee String? // who received payment + approvedBy String? // admin who approved + status TransactionStatus @default(PENDING) + notes String? + attachmentUrls String[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farmer Farmer @relation(fields: [farmerId], references: [id]) + farm Farm? @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("financial_records") +} + +model SoilTest { + id String @id @default(cuid()) + farmId String + plotId String? + testCode String @unique + testDate DateTime + sampleDepth Float? // cm + sampleLocation String? + gpsCoordinates Json? // GeoJSON point + + // Basic soil properties + pH Float? + organicMatter Float? // percentage + soilTexture String? // clay, sand, loam, etc. + bulkDensity Float? // g/cm³ + porosity Float? // percentage + + // Nutrients (ppm) + nitrogen Float? + phosphorus Float? + potassium Float? + calcium Float? + magnesium Float? + sulfur Float? + + // Micronutrients (ppm) + zinc Float? + iron Float? + manganese Float? + copper Float? + boron Float? + + // Other properties + conductivity Float? // dS/m + cationExchangeCapacity Float? // cmol/kg + baseStaturation Float? // percentage + carbonNitrogenRatio Float? + + // Analysis details + recommendations String? + testLaboratory String? + technicianName String? + testCost Float? + reportUrl String? + + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + // Relations + farm Farm @relation(fields: [farmId], references: [id]) + plot Plot? @relation(fields: [plotId], references: [id]) + + @@map("soil_tests") +} + +model Message { + id String @id @default(cuid()) + senderId String + receiverId String? + groupId String? + subject String? + content String + messageType MessageType + priority Priority @default(NORMAL) + isRead Boolean @default(false) + readAt DateTime? + attachments String[] // file URLs + deliveryStatus MessageStatus @default(SENT) + sentAt DateTime @default(now()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@map("messages") +} + +model MarketPrice { + id String @id @default(cuid()) + productId String + variantId String? + market String + region String + price Float + unit String @default("kg") + qualityGrade QualityGrade + priceDate DateTime + source String? // where price data came from + volume Float? // trading volume + trend PriceTrend? + verified Boolean @default(false) + verifiedBy String? + notes String? + createdAt DateTime @default(now()) + + // Relations + product Product @relation(fields: [productId], references: [id]) + variant ProductVariant? @relation(fields: [variantId], references: [id]) + + @@map("market_prices") +} + +model MarketDemand { + id String @id @default(cuid()) + productId String + variantId String? + region String + demandLevel DemandLevel + estimatedVolume Float? + priceRange String? + season String? + factors String[] // factors affecting demand + forecastDate DateTime + forecastBy String? + accuracy Float? // percentage + notes String? + createdAt DateTime @default(now()) + + // Relations + product Product @relation(fields: [productId], references: [id]) + variant ProductVariant? @relation(fields: [variantId], references: [id]) + + @@map("market_demand") +} + +// Enums +enum UserRole { + FARMER + BUYER + ADMINISTRATOR +} + +enum QualityGrade { + A + B + C +} + +enum ProcurementStatus { + PENDING + QUALITY_ASSESSMENT + APPROVED + REJECTED + IN_TRANSIT + DELIVERED + INVOICED + PAID + COMPLETED + CANCELLED + PARTIALLY_REJECTED +} + +enum TrainingStatus { + ENROLLED + IN_PROGRESS + COMPLETED + DROPPED +} + +enum CertificationStatus { + PENDING + APPROVED + REJECTED + EXPIRED +} + +enum ArticleStatus { + DRAFT + PUBLISHED + ARCHIVED +} + +enum ModifierSelectionType { + DROPDOWN + INPUT +} + +enum NominalType { + NOMINAL + PERCENTAGE +} + +enum RuleCondition { + EQUALS + LESS_THAN + GREATER_THAN + BETWEEN +} + +enum Gender { + MALE + FEMALE + OTHER +} + +enum IdentityType { + KTP // Indonesian ID Card + PASSPORT + DRIVING_LICENSE + OTHER +} + +enum EducationLevel { + NO_FORMAL_EDUCATION + ELEMENTARY + MIDDLE_SCHOOL + HIGH_SCHOOL + DIPLOMA + BACHELOR + MASTER + DOCTORATE +} + +enum FarmerStatus { + ACTIVE + INACTIVE + SUSPENDED + PENDING_VERIFICATION + BLACKLISTED +} + +enum AttachmentType { + PROFILE_PHOTO + ID_CARD_FRONT + ID_CARD_BACK + FARMING_LICENSE + LAND_CERTIFICATE + BANK_STATEMENT + CONTRACT + CERTIFICATE + OTHER_DOCUMENT +} + +enum MaritalStatus { + SINGLE + MARRIED + DIVORCED + WIDOWED + SEPARATED +} + +enum Religion { + ISLAM + CHRISTIAN + CATHOLIC + HINDU + BUDDHIST + CONFUCIAN + OTHER +} + +enum LandOwnership { + OWNER + TENANT + SHARECROPPER + COOPERATIVE_MEMBER + GOVERNMENT_LEASE + FAMILY_LAND + OTHER +} + +enum WaterSource { + RAIN_FED + IRRIGATION_CANAL + WELL + RIVER + POND + GROUNDWATER + SPRING + MIXED +} + +enum IrrigationType { + FLOOD + SPRINKLER + DRIP + FURROW + MANUAL + NONE +} + +enum SlopeType { + FLAT + GENTLE + MODERATE + STEEP + VERY_STEEP +} + +enum ClimateType { + TROPICAL_WET + TROPICAL_DRY + SUBTROPICAL + TEMPERATE + HIGHLAND +} + +enum RoadType { + PAVED + GRAVEL + DIRT + FOOTPATH + NO_ACCESS +} + +enum FarmOwnership { + PRIVATE_OWNED + LEASED + SHARECROPPED + COOPERATIVE + GOVERNMENT + COMMUNAL + FAMILY_INHERITED +} + +enum FarmingSystem { + MONOCULTURE + POLYCULTURE + MIXED_FARMING + ORGANIC + CONVENTIONAL + INTEGRATED + PERMACULTURE + AGROFORESTRY +} + +enum FarmAttachmentType { + MAIN_PHOTO + AERIAL_PHOTO + SOIL_PHOTO + CROP_PHOTO + INFRASTRUCTURE_PHOTO + LAND_CERTIFICATE + SURVEY_MAP + WATER_SOURCE_PHOTO + ENTRANCE_PHOTO + BOUNDARY_PHOTO + EQUIPMENT_PHOTO + STORAGE_PHOTO + OTHER_DOCUMENT +} + +enum PaymentMethod { + CASH + BANK_TRANSFER + MOBILE_MONEY + CHECK + DIGITAL_WALLET + CREDIT + BARTER + INSTALLMENT +} + +enum ProcurementAttachmentType { + PRODUCT_PHOTO + QUALITY_ASSESSMENT_PHOTO + WEIGHING_PHOTO + PACKAGING_PHOTO + LOADING_PHOTO + DELIVERY_PHOTO + CONTRACT_DOCUMENT + INVOICE + RECEIPT + PAYMENT_PROOF + QUALITY_CERTIFICATE + TRANSPORT_DOCUMENT + REJECTION_PHOTO + SIGNATURE_DOCUMENT + OTHER_DOCUMENT +} + +// Input Management Enums +enum InputType { + SEED + FERTILIZER + PESTICIDE + HERBICIDE + FUNGICIDE + INSECTICIDE + EQUIPMENT_RENTAL + FUEL + IRRIGATION_WATER + MULCH + COMPOST + LIME + OTHER +} + +enum ScheduleStatus { + PENDING + SCHEDULED + IN_PROGRESS + COMPLETED + CANCELLED + OVERDUE +} + +enum SupplierType { + SEED_SUPPLIER + FERTILIZER_SUPPLIER + PESTICIDE_SUPPLIER + EQUIPMENT_SUPPLIER + GENERAL_SUPPLIER + COOPERATIVE + GOVERNMENT_AGENCY +} + +// Labor Management Enums +enum WorkerRole { + PERMANENT + SEASONAL + DAILY + CONTRACTOR + SUPERVISOR + FOREMAN + SPECIALIST +} + +enum SkillLevel { + BEGINNER + INTERMEDIATE + ADVANCED + EXPERT +} + +enum ContractType { + PERMANENT + TEMPORARY + SEASONAL + PROJECT_BASED + DAILY +} + +enum WorkType { + PLANTING + WEEDING + FERTILIZING + HARVESTING + IRRIGATION + PEST_CONTROL + SOIL_PREPARATION + PRUNING + GENERAL_MAINTENANCE + EQUIPMENT_OPERATION + PROCESSING + PACKAGING + TRANSPORT +} + +enum PaymentStatus { + PENDING + APPROVED + PAID + OVERDUE + CANCELLED +} + +// Equipment & Asset Enums +enum EquipmentType { + TRACTOR + HARVESTER + PLANTER + CULTIVATOR + IRRIGATION_SYSTEM + SPRAYER + THRESHER + MOWER + TOOLS + VEHICLE + PROCESSING_EQUIPMENT + STORAGE_EQUIPMENT +} + +enum EquipmentCondition { + EXCELLENT + GOOD + FAIR + POOR + NEEDS_REPAIR + OUT_OF_ORDER +} + +enum EquipmentStatus { + ACTIVE + INACTIVE + MAINTENANCE + REPAIR + RETIRED +} + +enum MaintenanceType { + PREVENTIVE + CORRECTIVE + EMERGENCY + OVERHAUL + INSPECTION + CALIBRATION +} + +enum AssetType { + BUILDING + LAND_IMPROVEMENT + INFRASTRUCTURE + VEHICLE + MACHINERY + FURNITURE + TECHNOLOGY + OTHER +} + +enum AssetCondition { + NEW + EXCELLENT + GOOD + FAIR + POOR + DAMAGED +} + +// Buyer Enums +enum BuyerType { + INDIVIDUAL + WHOLESALER + RETAILER + PROCESSOR + EXPORTER + COOPERATIVE + GOVERNMENT + RESTAURANT + HOTEL +} + +enum BusinessSize { + MICRO + SMALL + MEDIUM + LARGE + ENTERPRISE +} + +enum BuyerStatus { + ACTIVE + INACTIVE + SUSPENDED + PENDING_VERIFICATION + BLACKLISTED +} + +enum ReviewType { + PAYMENT_TIMELINESS + QUALITY_REQUIREMENTS + COMMUNICATION + OVERALL_EXPERIENCE + PRICE_FAIRNESS +} + +// Pest & Disease Enums +enum PestDiseaseType { + PEST + DISEASE + WEED + NUTRIENT_DEFICIENCY + VIRUS + FUNGUS + BACTERIA +} + +enum SeverityLevel { + LOW + MEDIUM + HIGH + CRITICAL + CATASTROPHIC +} + +// Financial Enums +enum TransactionType { + INCOME + EXPENSE + INVESTMENT + LOAN + LOAN_PAYMENT + INSURANCE_PAYMENT + TAX_PAYMENT + GRANT + SUBSIDY + REFUND +} + +enum TransactionStatus { + PENDING + APPROVED + COMPLETED + REJECTED + CANCELLED + FAILED +} + +// Communication Enums +enum MessageType { + PERSONAL + BROADCAST + NOTIFICATION + ALERT + SYSTEM + ANNOUNCEMENT +} + +enum Priority { + LOW + NORMAL + HIGH + URGENT + CRITICAL +} + +enum MessageStatus { + SENT + DELIVERED + READ + FAILED + PENDING +} + +// Market Intelligence Enums +enum PriceTrend { + RISING + FALLING + STABLE + VOLATILE +} + +enum DemandLevel { + VERY_LOW + LOW + MODERATE + HIGH + VERY_HIGH + EXCESSIVE +}