Fase 18: Sistema de Hospedagem Territorial
Duração: 8 semanas (56 dias úteis)
Prioridade: 🔴 CRÍTICA (Economia local e diferencial competitivo)
Depende de: Fase 6-7 (Marketplace/Pagamentos) - ✅ Já implementado
Integra com: Fase 14 (Governança/Votação) - opcional para aprovação comunitária
Estimativa Total: 360 horas
Status: ⏳ Planejado
Nota: Renumerada de Fase 30 para Fase 18, priorizada de P1 para P0 (Onda 3: Economia Local)
Referência: Proposta de Implementação | Análise de Inserção
🎯 Objetivo
Implementar sistema de hospedagem territorial que permite:
- Moradores validados cadastrarem propriedades privadas
- Configurar múltiplas formas de hospedagem por propriedade (casa inteira, quarto, cama compartilhada)
- Gerenciar agenda de disponibilidade (núcleo do sistema)
- Visitantes solicitarem estadias com aprovação humana (manual ou condicional)
- Sistema de pagamentos com escrow e split (Owner, Limpeza, Plataforma)
- Check-in/Check-out com liberação de pagamentos
Princípios:
- ✅ Privacidade por Padrão: Propriedades privadas até terem hospedagem ativa
- ✅ Agenda como Núcleo: Toda lógica gira em torno da agenda
- ✅ Aprovação Humana: Sempre requer consentimento (com auto-aprovação condicional)
- ✅ Papéis Contextuais: Host e Limpeza são específicos por configuração
- ✅ Economia Local: Fortalece circulação de recursos no território
- ✅ Soberania Territorial: Moradores validados, regulação territorial
Diferenciais do Arah:
- Território-first (não global como Airbnb)
- Morador validado como pré-requisito
- Aprovação humana sempre presente
- Privacidade por padrão
📋 Contexto e Requisitos
Estado Atual
- ✅ Sistema de pagamentos completo (Fase 6-7)
- FinancialTransaction, escrow, split
- Payout para vendedores
- Platform fees configuráveis
- ✅ Sistema de aprovação humana (WorkItem)
- Fila genérica de revisão
- Suporta diferentes tipos
- ✅ Sistema de notificações completo
- OutboxMessage e UserNotification
- ✅ Feature flags por território
- ✅ Membership e validação robusta
- ResidencyVerification (Flags)
- MembershipCapability
- ❌ Não existe sistema de hospedagem
- ❌ Não existe sistema de agenda de propriedades
- ❌ Não existe sistema de solicitações de estadia
Requisitos Funcionais
1. Property (Propriedade)
- ✅ Morador Validado pode criar propriedade (privada)
- ✅ Propriedade é privada por padrão
- ✅ Visível apenas para Owner até ter hospedagem ativa
- ✅ Pode existir indefinidamente sem hospedagem
- ✅ Dados: nome, descrição, localização, endereço
2. HostingConfiguration (Configuração de Hospedagem)
- ✅ Uma Property pode ter múltiplas HostingConfigurations
- ✅ Tipo de acomodação: Casa Inteira, Quarto Privado, Cama Compartilhada
- ✅ Capacidade máxima
- ✅ Regras da casa, check-in/check-out, política de cancelamento
- ✅ Modalidades: Diária, Semanal, Mensal, Anual, Pacotes
- ✅ Política de aprovação: Manual ou Auto-aprovação Condicional
- ✅ Status: Active, Inactive
- ✅ Visibilidade pública: Ativa + ao menos uma data disponível
3. HostingCalendar (Agenda - NÚCLEO)
- ✅ Agenda exclusiva por HostingConfiguration
- ✅ Estados por data: Available, BlockedByResident, PendingApproval, Reserved
- ✅ Agenda inicia totalmente bloqueada
- ✅ Host/Owner deve abrir datas explicitamente
- ✅ Padrões recorrentes (bloqueios, aberturas)
- ✅ Regras: antecedência mínima, janela máxima de abertura
- ✅ Datas reservadas não podem ser sobrescritas
4. HostingRole (Papéis Contextuais)
- ✅ Owner: Dono da propriedade (sempre o criador)
- ✅ Host: Responsável por aprovar/rejeitar (pode ser delegado)
- ✅ Cleaning: Responsável pela limpeza
- ✅ Papéis são contextuais (por HostingConfiguration)
- ✅ Um morador pode acumular múltiplos papéis
- ✅ Host e Cleaning devem ser Moradores Validados do mesmo território
5. StayRequest / Stay (Solicitação de Estadia)
- ✅ Visitante cria StayRequest (não precisa ser morador)
- ✅ Estado inicial: PendingApproval
- ✅ Bloqueia datas na agenda (PendingApproval)
- ✅ Calcula valor total
- ✅ Auto-aprovação condicional (se critérios atendidos)
- ✅ Aprovação manual via WorkItem
- ✅ Quando aprovada: cria Stay, cria FinancialTransaction (escrow), atualiza agenda (Reserved)
6. Check-in / Check-out e Pagamento
- ✅ Check-in: marca estadia, notifica Host e Limpeza, libera primeira parcela (se configurado)
- ✅ Check-out: marca saída, notifica Limpeza, libera pagamento completo (split: Owner, Limpeza, Plataforma)
- ✅ Cancelamento: reembolso conforme política, libera datas na agenda
📋 Tarefas Detalhadas
Semana 1-2: Fundação - Modelo de Domínio
18.1 Modelo de Domínio - Property e HostingConfiguration
Estimativa: 24 horas (3 dias)
Status: ⏳ Planejado
Tarefas:
- Criar enum
PropertyVisibility:-
Private(privada, apenas Owner) -
Public(pública, quando tem hospedagem ativa)
-
- Criar enum
PropertyStatus:-
Active(ativa) -
Inactive(inativa)
-
- Criar enum
AccommodationType:-
EntirePlace(casa inteira) -
PrivateRoom(quarto privado) -
SharedRoom(cama em quarto compartilhado)
-
- Criar enum
RentalModality:-
Daily(diária) -
Weekly(semanal) -
Monthly(mensal) -
Annual(anual) -
Packages(pacotes)
-
- Criar enum
ApprovalPolicy:-
ManualOnly(apenas manual) -
ConditionalAutoApprove(auto-aprovação condicional)
-
- Criar enum
HostingConfigurationStatus:-
Active(ativa) -
Inactive(inativa)
-
- Criar modelo
Property:-
Id,OwnerUserId,TerritoryId -
Visibility(PropertyVisibility, Private por padrão) -
Name,Description?,Latitude?,Longitude?,Address? -
Status(PropertyStatus) -
CreatedAtUtc,UpdatedAtUtc - Métodos:
UpdateVisibility(),IsVisibleToPublic()
-
- Criar modelo
HostingConfiguration:-
Id,PropertyId,TerritoryId -
Type(AccommodationType) -
MaxCapacity(int) -
HouseRules?,CheckInTime?,CheckOutTime? -
CancellationPolicy(enum) -
Modality(RentalModality) -
ApprovalPolicy(ApprovalPolicy) -
AutoApproveCriteria?(JSON com critérios) -
Status(HostingConfigurationStatus) -
CreatedAtUtc,UpdatedAtUtc - Métodos:
IsPubliclyVisible(),Activate(),Deactivate()
-
18.2 Modelo de Domínio - HostingCalendar (Núcleo)
Estimativa: 32 horas (4 dias)
Status: ⏳ Planejado
Tarefas:
- Criar enum
CalendarDateState:-
Available(disponível) -
BlockedByResident(bloqueada pelo morador) -
PendingApproval(solicitação pendente) -
Reserved(reservada)
-
- Criar enum
BlockReason:-
Manual(bloqueio manual) -
Recurring(padrão recorrente) -
Maintenance(manutenção)
-
- Criar modelo
HostingCalendar:-
Id,HostingConfigurationId -
Dates(Dictionary<DateOnly, CalendarDateState>) -
Patterns(List) -
Rules(CalendarRules: antecedência mínima, janela máxima) - Métodos:
OpenDate(),BlockDate(),ReserveDate(),ReleaseDate() - Métodos:
IsDateAvailable(),GetAvailableDates() - Regra: Agenda inicia totalmente bloqueada
-
- Criar modelo
CalendarPattern:-
Id,CalendarId -
Type(RecurringBlock, RecurringOpen) -
DayOfWeek?,DayOfMonth?,StartDate,EndDate? -
Reason?(string)
-
- Criar modelo
CalendarRules:-
MinAdvanceDays(int, antecedência mínima) -
MaxAdvanceDays(int, janela máxima) -
DefaultBlockReason(BlockReason)
-
18.3 Modelo de Domínio - HostingRole e Gestão pela Plataforma
Estimativa: 32 horas (4 dias) - Aumentado para incluir gestão pela plataforma
Status: ⏳ Planejado
Tarefas:
- Criar enum
HostingRoleType:-
Owner(dono) -
Host(responsável por aprovar) -
Cleaning(responsável pela limpeza)
-
- Criar modelo
HostingRole:-
Id,HostingConfigurationId,MembershipId -
Type(HostingRoleType) -
GrantedAtUtc,GrantedByUserId -
RevokedAtUtc?,RevokedByUserId? - Métodos:
Revoke(),IsActive() - Regra: Owner é sempre o criador da Property
- Regra: Host e Cleaning devem ser Moradores Validados do mesmo território
-
- Criar modelo
HostInvitation:-
Id,HostingConfigurationId,InvitedMembershipId,InvitedByUserId -
Status(HostInvitationStatus: Pending, Accepted, Rejected, Expired) -
ExpiresAtUtc(7 dias após criação) - Métodos:
Accept(),Reject(),IsExpired() - Regra: Ao aceitar, cria
HostingRoleautomaticamente
-
- Criar modelo
HostOffer:-
Id,MembershipId,TerritoryId -
AvailableFrom,AvailableUntil?,AvailableDaysOfWeek -
SupportedTypes(AccommodationType),MaxPropertiesManaged? -
Status(HostOfferStatus: Active, Inactive, Paused) -
IsPubliclyVisible(visível para moradores) - Métodos:
Activate(),Deactivate(),Pause(),IsAvailableFor()
-
- Criar modelo
CleaningOffer:-
Id,MembershipId,TerritoryId -
AvailableDaysOfWeek,PreferredStartTime?,PreferredEndTime? -
SupportedTypes,MaxPropertiesPerDay? -
Status(CleaningOfferStatus: Active, Inactive, Paused) -
IsPubliclyVisible(visível para moradores) - Métodos:
Activate(),Deactivate(),Pause(),IsAvailableFor()
-
- Criar modelo
CleaningServiceRequest:-
Id,StayId,HostingConfigurationId,PropertyId,TerritoryId -
ServiceDate(data do checkout),CheckoutTime,PreferredServiceTime? -
Status(CleaningServiceRequestStatus: Open, Assigned, InProgress, Completed, Cancelled) -
AssignedCleaningMembershipId?,EstimatedAmount?,FinalAmount? - Métodos:
AssignTo(),MarkInProgress(),MarkCompleted(),Cancel() - Regra: Criada automaticamente quando Stay é confirmada
-
- Criar modelo
CleaningServiceApplication:-
Id,CleaningServiceRequestId,ApplicantMembershipId,TerritoryId -
ProposedAmount?,Message? -
Status(CleaningApplicationStatus: Pending, Accepted, Rejected, Withdrawn) - Métodos:
Accept(),Reject(),Withdraw() - Regra: Ao aceitar, atualiza CleaningServiceRequest para Assigned
-
18.4 Feature Flag e Validações
Estimativa: 8 horas (1 dia)
Status: ⏳ Planejado
Tarefas:
- Adicionar
HostingEnabledao enumFeatureFlag - Adicionar
EnsureHostingEnabled()aoTerritoryFeatureFlagGuard - Criar
HostingAccessRuleshelper:-
CanCreateProperty()- valida Morador Validado -
CanCreateHostingConfiguration()- valida Owner -
CanManageCalendar()- valida Owner ou Host -
CanApproveStayRequest()- valida Host
-
Total Semana 1-2: 96 horas (12 dias)
Semana 3-4: Repositórios e Infraestrutura
18.5 Repositórios de Domínio
Estimativa: 48 horas (6 dias) - Aumentado para incluir novos repositórios
Status: ⏳ Planejado
Tarefas:
- Criar interface
IPropertyRepository:-
GetByIdAsync(),GetByOwnerAsync(),GetPublicPropertiesAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
IHostingConfigurationRepository:-
GetByIdAsync(),GetByPropertyAsync(),GetPublicConfigurationsAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
IHostingCalendarRepository:-
GetByConfigurationAsync(),GetAvailableDatesAsync() -
UpdateDateStateAsync(),UpdateDatesAsync()
-
- Criar interface
IHostingRoleRepository:-
GetByConfigurationAsync(),GetByMembershipAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
IHostInvitationRepository:-
GetByIdAsync(),GetByConfigurationAsync(),GetByInvitedMembershipAsync() -
GetPendingInvitationsAsync(),GetExpiredInvitationsAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
IHostOfferRepository:-
GetByIdAsync(),GetByMembershipAsync(),GetPublicOffersAsync() -
SearchAvailableOffersAsync()(por território, datas, tipos) -
AddAsync(),UpdateAsync()
-
- Criar interface
ICleaningOfferRepository:-
GetByIdAsync(),GetByMembershipAsync(),GetPublicOffersAsync() -
SearchAvailableOffersAsync()(por território, data, horário) -
AddAsync(),UpdateAsync()
-
- Criar interface
ICleaningServiceRequestRepository:-
GetByIdAsync(),GetByStayAsync(),GetOpenRequestsAsync() -
GetByAssignedCleaningAsync(),GetByPropertyAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
ICleaningServiceApplicationRepository:-
GetByIdAsync(),GetByRequestAsync(),GetByApplicantAsync() -
GetPendingApplicationsAsync() -
AddAsync(),UpdateAsync()
-
- Implementar repositórios InMemory
- Implementar repositórios Postgres (com migrations)
18.6 Migrations e Schema
Estimativa: 24 horas (3 dias) - Aumentado para incluir novas tabelas
Status: ⏳ Planejado
Tarefas:
- Criar migration
AddHostingModule:- Tabela
properties - Tabela
hosting_configurations - Tabela
hosting_calendars - Tabela
hosting_calendar_dates(para performance) - Tabela
hosting_calendar_patterns - Tabela
hosting_roles - Tabela
host_invitations - Tabela
host_offers - Tabela
cleaning_offers - Tabela
cleaning_service_requests - Tabela
cleaning_service_applications - Índices:
-
properties(owner_user_id, territory_id) -
hosting_configurations(property_id) -
hosting_calendar_dates(configuration_id, date) -
host_offers(membership_id, territory_id, status) -
cleaning_offers(membership_id, territory_id, status) -
cleaning_service_requests(stay_id, status, service_date) -
cleaning_service_applications(request_id, applicant_membership_id, status)
-
- Tabela
Total Semana 3-4: 72 horas (9 dias)
Semana 5-6: StayRequest e Stay
18.7 Modelo de Domínio - StayRequest e Stay
Estimativa: 24 horas (3 dias)
Status: ⏳ Planejado
Tarefas:
- Criar enum
StayRequestStatus:-
PendingApproval,AutoApproved,Approved,Rejected,Cancelled,Completed
-
- Criar enum
ApprovalSource:-
Manual,AutoApproved
-
- Criar enum
StayStatus:-
Confirmed,CheckedIn,CheckedOut,Cancelled
-
- Criar enum
StayPaymentStatus:-
Pending,Partial,Completed,Refunded
-
- Criar modelo
StayRequest:-
Id,VisitorUserId,HostingConfigurationId,TerritoryId -
CheckInDate,CheckOutDate(DateOnly) -
TotalAmount,Currency -
Status(StayRequestStatus) -
ApprovalSource,ApprovedByUserId?,ApprovedAtUtc? -
RejectedAtUtc?,RejectionReason? -
CreatedAtUtc,UpdatedAtUtc - Métodos:
Approve(),AutoApprove(),Reject(),Cancel()
-
- Criar modelo
Stay:-
Id,StayRequestId,VisitorUserId,HostingConfigurationId,PropertyId,TerritoryId -
CheckInDate,CheckOutDate -
TotalAmount,Currency,PaymentStatus -
Status(StayStatus) -
CreatedAtUtc,CheckedInAtUtc?,CheckedOutAtUtc? - Métodos:
MarkCheckedIn(),MarkCheckedOut(),Cancel()
-
18.8 Repositórios - StayRequest e Stay
Estimativa: 16 horas (2 dias)
Status: ⏳ Planejado
Tarefas:
- Criar interface
IStayRequestRepository:-
GetByIdAsync(),GetByVisitorAsync(),GetByConfigurationAsync() -
GetPendingApprovalAsync() -
AddAsync(),UpdateAsync()
-
- Criar interface
IStayRepository:-
GetByIdAsync(),GetByVisitorAsync(),GetByConfigurationAsync() -
AddAsync(),UpdateAsync()
-
- Implementar repositórios InMemory e Postgres
- Criar migration para
stay_requestsestays
18.9 Integração com WorkItem para Aprovação
Estimativa: 16 horas (2 dias)
Status: ⏳ Planejado
Tarefas:
- Adicionar
StayRequestApprovalao enumWorkItemType - Criar
StayRequestApprovalService:-
CreateApprovalWorkItemAsync()- cria WorkItem quando requer aprovação manual -
ProcessApprovalAsync()- processa aprovação via WorkItem -
ProcessRejectionAsync()- processa rejeição via WorkItem
-
- Integrar com
WorkQueueServiceexistente
Total Semana 5-6: 56 horas (7 dias)
Semana 7-8: Pagamentos e Check-in/out
18.10 Integração com FinancialTransaction
Estimativa: 24 horas (3 dias)
Status: ⏳ Planejado
Tarefas:
- Adicionar
HostingPaymentao enumTransactionType - Criar
HostingPaymentService:-
CreateEscrowTransactionAsync()- cria escrow quando Stay é criado -
ProcessCheckInPaymentAsync()- libera primeira parcela (se configurado) -
ProcessCheckOutPaymentAsync()- libera pagamento completo com split -
ProcessRefundAsync()- processa reembolso conforme política
-
- Criar
HostingPaymentSplitConfig:- Configuração por território: Owner %, Limpeza %, Plataforma %
- Limpeza pode ser fixo ou percentual
- Reutilizar padrão do Marketplace
18.11 Check-in e Check-out
Estimativa: 24 horas (3 dias) - Aumentado para incluir CleaningServiceRequest
Status: ⏳ Planejado
Tarefas:
- Criar
StayManagementService:-
MarkCheckedInAsync()- marca check-in, notifica Host e Limpeza (se já atribuído), libera primeira parcela -
MarkCheckedOutAsync()- marca check-out, cria CleaningServiceRequest (se não atribuído), notifica Limpeza, libera pagamento completo, libera datas -
CancelStayAsync()- cancela estadia, cancela CleaningServiceRequest (se existir), processa reembolso, libera datas
-
- Integrar com
HostingCalendarpara liberar datas - Integrar com notificações
- Nova funcionalidade: Criar
CleaningServiceRequestautomaticamente quando Stay é confirmada (com data/horário de checkout)
18.11.1 Serviços de Gestão de Host e Cleaning
Estimativa: 32 horas (4 dias) - Nova seção
Status: ⏳ Planejado
Tarefas:
- Criar
HostInvitationService:-
SendInvitationAsync()- Owner envia convite para morador ser Host -
AcceptInvitationAsync()- Morador aceita convite, cria HostingRole -
RejectInvitationAsync()- Morador rejeita convite -
ExpireInvitationsAsync()- Job para expirar convites antigos
-
- Criar
HostOfferService:-
CreateOfferAsync()- Morador cria oferta de hosting -
SearchAvailableOffersAsync()- Busca ofertas disponíveis (para Owners) -
UpdateOfferAsync()- Atualiza disponibilidade -
ActivateOfferAsync(),DeactivateOfferAsync(),PauseOfferAsync()
-
- Criar
CleaningOfferService:-
CreateOfferAsync()- Morador cria oferta de limpeza -
SearchAvailableOffersAsync()- Busca ofertas disponíveis (para Owners/Hosts) -
UpdateOfferAsync()- Atualiza disponibilidade -
ActivateOfferAsync(),DeactivateOfferAsync(),PauseOfferAsync()
-
- Criar
CleaningServiceRequestService:-
CreateRequestAsync()- Criado automaticamente quando Stay é confirmada -
GetOpenRequestsAsync()- Lista solicitações abertas (para moradores com CleaningOffer) -
NotifyEligibleCleanersAsync()- Notifica moradores com CleaningOffer ativa
-
- Criar
CleaningServiceApplicationService:-
ApplyForServiceAsync()- Morador se candidata a serviço de limpeza -
AcceptApplicationAsync()- Owner/Host aceita candidatura, atribui serviço -
RejectApplicationAsync()- Owner/Host rejeita candidatura -
WithdrawApplicationAsync()- Morador retira candidatura -
MarkServiceInProgressAsync()- Marca serviço em execução (no check-out) -
MarkServiceCompletedAsync()- Marca serviço concluído, processa pagamento
-
Total Semana 7-8: 80 horas (10 dias)
Semana 9: Notificações e Busca
18.12 Notificações
Estimativa: 16 horas (2 dias)
Status: ⏳ Planejado
Tarefas:
- Adicionar tipos de notificação:
-
HostingRequest(nova solicitação) -
HostingApproved(solicitação aprovada) -
HostingRejected(solicitação rejeitada) -
HostingCheckIn(check-in realizado) -
HostingCheckOut(check-out realizado) -
HostingCleaningRequired(limpeza necessária)
-
- Criar handlers de notificação:
- Notificar Host quando há nova solicitação
- Notificar Visitante quando aprovada/rejeitada
- Notificar Limpeza em check-in/check-out
- Notificar Owner em eventos importantes
18.13 Busca de Propriedades Disponíveis
Estimativa: 16 horas (2 dias)
Status: ⏳ Planejado
Tarefas:
- Criar
HostingSearchService:-
SearchAvailablePropertiesAsync()- busca propriedades disponíveis - Filtros: Territory, datas (check-in/check-out), tipo, capacidade, preço
- Apenas HostingConfigurations ativas + datas Available
- Paginação
-
- Criar índices para performance:
-
hosting_configurations(status, territory_id) -
hosting_calendar_dates(configuration_id, date, state)
-
Total Semana 9: 32 horas (4 dias)
Semana 10: API e Testes
18.14 Controllers e Endpoints
Estimativa: 40 horas (5 dias) - Aumentado para incluir novos endpoints
Status: ⏳ Planejado
Tarefas:
- Criar
PropertiesController:-
POST /api/v1/properties- criar propriedade -
GET /api/v1/properties- listar propriedades do usuário -
GET /api/v1/properties/{id}- obter propriedade -
PUT /api/v1/properties/{id}- atualizar propriedade
-
- Criar
HostingConfigurationsController:-
POST /api/v1/properties/{propertyId}/configurations- criar configuração -
GET /api/v1/properties/{propertyId}/configurations- listar configurações -
PUT /api/v1/configurations/{id}- atualizar configuração -
POST /api/v1/configurations/{id}/activate- ativar -
POST /api/v1/configurations/{id}/deactivate- desativar
-
- Criar
HostingCalendarController:-
GET /api/v1/configurations/{id}/calendar- obter agenda -
POST /api/v1/configurations/{id}/calendar/open- abrir datas -
POST /api/v1/configurations/{id}/calendar/block- bloquear datas -
GET /api/v1/configurations/{id}/calendar/available- datas disponíveis
-
- Criar
HostingRolesController:-
POST /api/v1/configurations/{id}/roles- delegar papel -
GET /api/v1/configurations/{id}/roles- listar papéis -
DELETE /api/v1/roles/{id}- revogar papel
-
- Criar
StayRequestsController:-
POST /api/v1/stay-requests- criar solicitação -
GET /api/v1/stay-requests- listar solicitações (Host/Visitor) -
GET /api/v1/stay-requests/{id}- obter solicitação -
POST /api/v1/stay-requests/{id}/approve- aprovar (Host) -
POST /api/v1/stay-requests/{id}/reject- rejeitar (Host) -
POST /api/v1/stay-requests/{id}/cancel- cancelar
-
- Criar
StaysController:-
GET /api/v1/stays- listar estadias -
GET /api/v1/stays/{id}- obter estadia -
POST /api/v1/stays/{id}/check-in- check-in -
POST /api/v1/stays/{id}/check-out- check-out -
POST /api/v1/stays/{id}/cancel- cancelar
-
- Criar
HostingSearchController:-
GET /api/v1/hosting/search- buscar propriedades disponíveis - Filtros: territoryId, checkIn, checkOut, type, capacity, maxPrice
-
- Criar
HostInvitationsController:-
POST /api/v1/configurations/{id}/host-invitations- enviar convite para Host -
GET /api/v1/configurations/{id}/host-invitations- listar convites -
POST /api/v1/host-invitations/{id}/accept- aceitar convite -
POST /api/v1/host-invitations/{id}/reject- rejeitar convite
-
- Criar
HostOffersController:-
POST /api/v1/host-offers- criar oferta de hosting -
GET /api/v1/host-offers- listar ofertas (próprias ou públicas) -
GET /api/v1/host-offers/search- buscar ofertas disponíveis -
PUT /api/v1/host-offers/{id}- atualizar oferta -
POST /api/v1/host-offers/{id}/activate- ativar oferta -
POST /api/v1/host-offers/{id}/deactivate- desativar oferta
-
- Criar
CleaningOffersController:-
POST /api/v1/cleaning-offers- criar oferta de limpeza -
GET /api/v1/cleaning-offers- listar ofertas (próprias ou públicas) -
GET /api/v1/cleaning-offers/search- buscar ofertas disponíveis -
PUT /api/v1/cleaning-offers/{id}- atualizar oferta -
POST /api/v1/cleaning-offers/{id}/activate- ativar oferta -
POST /api/v1/cleaning-offers/{id}/deactivate- desativar oferta
-
- Criar
CleaningServiceRequestsController:-
GET /api/v1/cleaning-service-requests- listar solicitações (abertas, atribuídas, próprias) -
GET /api/v1/cleaning-service-requests/{id}- obter solicitação -
POST /api/v1/cleaning-service-requests/{id}/assign- atribuir serviço (Owner/Host) -
POST /api/v1/cleaning-service-requests/{id}/complete- marcar concluído -
POST /api/v1/cleaning-service-requests/{id}/cancel- cancelar
-
- Criar
CleaningServiceApplicationsController:-
POST /api/v1/cleaning-service-requests/{id}/applications- candidatar-se a serviço -
GET /api/v1/cleaning-service-requests/{id}/applications- listar candidaturas -
POST /api/v1/cleaning-applications/{id}/accept- aceitar candidatura (Owner/Host) -
POST /api/v1/cleaning-applications/{id}/reject- rejeitar candidatura (Owner/Host) -
POST /api/v1/cleaning-applications/{id}/withdraw- retirar candidatura
-
18.15 Testes
Estimativa: 32 horas (4 dias)
Status: ⏳ Planejado
Tarefas:
- Testes de domínio:
- Property (visibilidade, regras)
- HostingConfiguration (ativação, visibilidade)
- HostingCalendar (estados, bloqueios, reservas)
- HostingRole (delegação, revogação)
- StayRequest (aprovação, auto-aprovação, rejeição)
- Stay (check-in, check-out, cancelamento)
- Testes de aplicação:
- PropertyService (criação, atualização)
- HostingConfigurationService (criação, ativação)
- HostingCalendarService (abrir, bloquear, reservar)
- StayRequestService (criação, aprovação)
- StayManagementService (check-in, check-out)
- HostingPaymentService (escrow, split, reembolso)
- HostingSearchService (busca, filtros)
- Testes de API (E2E):
- Fluxo completo: criar propriedade → configurar → ativar → solicitar → aprovar → check-in → check-out
- Testes de concorrência (múltiplas solicitações simultâneas)
- Testes de edge cases (datas inválidas, valores zero, etc.)
Total Semana 10: 72 horas (9 dias)
📊 Resumo de Estimativas
| Semana | Tarefas | Horas | Dias |
|---|---|---|---|
| 1-2 | Fundação - Modelo de Domínio | 96h | 12d |
| 3-4 | Repositórios e Infraestrutura | 72h | 9d |
| 5-6 | StayRequest e Stay | 56h | 7d |
| 7-8 | Pagamentos e Check-in/out + Gestão Host/Cleaning | 80h | 10d |
| 9 | Notificações e Busca | 32h | 4d |
| 10 | API e Testes | 72h | 9d |
| TOTAL | 10 semanas | 408h | 51d |
Buffer para imprevistos: +5 dias (10% de buffer)
Total com Buffer: 56 dias úteis (11 semanas)
🔌 Integrações com Sistema Existente
1. Feature Flags
- ✅ Adicionar
HostingEnabledao enumFeatureFlag - ✅ Usar
TerritoryFeatureFlagGuard.EnsureHostingEnabled()
2. Notificações
- ✅ Reutilizar
OutboxMessageeUserNotification - ✅ Novos tipos:
HostingRequest,HostingApproved,HostingRejected,HostingCheckIn,HostingCheckOut,HostingCleaningRequired
3. WorkItem para Aprovação
- ✅ Adicionar
StayRequestApprovalao enumWorkItemType - ✅ Reutilizar
WorkQueueServiceexistente
4. Pagamentos
- ✅ Adicionar
HostingPaymentao enumTransactionType - ✅ Reutilizar
FinancialTransactione split do Marketplace - ✅ Criar
HostingPaymentSplitConfig(similar ao Marketplace)
5. Regras de Acesso
- ✅ Criar
HostingAccessRules(similar ao Marketplace) - ✅ Validar Morador Validado para criar Property
- ✅ Validar Owner/Host para gerenciar configuração
⚠️ Riscos e Mitigações
Risco 1: Complexidade da Agenda
Mitigação:
- Agenda como entidade separada e bem testada
- Estados explícitos e imutáveis
- Testes de concorrência extensivos
- Índices no banco para performance
Risco 2: Confusão com Marketplace
Mitigação:
- Domínio completamente separado (
Arah.Domain/Hosting/) - Nomenclatura distinta (Property ≠ Store, StayRequest ≠ Checkout)
- Documentação clara das diferenças
Risco 3: Performance da Agenda
Mitigação:
- Índices no banco (HostingConfigurationId + Date)
- Cache de datas disponíveis
- Paginação em buscas
Risco 4: Split de Pagamento Complexo
Mitigação:
- Reutilizar padrão do Marketplace
- Configuração flexível por território
- Testes de edge cases (valores zero, percentuais totais)
📝 Critérios de Aceitação
MVP Completo
- Morador Validado pode criar Property (privada)
- Morador pode criar HostingConfiguration
- Agenda funciona corretamente (abrir, bloquear, reservar)
- Visitante pode criar StayRequest
- Host pode aprovar/rejeitar via WorkItem
- Auto-aprovação condicional funciona
- Check-in/Check-out funciona
- Pagamento com escrow e split funciona
- Notificações são enviadas corretamente
- Busca de propriedades disponíveis funciona
- Testes com cobertura >90%
🔗 Referências
- Proposta de Implementação de Hospedagem
- Análise de Inserção no Roadmap
- Marketplace (Fase 6-7) - Referência de padrões
- Sistema de Pagamentos (Fase 7) - Escrow e split
- WorkItem para Aprovação
Status: ⏳ PLANEJADO
Prioridade: 🔴 P0 (Crítica)
Onda: 3 - Economia Local
Timeline: Mês 6-9 (após Fase 17, antes de Fase 19)