Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
O formato é baseado em Keep a Changelog, e este projeto adere ao Semantic Versioning.
- Chore: Ajuste de timeout
- Feat: Sistema de papéis por tenant (Dono, Admin, Usuário) com hierarquia de permissões. Políticas de autorização
TenantUser,TenantAdmin,TenantOwneraplicadas nos controllers. Arquivos:Authorization/TenantRoleRequirement.cs,Authorization/TenantRoleHandler.cs,Program.cs. - Feat: Sistema de convites para tenants — criar convite (GUID, validade de 7 dias), aceitar (valida expiração e e-mail), cancelar (Owner cancela qualquer um, Admin só os seus). Arquivos:
Services/InviteService.cs,Services/IInviteService.cs,Controllers/InviteController.cs,Views/Admin/Invites.cshtml,Views/Admin/CreateInvite.cshtml. - Feat: Workspace switcher — sessão + cache para alternar entre tenants ou "Todos os Grupos". Dropdown no cabeçalho com todos os tenants do usuário. Arquivos:
Services/TenantService.cs,Controllers/WorkspaceController.cs,Views/Shared/_Layout.cshtml. - Feat: Painel de administração (membros, convites, histórico de alterações). Owner pode alterar papéis, desativar e expulsar membros. Arquivos:
Controllers/AdminController.cs,Views/Admin/Members.cshtml,Views/Admin/AuditLog.cshtml. - Feat: Página de perfil do usuário com upload de foto, informações pessoais e lista de grupos. Arquivos:
Controllers/ProfileController.cs,Views/Profile/Index.cshtml. - Feat: Tags com escopo Local (só o criador vê) e Tenant (todos do grupo veem). CRUD de tags e API JSON para busca via AJAX. Arquivos:
Services/TagService.cs,Services/ITagService.cs,Controllers/TagController.cs,Views/Tag/Manage.cshtml. - Feat: Upload de arquivos estáticos (fotos de perfil e logos de grupo) em
wwwroot/uploads/. Validação de extensão e tamanho. Arquivos:Services/FileUploadService.cs,Services/IFileUploadService.cs. - Feat: Múltiplos telefones, e-mails e endereços por contato com campos dinâmicos JS. Primeiro telefone marcado como principal e exibido na listagem/dashboard. Arquivos:
Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,ViewModels/ContactViewModel.cs. - Feat: Contatos favoritos com toggle rápido na listagem. Arquivos:
Services/ContatoService.cs,Controllers/ContatoController.cs,Views/Contato/List.cshtml. - Feat: Histórico de alterações (audit log) automático — registra criações, edições (com diff de campos) e exclusões de contatos. Arquivos:
Services/ContatoService.cs,Models/ContactAuditLog.cs,Views/Admin/AuditLog.cshtml. - Feat: Filtros avançados por nome, e-mail, telefone, tags, favoritos e ativos na listagem de contatos. Ordenação por nome, data de criação e aniversário. Arquivos:
ViewModels/ContactFilterViewModel.cs,Services/ContatoService.cs,Views/Contato/List.cshtml. - Feat: Compressão de resposta (Brotli + GZip) e cache em memória para tenant e tags. Arquivos:
Program.cs,Services/TenantService.cs,Services/TagService.cs. - Feat: Nova migration inicial
InitialCreatecom todas as tabelas do sistema (Tenant, TenantMembership, TenantInvite, Contact, ContactPhone, ContactEmail, ContactAddress, Tag, ContactTag, ContactAuditLog). Arquivos:Migrations/*. - Feat: Campo "Rótulo (opcional)" nos telefones, e-mails e endereços — exibido na listagem e detalhes do contato. Arquivos:
ViewModels/ContactViewModel.cs,ViewModels/ContactListItemViewModel.cs,Services/ContatoService.cs. - Feat: Propriedade
AvailableTagsnoContactViewModelpara seleção de tags nos formulários de criação/edição. Arquivo:ViewModels/ContactViewModel.cs. - Feat: Migração automática de imagens base64 para
wwwroot/uploads/na inicialização. ServiçoImageMigrationServiceidempotente. Arquivos:Services/ImageMigrationService.cs,Program.cs. - Feat: Sidebar compacta (64px, expande para 220px ao hover) com ícones autodescritivos à esquerda. Topbar superior com workspace switcher, busca e toggle de tema. Profile dropdown fixo no rodapé da sidebar. Layout público sem sidebar. Arquivos:
Views/Shared/_Layout.cshtml,wwwroot/css/site.css,wwwroot/js/site.js. - Feat: Componente
_Pager.cshtmlreutilizável com paginação server-side — botões Anterior/Próxima, input "Ir para página" e seletor de pageSize (10/20/30/50). Aplicado na listagem de contatos. Arquivos:Views/Shared/_Pager.cshtml,Views/Contato/List.cshtml. - Feat: Dashboard completo com 4 cards KPI (Total, Ativos, Favoritos, Grupos), gráfico de barras (Chart.js) de contatos por grupo, nuvem de tags clicável (redireciona para listagem filtrada) e aniversariantes com link para detalhes. Arquivos:
Controllers/HomeController.cs,ViewModels/HomeDashboardViewModel.cs,Views/Home/Dashboard.cshtml. - Feat: Seleção de tags nos formulários de criação e edição — checkboxes com badges coloridas, tags pré-selecionadas no Edit. Arquivos:
Controllers/ContatoController.cs,Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml. - Feat: Indicador visual de escopo nas tags — badge "Local" (só o criador vê) ou "Grupo" (todos do tenant veem) no painel de gerenciamento de tags. Arquivos:
ViewModels/ContactDetailsViewModel.cs,Services/TagService.cs,Views/Tag/Manage.cshtml. - Feat: Filtro por tags na listagem de contatos — dropdown com checkboxes no formulário de filtros, TagIds preservados na paginação. Arquivos:
Views/Contato/List.cshtml,Controllers/ContatoController.cs,Views/Shared/_Pager.cshtml. - Kanban / Mini-CRM: Pipelines, Stages e Cards com board drag-and-drop. Criação de pipeline com estágios editáveis (cor + nome, padrão: A Fazer / Em Progresso / Concluído). Formulário "Novo Card" com título, descrição, prioridade (Baixa/Média/Alta), datas de início e fim, contato vinculado, tags e subtarefas inline. Arquivos:
Models/Pipeline.cs,Models/Stage.cs,Models/Deal.cs,Models/DealTask.cs,Controllers/DealsController.cs,Views/Deals/Index.cshtml,Views/Deals/CreatePipeline.cshtml,Views/Deals/CreateDeal.cshtml. - Tempo real (SignalR): Hub
/realtimecom grupos por tenant. EventosCardMoved,DealCreated,DealDeleted,ContactChanged— outros usuários do mesmo workspace veem mudanças no Kanban sem recarregar a página. Sem Redis (single-server). Arquivos:Hubs/RealtimeHub.cs,Program.cs,Views/Deals/Index.cshtml. - CRUD de subtarefas (AJAX): Endpoints
ToggleTask,AddTaskeDeleteTasknoDealsController— manipulação de subtarefas em tempo real sem reload. Arquivos:Controllers/DealsController.cs,ViewModels/KanbanViewModels.cs. - Badges nos cards Kanban: Exibição de prioridade (cor por nível), data de fim e contagem de subtarefas diretamente nos cards do board. Arquivo:
Views/Deals/Index.cshtml. - Template HTML de e-mail: Novo serviço
EmailTemplatescom layout corporativo responsivo (CSS inline, cabeçalho azul, botão CTA, rodapé). Templates para: confirmação de conta, redefinição de senha, alteração de e-mail e teste SMTP. Arquivo:Services/EmailTemplates.cs. - Confirmação de e-mail no registro: Novo usuário recebe e-mail de confirmação com token; login bloqueado até confirmar.
RequireConfirmedEmail = trueno Identity. Arquivos:Controllers/AccountController.cs,Program.cs. - Fluxos de segurança: Esquecer senha (ForgotPassword + ResetPassword), alterar senha e alterar e-mail — todos com e-mail de confirmação usando o novo template HTML. Arquivos:
Controllers/AccountController.cs,Views/Account/. - Alterar senha e e-mail na página de Perfil: Removidos do dropdown do header e centralizados em
Views/Profile/Index.cshtml. - Importação e exportação de contatos: CSV, Excel (XLSX) e vCard 3.0 com preview e detecção de duplicados. Arquivos:
Services/ExportService.cs,Services/ImportService.cs,Controllers/ImportExportController.cs,Views/ImportExport/. - Cache do dashboard:
DashboardCacheServicecom TTL curto e invalidação por tenant. Arquivos:Services/DashboardCacheService.cs,Controllers/HomeController.cs. - Endpoint de diagnóstico SMTP:
GET /Dev/SendTestEmail?to=email(somente Development) para validar configuração Brevo. Arquivo:Controllers/DevController.cs. - Migration
AtualizarDealRemoverValueAdicionarCampos: Remove campoValuedo Deal; adicionaStartDate,EndDateePriority. Arquivo:Migrations/20260225033944_AtualizarDealRemoverValueAdicionarCampos.cs.
- Fix: "Todos os Grupos" não mais redireciona para AccessDenied —
ContatoServiceretorna lista vazia quando não há tenants,GetUpcomingBirthdaysAsyncidem. Arquivos:Services/ContatoService.cs,Controllers/ContatoController.cs. - Fix: Gráfico Chart.js no dashboard renderizava infinitamente — canvas envolto em container com altura fixa (260px) e
Chart.getChart()destrói instância anterior antes de recriar. Arquivo:Views/Home/Dashboard.cshtml. - Fix: Sidebar exibia email ao invés do nome completo — agora usa
FullNamedo banco com query única (ProfilePictureUrl + FullName). Nomes longos truncados com ellipsis (max-width:140px). Arquivos:Views/Shared/_Layout.cshtml,wwwroot/css/site.css. - Fix: Pager (controles de paginação) agora sempre visível quando existem resultados, não apenas quando há mais de 1 página. Arquivos:
Views/Shared/_Pager.cshtml,Views/Contato/List.cshtml. - Fix: Audit log registra alterações completas — detecta diffs em todos os campos (Nome, Anotações, Ativo, Favorito, Data de Nascimento, Telefones, E-mails, Endereços, Tags). Modal de detalhes com tabela Campo/Anterior/Novo. Arquivos:
Services/ContatoService.cs,Views/Admin/AuditLog.cshtml. - Fix: TenantRoleHandler com logging para debug de falhas de autorização. Página AccessDenied melhorada com dica sobre workspace. Arquivos:
Authorization/TenantRoleHandler.cs,Views/Account/AccessDenied.cshtml.
- Refactor: Sanitização de comentários em todo o código-fonte — removidos comentários redundantes, TODOs obsoletos e comentários em inglês; padronizado em português conciso. Arquivos:
Services/*,Controllers/*,Models/*,ViewModels/*,Data/*,Program.cs. - Refactor:
TenantServicereescrito para usar sessão +IMemoryCacheem vez de claims diretas. Arquivos:Services/TenantService.cs,Services/ITenantService.cs. - Refactor:
ContatoServicereescrito com suporte multi-tenant agregado ("Todos os Grupos") e projeções diretas. Arquivo:Services/ContatoService.cs. - Refactor:
ApplicationDbContextreescrito com 10DbSet<>, relacionamentos explícitos e índices compostos para performance. Arquivo:Data/ApplicationDbContext.cs. - Refactor:
DbInitializeratualizado para criar roles Identity (Owner, Admin, User) na inicialização. Arquivo:Data/DbInitializer.cs. - Refactor: Views de Contato (Create, Edit, Details, Delete, List) reescritas para suportar múltiplos campos, tags e badges de tenant. Arquivos:
Views/Contato/*.
- Feat: Toasts de notificação para feedback de usuário (criação, edição e exclusão de contatos). A lógica usa
TempData["Message"]nas actions do controller e Bootstrap Toasts na view de listagem. Arquivos:Views/Contato/List.cshtml,Controllers/ContatoController.cs,Views/Shared/_Layout.cshtml. - Feat: Confirmação de exclusão com página dedicada. Ao clicar em deletar na lista o usuário é redirecionado para uma página de confirmação (
GET /Contato/Delete/{id}) que mostra detalhes do contato antes de confirmar. Arquivos:Views/Contato/Delete.cshtml,Views/Contato/List.cshtml,Controllers/ContatoController.cs. - Feat: Máscara de telefone centralizada e API reutilizável em
site.js(window.PhoneMask). Agora inputs apenas precisam da classephone-maskpara receber o comportamento de máscara/format. Arquivos:wwwroot/js/site.js,Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Account/Register.cshtml. - Feat: ViewModel específico para exibição de detalhes (
ContactDetailsViewModel) e mapeamento AutoMapper para evitar expor entidades de domínio diretamente nas views. Arquivos:ViewModels/ContactDetailsViewModel.cs,Mappings/ContactMappingProfile.cs,Controllers/ContatoController.cs,Views/Contato/Details.cshtml.
- Polish: Redesign visual das páginas de Contato (Criar / Editar / Excluir / Detalhes) para um layout consistente com card, breadcrumb, ícones e botões alinhados. Arquivos:
Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Contato/Delete.cshtml,Views/Contato/Details.cshtml. - Refactor: Removidos scripts de máscara inline das views e substituídos pela função central
PhoneMask.attachnosite.js. Isso reduz duplicação e centraliza comportamento. Arquivos:wwwroot/js/site.js,Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Account/Register.cshtml. - Fix: Script de inicialização dos Toasts movido para a section
@section Scriptsdas views para garantir que obootstrap.bundle.min.jsjá tenha sido carregado antes de executar a lógica JS. Arquivo:Views/Contato/List.cshtml.
- Feat: Toasts de notificação para feedback de usuário (criação, edição e exclusão de contatos). A lógica usa
TempData["Message"]nas actions do controller e Bootstrap Toasts na view de listagem. Arquivos:Views/Contato/List.cshtml,Controllers/ContatoController.cs,Views/Shared/_Layout.cshtml. - Feat: Confirmação de exclusão com página dedicada. Ao clicar em deletar na lista o usuário é redirecionado para uma página de confirmação (
GET /Contato/Delete/{id}) que mostra detalhes do contato antes de confirmar. Arquivos:Views/Contato/Delete.cshtml,Views/Contato/List.cshtml,Controllers/ContatoController.cs. - Feat: Máscara de telefone centralizada e API reutilizável em
site.js(window.PhoneMask). Agora inputs apenas precisam da classephone-maskpara receber o comportamento de máscara/format. Arquivos:wwwroot/js/site.js,Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Account/Register.cshtml. - Feat: ViewModel específico para exibição de detalhes (
ContactDetailsViewModel) e mapeamento AutoMapper para evitar expor entidades de domínio diretamente nas views. Arquivos:ViewModels/ContactDetailsViewModel.cs,Mappings/ContactMappingProfile.cs,Controllers/ContatoController.cs,Views/Contato/Details.cshtml.
- Polish: Redesign visual das páginas de Contato (Criar / Editar / Excluir / Detalhes) para um layout consistente com card, breadcrumb, ícones e botões alinhados. Arquivos:
Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Contato/Delete.cshtml,Views/Contato/Details.cshtml. - Refactor: Removidos scripts de máscara inline das views e substituídos pela função central
PhoneMask.attachnosite.js. Isso reduz duplicação e centraliza comportamento. Arquivos:wwwroot/js/site.js,Views/Contato/Create.cshtml,Views/Contato/Edit.cshtml,Views/Account/Register.cshtml. - Fix: Script de inicialização dos Toasts movido para a section
@section Scriptsdas views para garantir que obootstrap.bundle.min.jsjá tenha sido carregado antes de executar a lógica JS. Arquivo:Views/Contato/List.cshtml.
- Fix: Correção de uma falha critica na hora de acessar a páginina inicial quando o usuário não está autenticado
- Fix: Adicionado tratamento para usuários não autenticados no
HomeControllerpara evitar falhas ao acessar a página inicial sem login. Arquivo:Controllers/HomeController.cs - Feat: Adição de uma página inicial para usuários não autenticados, com mensagem de boas-vindas e link para login/registro. Arquivo:
Views/Home/Index.cshtml
- Feat: Cadastro de Tenant durante registro de usuário, associando usuário ao tenant (claim
TenantId). Arquivo:Controllers/AccountController.cs - Fix: Corrigido fluxo de registro para criar o
Tenantdurante o registro de um novo usuário e associar o usuário ao tenant (adiciona claimTenantIdao usuário). Arquivo:Controllers/AccountController.cs - Fix: Adicionado filtro global em
Contatopara garantir que apenas contatos do tenant atual sejam acessos, reforçando a segurança e isolamento entre tenants. Arquivo:Data/ApplicationDbContext.cs - Fix: Removida cache privado
_currentTenantIde métodoSetCurrentTenantIddoTenantService;GetCurrentTenantId()agora lê diretamente a claim do usuário. Arquivo:Services/TenantService.cs - API: Adicionado
SaveChangesAsync()emITenantServicee implementado emTenantServicepara persistência explícita após criação de tenant. Arquivos:Services/ITenantService.cs,Services/TenantService.cs - Fix/Security: Ajustes em
ContatoServicepara garantir filtragem por tenant nas operações críticas (GetAll, GetById, GetByName, GetByEmail, Add, Update, Delete) e evitar vazamento de dados entre tenants. Arquivo:Services/ContatoService.cs - Fix: Removida action vazia
RegisterTenantdoAccountControllere simplificado fluxo de registro. Arquivo:Controllers/AccountController.cs - Polish: Mensagens de log no
AccountControllertraduzidas para português para consistência com o projeto. Arquivo:Controllers/AccountController.cs - Note: Global query filters não protegem consultas raw SQL (
FromSqlRaw) nem chamadas que explicitamente usem.IgnoreQueryFilters()- attention em scripts administrativos e jobs em background. - Feat: Painel (Dashboard) — adicionada seção de "Próximos Aniversariantes" no
Home/Indexcom visual consistente em Bootstrap (cards + list-group) e badges para dias restantes; arquivo:Views/Home/Index.cshtml - Feat: Novo ViewModel
BirthdayItemViewModelpara representar aniversariantes (Id, Name, Phone, BirthDate, DaysUntil, AgeTurning) e atualização deHomeDashboardViewModelpara exporClosestBirthdaytipado; arquivos:ViewModels/BirthdayItemViewModel.cs,ViewModels/HomeDashboardViewModel.cs - Feat: Serviço
GetUpcomingBirthdaysAsyncemContatoServicee assinatura emIContatoService— centraliza a lógica de cálculo do próximo aniversário (considerando mês/dia e tratamento de 29/fev) e retorna itens projetados prontos para a view; arquivo:Services/ContatoService.cs,Services/IContatoService.cs - Refactor:
HomeController.Indexsimplificado para delegar ao serviço a obtenção dos aniversariantes próximos; arquivo:Controllers/HomeController.cs - Fix/UX: Substituição da tabela de aniversariantes por uma lista formatada (melhor compatibilidade com temas/Bootstrap e dark mode) e correta formatação de datas/porcentagens; arquivo:
Views/Home/Index.cshtml - Build: Limpeza de artifacts e ajustes locais para evitar erros MSBuild relacionados a arquivos ausentes no
bin/; comando usado:dotnet clean+dotnet build.
- Entity Framework Core com SQL Server
- Microsoft.AspNetCore.Identity.EntityFrameworkCore
- Connection string para LocalDB
- HttpContextAccessor para serviços de tenant
- Logging aprimorado para EF Core(Auth)
- Configuração inicial do projeto ASP.NET Core MVC
- Estrutura básica de Controllers, Models e Views
- Configuração de Bootstrap e jQuery
- Configuração de rotas padrão
- Configuração de ambiente de desenvolvimento e produção
- Autenticação básica com Identity
- Configuração de banco de dados com Entity Framework Core
- Criação de contatos e exibição de lista de contatos
- Página inicial com boas-vindas e navegação básica