Files
soft_usite/pkg/models/notif_config.go
T
2026-05-16 21:36:59 -05:00

133 lines
5.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package models
import (
"github.com/sujit-baniya/fiber-boilerplate/app"
"gorm.io/gorm"
)
// ─── NotifEventoConfig ────────────────────────────────────────────────────────
// Define qué canales activar para cada combinación evento × destinatario.
//
// Eventos disponibles (extensibles):
// ticket_nuevo → admin recibe cuando el cliente abre un ticket
// ticket_respuesta_cliente → admin recibe cuando el cliente responde
// ticket_respuesta_admin → portal_user recibe cuando admin responde
// factura_emitida → portal_user recibe cuando se emite factura
// avance_publicado → portal_user recibe cuando se publica avance
//
// Destinatarios: "admin" | "portal_user"
type NotifEventoConfig struct {
gorm.Model
Evento string `json:"evento" gorm:"column:evento;uniqueIndex:uidx_notif_ev_dest"`
Destinatario string `json:"destinatario" gorm:"column:destinatario;uniqueIndex:uidx_notif_ev_dest"`
CanalEmail bool `json:"canal_email" gorm:"column:canal_email;default:true"`
CanalTelegram bool `json:"canal_telegram" gorm:"column:canal_telegram;default:false"`
CanalSistema bool `json:"canal_sistema" gorm:"column:canal_sistema;default:true"`
Descripcion string `json:"descripcion" gorm:"column:descripcion"`
}
func (NotifEventoConfig) TableName() string { return "notif_evento_configs" }
// ─── SistemaNotificacion ──────────────────────────────────────────────────────
// Notificaciones in-app visibles en el badge del header.
// tipo_usuario = "admin" → visible para todos los admins (usuario_id = 0)
// tipo_usuario = "portal_user" → visible solo para ese portal user
type SistemaNotificacion struct {
gorm.Model
TipoUsuario string `json:"tipo_usuario" gorm:"column:tipo_usuario;index"`
UsuarioID uint `json:"usuario_id" gorm:"column:usuario_id;index"`
Titulo string `json:"titulo" gorm:"column:titulo"`
Cuerpo string `json:"cuerpo" gorm:"column:cuerpo;type:text"`
Leida bool `json:"leida" gorm:"column:leida;default:false"`
Url string `json:"url" gorm:"column:url"`
Icono string `json:"icono" gorm:"column:icono"` // emoji: 🎫 🧾 📦
}
func (SistemaNotificacion) TableName() string { return "sistema_notificaciones" }
// ─── CRUD NotifEventoConfig ───────────────────────────────────────────────────
func GetAllNotifConfigs() ([]NotifEventoConfig, error) {
var items []NotifEventoConfig
err := app.Http.Database.DB.Order("evento, destinatario").Find(&items).Error
return items, err
}
func GetNotifConfig(evento, destinatario string) *NotifEventoConfig {
var item NotifEventoConfig
if err := app.Http.Database.DB.
Where("evento = ? AND destinatario = ?", evento, destinatario).
First(&item).Error; err != nil {
return nil
}
return &item
}
// UpsertNotifConfig inserta o actualiza los canales para un evento × destinatario.
func UpsertNotifConfig(cfg *NotifEventoConfig) error {
db := app.Http.Database.DB
result := db.Model(&NotifEventoConfig{}).
Where("evento = ? AND destinatario = ?", cfg.Evento, cfg.Destinatario).
Updates(map[string]interface{}{
"canal_email": cfg.CanalEmail,
"canal_telegram": cfg.CanalTelegram,
"canal_sistema": cfg.CanalSistema,
})
if result.Error != nil {
return result.Error
}
if result.RowsAffected == 0 {
return db.Create(cfg).Error
}
return nil
}
// ─── CRUD SistemaNotificacion ─────────────────────────────────────────────────
func CreateSistemaNotif(n *SistemaNotificacion) error {
return app.Http.Database.DB.Create(n).Error
}
func GetSistemaNotifs(tipoUsuario string, usuarioID uint, soloNoLeidas bool) ([]SistemaNotificacion, error) {
var items []SistemaNotificacion
db := app.Http.Database.DB.Where("tipo_usuario = ? AND (usuario_id = ? OR usuario_id = 0)", tipoUsuario, usuarioID)
if soloNoLeidas {
db = db.Where("leida = false")
}
err := db.Order("created_at DESC").Limit(50).Find(&items).Error
return items, err
}
func CountUnreadNotifs(tipoUsuario string, usuarioID uint) int64 {
var count int64
app.Http.Database.DB.Model(&SistemaNotificacion{}).
Where("tipo_usuario = ? AND (usuario_id = ? OR usuario_id = 0) AND leida = false", tipoUsuario, usuarioID).
Count(&count)
return count
}
func MarcarNotifLeida(id uint) error {
return app.Http.Database.DB.Model(&SistemaNotificacion{}).
Where("id = ?", id).Update("leida", true).Error
}
func MarcarTodasLeidas(tipoUsuario string, usuarioID uint) error {
return app.Http.Database.DB.Model(&SistemaNotificacion{}).
Where("tipo_usuario = ? AND (usuario_id = ? OR usuario_id = 0)", tipoUsuario, usuarioID).
Update("leida", true).Error
}
func CountUnreadFacturaNotifs(usuarioID uint) int64 {
var count int64
app.Http.Database.DB.Model(&SistemaNotificacion{}).
Where("tipo_usuario = 'portal_user' AND usuario_id = ? AND icono = '🧾' AND leida = false", usuarioID).
Count(&count)
return count
}
func MarcarNotifsFacturasLeidas(usuarioID uint) error {
return app.Http.Database.DB.Model(&SistemaNotificacion{}).
Where("tipo_usuario = 'portal_user' AND usuario_id = ? AND icono = '🧾'", usuarioID).
Update("leida", true).Error
}