package repository import ( "context" "enaklo-pos-be/internal/common/logger" "enaklo-pos-be/internal/common/mycontext" "enaklo-pos-be/internal/entity" "fmt" "time" "go.uber.org/zap" "gorm.io/gorm" ) type UndianRepo interface { GetUndianEventByID(ctx context.Context, id int64) (*entity.UndianEventDB, error) GetActiveUndianEvents(ctx context.Context) ([]*entity.UndianEventDB, error) CreateUndianVouchers(ctx context.Context, vouchers []*entity.UndianVoucherDB) error GetNextVoucherSequence(ctx mycontext.Context) (int64, error) GetNextVoucherSequenceBatch(ctx mycontext.Context, count int) (int64, error) } type undianRepository struct { db *gorm.DB } func NewUndianRepository(db *gorm.DB) *undianRepository { return &undianRepository{ db: db, } } func (r *undianRepository) GetUndianEventByID(ctx context.Context, id int64) (*entity.UndianEventDB, error) { event := new(entity.UndianEventDB) if err := r.db.WithContext(ctx).First(event, id).Error; err != nil { logger.ContextLogger(ctx).Error("error when get undian event by id", zap.Error(err)) return nil, err } return event, nil } func (r *undianRepository) GetActiveUndianEvents(ctx context.Context) ([]*entity.UndianEventDB, error) { var events []*entity.UndianEventDB now := time.Now() if err := r.db.WithContext(ctx). Where("status = 'active' AND start_date <= ? AND end_date >= ?", now, now). Find(&events).Error; err != nil { logger.ContextLogger(ctx).Error("error when get active undian events", zap.Error(err)) return nil, err } return events, nil } func (r *undianRepository) CreateUndianVouchers(ctx context.Context, vouchers []*entity.UndianVoucherDB) error { err := r.db.WithContext(ctx).Create(&vouchers).Error if err != nil { logger.ContextLogger(ctx).Error("error when create undian vouchers", zap.Error(err)) return err } return nil } func (r *undianRepository) GetNextVoucherSequence(ctx mycontext.Context) (int64, error) { var sequence int64 err := r.db.WithContext(ctx).Raw("SELECT nextval('voucher_sequence')").Scan(&sequence).Error if err != nil { logger.ContextLogger(ctx).Error("error when get next voucher sequence", zap.Error(err)) return 0, err } return sequence, nil } func (r *undianRepository) GetNextVoucherSequenceBatch(ctx mycontext.Context, count int) (int64, error) { var startSequence int64 query := fmt.Sprintf("SELECT nextval('voucher_sequence') + %d - %d", count-1, count-1) err := r.db.WithContext(ctx).Raw(query).Scan(&startSequence).Error if err != nil { logger.ContextLogger(ctx).Error("error when get batch voucher sequence", zap.Error(err)) return 0, err } return startSequence, nil }