diff --git a/backend/internal/profissionais/handler.go b/backend/internal/profissionais/handler.go index fe405ec..840a319 100644 --- a/backend/internal/profissionais/handler.go +++ b/backend/internal/profissionais/handler.go @@ -282,21 +282,24 @@ func (h *Handler) Create(c *gin.Context) { } // Security: Only allow TargetUserID if user is ADMIN or OWNER + // Also handle Region override + userRole, _ := c.Get("role") + roleStr, _ := userRole.(string) + if input.TargetUserID != nil && *input.TargetUserID != "" { - userRole, exists := c.Get("role") - if !exists { - // Should validation fail? Or just ignore target? - // Safer to ignore target user ID if role not found + if roleStr != "SUPERADMIN" && roleStr != "BUSINESS_OWNER" { input.TargetUserID = nil - } else { - roleStr, ok := userRole.(string) - if !ok || (roleStr != "SUPERADMIN" && roleStr != "BUSINESS_OWNER") { - input.TargetUserID = nil - } } } regiao := c.GetString("regiao") + // If input has regiao and user is admin, use it + if input.Regiao != nil && *input.Regiao != "" { + if roleStr == "SUPERADMIN" || roleStr == "BUSINESS_OWNER" { + regiao = *input.Regiao + } + } + prof, err := h.service.Create(c.Request.Context(), userIDStr, input, regiao) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) diff --git a/backend/internal/profissionais/service.go b/backend/internal/profissionais/service.go index 93ce234..cd34919 100644 --- a/backend/internal/profissionais/service.go +++ b/backend/internal/profissionais/service.go @@ -47,6 +47,7 @@ type CreateProfissionalInput struct { Email *string `json:"email"` AvatarURL *string `json:"avatar_url"` TargetUserID *string `json:"target_user_id"` // Optional: For admin creation + Regiao *string `json:"regiao"` // Optional: Override region } func (s *Service) Create(ctx context.Context, userID string, input CreateProfissionalInput, regiao string) (*generated.GetProfissionalByIDRow, error) { diff --git a/frontend/components/ProfessionalModal.tsx b/frontend/components/ProfessionalModal.tsx index 5796bd8..b4143ea 100644 --- a/frontend/components/ProfessionalModal.tsx +++ b/frontend/components/ProfessionalModal.tsx @@ -35,11 +35,12 @@ export const ProfessionalModal: React.FC = ({ roles, onSuccess, }) => { - const { token: contextToken } = useAuth(); + const { token: contextToken, user } = useAuth(); // Get User const token = contextToken || ""; const initialFormState: CreateProfessionalDTO & { senha?: string; confirmarSenha?: string } = { nome: "", + regiao: "", funcao_profissional_id: "", funcoes_ids: [], email: "", @@ -87,6 +88,7 @@ export const ProfessionalModal: React.FC = ({ // Edit Mode setFormData({ nome: professional.nome, + regiao: professional.regiao || "", funcao_profissional_id: professional.funcao_profissional_id, funcoes_ids: professional.functions?.map(f => f.id) || (professional.funcao_profissional_id ? [professional.funcao_profissional_id] : []), email: professional.email || "", @@ -119,12 +121,13 @@ export const ProfessionalModal: React.FC = ({ setAvatarPreview(professional.avatar_url || (professional.avatar ?? GenericAvatar)); } else { // Add Mode - setFormData(initialFormState); + const defaultRegion = user?.allowedRegions && user.allowedRegions.length > 0 ? user.allowedRegions[0] : "SP"; + setFormData({ ...initialFormState, regiao: defaultRegion }); setAvatarPreview(""); } setAvatarFile(null); } - }, [isOpen, professional]); + }, [isOpen, professional]); // user dependency intentionally omitted to avoid reset loop, but safe to add if needed // Helpers const maskPhone = (value: string) => { @@ -387,6 +390,22 @@ export const ProfessionalModal: React.FC = ({ + {/* Region Selection (Only for Multi-Region Admins) */} + {(user?.allowedRegions && user.allowedRegions.length > 1) || user?.role === "SUPERADMIN" ? ( +
+ + +

Selecione onde este profissional irá atuar.

+
+ ) : null} + {/* Seleção de Função (Movida para o topo) */}