<% ' HouseholdController - CRUD controller for Households ' NorthTerritory app ' ' Dependencies: ' - app/models/POBO_Households.asp ' - app/models/HouseholdsRepository.asp ' - app/models/POBO_HouseholderNames.asp ' - app/models/HouseholderNamesRepository.asp %> <% Class HouseholdController_Class Private m_useLayout Private m_title ' Public properties for views Public households ' LinkedList for Index Public household ' Single POBO for Show/Edit Public territoriesList ' For dropdown Public territoryNamesById ' Dictionary for territory labels Public householderNames ' LinkedList for Show ' Pagination properties Public currentPage Public pageCount Public recordCount Public perPage Public searchTerm Public filterTerritoryId Public filterDoNotCall Private Sub Class_Initialize() m_useLayout = True m_title = "Households" currentPage = 1 pageCount = 0 recordCount = 0 perPage = 25 searchTerm = "" filterTerritoryId = 0 filterDoNotCall = -1 End Sub Public Property Get useLayout useLayout = m_useLayout End Property Public Property Let useLayout(v) m_useLayout = v End Property Public Property Get Title Title = m_title End Property Public Property Let Title(v) m_title = v End Property '------------------------------------------------------------------------------------------------------------------- ' Index - List all households with pagination, search, and territory filter '------------------------------------------------------------------------------------------------------------------- Public Sub Index() ' Get pagination params If Request.QueryString("page") <> "" And IsNumeric(Request.QueryString("page")) Then currentPage = CInt(Request.QueryString("page")) If currentPage < 1 Then currentPage = 1 End If ' Get search param searchTerm = Trim(Request.QueryString("q") & "") ' Get territory filter If Request.QueryString("territory") <> "" And IsNumeric(Request.QueryString("territory")) Then filterTerritoryId = CInt(Request.QueryString("territory")) End If If Request.QueryString("dnc") <> "" Then If Request.QueryString("dnc") = "1" Then filterDoNotCall = 1 ElseIf Request.QueryString("dnc") = "0" Then filterDoNotCall = 0 End If End If ' Load territories for filter dropdown Set territoriesList = TerritoriesRepository.GetAll(Empty) Set territoryNamesById = BuildTerritoryNamesById(territoriesList) ' Fetch households with pagination If searchTerm <> "" And filterDoNotCall <> -1 Then Set households = HouseholdsRepository.SearchTablePagedByDoNotCall( _ Array("Address", "StreetName"), _ searchTerm, _ filterDoNotCall, _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) ElseIf searchTerm <> "" Then ' Search in Address and StreetName columns Set households = HouseholdsRepository.SearchTablePaged( _ Array("Address", "StreetName"), _ searchTerm, _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) ElseIf filterTerritoryId > 0 And filterDoNotCall <> -1 Then Set households = HouseholdsRepository.FindPagedByTerritoryAndDoNotCall( _ filterTerritoryId, _ filterDoNotCall, _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) ElseIf filterTerritoryId > 0 Then ' Filter by territory Set households = HouseholdsRepository.FindPaged( _ Array("TerritoryId", filterTerritoryId), _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) ElseIf filterDoNotCall <> -1 Then Set households = HouseholdsRepository.FindPaged( _ Array("DoNotCall", filterDoNotCall), _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) Else Set households = HouseholdsRepository.FindPaged( _ Empty, _ Empty, _ perPage, _ currentPage, _ pageCount, _ recordCount _ ) End If %> <% End Sub '------------------------------------------------------------------------------------------------------------------- ' Show - Display a single household '------------------------------------------------------------------------------------------------------------------- Public Sub Show(id) On Error Resume Next Set household = HouseholdsRepository.FindByID(id) If Err.Number <> 0 Or household Is Nothing Then On Error GoTo 0 Flash().AddError "Household not found." Response.Redirect "/households" Exit Sub End If On Error GoTo 0 ' Load householder names for this household Set householderNames = HouseholderNamesRepository.Find( _ Array("HouseholdId", id), _ "Name" _ ) %> <% End Sub '------------------------------------------------------------------------------------------------------------------- ' MarkReturned - Quick action to mark a householder name as returned '------------------------------------------------------------------------------------------------------------------- Public Sub MarkReturned(id) Dim householderId, hn, householdId householderId = Request.Form("householder_id") If householderId = "" Or Not IsNumeric(householderId) Then Flash().Error = "Invalid householder ID." Response.Redirect "/households/" & id Exit Sub End If On Error Resume Next Set hn = HouseholderNamesRepository.FindByID(CLng(householderId)) If Err.Number <> 0 Or hn Is Nothing Then On Error GoTo 0 Flash().Error = "Householder name not found." Response.Redirect "/households/" & id Exit Sub End If On Error GoTo 0 ' Toggle the returned status If hn.LetterReturned = 1 Then hn.LetterReturned = 0 hn.ReturnDate = #1/1/1970# Else hn.LetterReturned = 1 hn.ReturnDate = Now() End If HouseholderNamesRepository.Update hn If hn.LetterReturned = 1 Then Flash().Success = "Marked as returned." Else Flash().Success = "Marked as not returned." End If Response.Redirect "/households/" & id End Sub '------------------------------------------------------------------------------------------------------------------- ' Create - Display form for new household '------------------------------------------------------------------------------------------------------------------- Public Sub Create() Set household = New POBO_Households ' Pre-fill territory if passed in query string If Request.QueryString("territory") <> "" And IsNumeric(Request.QueryString("territory")) Then household.TerritoryId = CInt(Request.QueryString("territory")) End If ' Load territories for dropdown Set territoriesList = TerritoriesRepository.GetAll(Empty) %> <% End Sub '------------------------------------------------------------------------------------------------------------------- ' Store - Save new household '------------------------------------------------------------------------------------------------------------------- Public Sub Store() Set household = New POBO_Households household.Address = Trim(Request.Form("Address")) household.StreetNumber = Request.Form("StreetNumber") household.StreetName = Trim(Request.Form("StreetName")) household.Latitude = Trim(Request.Form("Latitude")) household.Longitude = Trim(Request.Form("Longitude")) household.IsBusiness = IIf(Request.Form("IsBusiness") = "1", 1, 0) household.DoNotCall = IIf(Request.Form("DoNotCall") = "1", 1, 0) household.DoNotCallNotes = Trim(Request.Form("DoNotCallNotes")) household.DoNotCallPrivateNotes = Trim(Request.Form("DoNotCallPrivateNotes")) household.TerritoryId = Request.Form("TerritoryId") If Request.Form("DoNotCallDate") <> "" Then household.DoNotCallDate = CDate(Request.Form("DoNotCallDate")) ElseIf household.DoNotCall = 1 Then household.DoNotCallDate = Date() Else household.DoNotCallDate = Null End If ' Validation If household.Address = "" Then Flash().AddError "Address is required." Response.Redirect "/households/new" Exit Sub End If If Not IsNumeric(household.TerritoryId) Or CInt(household.TerritoryId) < 1 Then Flash().AddError "Please select a territory." Response.Redirect "/households/new" Exit Sub End If HouseholdsRepository.AddNew household Flash().Success = "Household created successfully." Response.Redirect "/households/" & household.Id End Sub '------------------------------------------------------------------------------------------------------------------- ' Edit - Display form to edit household '------------------------------------------------------------------------------------------------------------------- Public Sub Edit(id) On Error Resume Next Set household = HouseholdsRepository.FindByID(id) If Err.Number <> 0 Or household Is Nothing Then On Error GoTo 0 Flash().AddError "Household not found." Response.Redirect "/households" Exit Sub End If On Error GoTo 0 ' Load territories for dropdown Set territoriesList = TerritoriesRepository.GetAll(Empty) %> <% End Sub '------------------------------------------------------------------------------------------------------------------- ' Update - Save changes to household '------------------------------------------------------------------------------------------------------------------- Public Sub Update(id) On Error Resume Next Set household = HouseholdsRepository.FindByID(id) If Err.Number <> 0 Or household Is Nothing Then On Error GoTo 0 Flash().AddError "Household not found." Response.Redirect "/households" Exit Sub End If On Error GoTo 0 household.Address = Trim(Request.Form("Address")) household.StreetNumber = Request.Form("StreetNumber") household.StreetName = Trim(Request.Form("StreetName")) household.Latitude = Trim(Request.Form("Latitude")) household.Longitude = Trim(Request.Form("Longitude")) household.IsBusiness = IIf(Request.Form("IsBusiness") = "1", 1, 0) household.DoNotCall = IIf(Request.Form("DoNotCall") = "1", 1, 0) household.DoNotCallNotes = Trim(Request.Form("DoNotCallNotes")) household.DoNotCallPrivateNotes = Trim(Request.Form("DoNotCallPrivateNotes")) household.TerritoryId = Request.Form("TerritoryId") If Request.Form("DoNotCallDate") <> "" Then household.DoNotCallDate = CDate(Request.Form("DoNotCallDate")) ElseIf household.DoNotCall = 1 Then If IsNull(household.DoNotCallDate) Then household.DoNotCallDate = Date() ElseIf Trim(CStr(household.DoNotCallDate)) = "" Then household.DoNotCallDate = Date() End If Else household.DoNotCallDate = Null End If ' Validation If household.Address = "" Then Flash().AddError "Address is required." Response.Redirect "/households/" & id & "/edit" Exit Sub End If HouseholdsRepository.Update household Flash().Success = "Household updated successfully." Response.Redirect "/households/" & id End Sub '------------------------------------------------------------------------------------------------------------------- ' Delete - Remove a household '------------------------------------------------------------------------------------------------------------------- Public Sub Delete(id) On Error Resume Next Set household = HouseholdsRepository.FindByID(id) If Err.Number <> 0 Or household Is Nothing Then On Error GoTo 0 Flash().AddError "Household not found." Response.Redirect "/households" Exit Sub End If On Error GoTo 0 HouseholdsRepository.Delete id Flash().Success = "Household deleted successfully." Response.Redirect "/households" End Sub Private Function BuildTerritoryNamesById(territories) Dim dict : Set dict = Server.CreateObject("Scripting.Dictionary") Dim iter, territory Set iter = territories.Iterator() Do While iter.HasNext() Set territory = iter.GetNext() dict(CStr(territory.Id)) = territory.Name & "" Loop Set BuildTerritoryNamesById = dict End Function End Class ' Singleton instance Dim HouseholdController_Class__Singleton Function HouseholdController() If IsEmpty(HouseholdController_Class__Singleton) Then Set HouseholdController_Class__Singleton = New HouseholdController_Class End If Set HouseholdController = HouseholdController_Class__Singleton End Function %>