Initial commit: breakpilot-compliance - Compliance SDK Platform
Services: Admin-Compliance, Backend-Compliance, AI-Compliance-SDK, Consent-SDK, Developer-Portal, PCA-Platform, DSMS Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
394
ai-compliance-sdk/internal/funding/models.go
Normal file
394
ai-compliance-sdk/internal/funding/models.go
Normal file
@@ -0,0 +1,394 @@
|
||||
package funding
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// Constants / Enums
|
||||
// ============================================================================
|
||||
|
||||
// FundingProgram represents the type of funding program
|
||||
type FundingProgram string
|
||||
|
||||
const (
|
||||
FundingProgramDigitalPakt1 FundingProgram = "DIGITALPAKT_1"
|
||||
FundingProgramDigitalPakt2 FundingProgram = "DIGITALPAKT_2"
|
||||
FundingProgramLandesfoerderung FundingProgram = "LANDESFOERDERUNG"
|
||||
FundingProgramSchultraeger FundingProgram = "SCHULTRAEGER"
|
||||
FundingProgramSonstige FundingProgram = "SONSTIGE"
|
||||
)
|
||||
|
||||
// ApplicationStatus represents the workflow status
|
||||
type ApplicationStatus string
|
||||
|
||||
const (
|
||||
ApplicationStatusDraft ApplicationStatus = "DRAFT"
|
||||
ApplicationStatusInProgress ApplicationStatus = "IN_PROGRESS"
|
||||
ApplicationStatusReview ApplicationStatus = "REVIEW"
|
||||
ApplicationStatusSubmitted ApplicationStatus = "SUBMITTED"
|
||||
ApplicationStatusApproved ApplicationStatus = "APPROVED"
|
||||
ApplicationStatusRejected ApplicationStatus = "REJECTED"
|
||||
ApplicationStatusArchived ApplicationStatus = "ARCHIVED"
|
||||
)
|
||||
|
||||
// FederalState represents German federal states
|
||||
type FederalState string
|
||||
|
||||
const (
|
||||
FederalStateNI FederalState = "NI" // Niedersachsen
|
||||
FederalStateNRW FederalState = "NRW" // Nordrhein-Westfalen
|
||||
FederalStateBAY FederalState = "BAY" // Bayern
|
||||
FederalStateBW FederalState = "BW" // Baden-Wuerttemberg
|
||||
FederalStateHE FederalState = "HE" // Hessen
|
||||
FederalStateSN FederalState = "SN" // Sachsen
|
||||
FederalStateTH FederalState = "TH" // Thueringen
|
||||
FederalStateSA FederalState = "SA" // Sachsen-Anhalt
|
||||
FederalStateBB FederalState = "BB" // Brandenburg
|
||||
FederalStateMV FederalState = "MV" // Mecklenburg-Vorpommern
|
||||
FederalStateSH FederalState = "SH" // Schleswig-Holstein
|
||||
FederalStateHH FederalState = "HH" // Hamburg
|
||||
FederalStateHB FederalState = "HB" // Bremen
|
||||
FederalStateBE FederalState = "BE" // Berlin
|
||||
FederalStateSL FederalState = "SL" // Saarland
|
||||
FederalStateRP FederalState = "RP" // Rheinland-Pfalz
|
||||
)
|
||||
|
||||
// SchoolType represents different school types
|
||||
type SchoolType string
|
||||
|
||||
const (
|
||||
SchoolTypeGrundschule SchoolType = "GRUNDSCHULE"
|
||||
SchoolTypeHauptschule SchoolType = "HAUPTSCHULE"
|
||||
SchoolTypeRealschule SchoolType = "REALSCHULE"
|
||||
SchoolTypeGymnasium SchoolType = "GYMNASIUM"
|
||||
SchoolTypeGesamtschule SchoolType = "GESAMTSCHULE"
|
||||
SchoolTypeOberschule SchoolType = "OBERSCHULE"
|
||||
SchoolTypeFoerderschule SchoolType = "FOERDERSCHULE"
|
||||
SchoolTypeBerufsschule SchoolType = "BERUFSSCHULE"
|
||||
SchoolTypeBerufskolleg SchoolType = "BERUFSKOLLEG"
|
||||
SchoolTypeFachoberschule SchoolType = "FACHOBERSCHULE"
|
||||
SchoolTypeBerufliches SchoolType = "BERUFLICHES_GYMNASIUM"
|
||||
SchoolTypeSonstige SchoolType = "SONSTIGE"
|
||||
)
|
||||
|
||||
// CarrierType represents the school carrier type
|
||||
type CarrierType string
|
||||
|
||||
const (
|
||||
CarrierTypePublic CarrierType = "PUBLIC" // Oeffentlich
|
||||
CarrierTypePrivate CarrierType = "PRIVATE" // Privat
|
||||
CarrierTypeChurch CarrierType = "CHURCH" // Kirchlich
|
||||
CarrierTypeNonProfit CarrierType = "NON_PROFIT" // Gemeinnuetzig
|
||||
)
|
||||
|
||||
// BudgetCategory represents categories for budget items
|
||||
type BudgetCategory string
|
||||
|
||||
const (
|
||||
BudgetCategoryNetwork BudgetCategory = "NETWORK" // Netzwerk/Verkabelung
|
||||
BudgetCategoryWLAN BudgetCategory = "WLAN" // WLAN-Infrastruktur
|
||||
BudgetCategoryDevices BudgetCategory = "DEVICES" // Endgeraete
|
||||
BudgetCategoryPresentation BudgetCategory = "PRESENTATION" // Praesentationstechnik
|
||||
BudgetCategorySoftware BudgetCategory = "SOFTWARE" // Software-Lizenzen
|
||||
BudgetCategoryServer BudgetCategory = "SERVER" // Server/Rechenzentrum
|
||||
BudgetCategoryServices BudgetCategory = "SERVICES" // Dienstleistungen
|
||||
BudgetCategoryTraining BudgetCategory = "TRAINING" // Schulungen
|
||||
BudgetCategorySonstige BudgetCategory = "SONSTIGE" // Sonstige
|
||||
)
|
||||
|
||||
// ============================================================================
|
||||
// Main Entities
|
||||
// ============================================================================
|
||||
|
||||
// FundingApplication represents a funding application
|
||||
type FundingApplication struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
TenantID uuid.UUID `json:"tenant_id"`
|
||||
ApplicationNumber string `json:"application_number"` // e.g., DP2-NI-2026-00123
|
||||
Title string `json:"title"`
|
||||
FundingProgram FundingProgram `json:"funding_program"`
|
||||
Status ApplicationStatus `json:"status"`
|
||||
|
||||
// Wizard State
|
||||
CurrentStep int `json:"current_step"`
|
||||
TotalSteps int `json:"total_steps"`
|
||||
WizardData map[string]interface{} `json:"wizard_data,omitempty"`
|
||||
|
||||
// School Information
|
||||
SchoolProfile *SchoolProfile `json:"school_profile,omitempty"`
|
||||
|
||||
// Project Information
|
||||
ProjectPlan *ProjectPlan `json:"project_plan,omitempty"`
|
||||
Budget *Budget `json:"budget,omitempty"`
|
||||
Timeline *ProjectTimeline `json:"timeline,omitempty"`
|
||||
|
||||
// Financial Summary
|
||||
RequestedAmount float64 `json:"requested_amount"`
|
||||
OwnContribution float64 `json:"own_contribution"`
|
||||
ApprovedAmount *float64 `json:"approved_amount,omitempty"`
|
||||
|
||||
// Attachments
|
||||
Attachments []Attachment `json:"attachments,omitempty"`
|
||||
|
||||
// Audit Trail
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
SubmittedAt *time.Time `json:"submitted_at,omitempty"`
|
||||
CreatedBy uuid.UUID `json:"created_by"`
|
||||
UpdatedBy uuid.UUID `json:"updated_by"`
|
||||
}
|
||||
|
||||
// SchoolProfile contains school information
|
||||
type SchoolProfile struct {
|
||||
Name string `json:"name"`
|
||||
SchoolNumber string `json:"school_number"` // Official school number
|
||||
Type SchoolType `json:"type"`
|
||||
FederalState FederalState `json:"federal_state"`
|
||||
Address Address `json:"address"`
|
||||
ContactPerson ContactPerson `json:"contact_person"`
|
||||
StudentCount int `json:"student_count"`
|
||||
TeacherCount int `json:"teacher_count"`
|
||||
ClassCount int `json:"class_count"`
|
||||
CarrierType CarrierType `json:"carrier_type"`
|
||||
CarrierName string `json:"carrier_name"`
|
||||
CarrierAddress *Address `json:"carrier_address,omitempty"`
|
||||
Infrastructure *InfrastructureStatus `json:"infrastructure,omitempty"`
|
||||
}
|
||||
|
||||
// Address represents a postal address
|
||||
type Address struct {
|
||||
Street string `json:"street"`
|
||||
HouseNo string `json:"house_no"`
|
||||
PostalCode string `json:"postal_code"`
|
||||
City string `json:"city"`
|
||||
Country string `json:"country,omitempty"`
|
||||
}
|
||||
|
||||
// ContactPerson represents a contact person
|
||||
type ContactPerson struct {
|
||||
Salutation string `json:"salutation,omitempty"` // Herr/Frau
|
||||
Title string `json:"title,omitempty"` // Dr., Prof.
|
||||
FirstName string `json:"first_name"`
|
||||
LastName string `json:"last_name"`
|
||||
Position string `json:"position,omitempty"` // Schulleitung, IT-Beauftragter
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone,omitempty"`
|
||||
}
|
||||
|
||||
// InfrastructureStatus describes current IT infrastructure
|
||||
type InfrastructureStatus struct {
|
||||
HasWLAN bool `json:"has_wlan"`
|
||||
WLANCoverage int `json:"wlan_coverage"` // Percentage 0-100
|
||||
HasStructuredCabling bool `json:"has_structured_cabling"`
|
||||
InternetBandwidth string `json:"internet_bandwidth"` // e.g., "100 Mbit/s"
|
||||
DeviceCount int `json:"device_count"` // Current devices
|
||||
HasServerRoom bool `json:"has_server_room"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
}
|
||||
|
||||
// ProjectPlan describes the project
|
||||
type ProjectPlan struct {
|
||||
ProjectName string `json:"project_name"`
|
||||
Summary string `json:"summary"` // Kurzbeschreibung
|
||||
Goals string `json:"goals"` // Projektziele
|
||||
DidacticConcept string `json:"didactic_concept"` // Paedagogisches Konzept
|
||||
MEPReference string `json:"mep_reference,omitempty"` // Medienentwicklungsplan Bezug
|
||||
DataProtection string `json:"data_protection"` // Datenschutzkonzept
|
||||
MaintenancePlan string `json:"maintenance_plan"` // Wartungs-/Betriebskonzept
|
||||
TargetGroups []string `json:"target_groups"` // e.g., ["Schueler", "Lehrer"]
|
||||
SubjectsAffected []string `json:"subjects_affected,omitempty"` // Betroffene Faecher
|
||||
}
|
||||
|
||||
// Budget represents the financial plan
|
||||
type Budget struct {
|
||||
TotalCost float64 `json:"total_cost"`
|
||||
RequestedFunding float64 `json:"requested_funding"`
|
||||
OwnContribution float64 `json:"own_contribution"`
|
||||
OtherFunding float64 `json:"other_funding"`
|
||||
FundingRate float64 `json:"funding_rate"` // 0.90 = 90%
|
||||
BudgetItems []BudgetItem `json:"budget_items"`
|
||||
IsWithinLimits bool `json:"is_within_limits"`
|
||||
Justification string `json:"justification,omitempty"` // Begruendung
|
||||
}
|
||||
|
||||
// BudgetItem represents a single budget line item
|
||||
type BudgetItem struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Position int `json:"position"` // Order number
|
||||
Category BudgetCategory `json:"category"`
|
||||
Description string `json:"description"`
|
||||
Manufacturer string `json:"manufacturer,omitempty"`
|
||||
ProductName string `json:"product_name,omitempty"`
|
||||
Quantity int `json:"quantity"`
|
||||
UnitPrice float64 `json:"unit_price"`
|
||||
TotalPrice float64 `json:"total_price"`
|
||||
IsFundable bool `json:"is_fundable"` // Foerderfahig Ja/Nein
|
||||
FundingSource string `json:"funding_source"` // digitalpakt, eigenanteil, sonstige
|
||||
Notes string `json:"notes,omitempty"`
|
||||
}
|
||||
|
||||
// ProjectTimeline represents project schedule
|
||||
type ProjectTimeline struct {
|
||||
PlannedStart time.Time `json:"planned_start"`
|
||||
PlannedEnd time.Time `json:"planned_end"`
|
||||
Milestones []Milestone `json:"milestones,omitempty"`
|
||||
ProjectPhase string `json:"project_phase,omitempty"` // Current phase
|
||||
}
|
||||
|
||||
// Milestone represents a project milestone
|
||||
type Milestone struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description,omitempty"`
|
||||
DueDate time.Time `json:"due_date"`
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
||||
Status string `json:"status"` // planned, in_progress, completed
|
||||
}
|
||||
|
||||
// Attachment represents an uploaded file
|
||||
type Attachment struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
FileName string `json:"file_name"`
|
||||
FileType string `json:"file_type"` // pdf, docx, xlsx, jpg, png
|
||||
FileSize int64 `json:"file_size"` // bytes
|
||||
Category string `json:"category"` // angebot, mep, nachweis, sonstiges
|
||||
Description string `json:"description,omitempty"`
|
||||
StoragePath string `json:"-"` // Internal path, not exposed
|
||||
UploadedAt time.Time `json:"uploaded_at"`
|
||||
UploadedBy uuid.UUID `json:"uploaded_by"`
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Wizard Step Data
|
||||
// ============================================================================
|
||||
|
||||
// WizardStep represents a single wizard step
|
||||
type WizardStep struct {
|
||||
Number int `json:"number"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
Fields []string `json:"fields"` // Field IDs for this step
|
||||
IsCompleted bool `json:"is_completed"`
|
||||
IsRequired bool `json:"is_required"`
|
||||
HelpContext string `json:"help_context"` // Context for LLM assistant
|
||||
}
|
||||
|
||||
// WizardProgress tracks wizard completion
|
||||
type WizardProgress struct {
|
||||
CurrentStep int `json:"current_step"`
|
||||
TotalSteps int `json:"total_steps"`
|
||||
CompletedSteps []int `json:"completed_steps"`
|
||||
StepValidation map[int][]string `json:"step_validation,omitempty"` // Errors per step
|
||||
FormData map[string]interface{} `json:"form_data"`
|
||||
LastSavedAt time.Time `json:"last_saved_at"`
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// BreakPilot Presets
|
||||
// ============================================================================
|
||||
|
||||
// ProductPreset represents a BreakPilot product preset
|
||||
type ProductPreset struct {
|
||||
ID string `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
BudgetItems []BudgetItem `json:"budget_items"`
|
||||
AutoFill map[string]interface{} `json:"auto_fill"`
|
||||
DataProtection string `json:"data_protection"`
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Export Structures
|
||||
// ============================================================================
|
||||
|
||||
// ExportDocument represents a generated document
|
||||
type ExportDocument struct {
|
||||
Type string `json:"type"` // antragsschreiben, kostenplan, datenschutz
|
||||
Format string `json:"format"` // pdf, docx, xlsx
|
||||
FileName string `json:"file_name"`
|
||||
GeneratedAt time.Time `json:"generated_at"`
|
||||
ContentHash string `json:"content_hash"`
|
||||
StoragePath string `json:"-"`
|
||||
}
|
||||
|
||||
// ExportBundle represents a ZIP bundle of all documents
|
||||
type ExportBundle struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
ApplicationID uuid.UUID `json:"application_id"`
|
||||
Documents []ExportDocument `json:"documents"`
|
||||
GeneratedAt time.Time `json:"generated_at"`
|
||||
DownloadURL string `json:"download_url"`
|
||||
ExpiresAt time.Time `json:"expires_at"`
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// LLM Assistant
|
||||
// ============================================================================
|
||||
|
||||
// AssistantMessage represents a chat message with the assistant
|
||||
type AssistantMessage struct {
|
||||
Role string `json:"role"` // user, assistant, system
|
||||
Content string `json:"content"`
|
||||
Step int `json:"step,omitempty"` // Current wizard step
|
||||
}
|
||||
|
||||
// AssistantRequest for asking questions
|
||||
type AssistantRequest struct {
|
||||
ApplicationID uuid.UUID `json:"application_id"`
|
||||
Question string `json:"question"`
|
||||
CurrentStep int `json:"current_step"`
|
||||
Context map[string]interface{} `json:"context,omitempty"`
|
||||
History []AssistantMessage `json:"history,omitempty"`
|
||||
}
|
||||
|
||||
// AssistantResponse from the assistant
|
||||
type AssistantResponse struct {
|
||||
Answer string `json:"answer"`
|
||||
Suggestions []string `json:"suggestions,omitempty"`
|
||||
References []string `json:"references,omitempty"` // Links to help resources
|
||||
FormFills map[string]interface{} `json:"form_fills,omitempty"` // Suggested form values
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// API Request/Response Types
|
||||
// ============================================================================
|
||||
|
||||
// CreateApplicationRequest for creating a new application
|
||||
type CreateApplicationRequest struct {
|
||||
Title string `json:"title"`
|
||||
FundingProgram FundingProgram `json:"funding_program"`
|
||||
FederalState FederalState `json:"federal_state"`
|
||||
PresetID string `json:"preset_id,omitempty"` // Optional BreakPilot preset
|
||||
}
|
||||
|
||||
// UpdateApplicationRequest for updating an application
|
||||
type UpdateApplicationRequest struct {
|
||||
Title *string `json:"title,omitempty"`
|
||||
WizardData map[string]interface{} `json:"wizard_data,omitempty"`
|
||||
CurrentStep *int `json:"current_step,omitempty"`
|
||||
}
|
||||
|
||||
// SaveWizardStepRequest for saving a wizard step
|
||||
type SaveWizardStepRequest struct {
|
||||
Step int `json:"step"`
|
||||
Data map[string]interface{} `json:"data"`
|
||||
Complete bool `json:"complete"` // Mark step as complete
|
||||
}
|
||||
|
||||
// ApplicationListResponse for list endpoints
|
||||
type ApplicationListResponse struct {
|
||||
Applications []FundingApplication `json:"applications"`
|
||||
Total int `json:"total"`
|
||||
Page int `json:"page"`
|
||||
PageSize int `json:"page_size"`
|
||||
}
|
||||
|
||||
// ExportRequest for export endpoints
|
||||
type ExportRequest struct {
|
||||
Format string `json:"format"` // zip, pdf, docx
|
||||
Documents []string `json:"documents"` // Which documents to include
|
||||
Language string `json:"language"` // de, en
|
||||
}
|
||||
Reference in New Issue
Block a user