namespace GoodBooks.PAY.PAYDAL.Query.Loyalty
{
///
/// SQL for MLOYALTYPROGRAM. Always filter by TENANTID.
/// Required indexes:
/// MLOYALTYPROGRAM: PK (LOYALTYPROGRAMID)
/// MLOYALTYPROGRAM: (TENANTID, STATUS) — covers list queries
/// MLOYALTYTIER: (LOYALTYPROGRAMID) — covers child fetches and bulk delete on update
///
public static class LoyaltyProgramQB
{
///
/// Fetches a single loyalty program header by ID and tenant.
/// Child arrays (tiers, earn configs) are fetched separately by the DAL.
/// CreatedByName and ModifiedByName are joined from MUSERS.
///
public const string GET_LOYALTY_PROGRAM = @"
SELECT LP.LOYALTYPROGRAMID AS LoyaltyProgramId,
LP.PROGRAMCODE AS ProgramCode,
LP.PROGRAMNAME AS ProgramName,
LP.PROGRAMTYPE AS ProgramType,
LP.POINTSNAME AS PointsName,
LP.POINTSEXPIREDAYS AS PointsExpireDays,
LP.MINREDEEMPOINTS AS MinRedeemPoints,
LP.POINTSTOCURRENCY AS PointsToCurrency,
LP.CURRENCYTOPOINTS AS CurrencyToPoints,
LP.ALLOWTIERING AS AllowTiering,
LP.REMARKS AS Remarks,
LP.VERSION AS Version,
LP.STATUS AS Status,
LP.SORTORDER AS SortOrder,
LP.CREATEDBYID AS CreatedById,
UC.USERNAME AS CreatedByName,
LP.CREATEDON AS CreatedOn,
LP.MODIFIEDBYID AS ModifiedById,
UM.USERNAME AS ModifiedByName,
LP.MODIFIEDON AS ModifiedOn,
LP.SOURCETYPE AS SourceType,
LP.TENANTID AS TenantId
FROM MLOYALTYPROGRAM LP
LEFT JOIN MUSERS UC ON UC.USERID = LP.CREATEDBYID
LEFT JOIN MUSERS UM ON UM.USERID = LP.MODIFIEDBYID
WHERE LP.LOYALTYPROGRAMID = @LoyaltyProgramId
AND LP.TENANTID = @TenantId";
///
/// Paged list of loyalty programs for a tenant.
/// Filtered to active records (STATUS=1) by default; admin views may pass STATUS=NULL.
/// OFFSET/FETCH paging — caller supplies @Offset and @PageSize.
/// Wrap in QueryPagedAsync which builds the COUNT(*) automatically.
///
public const string GET_LOYALTY_PROGRAM_LIST = @"
SELECT LP.LOYALTYPROGRAMID AS LoyaltyProgramId,
LP.PROGRAMCODE AS ProgramCode,
LP.PROGRAMNAME AS ProgramName,
LP.PROGRAMTYPE AS ProgramType,
LP.POINTSNAME AS PointsName,
LP.POINTSEXPIREDAYS AS PointsExpireDays,
LP.MINREDEEMPOINTS AS MinRedeemPoints,
LP.POINTSTOCURRENCY AS PointsToCurrency,
LP.CURRENCYTOPOINTS AS CurrencyToPoints,
LP.ALLOWTIERING AS AllowTiering,
LP.REMARKS AS Remarks,
LP.VERSION AS Version,
LP.STATUS AS Status,
LP.SORTORDER AS SortOrder,
LP.CREATEDBYID AS CreatedById,
LP.CREATEDON AS CreatedOn,
LP.MODIFIEDBYID AS ModifiedById,
LP.MODIFIEDON AS ModifiedOn,
LP.SOURCETYPE AS SourceType,
LP.TENANTID AS TenantId
FROM MLOYALTYPROGRAM LP
WHERE LP.TENANTID = @TenantId
AND LP.STATUS = 1
ORDER BY LP.SORTORDER, LP.PROGRAMNAME
OFFSET @Offset ROWS
FETCH NEXT @PageSize ROWS ONLY";
///
/// Inserts a new loyalty program header.
/// LOYALTYPROGRAMID is assumed to be app-generated (not IDENTITY).
/// Child tiers and earn configs are inserted separately inside the same transaction.
///
public const string INSERT_LOYALTY_PROGRAM = @"
INSERT INTO MLOYALTYPROGRAM
(
LOYALTYPROGRAMID,
PROGRAMCODE,
PROGRAMNAME,
PROGRAMTYPE,
POINTSNAME,
POINTSEXPIREDAYS,
MINREDEEMPOINTS,
POINTSTOCURRENCY,
CURRENCYTOPOINTS,
ALLOWTIERING,
REMARKS,
VERSION,
STATUS,
SORTORDER,
CREATEDBYID,
CREATEDON,
MODIFIEDBYID,
MODIFIEDON,
SOURCETYPE,
TENANTID
)
VALUES
(
@LoyaltyProgramId,
@ProgramCode,
@ProgramName,
@ProgramType,
@PointsName,
@PointsExpireDays,
@MinRedeemPoints,
@PointsToCurrency,
@CurrencyToPoints,
@AllowTiering,
@Remarks,
@Version,
@Status,
@SortOrder,
@CreatedById,
GETUTCDATE(),
@ModifiedById,
GETUTCDATE(),
@SourceType,
@TenantId
)";
///
/// Updates the loyalty program header.
/// TENANTID guard prevents cross-tenant writes.
/// After UPDATE the caller should DELETE all tiers (DELETE_LOYALTY_TIER_BY_PROGRAM)
/// and re-insert them to handle tier reordering.
///
public const string UPDATE_LOYALTY_PROGRAM = @"
UPDATE MLOYALTYPROGRAM
SET PROGRAMCODE = @ProgramCode,
PROGRAMNAME = @ProgramName,
PROGRAMTYPE = @ProgramType,
POINTSNAME = @PointsName,
POINTSEXPIREDAYS = @PointsExpireDays,
MINREDEEMPOINTS = @MinRedeemPoints,
POINTSTOCURRENCY = @PointsToCurrency,
CURRENCYTOPOINTS = @CurrencyToPoints,
ALLOWTIERING = @AllowTiering,
REMARKS = @Remarks,
VERSION = @Version,
STATUS = @Status,
SORTORDER = @SortOrder,
MODIFIEDBYID = @ModifiedById,
MODIFIEDON = GETUTCDATE(),
SOURCETYPE = @SourceType
WHERE LOYALTYPROGRAMID = @LoyaltyProgramId
AND TENANTID = @TenantId";
///
/// Deletes all tier rows for a program before re-inserting on update.
/// Safe to call inside the same transaction as INSERT_LOYALTY_TIER.
///
public const string DELETE_LOYALTY_TIER_BY_PROGRAM = @"
DELETE FROM MLOYALTYTIER
WHERE LOYALTYPROGRAMID = @LoyaltyProgramId";
}
}