Apply Supabase schema changes
Apply the SQL schema changes to Supabase, including the creation of the `grupos_whatsapp` table and the addition of the `grupo_id` column to the `transacoes` table.
This commit is contained in:
parent
908904f9b9
commit
5a16246b23
@ -30,7 +30,8 @@ const transactionSchema = z.object({
|
||||
detalhes: z.string().min(1, { message: 'Detalhes são obrigatórios' }),
|
||||
categoria: z.string().min(1, { message: 'Categoria é obrigatória' }),
|
||||
tipo: z.string().min(1, { message: 'Tipo é obrigatório' }),
|
||||
quando: z.string().min(1, { message: 'Data é obrigatória' })
|
||||
quando: z.string().min(1, { message: 'Data é obrigatória' }),
|
||||
grupo_id: z.string().optional()
|
||||
});
|
||||
|
||||
type TransactionFormValues = z.infer<typeof transactionSchema>;
|
||||
@ -39,13 +40,34 @@ interface TransactionFormProps {
|
||||
onSuccess: () => void;
|
||||
onCancel: () => void;
|
||||
defaultTipo?: 'receita' | 'despesa';
|
||||
grupoId?: string;
|
||||
}
|
||||
|
||||
export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa' }: TransactionFormProps) {
|
||||
export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa', grupoId }: TransactionFormProps) {
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const [grupos, setGrupos] = useState<{remote_jid: string, nome_grupo: string | null}[]>([]);
|
||||
const { toast } = useToast();
|
||||
const navigate = useNavigate();
|
||||
|
||||
// Buscar grupos do usuário ao carregar o formulário
|
||||
useState(() => {
|
||||
const fetchGrupos = async () => {
|
||||
const userId = localStorage.getItem('userId') || 'default';
|
||||
const { data, error } = await supabase
|
||||
.from('grupos_whatsapp')
|
||||
.select('remote_jid, nome_grupo')
|
||||
.eq('user_id', userId);
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao buscar grupos:', error);
|
||||
} else if (data) {
|
||||
setGrupos(data);
|
||||
}
|
||||
};
|
||||
|
||||
fetchGrupos();
|
||||
});
|
||||
|
||||
const form = useForm<TransactionFormValues>({
|
||||
resolver: zodResolver(transactionSchema),
|
||||
defaultValues: {
|
||||
@ -54,7 +76,8 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa' }
|
||||
detalhes: '',
|
||||
categoria: '',
|
||||
tipo: defaultTipo,
|
||||
quando: new Date().toISOString().split('T')[0]
|
||||
quando: new Date().toISOString().split('T')[0],
|
||||
grupo_id: grupoId || ''
|
||||
}
|
||||
});
|
||||
|
||||
@ -85,20 +108,24 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa' }
|
||||
|
||||
console.log(`Salvando transação para usuário: ${userId} (${userEmail || userName})`);
|
||||
|
||||
// Preparar dados da transação incluindo o grupo_id se fornecido
|
||||
const transactionData = {
|
||||
user: userId,
|
||||
estabelecimento: data.estabelecimento,
|
||||
valor: valorFinal,
|
||||
detalhes: data.detalhes,
|
||||
categoria: data.categoria,
|
||||
tipo: data.tipo,
|
||||
quando: data.quando,
|
||||
grupo_id: data.grupo_id || null
|
||||
};
|
||||
|
||||
console.log('Dados da transação a serem salvos:', transactionData);
|
||||
|
||||
// With RLS disabled, we can insert directly to the fixed table
|
||||
const { error } = await supabase
|
||||
.from('transacoes') // Using a fixed table name instead of dynamic one
|
||||
.insert([
|
||||
{
|
||||
user: userId, // Store user ID as reference only
|
||||
estabelecimento: data.estabelecimento,
|
||||
valor: valorFinal,
|
||||
detalhes: data.detalhes,
|
||||
categoria: data.categoria,
|
||||
tipo: data.tipo,
|
||||
quando: data.quando
|
||||
}
|
||||
]);
|
||||
.from('transacoes')
|
||||
.insert([transactionData]);
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao salvar transação:', error);
|
||||
@ -230,6 +257,37 @@ export function TransactionForm({ onSuccess, onCancel, defaultTipo = 'despesa' }
|
||||
)}
|
||||
/>
|
||||
|
||||
{grupos.length > 0 && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
name="grupo_id"
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>Grupo WhatsApp (opcional)</FormLabel>
|
||||
<Select
|
||||
onValueChange={field.onChange}
|
||||
value={field.value || ""}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Selecione um grupo (opcional)" />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent>
|
||||
<SelectItem value="">Nenhum grupo</SelectItem>
|
||||
{grupos.map((grupo) => (
|
||||
<SelectItem key={grupo.remote_jid} value={grupo.remote_jid}>
|
||||
{grupo.nome_grupo || grupo.remote_jid}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
|
||||
<div className="flex justify-end space-x-2 pt-2">
|
||||
<Button variant="outline" type="button" onClick={onCancel} disabled={isSubmitting}>
|
||||
Cancelar
|
||||
|
||||
@ -120,6 +120,30 @@ export type Database = {
|
||||
}
|
||||
Relationships: []
|
||||
}
|
||||
grupos_whatsapp: {
|
||||
Row: {
|
||||
created_at: string | null
|
||||
id: number
|
||||
nome_grupo: string | null
|
||||
remote_jid: string
|
||||
user_id: string
|
||||
}
|
||||
Insert: {
|
||||
created_at?: string | null
|
||||
id?: number
|
||||
nome_grupo?: string | null
|
||||
remote_jid: string
|
||||
user_id: string
|
||||
}
|
||||
Update: {
|
||||
created_at?: string | null
|
||||
id?: number
|
||||
nome_grupo?: string | null
|
||||
remote_jid?: string
|
||||
user_id?: string
|
||||
}
|
||||
Relationships: []
|
||||
}
|
||||
metas: {
|
||||
Row: {
|
||||
ano: number
|
||||
@ -189,6 +213,7 @@ export type Database = {
|
||||
created_at: string
|
||||
detalhes: string | null
|
||||
estabelecimento: string | null
|
||||
grupo_id: string | null
|
||||
id: number
|
||||
login: string | null
|
||||
quando: string | null
|
||||
@ -201,6 +226,7 @@ export type Database = {
|
||||
created_at?: string
|
||||
detalhes?: string | null
|
||||
estabelecimento?: string | null
|
||||
grupo_id?: string | null
|
||||
id?: number
|
||||
login?: string | null
|
||||
quando?: string | null
|
||||
@ -213,6 +239,7 @@ export type Database = {
|
||||
created_at?: string
|
||||
detalhes?: string | null
|
||||
estabelecimento?: string | null
|
||||
grupo_id?: string | null
|
||||
id?: number
|
||||
login?: string | null
|
||||
quando?: string | null
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
|
||||
import { supabase } from "@/integrations/supabase/client";
|
||||
import { Transaction, CategorySummary } from "@/types/financialTypes";
|
||||
|
||||
@ -9,11 +10,25 @@ export async function getTransacoes(): Promise<Transaction[]> {
|
||||
console.log("Buscando transações para o usuário:", userId);
|
||||
|
||||
try {
|
||||
// Buscar transações filtrando pelo usuário atual
|
||||
// Primeiro, buscar todos os grupos do usuário
|
||||
const { data: userGroups, error: groupsError } = await supabase
|
||||
.from('grupos_whatsapp')
|
||||
.select('remote_jid')
|
||||
.eq('user_id', userId);
|
||||
|
||||
if (groupsError) {
|
||||
console.error('Erro ao buscar grupos do usuário:', groupsError);
|
||||
}
|
||||
|
||||
// Extrair IDs dos grupos para usar no filtro
|
||||
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
|
||||
console.log(`Encontrados ${groupIds.length} grupos vinculados ao usuário:`, groupIds);
|
||||
|
||||
// Buscar transações com filtro aprimorado
|
||||
const { data, error } = await supabase
|
||||
.from('transacoes')
|
||||
.select('*')
|
||||
.eq('user', userId) // Filtrar pelo ID do usuário
|
||||
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`)
|
||||
.order('quando', { ascending: false });
|
||||
|
||||
if (error) {
|
||||
@ -33,7 +48,8 @@ export async function getTransacoes(): Promise<Transaction[]> {
|
||||
detalhes: item.detalhes || '',
|
||||
estabelecimento: item.estabelecimento || '',
|
||||
tipo: item.tipo?.toLowerCase() || 'despesa',
|
||||
categoria: item.categoria || 'Outros'
|
||||
categoria: item.categoria || 'Outros',
|
||||
grupo_id: item.grupo_id || null
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Erro ao buscar transações:', error);
|
||||
@ -48,11 +64,24 @@ export async function getTransactionSummary() {
|
||||
const userId = localStorage.getItem('userId') || 'default';
|
||||
|
||||
try {
|
||||
// Buscar resumo filtrando pelo usuário atual
|
||||
// Primeiro, buscar todos os grupos do usuário
|
||||
const { data: userGroups, error: groupsError } = await supabase
|
||||
.from('grupos_whatsapp')
|
||||
.select('remote_jid')
|
||||
.eq('user_id', userId);
|
||||
|
||||
if (groupsError) {
|
||||
console.error('Erro ao buscar grupos do usuário:', groupsError);
|
||||
}
|
||||
|
||||
// Extrair IDs dos grupos para usar no filtro
|
||||
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
|
||||
|
||||
// Buscar resumo das transações com filtro aprimorado
|
||||
const { data, error } = await supabase
|
||||
.from('transacoes')
|
||||
.select('tipo, valor')
|
||||
.eq('user', userId); // Filtrar pelo ID do usuário
|
||||
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao buscar resumo das transações:', error);
|
||||
@ -90,11 +119,24 @@ export async function getCategorySummary(tipoFiltro: string = 'despesa') {
|
||||
const userId = localStorage.getItem('userId') || 'default';
|
||||
|
||||
try {
|
||||
// Buscar resumo de categorias filtrando pelo usuário atual
|
||||
// Primeiro, buscar todos os grupos do usuário
|
||||
const { data: userGroups, error: groupsError } = await supabase
|
||||
.from('grupos_whatsapp')
|
||||
.select('remote_jid')
|
||||
.eq('user_id', userId);
|
||||
|
||||
if (groupsError) {
|
||||
console.error('Erro ao buscar grupos do usuário:', groupsError);
|
||||
}
|
||||
|
||||
// Extrair IDs dos grupos para usar no filtro
|
||||
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
|
||||
|
||||
// Buscar resumo de categorias com filtro aprimorado
|
||||
const { data, error } = await supabase
|
||||
.from('transacoes')
|
||||
.select('categoria, valor, tipo')
|
||||
.eq('user', userId); // Filtrar pelo ID do usuário
|
||||
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao buscar resumo de categorias:', error);
|
||||
@ -154,11 +196,24 @@ export async function getMonthlyData() {
|
||||
const userId = localStorage.getItem('userId') || 'default';
|
||||
|
||||
try {
|
||||
// Buscar dados mensais filtrando pelo usuário atual
|
||||
// Primeiro, buscar todos os grupos do usuário
|
||||
const { data: userGroups, error: groupsError } = await supabase
|
||||
.from('grupos_whatsapp')
|
||||
.select('remote_jid')
|
||||
.eq('user_id', userId);
|
||||
|
||||
if (groupsError) {
|
||||
console.error('Erro ao buscar grupos do usuário:', groupsError);
|
||||
}
|
||||
|
||||
// Extrair IDs dos grupos para usar no filtro
|
||||
const groupIds = userGroups ? userGroups.map(group => group.remote_jid) : [];
|
||||
|
||||
// Buscar dados mensais com filtro aprimorado
|
||||
const { data, error } = await supabase
|
||||
.from('transacoes')
|
||||
.select('quando, valor, tipo')
|
||||
.eq('user', userId); // Filtrar pelo ID do usuário
|
||||
.or(`user.eq.${userId},${groupIds.length > 0 ? `grupo_id.in.(${groupIds.map(id => `"${id}"`).join(',')})` : ''}`);
|
||||
|
||||
if (error) {
|
||||
console.error('Erro ao buscar dados mensais:', error);
|
||||
|
||||
@ -9,6 +9,7 @@ export interface Transaction {
|
||||
estabelecimento: string;
|
||||
tipo: string;
|
||||
categoria: string;
|
||||
grupo_id?: string | null;
|
||||
}
|
||||
|
||||
export interface TransactionSummary {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user