change services in db

This commit is contained in:
Max
2025-06-08 22:24:19 +03:00
parent e4e00184a5
commit 46ad6ea9f3
2 changed files with 41 additions and 59 deletions

View File

@@ -1,52 +1,46 @@
const router = require('express').Router();
const { getSupabaseClient } = require('./supabaseClient');
// Получить агрегированные сервисы с деталями и статусами оплаты для квартиры
// Получить платежки с деталями для квартиры
router.get('/payment-services', async (req, res) => {
const supabase = getSupabaseClient();
const { apartment_id, user_id } = req.query;
if (!apartment_id || !user_id) return res.status(400).json({ error: 'apartment_id и user_id обязательны' });
const { apartment_id } = req.query;
if (!apartment_id) return res.status(400).json({ error: 'apartment_id обязателен' });
// Получаем все агрегаторы
// Получаем все платежки по квартире
const { data: services, error: servicesError } = await supabase
.from('payment_services')
.select('id, name, icon');
.select('id, name, icon, amount, is_paid, payment_method')
.eq('apartment_id', apartment_id);
if (servicesError) return res.status(400).json({ error: servicesError.message });
// Получаем детали по агрегаторам
const { data: details, error: detailsError } = await supabase
.from('payment_service_details')
.select('id, service_id, name, description');
if (detailsError) return res.status(400).json({ error: detailsError.message });
// Получаем платежи пользователя по деталям
const { data: payments, error: paymentsError } = await supabase
.from('payments')
.select('id, detail_id, amount, period, status, payment_method')
.eq('apartment_id', apartment_id)
.eq('user_id', user_id);
if (paymentsError) return res.status(400).json({ error: paymentsError.message });
// Получаем детализацию по всем платежкам
const serviceIds = services.map(s => s.id);
let details = [];
if (serviceIds.length > 0) {
const { data: detailsData, error: detailsError } = await supabase
.from('payment_service_details')
.select('id, payment_service_id, name, amount')
.in('payment_service_id', serviceIds);
if (detailsError) return res.status(400).json({ error: detailsError.message });
details = detailsData;
}
// Формируем структуру для фронта
const result = services.map(service => {
const serviceDetails = details.filter(d => d.service_id === service.id).map(detail => {
const payment = payments.find(p => p.detail_id === detail.id) || {};
return {
id: detail.id,
name: detail.name,
description: detail.description,
amount: payment.amount || null,
period: payment.period || null,
status: payment.status || 'pending',
paymentMethod: payment.payment_method || null,
paymentId: payment.id || null,
};
});
const serviceDetails = details.filter(d => d.payment_service_id === service.id).map(detail => ({
id: detail.id,
name: detail.name,
amount: detail.amount
}));
return {
id: service.id,
name: service.name,
icon: service.icon,
details: serviceDetails,
amount: service.amount,
isPaid: service.is_paid,
paymentMethod: service.payment_method,
details: serviceDetails
};
});