Adiciona o frontend Next.js em frontend/ (setup, design system, autenticação/tema, layout/navegação, área master, área tenant completa: clientes, produtos, vendas, recebimentos, whatsapp, e-mail, alertas, equipe e perfil). Estende o backend de forma aditiva e autorizada: cookie httpOnly para refresh token (Etapa 13) e CRUD de equipe + edição de perfil do tenant (Etapa 18, módulo src/modules/equipe/ novo e PUT /tenant/perfil). Detalhes completos em Etapas/V2/*. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { apiClient } from '@/lib/api/client';
|
|
import { buildQuery, type PaginatedResult } from '@/lib/api/types';
|
|
import {
|
|
TIPO_TEMPLATE_LABEL,
|
|
TIPOS_TEMPLATE,
|
|
type AlertTemplate,
|
|
type CanalTemplate,
|
|
type TipoTemplate,
|
|
} from '@/lib/api/alert-templates';
|
|
|
|
export {
|
|
CANAIS_TEMPLATE,
|
|
CANAL_TEMPLATE_LABEL,
|
|
PLACEHOLDERS_POR_TIPO,
|
|
TIPO_TEMPLATE_LABEL,
|
|
} from '@/lib/api/alert-templates';
|
|
export type { AlertTemplate, CanalTemplate, TipoTemplate } from '@/lib/api/alert-templates';
|
|
|
|
/**
|
|
* `mensalidade_tenant` fica de fora — é o master notificando o tenant sobre
|
|
* a própria mensalidade, o tenant não define esse template (espelha
|
|
* `TIPOS_TEMPLATE_TENANT` em `src/modules/alerts/alert-template-tipos.ts`).
|
|
*/
|
|
export const TIPOS_TEMPLATE_TENANT = TIPOS_TEMPLATE.filter(
|
|
(tipo) => tipo !== 'mensalidade_tenant',
|
|
);
|
|
export type TipoTemplateTenant = (typeof TIPOS_TEMPLATE_TENANT)[number];
|
|
|
|
export const TIPO_TEMPLATE_TENANT_LABEL: Record<TipoTemplateTenant, string> =
|
|
Object.fromEntries(
|
|
TIPOS_TEMPLATE_TENANT.map((tipo) => [tipo, TIPO_TEMPLATE_LABEL[tipo]]),
|
|
) as Record<TipoTemplateTenant, string>;
|
|
|
|
/** Espelha `CreateTenantAlertTemplateDto`/`UpdateTenantAlertTemplateDto`. */
|
|
export interface TenantAlertTemplateInput {
|
|
tipo: TipoTemplateTenant;
|
|
canal: CanalTemplate;
|
|
/** Obrigatório só quando `canal === 'email'`. */
|
|
assunto?: string;
|
|
corpo: string;
|
|
ativo?: boolean;
|
|
}
|
|
|
|
export interface ListTenantAlertTemplatesParams {
|
|
tipo?: TipoTemplate;
|
|
canal?: CanalTemplate;
|
|
ativo?: boolean;
|
|
page?: number;
|
|
limit?: number;
|
|
}
|
|
|
|
export function listTenantAlertTemplates(params: ListTenantAlertTemplatesParams) {
|
|
return apiClient.get<PaginatedResult<AlertTemplate>>(
|
|
`/tenant/alertas/templates${buildQuery(params)}`,
|
|
);
|
|
}
|
|
|
|
export function createTenantAlertTemplate(input: TenantAlertTemplateInput) {
|
|
return apiClient.post<AlertTemplate>('/tenant/alertas/templates', input);
|
|
}
|
|
|
|
export function updateTenantAlertTemplate(id: string, input: Partial<TenantAlertTemplateInput>) {
|
|
return apiClient.put<AlertTemplate>(`/tenant/alertas/templates/${id}`, input);
|
|
}
|
|
|
|
/** Soft delete no backend (`ativo: false`) — não remove o registro. */
|
|
export function deleteTenantAlertTemplate(id: string) {
|
|
return apiClient.delete<AlertTemplate>(`/tenant/alertas/templates/${id}`);
|
|
}
|