This commit is contained in:
s.esmaeili
2026-10-02 16:38:53 +03:30
195 changed files with 258013 additions and 344 deletions
+13
View File
@@ -0,0 +1,13 @@
export declare function toFarsiDigits(val: number | string | null | undefined | any): string;
/**
* قالب‌بندی اعداد با جداکننده هزارگان و ارقام فارسی
*/
export declare function formatFarsiNumber(val: number | string | null | undefined | any): string;
/**
* تبدیل ارقام فارسی (۰-۹) و عربی (٠-٩) به ارقام استاندارد انگلیسی (0-9)
*/
export declare function toEnglishDigits(val: number | string | null | undefined): string;
/**
* پارس مطمئن مقادیر عددی از ورودی‌ها (پشتیبانی از هر دو فرمت فارسی و انگلیسی)
*/
export declare function parseFarsiNumber(val: number | string | null | undefined, fallback?: number): number;
+66
View File
@@ -0,0 +1,66 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.toFarsiDigits = toFarsiDigits;
exports.formatFarsiNumber = formatFarsiNumber;
exports.toEnglishDigits = toEnglishDigits;
exports.parseFarsiNumber = parseFarsiNumber;
/**
* تبدیل تمامی ارقام انگلیسی (0-9) و عربی (٠-٩) به ارقام استاندارد فارسی (۰-۹)
*/
const FARSI_DIGITS = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
function toFarsiDigits(val) {
if (val === null || val === undefined)
return '';
if (typeof val === 'object' && val !== null && 'value' in val) {
val = val.value;
if (val === null || val === undefined)
return '';
}
if (typeof val === 'object')
return '';
return String(val)
.replace(/[0-9]/g, (d) => FARSI_DIGITS[+d])
.replace(/[٠-٩]/g, (d) => FARSI_DIGITS[d.charCodeAt(0) - 1632]);
}
/**
* قالب‌بندی اعداد با جداکننده هزارگان و ارقام فارسی
*/
function formatFarsiNumber(val) {
if (val === null || val === undefined || val === '')
return '';
if (typeof val === 'object' && val !== null && 'value' in val) {
val = val.value;
if (val === null || val === undefined || val === '')
return '';
}
if (typeof val === 'object')
return '';
const num = typeof val === 'string' ? parseFloat(toEnglishDigits(val)) : val;
if (isNaN(num))
return toFarsiDigits(val);
const formatted = new Intl.NumberFormat('fa-IR').format(num);
return toFarsiDigits(formatted);
}
/**
* تبدیل ارقام فارسی (۰-۹) و عربی (٠-٩) به ارقام استاندارد انگلیسی (0-9)
*/
function toEnglishDigits(val) {
if (val === null || val === undefined)
return '';
return String(val)
.replace(/[۰-۹]/g, (d) => String(d.charCodeAt(0) - 1776))
.replace(/[٠-٩]/g, (d) => String(d.charCodeAt(0) - 1632));
}
/**
* پارس مطمئن مقادیر عددی از ورودی‌ها (پشتیبانی از هر دو فرمت فارسی و انگلیسی)
*/
function parseFarsiNumber(val, fallback = 0) {
if (val === null || val === undefined || val === '')
return fallback;
if (typeof val === 'number')
return isNaN(val) ? fallback : val;
const enStr = toEnglishDigits(val).replace(/[^0-9.-]/g, '');
const parsed = Number(enStr);
return isNaN(parsed) ? fallback : parsed;
}
//# sourceMappingURL=farsi-number.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"farsi-number.js","sourceRoot":"","sources":["../src/farsi-number.ts"],"names":[],"mappings":"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"}
+171
View File
@@ -0,0 +1,171 @@
export declare enum AdminStatus {
ACTIVE = "ACTIVE",
DISABLED = "DISABLED"
}
export declare enum AdminRole {
SUPER_ADMIN = "SUPER_ADMIN",
OPERATOR = "OPERATOR",
SUPPORT = "SUPPORT"
}
export declare enum UserStatus {
ACTIVE = "ACTIVE",
BLOCKED = "BLOCKED"
}
export declare enum CampaignStatus {
DRAFT = "DRAFT",
ACTIVE = "ACTIVE",
PAUSED = "PAUSED",
FINISHED = "FINISHED"
}
export declare enum PrizeType {
PHYSICAL = "PHYSICAL",
DISCOUNT_CODE = "DISCOUNT_CODE",
CREDIT = "CREDIT",
CASH = "CASH",
NO_PRIZE = "NO_PRIZE",
OTHER = "OTHER"
}
export declare enum StockType {
LIMITED = "LIMITED",
UNLIMITED = "UNLIMITED"
}
export declare enum PrizeStatus {
ACTIVE = "ACTIVE",
INACTIVE = "INACTIVE"
}
export declare enum SpinStatus {
SUCCESS = "SUCCESS",
FAILED = "FAILED",
DUPLICATE = "DUPLICATE"
}
export declare enum ChanceTxnType {
SIGNUP_BONUS = "SIGNUP_BONUS",
ADMIN_ADJUSTMENT = "ADMIN_ADJUSTMENT",
SPIN_CONSUME = "SPIN_CONSUME",
CAMPAIGN_BONUS = "CAMPAIGN_BONUS",
REFUND = "REFUND"
}
export declare enum UserPrizeStatus {
NEW = "NEW",
CONTACTED = "CONTACTED",
DELIVERED = "DELIVERED",
ACTIVE_CODE = "ACTIVE_CODE",
USED = "USED",
EXPIRED = "EXPIRED"
}
export declare enum SmsType {
OTP = "OTP",
WINNING = "WINNING",
NO_PRIZE = "NO_PRIZE",
PRIZE_REMINDER = "PRIZE_REMINDER"
}
export declare enum SmsStatus {
PENDING = "PENDING",
SENT = "SENT",
FAILED = "FAILED"
}
export declare enum WheelDesign {
CLASSIC_CASINO = "CLASSIC_CASINO",
NEON_CYBER = "NEON_CYBER",
MINIMAL_FLAT = "MINIMAL_FLAT",
LUXURY_GOLD = "LUXURY_GOLD",
PLAYFUL_CARTOON = "PLAYFUL_CARTOON",
RUSTIC_WOOD = "RUSTIC_WOOD",
GALAXY_SPACE = "GALAXY_SPACE",
CANDY_LAND = "CANDY_LAND",
FIRE_FLAME = "FIRE_FLAME",
CRYSTAL_ICE = "CRYSTAL_ICE"
}
export interface WheelSegment {
id: string;
title: string;
image?: string | null;
color: string;
sortOrder: number;
}
export interface WheelDesignProps {
segments: WheelSegment[];
targetSegmentIndex: number | null;
spinning: boolean;
}
export interface PublicCampaignWheelDto {
id: string;
title: string;
slug: string;
description: string | null;
logo: string | null;
banner: string | null;
wheelDesign: WheelDesign;
settings: Record<string, any> | null;
rules: string | null;
ctaText: string | null;
startAt: string;
endAt: string;
segments: WheelSegment[];
}
export interface SpinRequestDto {
idempotencyKey: string;
}
export interface PrizeResultDto {
id: string;
title: string;
segment: number;
code: string | null;
type: PrizeType;
image: string | null;
}
export interface SpinResponseDto {
success: boolean;
spinId: string;
prize: PrizeResultDto | null;
remainingChances: number;
}
export interface UserChancesDto {
totalChances: number;
usedChances: number;
remainingChances: number;
}
export interface UserPrizeItemDto {
id: string;
prizeTitle: string;
prizeImage: string | null;
prizeType: PrizeType;
code: string | null;
status: UserPrizeStatus;
wonAt: string;
expiresAt: string | null;
campaignTitle: string;
}
export interface PaginationMeta {
page: number;
pageSize: number;
total: number;
totalPages: number;
}
export interface PaginatedResponse<T> {
data: T[];
meta: PaginationMeta;
}
export interface DashboardStatsDto {
totalUsers: number;
todayUsers: number;
totalSpins: number;
todaySpins: number;
totalWinners: number;
totalDistributedPrizes: number;
consumedChances: number;
activePrizesCount: number;
activeCampaignsCount?: number;
winRate?: number;
}
export interface SpinsByDayDataPoint {
date: string;
spins: number;
winners: number;
}
export interface PrizeDistributionDataPoint {
prizeTitle: string;
count: number;
percentage: number;
}
export * from './farsi-number';
+113
View File
@@ -0,0 +1,113 @@
"use strict";
// ==========================================
// Shared Enums (Synchronized with Prisma Schema)
// ==========================================
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WheelDesign = exports.SmsStatus = exports.SmsType = exports.UserPrizeStatus = exports.ChanceTxnType = exports.SpinStatus = exports.PrizeStatus = exports.StockType = exports.PrizeType = exports.CampaignStatus = exports.UserStatus = exports.AdminRole = exports.AdminStatus = void 0;
var AdminStatus;
(function (AdminStatus) {
AdminStatus["ACTIVE"] = "ACTIVE";
AdminStatus["DISABLED"] = "DISABLED";
})(AdminStatus || (exports.AdminStatus = AdminStatus = {}));
var AdminRole;
(function (AdminRole) {
AdminRole["SUPER_ADMIN"] = "SUPER_ADMIN";
AdminRole["OPERATOR"] = "OPERATOR";
AdminRole["SUPPORT"] = "SUPPORT";
})(AdminRole || (exports.AdminRole = AdminRole = {}));
var UserStatus;
(function (UserStatus) {
UserStatus["ACTIVE"] = "ACTIVE";
UserStatus["BLOCKED"] = "BLOCKED";
})(UserStatus || (exports.UserStatus = UserStatus = {}));
var CampaignStatus;
(function (CampaignStatus) {
CampaignStatus["DRAFT"] = "DRAFT";
CampaignStatus["ACTIVE"] = "ACTIVE";
CampaignStatus["PAUSED"] = "PAUSED";
CampaignStatus["FINISHED"] = "FINISHED";
})(CampaignStatus || (exports.CampaignStatus = CampaignStatus = {}));
var PrizeType;
(function (PrizeType) {
PrizeType["PHYSICAL"] = "PHYSICAL";
PrizeType["DISCOUNT_CODE"] = "DISCOUNT_CODE";
PrizeType["CREDIT"] = "CREDIT";
PrizeType["CASH"] = "CASH";
PrizeType["NO_PRIZE"] = "NO_PRIZE";
PrizeType["OTHER"] = "OTHER";
})(PrizeType || (exports.PrizeType = PrizeType = {}));
var StockType;
(function (StockType) {
StockType["LIMITED"] = "LIMITED";
StockType["UNLIMITED"] = "UNLIMITED";
})(StockType || (exports.StockType = StockType = {}));
var PrizeStatus;
(function (PrizeStatus) {
PrizeStatus["ACTIVE"] = "ACTIVE";
PrizeStatus["INACTIVE"] = "INACTIVE";
})(PrizeStatus || (exports.PrizeStatus = PrizeStatus = {}));
var SpinStatus;
(function (SpinStatus) {
SpinStatus["SUCCESS"] = "SUCCESS";
SpinStatus["FAILED"] = "FAILED";
SpinStatus["DUPLICATE"] = "DUPLICATE";
})(SpinStatus || (exports.SpinStatus = SpinStatus = {}));
var ChanceTxnType;
(function (ChanceTxnType) {
ChanceTxnType["SIGNUP_BONUS"] = "SIGNUP_BONUS";
ChanceTxnType["ADMIN_ADJUSTMENT"] = "ADMIN_ADJUSTMENT";
ChanceTxnType["SPIN_CONSUME"] = "SPIN_CONSUME";
ChanceTxnType["CAMPAIGN_BONUS"] = "CAMPAIGN_BONUS";
ChanceTxnType["REFUND"] = "REFUND";
})(ChanceTxnType || (exports.ChanceTxnType = ChanceTxnType = {}));
var UserPrizeStatus;
(function (UserPrizeStatus) {
UserPrizeStatus["NEW"] = "NEW";
UserPrizeStatus["CONTACTED"] = "CONTACTED";
UserPrizeStatus["DELIVERED"] = "DELIVERED";
UserPrizeStatus["ACTIVE_CODE"] = "ACTIVE_CODE";
UserPrizeStatus["USED"] = "USED";
UserPrizeStatus["EXPIRED"] = "EXPIRED";
})(UserPrizeStatus || (exports.UserPrizeStatus = UserPrizeStatus = {}));
var SmsType;
(function (SmsType) {
SmsType["OTP"] = "OTP";
SmsType["WINNING"] = "WINNING";
SmsType["NO_PRIZE"] = "NO_PRIZE";
SmsType["PRIZE_REMINDER"] = "PRIZE_REMINDER";
})(SmsType || (exports.SmsType = SmsType = {}));
var SmsStatus;
(function (SmsStatus) {
SmsStatus["PENDING"] = "PENDING";
SmsStatus["SENT"] = "SENT";
SmsStatus["FAILED"] = "FAILED";
})(SmsStatus || (exports.SmsStatus = SmsStatus = {}));
var WheelDesign;
(function (WheelDesign) {
WheelDesign["CLASSIC_CASINO"] = "CLASSIC_CASINO";
WheelDesign["NEON_CYBER"] = "NEON_CYBER";
WheelDesign["MINIMAL_FLAT"] = "MINIMAL_FLAT";
WheelDesign["LUXURY_GOLD"] = "LUXURY_GOLD";
WheelDesign["PLAYFUL_CARTOON"] = "PLAYFUL_CARTOON";
WheelDesign["RUSTIC_WOOD"] = "RUSTIC_WOOD";
WheelDesign["GALAXY_SPACE"] = "GALAXY_SPACE";
WheelDesign["CANDY_LAND"] = "CANDY_LAND";
WheelDesign["FIRE_FLAME"] = "FIRE_FLAME";
WheelDesign["CRYSTAL_ICE"] = "CRYSTAL_ICE";
})(WheelDesign || (exports.WheelDesign = WheelDesign = {}));
__exportStar(require("./farsi-number"), exports);
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,6CAA6C;AAC7C,iDAAiD;AACjD,6CAA6C;;;;;;;;;;;;;;;;;AAE7C,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;AACvB,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AAED,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,wCAA2B,CAAA;IAC3B,kCAAqB,CAAA;IACrB,gCAAmB,CAAA;AACrB,CAAC,EAJW,SAAS,yBAAT,SAAS,QAIpB;AAED,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,+BAAiB,CAAA;IACjB,iCAAmB,CAAA;AACrB,CAAC,EAHW,UAAU,0BAAV,UAAU,QAGrB;AAED,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,iCAAe,CAAA;IACf,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;IACjB,uCAAqB,CAAA;AACvB,CAAC,EALW,cAAc,8BAAd,cAAc,QAKzB;AAED,IAAY,SAOX;AAPD,WAAY,SAAS;IACnB,kCAAqB,CAAA;IACrB,4CAA+B,CAAA;IAC/B,8BAAiB,CAAA;IACjB,0BAAa,CAAA;IACb,kCAAqB,CAAA;IACrB,4BAAe,CAAA;AACjB,CAAC,EAPW,SAAS,yBAAT,SAAS,QAOpB;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,oCAAuB,CAAA;AACzB,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;AACvB,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AAED,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,iCAAmB,CAAA;IACnB,+BAAiB,CAAA;IACjB,qCAAuB,CAAA;AACzB,CAAC,EAJW,UAAU,0BAAV,UAAU,QAIrB;AAED,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8CAA6B,CAAA;IAC7B,sDAAqC,CAAA;IACrC,8CAA6B,CAAA;IAC7B,kDAAiC,CAAA;IACjC,kCAAiB,CAAA;AACnB,CAAC,EANW,aAAa,6BAAb,aAAa,QAMxB;AAED,IAAY,eAOX;AAPD,WAAY,eAAe;IACzB,8BAAW,CAAA;IACX,0CAAuB,CAAA;IACvB,0CAAuB,CAAA;IACvB,8CAA2B,CAAA;IAC3B,gCAAa,CAAA;IACb,sCAAmB,CAAA;AACrB,CAAC,EAPW,eAAe,+BAAf,eAAe,QAO1B;AAED,IAAY,OAKX;AALD,WAAY,OAAO;IACjB,sBAAW,CAAA;IACX,8BAAmB,CAAA;IACnB,gCAAqB,CAAA;IACrB,4CAAiC,CAAA;AACnC,CAAC,EALW,OAAO,uBAAP,OAAO,QAKlB;AAED,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,0BAAa,CAAA;IACb,8BAAiB,CAAA;AACnB,CAAC,EAJW,SAAS,yBAAT,SAAS,QAIpB;AAED,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,gDAAiC,CAAA;IACjC,wCAAyB,CAAA;IACzB,4CAA6B,CAAA;IAC7B,0CAA2B,CAAA;IAC3B,kDAAmC,CAAA;IACnC,0CAA2B,CAAA;IAC3B,4CAA6B,CAAA;IAC7B,wCAAyB,CAAA;IACzB,wCAAyB,CAAA;IACzB,0CAA2B,CAAA;AAC7B,CAAC,EAXW,WAAW,2BAAX,WAAW,QAWtB;AAmHD,iDAA+B"}