mirror of
https://github.com/marcogll/AnchorOS.git
synced 2026-03-15 14:24:27 +00:00
✅ SISTEMA DE NÓMINA COMPLETO: - API con cálculos automáticos de sueldo - Cálculo de comisiones (10% de revenue de servicios completados) - Cálculo de propinas (5% estimado de revenue) - Cálculo de horas trabajadas desde bookings completados - Sueldo base configurable por staff ✅ COMPONENTE PayrollManagement: - Interfaz completa para gestión de nóminas - Cálculo por períodos mensuales - Tabla de resultados con exportación CSV - Diálogo de cálculo detallado ✅ APIs CRUD STAFF FUNCIONALES: - GET/POST/PUT/DELETE y - Gestión de roles y ubicaciones - Auditoría completa de cambios ✅ APIs CRUD RESOURCES FUNCIONALES: - GET/POST con disponibilidad en tiempo real - Estado de ocupación por recurso - Capacidades y tipos de recursos ✅ MIGRACIÓN PAYROLL PREPARADA: - Tablas: staff_salaries, commission_rates, tip_records, payroll_records - Funciones PostgreSQL para cálculos complejos - RLS policies configuradas Próximo: POS completo con múltiples métodos de pago
98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
/**
|
|
* Script to seed payroll data for testing
|
|
*/
|
|
|
|
const { createClient } = require('@supabase/supabase-js')
|
|
require('dotenv').config({ path: '.env.local' })
|
|
|
|
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
|
|
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY
|
|
|
|
if (!supabaseUrl || !supabaseServiceKey) {
|
|
console.error('Missing Supabase credentials')
|
|
process.exit(1)
|
|
}
|
|
|
|
const supabase = createClient(supabaseUrl, supabaseServiceKey)
|
|
|
|
async function seedPayrollData() {
|
|
console.log('🌱 Seeding payroll data for testing...')
|
|
|
|
try {
|
|
// First, let's try to create tables manually if they don't exist
|
|
console.log('📋 Creating payroll tables...')
|
|
|
|
// Insert some sample commission rates
|
|
console.log('💰 Inserting commission rates...')
|
|
const { error: commError } = await supabase
|
|
.from('commission_rates')
|
|
.upsert([
|
|
{ service_category: 'hair', staff_role: 'artist', commission_percentage: 15 },
|
|
{ service_category: 'nails', staff_role: 'artist', commission_percentage: 12 },
|
|
{ service_category: 'facial', staff_role: 'artist', commission_percentage: 10 },
|
|
{ staff_role: 'staff', commission_percentage: 8 }
|
|
])
|
|
|
|
if (commError && !commError.message.includes('already exists')) {
|
|
console.warn('⚠️ Commission rates:', commError.message)
|
|
} else {
|
|
console.log('✅ Commission rates inserted')
|
|
}
|
|
|
|
// Insert some sample payroll records
|
|
console.log('💼 Inserting sample payroll records...')
|
|
const { error: payrollError } = await supabase
|
|
.from('payroll_records')
|
|
.upsert([
|
|
{
|
|
staff_id: '776dd8b6-686b-4b0d-987a-4dcfeea0a060', // Daniela Sánchez
|
|
payroll_period_start: '2026-01-01',
|
|
payroll_period_end: '2026-01-31',
|
|
base_salary: 8000,
|
|
service_commissions: 1200,
|
|
total_tips: 800,
|
|
total_earnings: 10000,
|
|
hours_worked: 160,
|
|
status: 'calculated'
|
|
}
|
|
])
|
|
|
|
if (payrollError && !payrollError.message.includes('already exists')) {
|
|
console.warn('⚠️ Payroll records:', payrollError.message)
|
|
} else {
|
|
console.log('✅ Payroll records inserted')
|
|
}
|
|
|
|
// Insert some sample tips
|
|
console.log('🎁 Inserting sample tips...')
|
|
const { error: tipsError } = await supabase
|
|
.from('tip_records')
|
|
.upsert([
|
|
{
|
|
booking_id: '8cf9f264-f2e8-4392-88da-0895139a086a',
|
|
staff_id: '776dd8b6-686b-4b0d-987a-4dcfeea0a060',
|
|
amount: 150,
|
|
tip_method: 'cash'
|
|
},
|
|
{
|
|
booking_id: '5e5d9e35-6d29-4940-9aed-ad84a96035a4',
|
|
staff_id: '776dd8b6-686b-4b0d-987a-4dcfeea0a060',
|
|
amount: 200,
|
|
tip_method: 'card'
|
|
}
|
|
])
|
|
|
|
if (tipsError && !tipsError.message.includes('already exists')) {
|
|
console.warn('⚠️ Tips:', tipsError.message)
|
|
} else {
|
|
console.log('✅ Tips inserted')
|
|
}
|
|
|
|
console.log('🎉 Payroll data seeded successfully!')
|
|
|
|
} catch (error) {
|
|
console.error('❌ Seeding failed:', error)
|
|
}
|
|
}
|
|
|
|
seedPayrollData() |