package eform import "time" // ===================================================== // NOTICE METADATA (Legacy - keeping for compatibility) // ===================================================== // NoticeMetadata contains identification and publication information type NoticeMetadata struct { NoticeID string `json:"notice_id" xml:"notice_id" validate:"required,noticeIDFormat"` NoticeType NoticeType `json:"notice_type" xml:"notice_type" validate:"required"` NoticeVersion string `json:"notice_version" xml:"notice_version" validate:"required,semver"` PublicationDate *time.Time `json:"publication_date,omitempty" xml:"publication_date,omitempty"` DispatchDate time.Time `json:"dispatch_date" xml:"dispatch_date" validate:"required"` Language LanguageCode `json:"language" xml:"language" validate:"required,iso639_1"` TranslationLanguages []LanguageCode `json:"translation_languages,omitempty" xml:"translation_languages,omitempty" validate:"dive,iso639_1"` LegalBasis LegalBasis `json:"legal_basis" xml:"legal_basis" validate:"required"` PreviousNoticeID string `json:"previous_notice_id,omitempty" xml:"previous_notice_id,omitempty" validate:"omitempty,noticeIDFormat"` ChangedNoticeID string `json:"changed_notice_id,omitempty" xml:"changed_notice_id,omitempty" validate:"omitempty,noticeIDFormat"` CorrectionPrevious bool `json:"correction_previous" xml:"correction_previous"` } // NoticeType represents the eForms subtype identifier (1-40, E1-E5) type NoticeType string const ( // Planning notices (1-6) NoticeTypePIN1 NoticeType = "1" // Prior Information Notice - standard NoticeTypePIN2 NoticeType = "2" // Prior Information Notice - utilities NoticeTypePIN3 NoticeType = "3" // Prior Information Notice - social NoticeTypePINCallComp4 NoticeType = "4" // PIN as call for competition - standard NoticeTypePINCallComp5 NoticeType = "5" // PIN as call for competition - utilities NoticeTypePINCallComp6 NoticeType = "6" // PIN as call for competition - social // Competition notices (7-14) NoticeTypeCN7 NoticeType = "7" // Contract Notice - open/restricted NoticeTypeCN8 NoticeType = "8" // Contract Notice - utilities NoticeTypeCN9 NoticeType = "9" // Contract Notice - negotiated NoticeTypeCN10 NoticeType = "10" // Contract Notice - competitive dialogue NoticeTypeCN11 NoticeType = "11" // Contract Notice - innovation partnership NoticeTypeCN12 NoticeType = "12" // Contract Notice - social services NoticeTypeCN13 NoticeType = "13" // Contract Notice - concessions NoticeTypeCN14 NoticeType = "14" // Contract Notice - design contest // Direct award notices (15-24) NoticeTypeCANDirect15 NoticeType = "15" // CAN without prior - direct award NoticeTypeCANDirect16 NoticeType = "16" // CAN without prior - utilities NoticeTypeCANDirect17 NoticeType = "17" // CAN without prior - social NoticeTypeCANDirect18 NoticeType = "18" // CAN without prior - negotiated NoticeTypeCANDirect19 NoticeType = "19" // CAN without prior - concessions NoticeTypeCANDirect20 NoticeType = "20" // Voluntary ex-ante transparency - direct award NoticeTypeCANDirect21 NoticeType = "21" // Voluntary ex-ante transparency - utilities NoticeTypeCANDirect22 NoticeType = "22" // Voluntary ex-ante transparency - social NoticeTypeCANDirect23 NoticeType = "23" // Voluntary ex-ante transparency - concessions NoticeTypeCANDirect24 NoticeType = "24" // Voluntary ex-ante transparency - defence // Result notices (25-35) NoticeTypeCAN25 NoticeType = "25" // Contract Award Notice - standard NoticeTypeCAN26 NoticeType = "26" // Contract Award Notice - utilities NoticeTypeCAN27 NoticeType = "27" // Contract Award Notice - social NoticeTypeCAN28 NoticeType = "28" // Contract Award Notice - concessions NoticeTypeCAN29 NoticeType = "29" // Contract Award Notice - design contest results NoticeTypeCAN30 NoticeType = "30" // Contract Award Notice - defence NoticeTypeCAN31 NoticeType = "31" // Contract Award Notice - framework single NoticeTypeCAN32 NoticeType = "32" // Contract Award Notice - DPS award NoticeTypeCAN33 NoticeType = "33" // Contract Award Notice - modification NoticeTypeCAN34 NoticeType = "34" // Contract Award Notice - completion NoticeTypeCAN35 NoticeType = "35" // Contract Award Notice - quarterly DPS // Modification notices (36-40) NoticeTypeMod36 NoticeType = "36" // Contract Modification Notice - standard NoticeTypeMod37 NoticeType = "37" // Contract Modification Notice - utilities NoticeTypeMod38 NoticeType = "38" // Contract Modification Notice - social NoticeTypeMod39 NoticeType = "39" // Contract Modification Notice - concessions NoticeTypeMod40 NoticeType = "40" // Contract Modification Notice - defence // Voluntary notices (E1-E5) NoticeTypeVoluntaryE1 NoticeType = "E1" // Voluntary notice - below threshold NoticeTypeVoluntaryE2 NoticeType = "E2" // Voluntary notice - modification NoticeTypeVoluntaryE3 NoticeType = "E3" // Voluntary notice - contract completion NoticeTypeVoluntaryE4 NoticeType = "E4" // Voluntary notice - concession award NoticeTypeVoluntaryE5 NoticeType = "E5" // Voluntary notice - qualification system ) // LegalBasis represents applicable EU directives type LegalBasis string const ( LegalBasisClassicDir LegalBasis = "32014L0024" // Directive 2014/24/EU (classic) LegalBasisUtilitiesDir LegalBasis = "32014L0025" // Directive 2014/25/EU (utilities) LegalBasisConcessionsDir LegalBasis = "32014L0023" // Directive 2014/23/EU (concessions) LegalBasisDefenceDir LegalBasis = "32009L0081" // Directive 2009/81/EC (defence) LegalBasisFinancialReg LegalBasis = "32018R1046" // Financial Regulation (EU institutions) ) // LanguageCode represents ISO 639-1 language codes type LanguageCode string // IsPlanningNotice checks if notice is a planning/PIN notice func (nt NoticeType) IsPlanningNotice() bool { planningTypes := []NoticeType{ NoticeTypePIN1, NoticeTypePIN2, NoticeTypePIN3, NoticeTypePINCallComp4, NoticeTypePINCallComp5, NoticeTypePINCallComp6, } for _, t := range planningTypes { if nt == t { return true } } return false } // IsCompetitionNotice checks if notice is a competition/CN notice func (nt NoticeType) IsCompetitionNotice() bool { return nt >= NoticeTypeCN7 && nt <= NoticeTypeCN14 } // IsResultNotice checks if notice is a result/CAN notice func (nt NoticeType) IsResultNotice() bool { return (nt >= NoticeTypeCANDirect15 && nt <= NoticeTypeCANDirect24) || (nt >= NoticeTypeCAN25 && nt <= NoticeTypeCAN35) } // IsModificationNotice checks if notice is a modification notice func (nt NoticeType) IsModificationNotice() bool { return nt >= NoticeTypeMod36 && nt <= NoticeTypeMod40 } // IsVoluntaryNotice checks if notice is voluntary func (nt NoticeType) IsVoluntaryNotice() bool { voluntaryTypes := []NoticeType{ NoticeTypeVoluntaryE1, NoticeTypeVoluntaryE2, NoticeTypeVoluntaryE3, NoticeTypeVoluntaryE4, NoticeTypeVoluntaryE5, NoticeTypeCANDirect20, NoticeTypeCANDirect21, NoticeTypeCANDirect22, NoticeTypeCANDirect23, NoticeTypeCANDirect24, } for _, t := range voluntaryTypes { if nt == t { return true } } return false }