@cristian.aragao/milharis-core 1.31.20 → 1.31.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/EXTRACAO.ts","../src/constants/GAMES.ts","../src/constants/GRUPOS_BICHOS.ts","../src/constants/MESSAGES.ts","../src/constants/ROLES.ts","../src/constants/STATUS_PULE.ts","../src/constants/TIPO_VISUALIZACAO.ts","../src/constants/VISUALIZACAO.ts","../src/constants/PREFIX_NUMBER.ts","../src/constants/PREFIX_ENVIO_OLD.ts","../src/constants/PREFIX_ENVIO.ts","../src/constants/STATUS_DESCARGA.ts","../src/constants/KEYBOARD.ts","../src/constants/STATUS_DEVICE.ts","../src/constants/PREMIOS.ts","../src/constants/COMISSOES_PADRAO.ts","../src/constants/STATUS_GUIA.ts","../src/functions/numbers/getCreatedBySystem.ts","../src/utils/index.ts","../src/utils/clone.ts","../src/utils/dateToNumber.ts","../src/utils/numberToDate.ts","../src/utils/pegarHorarioSaoPaulo.ts","../src/utils/combineDateTime.ts","../src/utils/getDataInicioFim.ts","../src/utils/formatBRL.ts","../src/utils/getAllCombinations.ts","../src/utils/showFormatDate.ts","../src/utils/numbersSelectedFormated.ts","../src/utils/generateId.ts","../src/utils/getCodigoAuth.ts","../src/utils/dividirArray.ts","../src/utils/delay.ts","../src/utils/normalize.ts","../src/utils/matchNormalized.ts","../src/utils/getInitials.ts","../src/utils/formatterPercentage.ts","../src/utils/parserPercentage.ts","../src/utils/formatterPercentageDecimal.ts","../src/utils/removerLetters.ts","../src/models/ExtracaoModel.ts","../src/functions/numbers/index.ts","../src/functions/numbers/formatarNumero.ts","../src/functions/descarga/generateDescarga.ts","../src/functions/descarga/getDescargaIdPeloNumero.ts","../src/functions/descarga/generateDescargas.ts","../src/functions/numbers/gerarDezenas.ts","../src/functions/numbers/getSomaEnvio.ts","../src/functions/numbers/getSomaVP.ts","../src/functions/numbers/getNumeroId.ts","../src/functions/numbers/getTiposJogos.ts","../src/functions/numbers/calcularValorDeNumero.ts","../src/functions/numbers/calculaValoresDosNumeros.ts","../src/functions/numbers/getNumerosAcimaDoLimite.ts","../src/functions/numbers/arrendondarParaCima.ts","../src/functions/numbers/sortNumeros.ts","../src/functions/numbers/getPropsEnvioId.ts","../src/functions/numbers/getPropsEnvioIdOld.ts","../src/functions/numbers/getPropsVP.ts","../src/functions/numbers/getPropsPrefix.ts","../src/functions/numbers/getPremioFormato.ts","../src/functions/numbers/getSomaProps.ts","../src/functions/limite_jogos/getLimiteJogoPeloTipoJogo.ts","../src/functions/limite_jogos/index.ts","../src/functions/limite_jogos/calcularValorJogoPeloLimite.ts","../src/functions/limite_jogos/getValorJogoPeloTipoJogo.ts","../src/functions/numbers/arrendondarCasasDecimais.ts","../src/functions/numbers/getLimiteSimulado.ts","../src/functions/extracao/index.ts","../src/functions/extracao/getAvailableTimes.ts","../src/functions/games/index.ts","../src/functions/games/calculateAmount.ts","../src/functions/games/calculateAmountGame.ts","../src/functions/games/getBetDateToNumber.ts","../src/functions/games/formatPuleId.ts","../src/functions/games/getFormattedPuleId.ts","../src/functions/games/invertGame.ts","../src/functions/games/fazerJogo.ts","../src/functions/games/getGamesUnicos.ts","../src/functions/extracao/pegarExtracoes.ts","../src/functions/extracao/extracaoEstaAtivaTryCatch.ts","../src/functions/extracao/extracaoEstaAtivaBoolean.ts","../src/functions/extracao/getProximaExtracaoDisponivelParaAposta.ts","../src/functions/users/index.ts","../src/functions/users/permissions.ts","../src/functions/users/getLimitsRest.ts","../src/functions/descarga/index.ts","../src/functions/descarga/sortDescargas.ts","../src/functions/descarga/getDescargasAcimaDoLimite.ts","../src/functions/descarga/getPropsVPDescarga.ts","../src/functions/descarga/getPropsEnvioIdDescarga.ts","../src/functions/descarga/getPropsEnvioIdOldDescarga.ts","../src/functions/descarga/getDescargaIdPeloEnvio.ts","../src/functions/descarga/getTotalGeralDescarga.ts","../src/functions/envio/index.ts","../src/functions/envio/criarEstruturaJogo.ts","../src/models/ComissaoDescargaModel.ts","../src/functions/envio/getComissoesDoEnvio.ts","../src/functions/envio/agruparEnvioPorExtracao.ts","../src/functions/index.ts","../src/models/MessageModel.ts","../src/models/ResultadoModel.ts","../src/models/RouteModel.ts","../src/models/UserModel.ts","../src/models/ValueGameModel.ts","../src/models/GameModel.ts","../src/models/NumberModel.ts","../src/models/BetModel.ts","../src/models/PremiacaoModel.ts","../src/models/PDFModel.ts","../src/models/BancaModel.ts","../src/models/AuditLogModel.ts","../src/models/LimitGameModel.ts","../src/models/EnvioDescargaModel.ts","../src/models/DescargaModel.ts","../src/models/DeviceModel.ts","../src/models/PremiacaoAssociacaoModel.ts","../src/models/GuiaModel.ts","../src/models/GuiaItemModel.ts","../src/models/LimiteNumeroApostaModel.ts","../src/models/ResultadoAssociacaoModel.ts","../src/models/VendaCambistaModel.ts","../src/models/VendasPorDiaModel.ts","../src/repo/collections.ts","../src/repo/COLLECTIONS_NAMES.ts","../src/repo/collectionsToAudit.ts","../src/repo/collectionsRetentionDays.ts","../src/repo/collectionsWithIsolationByBancaId.ts","../src/repo/generic.ts","../src/repo/createRepoFactory.ts"],"sourcesContent":["export const EXTRACAO = [13, 16, 19] as const","// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n\r\nexport const GAMES = {\r\n \"milhar\": {\r\n id: \"milhar\",\r\n label: \"Milhar\",\r\n sigla: \"M\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 1,\r\n showPerLine: 6,\r\n },\r\n \"centena\": {\r\n id: \"centena\",\r\n label: \"Centena\",\r\n sigla: \"C\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 2,\r\n showPerLine: 7,\r\n },\r\n \"dezena\": {\r\n id: \"dezena\",\r\n label: \"Dezena\",\r\n sigla: \"D\",\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n max: 0,\r\n order: 3,\r\n showPerLine: 0,\r\n },\r\n \"grupo\": {\r\n id: \"grupo\",\r\n label: \"Grupo\",\r\n sigla: \"G\",\r\n max: 25, // 0 a 25\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n order: 4,\r\n showPerLine: 0\r\n },\r\n \"terno.dezena\": {\r\n id: \"terno.dezena\",\r\n label: \"Terno de Dezena\",\r\n sigla: \"TD\",\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n max: 0,\r\n order: 5,\r\n showPerLine: 3,\r\n },\r\n \"terno.grupo\": {\r\n id: \"terno.grupo\",\r\n label: \"Terno de Grupo\",\r\n sigla: \"TG\",\r\n max: 25, // (0-25)-(0-25)-(0-25)\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n order: 6,\r\n showPerLine: 3\r\n },\r\n \"duque.dezena\": {\r\n id: \"duque.dezena\",\r\n label: \"Duque de Dezena\",\r\n sigla: \"DD\",\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n max: 0,\r\n order: 7,\r\n showPerLine: 5\r\n },\r\n \"duque.grupo\": {\r\n id: \"duque.grupo\",\r\n label: \"Duque de Grupo\",\r\n sigla: \"DG\",\r\n max: 25, // (0-25)-(0-25)\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n order: 8,\r\n showPerLine: 5\r\n },\r\n \"milhar.invertida\": {\r\n id: \"milhar.invertida\",\r\n label: \"Milhar Invertida\",\r\n sigla: \"MI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena.invertida\": {\r\n id: \"centena.invertida\",\r\n label: \"Centena Invertida\",\r\n sigla: \"CI\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n \"milhar@centena\": {\r\n id: \"milhar@centena\",\r\n label: \"Milhar Centena\",\r\n sigla: \"MC\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar.invertida@centena.invertida\": {\r\n id: \"milhar.invertida@centena.invertida\",\r\n label: \"Milhar e Centena Invertidas\",\r\n sigla: \"MCI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@dezena\": {\r\n id: \"milhar@dezena\",\r\n label: \"Milhar e Dezena\",\r\n sigla: \"MD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@centena@dezena\": {\r\n id: \"milhar@centena@dezena\",\r\n label: \"Milhar, Centena e Dezena\",\r\n sigla: \"MCD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena@dezena\": {\r\n id: \"centena@dezena\",\r\n label: \"Centena Dezena\",\r\n sigla: \"CD\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n} as const;","const BICHOS = {\r\n '01': 'Avestruz',\r\n '02': 'Águia',\r\n '03': 'Burro',\r\n '04': 'Borboleta',\r\n '05': 'Cachorro',\r\n '06': 'Cabra',\r\n '07': 'Carneiro',\r\n '08': 'Camelo',\r\n '09': 'Cobra',\r\n '10': 'Coelho',\r\n '11': 'Cavalo',\r\n '12': 'Elefante',\r\n '13': 'Galo',\r\n '14': 'Gato',\r\n '15': 'Jacaré',\r\n '16': 'Leão',\r\n '17': 'Macaco',\r\n '18': 'Porco',\r\n '19': 'Pavão',\r\n '20': 'Peru',\r\n '21': 'Touro',\r\n '22': 'Tigre',\r\n '23': 'Urso',\r\n '24': 'Veado',\r\n '25': 'Vaca'\r\n} as const;\r\n\r\nexport const GRUPOS_BICHOS = {\r\n '01': { grupo: '01', bicho: BICHOS['01'] },\r\n '02': { grupo: '01', bicho: BICHOS['01'] },\r\n '03': { grupo: '01', bicho: BICHOS['01'] },\r\n '04': { grupo: '01', bicho: BICHOS['01'] },\r\n '05': { grupo: '02', bicho: BICHOS['02'] },\r\n '06': { grupo: '02', bicho: BICHOS['02'] },\r\n '07': { grupo: '02', bicho: BICHOS['02'] },\r\n '08': { grupo: '02', bicho: BICHOS['02'] },\r\n '09': { grupo: '03', bicho: BICHOS['03'] },\r\n '10': { grupo: '03', bicho: BICHOS['03'] },\r\n '11': { grupo: '03', bicho: BICHOS['03'] },\r\n '12': { grupo: '03', bicho: BICHOS['03'] },\r\n '13': { grupo: '04', bicho: BICHOS['04'] },\r\n '14': { grupo: '04', bicho: BICHOS['04'] },\r\n '15': { grupo: '04', bicho: BICHOS['04'] },\r\n '16': { grupo: '04', bicho: BICHOS['04'] },\r\n '17': { grupo: '05', bicho: BICHOS['05'] },\r\n '18': { grupo: '05', bicho: BICHOS['05'] },\r\n '19': { grupo: '05', bicho: BICHOS['05'] },\r\n '20': { grupo: '05', bicho: BICHOS['05'] },\r\n '21': { grupo: '06', bicho: BICHOS['06'] },\r\n '22': { grupo: '06', bicho: BICHOS['06'] },\r\n '23': { grupo: '06', bicho: BICHOS['06'] },\r\n '24': { grupo: '06', bicho: BICHOS['06'] },\r\n '25': { grupo: '07', bicho: BICHOS['07'] },\r\n '26': { grupo: '07', bicho: BICHOS['07'] },\r\n '27': { grupo: '07', bicho: BICHOS['07'] },\r\n '28': { grupo: '07', bicho: BICHOS['07'] },\r\n '29': { grupo: '08', bicho: BICHOS['08'] },\r\n '30': { grupo: '08', bicho: BICHOS['08'] },\r\n '31': { grupo: '08', bicho: BICHOS['08'] },\r\n '32': { grupo: '08', bicho: BICHOS['08'] },\r\n '33': { grupo: '09', bicho: BICHOS['09'] },\r\n '34': { grupo: '09', bicho: BICHOS['09'] },\r\n '35': { grupo: '09', bicho: BICHOS['09'] },\r\n '36': { grupo: '09', bicho: BICHOS['09'] },\r\n '37': { grupo: '10', bicho: BICHOS['10'] },\r\n '38': { grupo: '10', bicho: BICHOS['10'] },\r\n '39': { grupo: '10', bicho: BICHOS['10'] },\r\n '40': { grupo: '10', bicho: BICHOS['10'] },\r\n '41': { grupo: '11', bicho: BICHOS['11'] },\r\n '42': { grupo: '11', bicho: BICHOS['11'] },\r\n '43': { grupo: '11', bicho: BICHOS['11'] },\r\n '44': { grupo: '11', bicho: BICHOS['11'] },\r\n '45': { grupo: '12', bicho: BICHOS['12'] },\r\n '46': { grupo: '12', bicho: BICHOS['12'] },\r\n '47': { grupo: '12', bicho: BICHOS['12'] },\r\n '48': { grupo: '12', bicho: BICHOS['12'] },\r\n '49': { grupo: '13', bicho: BICHOS['13'] },\r\n '50': { grupo: '13', bicho: BICHOS['13'] },\r\n '51': { grupo: '13', bicho: BICHOS['13'] },\r\n '52': { grupo: '13', bicho: BICHOS['13'] },\r\n '53': { grupo: '14', bicho: BICHOS['14'] },\r\n '54': { grupo: '14', bicho: BICHOS['14'] },\r\n '55': { grupo: '14', bicho: BICHOS['14'] },\r\n '56': { grupo: '14', bicho: BICHOS['14'] },\r\n '57': { grupo: '15', bicho: BICHOS['15'] },\r\n '58': { grupo: '15', bicho: BICHOS['15'] },\r\n '59': { grupo: '15', bicho: BICHOS['15'] },\r\n '60': { grupo: '15', bicho: BICHOS['15'] },\r\n '61': { grupo: '16', bicho: BICHOS['16'] },\r\n '62': { grupo: '16', bicho: BICHOS['16'] },\r\n '63': { grupo: '16', bicho: BICHOS['16'] },\r\n '64': { grupo: '16', bicho: BICHOS['16'] },\r\n '65': { grupo: '17', bicho: BICHOS['17'] },\r\n '66': { grupo: '17', bicho: BICHOS['17'] },\r\n '67': { grupo: '17', bicho: BICHOS['17'] },\r\n '68': { grupo: '17', bicho: BICHOS['17'] },\r\n '69': { grupo: '18', bicho: BICHOS['18'] },\r\n '70': { grupo: '18', bicho: BICHOS['18'] },\r\n '71': { grupo: '18', bicho: BICHOS['18'] },\r\n '72': { grupo: '18', bicho: BICHOS['18'] },\r\n '73': { grupo: '19', bicho: BICHOS['19'] },\r\n '74': { grupo: '19', bicho: BICHOS['19'] },\r\n '75': { grupo: '19', bicho: BICHOS['19'] },\r\n '76': { grupo: '19', bicho: BICHOS['19'] },\r\n '77': { grupo: '20', bicho: BICHOS['20'] },\r\n '78': { grupo: '20', bicho: BICHOS['20'] },\r\n '79': { grupo: '20', bicho: BICHOS['20'] },\r\n '80': { grupo: '20', bicho: BICHOS['20'] },\r\n '81': { grupo: '21', bicho: BICHOS['21'] },\r\n '82': { grupo: '21', bicho: BICHOS['21'] },\r\n '83': { grupo: '21', bicho: BICHOS['21'] },\r\n '84': { grupo: '21', bicho: BICHOS['21'] },\r\n '85': { grupo: '22', bicho: BICHOS['22'] },\r\n '86': { grupo: '22', bicho: BICHOS['22'] },\r\n '87': { grupo: '22', bicho: BICHOS['22'] },\r\n '88': { grupo: '22', bicho: BICHOS['22'] },\r\n '89': { grupo: '23', bicho: BICHOS['23'] },\r\n '90': { grupo: '23', bicho: BICHOS['23'] },\r\n '91': { grupo: '23', bicho: BICHOS['23'] },\r\n '92': { grupo: '23', bicho: BICHOS['23'] },\r\n '93': { grupo: '24', bicho: BICHOS['24'] },\r\n '94': { grupo: '24', bicho: BICHOS['24'] },\r\n '95': { grupo: '24', bicho: BICHOS['24'] },\r\n '96': { grupo: '24', bicho: BICHOS['24'] },\r\n '97': { grupo: '25', bicho: BICHOS['25'] },\r\n '98': { grupo: '25', bicho: BICHOS['25'] },\r\n '99': { grupo: '25', bicho: BICHOS['25'] },\r\n '00': { grupo: '25', bicho: BICHOS['25'] }\r\n} as const;\r\n\r\n","export const MESSAGES = {\r\n required: \"Obrigatório.\",\r\n list_length_zero: \"Selecione pelo menos um item.\",\r\n incorrect_login: \"Usuário e/ou senha incorretos!\",\r\n incorrect_password: \"Senha incorreta.\",\r\n email_already_in_use: \"Este login já está sendo usado!\",\r\n invalid_device: \"Este login já está sendo usado em outro dispositivo!\",\r\n} as const;\r\n","export const ROLES = {\r\n \"super_admin\": {\r\n \"id\": \"super_admin\",\r\n \"label\": \"Super Administrador\",\r\n },\r\n \"associacao\": {\r\n \"id\": \"associacao\",\r\n \"label\": \"Associação\",\r\n },\r\n \"admin\": { // Banca\r\n \"id\": \"admin\",\r\n \"label\": \"Administrador\",\r\n },\r\n \"sub_admin\": { // Banca sub-admin\r\n \"id\": \"sub_admin\",\r\n \"label\": \"Sub-administrador\",\r\n },\r\n \"digitador_adm\": { // pertence à banca\r\n \"id\": \"digitador_adm\",\r\n \"label\": \"Digitador Administrador\",\r\n },\r\n \"digitador\": { // pertence à banca\r\n \"id\": \"digitador\",\r\n \"label\": \"Digitador\",\r\n },\r\n \"cambista_talao\": { // pertence à banca // que usa talão\r\n \"id\": \"cambista_talao\",\r\n \"label\": \"Cambista de talão\",\r\n },\r\n \"cambista\": { // pertence à banca // que usa maquininha\r\n \"id\": \"cambista\",\r\n \"label\": \"Cambista\",\r\n },\r\n} as const","export const STATUS_PULE = {\r\n PROCESSANDO: {\r\n id: \"PROCESSANDO\",\r\n label: \"PROCESSANDO\",\r\n color: \"green\",\r\n showSite: false,\r\n ordem: 0,\r\n },\r\n JOGADA: {\r\n id: \"JOGADA\",\r\n label: \"PULES JOGADAS\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n AGUARDANDO_CANCELAMENTO: {\r\n id: \"AGUARDANDO_CANCELAMENTO\",\r\n label: \"AGUARDANDO CANCELAMENTO\",\r\n color: \"yellow\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n CANCELADA: {\r\n id: \"CANCELADA\",\r\n label: \"CANCELADAS\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;\r\n","export const TIPO_VISUALIZACAO = {\r\n \"notificacao\": {\r\n id: \"notificacao\",\r\n label: \"Notificação\"\r\n },\r\n \"impressao\": {\r\n id: \"impressao\",\r\n label: \"Impressão\"\r\n },\r\n} as const","export const VISUALIZACAO = {\r\n \"agora\": {\r\n id: \"agora\",\r\n label: \"Agora\"\r\n },\r\n \"jogo_hoje\": {\r\n id: \"jogo_hoje\",\r\n label: \"Jogo Hoje\"\r\n },\r\n \"jogo_pre_datado\": {\r\n id: \"jogo_pre_datado\",\r\n label: \"Jogo Pré-Datado\"\r\n },\r\n \"resultado\": {\r\n id: \"resultado\",\r\n label: \"Resultado\"\r\n }\r\n} as const","export const PREFIX_NUMBER = \"vp_\" as const;","export const PREFIX_ENVIO_OLD = \"envio_old_\" as const;","export const PREFIX_ENVIO = \"envio_\" as const;","export const STATUS_DESCARGA = {\r\n \"ENVIANDO\": {\r\n id: \"ENVIANDO\",\r\n labelBanca: \"ENVIANDO\",\r\n labelAssociacao: \"RECEBENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"DEVOLVENDO\": {\r\n id: \"DEVOLVENDO\",\r\n labelBanca: \"RECEBENDO\",\r\n labelAssociacao: \"DEVOLVENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"ENVIADA\": {\r\n id: \"ENVIADA\",\r\n labelBanca: \"ENVIADA\",\r\n labelAssociacao: \"RECEBIDA\",\r\n color: \"green\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 2\r\n },\r\n \"DEVOLVIDA\": {\r\n id: \"DEVOLVIDA\",\r\n labelBanca: \"DEVOLVIDA\",\r\n labelAssociacao: \"DEVOLVIDA\",\r\n color: \"orange\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 3\r\n },\r\n \"ERRO\": {\r\n id: \"ERRO\",\r\n labelBanca: \"ERRO\",\r\n labelAssociacao: \"ERRO\",\r\n color: \"red\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 4\r\n }\r\n} as const","export const KEYBOARD = {\r\n\r\n Enter: { label: \"Enter\", value: \"enter\" },\r\n Ctrl: { label: \"Ctrl\", value: \"ctrl\" },\r\n Tab: { label: \"Tab\", value: \"tab\" },\r\n Space: { label: \"\\u23b5\", value: \"space\" },\r\n Backspace: { label: \"Backspace\", value: \"backspace\" },\r\n Escape: { label: \"Esc\", value: \"escape\" },\r\n Delete: { label: \"Del\", value: \"delete\" },\r\n Backslash: { label: \"\\\\\", value: \"backslash\" },\r\n Semicolon: { label: \";\", value: \"semicolon\" },\r\n CapsLock: { label: \"CapsLock\", value: \"capslock\" },\r\n Quote: { label: \"'\", value: \"quote\" },\r\n Comma: { label: \",\", value: \"decimal,comma\" },\r\n\r\n Insert: { label: \"Insert\", value: \"insert\" },\r\n Home: { label: \"Home\", value: \"home\" },\r\n End: { label: \"End\", value: \"end\" },\r\n PageUp: { label: \"Page Up\", value: \"pageup\" },\r\n PageDown: { label: \"Page Down\", value: \"pagedown\" },\r\n\r\n ArrowUp: { label: \"↑\", value: \"arrowup\" },\r\n ArrowDown: { label: \"↓\", value: \"arrowdown\" },\r\n ArrowLeft: { label: \"←\", value: \"arrowleft\" },\r\n ArrowRight: { label: \"→\", value: \"arrowright\" },\r\n\r\n \r\n NumLock: { label: \"Num Lock\", value: \"numlock\" },\r\n /**\r\n * @description The decimal point key (typically . or\r\n * , depending on the region).\r\n * In newer browsers, this value to be the character generated by the\r\n * decimal key (one of those two characters). [1]\r\n */\r\n Dot: { label: \".\", value: \"period,comma\" },\r\n\r\n /** The numeric keypad's multiplication key, /. */\r\n Divide: { label: \"/\", value: \"slash,divide\" },\r\n\r\n /** @description The numeric keypad's addition key, -. */\r\n Subtract: { label: \"-\", value: \"minus,subtract\" },\r\n\r\n /** The numeric keypad's multiplication key, *. */\r\n Multiply: { label: '*', value: 'multiply,shift+8' },\r\n\r\n /** The numeric keypad's addition key, +. */\r\n Add: { label: \"+\", value: \"add,shift+equal\" },\r\n\r\n Equal: { id: \"Equal\", label: \"=\", value: \"equal\" },\r\n\r\n // -------\r\n // FNs\r\n\r\n F1: { label: \"F1\", value: \"f1\" },\r\n F2: { label: \"F2\", value: \"f2\" },\r\n F3: { label: \"F3\", value: \"f3\" },\r\n F4: { label: \"F4\", value: \"f4\" },\r\n F5: { label: \"F5\", value: \"f5\" },\r\n F6: { label: \"F6\", value: \"f6\" },\r\n F7: { label: \"F7\", value: \"f7\" },\r\n F8: { label: \"F8\", value: \"f8\" },\r\n F9: { label: \"F9\", value: \"f9\" },\r\n F10: { label: \"F10\", value: \"f10\" },\r\n F11: { label: \"F11\", value: \"f11\" },\r\n F12: { label: \"F12\", value: \"f12\" },\r\n\r\n // -------\r\n // numbers\r\n\r\n 0: { label: \"0\", value: \"0\" },\r\n 1: { label: \"1\", value: \"1\" },\r\n 2: { label: \"2\", value: \"2\" },\r\n 3: { label: \"3\", value: \"3\" },\r\n 4: { label: \"4\", value: \"4\" },\r\n 5: { label: \"5\", value: \"5\" },\r\n 6: { label: \"6\", value: \"6\" },\r\n 7: { label: \"7\", value: \"7\" },\r\n 8: { label: \"8\", value: \"8\" },\r\n 9: { label: \"9\", value: \"9\" },\r\n\r\n // -------\r\n // letters\r\n\r\n A: { label: \"A\", value: \"a\" },\r\n B: { label: \"B\", value: \"b\" },\r\n C: { label: \"C\", value: \"c\" },\r\n D: { label: \"D\", value: \"d\" },\r\n E: { label: \"E\", value: \"e\" },\r\n F: { label: \"F\", value: \"f\" },\r\n G: { label: \"G\", value: \"g\" },\r\n H: { label: \"H\", value: \"h\" },\r\n I: { label: \"I\", value: \"i\" },\r\n J: { label: \"J\", value: \"j\" },\r\n K: { label: \"K\", value: \"k\" },\r\n L: { label: \"L\", value: \"l\" },\r\n M: { label: \"M\", value: \"m\" },\r\n N: { label: \"N\", value: \"n\" },\r\n O: { label: \"O\", value: \"o\" },\r\n P: { label: \"P\", value: \"p\" },\r\n Q: { label: \"Q\", value: \"q\" },\r\n R: { label: \"R\", value: \"r\" },\r\n S: { label: \"S\", value: \"s\" },\r\n T: { label: \"T\", value: \"t\" },\r\n U: { label: \"U\", value: \"u\" },\r\n V: { label: \"V\", value: \"v\" },\r\n W: { label: \"W\", value: \"w\" },\r\n X: { label: \"X\", value: \"x\" },\r\n Y: { label: \"Y\", value: \"y\" },\r\n Z: { label: \"Z\", value: \"z\" },\r\n\r\n} as const;\r\n","export const STATUS_DEVICE = {\r\n \"EM_ESPERA\": {\r\n \"id\": \"EM_ESPERA\",\r\n \"label\": \"Esperando aprovação\",\r\n \"color\": \"orange\"\r\n },\r\n \"APROVADO\": {\r\n \"id\": \"APROVADO\",\r\n \"label\": \"Aprovado\",\r\n \"color\": \"green\"\r\n },\r\n \"BLOQUEADO\": {\r\n \"id\": \"BLOQUEADO\",\r\n \"label\": \"Bloqueado\",\r\n \"color\": \"red\"\r\n }\r\n} as const","export const PREMIOS = {\r\n \"1\": {\r\n id: \"1\",\r\n order: 1,\r\n label: \"1º Prêmio\",\r\n labelShort: \"1º\",\r\n },\r\n \"2\": {\r\n id: \"2\",\r\n order: 2,\r\n label: \"2º Prêmio\",\r\n labelShort: \"2º\",\r\n },\r\n \"3\": {\r\n id: \"3\",\r\n order: 3,\r\n label: \"3º Prêmio\",\r\n labelShort: \"3º\",\r\n },\r\n \"4\": {\r\n id: \"4\",\r\n order: 4,\r\n label: \"4º Prêmio\",\r\n labelShort: \"4º\",\r\n },\r\n \"5\": {\r\n id: \"5\",\r\n order: 5,\r\n label: \"5º Prêmio\",\r\n labelShort: \"5º\",\r\n },\r\n \"1-5\": {\r\n id: \"1-5\",\r\n order: 6,\r\n label: \"1º ao 5º Prêmio\",\r\n labelShort: \"1º ao 5º\",\r\n }\r\n} as const","import { GAMES } from \"./GAMES\";\r\n\r\nexport const COMISSOES_PADRAO = {\r\n [GAMES.milhar.id]: {\r\n id: GAMES.milhar.id,\r\n label: GAMES.milhar.label,\r\n order: 1,\r\n },\r\n [GAMES.centena.id]: {\r\n id: GAMES.centena.id,\r\n label: GAMES.centena.label,\r\n order: 2,\r\n },\r\n [GAMES.dezena.id]: {\r\n id: GAMES.dezena.id,\r\n label: GAMES.dezena.label,\r\n order: 3,\r\n },\r\n [GAMES.grupo.id]: {\r\n id: GAMES.grupo.id,\r\n label: GAMES.grupo.label,\r\n order: 4,\r\n },\r\n [GAMES[\"terno.dezena\"].id]: {\r\n id: GAMES[\"terno.dezena\"].id,\r\n label: GAMES[\"terno.dezena\"].label,\r\n order: 5,\r\n },\r\n [GAMES[\"terno.grupo\"].id]: {\r\n id: GAMES[\"terno.grupo\"].id,\r\n label: GAMES[\"terno.grupo\"].label,\r\n order: 6,\r\n },\r\n [GAMES[\"duque.dezena\"].id]: {\r\n id: GAMES[\"duque.dezena\"].id,\r\n label: GAMES[\"duque.dezena\"].label,\r\n order: 7,\r\n },\r\n [GAMES[\"duque.grupo\"].id]: {\r\n id: GAMES[\"duque.grupo\"].id,\r\n label: GAMES[\"duque.grupo\"].label,\r\n order: 8,\r\n },\r\n restante: {\r\n id: \"restante\",\r\n label: \"Restante\",\r\n order: 9,\r\n },\r\n} as const;\r\n","export const STATUS_GUIA = {\r\n \"vendas\": {\r\n id: \"vendas\",\r\n label: \"Vendas\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n \"premios\": {\r\n id: \"premios\",\r\n label: \"Prêmios\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 2,\r\n },\r\n \"revisando\":{\r\n id: \"revisando\",\r\n label: \"Revisando\",\r\n color: \"blue\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n \"concluida\": {\r\n id: \"concluida\",\r\n label: \"Concluída\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;","import { TypeMetaData } from \"../../types\";\r\nimport { ROLES } from \"../../constants\";\r\n\r\n/**\r\n * @description\r\n * Gera um objeto `createdBy` com informações de criação, usando dados fornecidos ou,\r\n * caso estejam ausentes, valores padrão definidos pelo sistema.\r\n * \r\n * Essa função é útil para garantir que todos os campos de autoria estejam preenchidos\r\n * corretamente mesmo quando não houver um usuário autenticado no contexto.\r\n * \r\n * Campos padrão utilizados:\r\n * - `id`: \"system\"\r\n * - `role`: \"super_admin\"\r\n * - `name`: \"Gerado automaticamente pelo sistema\"\r\n * - `login`: \"system\"\r\n */\r\nexport const getCreatedBySystem = (\r\n obj?: Partial<TypeMetaData[\"createdBy\"]>\r\n): TypeMetaData[\"createdBy\"] => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n role: obj?.role || ROLES.super_admin.id,\r\n name: obj?.name || \"Gerado automaticamente pelo sistema\",\r\n login: obj?.login || \"\",\r\n});\r\n","export { clone } from \"./clone\";\r\nexport { combineDateTime } from \"./combineDateTime\";\r\nexport { dateToNumber } from \"./dateToNumber\";\r\nexport { numberToDate } from \"./numberToDate\";\r\nexport { getDataInicioFim } from \"./getDataInicioFim\";\r\nexport { formatterBRL, parserBRL } from \"./formatBRL\";\r\nexport { getAllCombinations } from \"./getAllCombinations\";\r\nexport { showFormatDate } from \"./showFormatDate\";\r\nexport { numbersSelectedFormated } from \"./numbersSelectedFormated\";\r\nexport { generateId } from \"./generateId\";\r\nexport { getCodigoAuth } from \"./getCodigoAuth\";\r\nexport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\nexport { dividirArray } from \"./dividirArray\";\r\nexport { delay } from \"./delay\";\r\nexport { matchNormalized } from \"./matchNormalized\";\r\nexport { normalize } from \"./normalize\";\r\nexport { getInitials } from \"./getInitials\";\r\nexport { formatterPercentage } from \"./formatterPercentage\";\r\nexport { parserPercentage } from \"./parserPercentage\";\r\nexport { formatterPercentageDecimal, parserPercentageDecimal } from \"./formatterPercentageDecimal\";\r\nexport { removerLetters } from \"./removerLetters\";","import cloneDeep from 'clone-deep'\r\n\r\n/**\r\n*\t@description Função que clona um objeto, array ou data\r\n*\t@param {T} item - item a ser clonado\r\n*\t@returns {T} item clonado\r\n*\t@example\r\n*\tclone([1, 3, 4]) // [1, 3, 4]\r\n*/\r\nexport const clone = <T>(item: T): T =>\r\n\tcloneDeep(item)\r\n","import { isValid } from \"date-fns\";\r\n\r\n/**\r\n * Converte um objeto `Date` para um número no formato `yyyyMMddHHmmss`.\r\n * Se a data for inválida ou não informada, retorna 0.\r\n *\r\n * @param {Date} [date] - Objeto `Date` a ser convertido.\r\n * @returns {number} Representação numérica da data no formato `yyyyMMddHHmmss`.\r\n */\r\nexport const dateToNumber = (date?: Date): number => {\r\n if (!date || !isValid(date)) return 0;\r\n\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hour = String(date.getHours()).padStart(2, '0');\r\n const minute = String(date.getMinutes()).padStart(2, '0');\r\n const second = String(date.getSeconds()).padStart(2, '0');\r\n\r\n return Number(`${year}${month}${day}${hour}${minute}${second}`);\r\n};\r\n","import { parse, isValid } from \"date-fns\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * Converte um número no formato `yyyyMMddHHmmss` para um objeto `Date`.\r\n * Se o número for inválido ou não informado, retorna a data atual.\r\n *\r\n * @param {number} [number] - Número representando a data no formato `yyyyMMddHHmmss`.\r\n * @returns {Date} Objeto `Date` correspondente ao número informado.\r\n */\r\nexport const numberToDate = (number?: number): Date | undefined => {\r\n if (!number) return undefined;\r\n\r\n const str = number.toString();\r\n\r\n const year = str.slice(0, 4);\r\n const month = str.slice(4, 6);\r\n const day = str.slice(6, 8);\r\n const hour = str.slice(8, 10);\r\n const minute = str.slice(10, 12);\r\n const second = str.slice(12, 14);\r\n\r\n const dateString = `${year}-${month}-${day} ${hour}:${minute}:${second}`;\r\n\r\n const dateNow = pegarHorarioSaoPaulo();\r\n\r\n const date = parse(dateString, \"yyyy-MM-dd HH:mm:ss\", dateNow);\r\n\r\n return isValid(date) ? date : undefined;\r\n};\r\n","import moment from \"moment-timezone\";\r\n\r\nexport const pegarHorarioSaoPaulo = (): Date => {\r\n \r\n const string = moment\r\n .tz(new Date(), \"America/Sao_Paulo\")\r\n .format(\"DD_MM_YYYY_HH_mm_ss_SSS\");\r\n\r\n const [day, month, year, hour, minutes, seconds, milliseconds] =\r\n string.split(\"_\");\r\n\r\n return new Date(\r\n Number(year),\r\n Number(month) - 1,\r\n Number(day),\r\n Number(hour),\r\n Number(minutes),\r\n Number(seconds),\r\n Number(milliseconds)\r\n );\r\n};\r\n","import { dateToNumber } from \"./dateToNumber\";\r\nimport { numberToDate } from \"./numberToDate\";\r\n\r\n/**\r\n * @deprecated Esta função está depreciada. Use getBetDateToNumber ao invés desta.\r\n * \r\n * Combina a data (ano, mês, dia) de um timestamp (`dateA`)\r\n * com o horário (hora, minuto, segundo) de outro timestamp (`dateB`).\r\n * Ambos os timestamps devem estar no formato `yyyyMMddHHmmss`.\r\n *\r\n * @param {number} dateA - Número no formato `yyyyMMddHHmmss` contendo a data base (ano, mês e dia).\r\n * @param {number} dateB - Número no formato `yyyyMMddHHmmss` contendo o horário base (hora, minuto e segundo).\r\n * @returns {number} Um novo número no formato `yyyyMMddHHmmss` combinando a data de `dateA` com a hora de `dateB`.\r\n *\r\n * @example\r\n * // Combina 2023-12-25 com 14:30:00\r\n * const result = combineDateTime(20231225000000, 20230101143000);\r\n * 20231225143000\r\n */\r\nexport const combineDateTime = (dateA: number, dateB: number): number => {\r\n const dateAParts = numberToDate(dateA);\r\n const dateBParts = numberToDate(dateB);\r\n\r\n if (!dateAParts || !dateBParts) return 0;\r\n\r\n const year = dateAParts.getFullYear();\r\n const month = dateAParts.getMonth(); // zero-based\r\n const day = dateAParts.getDate();\r\n\r\n const hours = dateBParts.getHours();\r\n const minutes = dateBParts.getMinutes();\r\n const seconds = dateBParts.getSeconds();\r\n\r\n const combinedDate = new Date(year, month, day, hours, minutes, seconds, 0);\r\n\r\n return dateToNumber(combinedDate);\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { numberToDate } from \"./numberToDate\";\r\nimport { dateToNumber } from \"./dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * A partir de uma data no formato numérico (`yyyyMMddHHmmss`),\r\n * retorna o início e fim do dia dessa data no mesmo formato numérico.\r\n *\r\n * @param {Object} params - Parâmetro contendo a data.\r\n * @param {number} params.dataAposta - Data no formato `yyyyMMddHHmmss`.\r\n * @returns {{ dataInicio: number, dataFim: number }} Datas de início (00:00:00) e fim (23:59:59) do dia.\r\n */\r\nexport const getDataInicioFim = ({ dataAposta }: { dataAposta: number }) => {\r\n const dataInicio = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 0), 0),\r\n 0\r\n );\r\n\r\n const dataFim = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 23), 59),\r\n 59\r\n );\r\n\r\n return {\r\n dataInicio: dateToNumber(dataInicio),\r\n dataFim: dateToNumber(dataFim),\r\n };\r\n};\r\n","export const formatterBRL = (value: number) => {\r\n\r\n\tconst cloneValue = value\r\n\r\n\tconst valueS = new Intl.NumberFormat('pt-BR', {\r\n\t\tstyle: 'currency',\r\n\t\tcurrency: 'BRL',\r\n\t}).format(cloneValue || 0)\r\n\treturn valueS\r\n}\r\n\r\nexport const parserBRL = (value: string) => {\r\n\r\n\tlet cloneValue = value\r\n\r\n\tcloneValue = cloneValue.replace(/\\D/g, '')\r\n\tlet valueN = parseFloat(cloneValue || '0')\r\n\tvalueN /= 100\r\n\treturn valueN\r\n}\r\n","/**\r\n * Função para gerar todas as permutações de um array, sem duplicações.\r\n * @param arr - O array de números ou caracteres.\r\n * @returns Um array com todas as permutações possíveis, sem duplicações.\r\n */\r\nconst generatePermutations = (arr: string[]): string[][] => {\r\n // Verifica se o array está vazio: se sim, retorna um array contendo um array vazio (caso base da recursão)\r\n if (arr.length === 0) return [[]];\r\n\r\n // Cria um Set para armazenar as permutações e evitar duplicatas\r\n const result: Set<string[]> = new Set();\r\n\r\n // Itera sobre cada elemento do array, usando-o como primeiro elemento da permutação\r\n for (let i = 0; i < arr.length; i++) {\r\n // Pega o elemento atual na posição i\r\n const current = arr[i];\r\n // Cria um novo array com todos os elementos exceto o atual (elementos antes de i + elementos depois de i)\r\n const remaining = [...arr.slice(0, i), ...arr.slice(i + 1)];\r\n // Chama recursivamente a função para gerar todas as permutações dos elementos restantes\r\n const remainingPermutations = generatePermutations(remaining);\r\n\r\n // Itera sobre cada permutação gerada recursivamente\r\n for (const perm of remainingPermutations) {\r\n // Adiciona o elemento atual no início de cada permutação e adiciona ao Set de resultados\r\n result.add([current, ...perm]);\r\n }\r\n }\r\n\r\n // Converte o Set de arrays de strings de volta para um array comum e retorna\r\n return Array.from(result);\r\n};\r\n\r\n/**\r\n * Função para pegar um número e gerar todas as suas combinações únicas.\r\n * @param num - O número como string ou número.\r\n * @returns Um array de strings com todas as combinações possíveis, sem duplicações.\r\n */\r\nexport const getAllCombinations = (num: string): string[] => {\r\n // Converte o número para string e depois divide em um array de caracteres individuais\r\n const numArr = num.split(\"\");\r\n\r\n // Gera todas as permutações possíveis do array de caracteres\r\n const permutations = generatePermutations(numArr);\r\n\r\n // Usar um Set para garantir combinações únicas\r\n // Mapeia cada permutação (array de strings) para uma string única e cria um Set para eliminar duplicatas\r\n const uniqueCombinations = new Set(permutations.map((perm) => perm.join(\"\")));\r\n\r\n // Converte o Set de strings de volta para um array comum e retorna\r\n return Array.from(uniqueCombinations);\r\n};\r\n\r\n/**\r\n * EXEMPLO DE USO COM O NÚMERO 1234:\r\n * \r\n * getAllCombinations(1234) ou getAllCombinations(\"1234\")\r\n * \r\n * PASSO A PASSO:\r\n * \r\n * 1. numArr = \"1234\".split(\"\") → [\"1\", \"2\", \"3\", \"4\"]\r\n * - Converte o número para string e divide em um array de dígitos\r\n * \r\n * 2. permutations = generatePermutations([\"1\", \"2\", \"3\", \"4\"])\r\n * - Gera todas as permutações possíveis dos 4 dígitos\r\n * - Resultado: [\r\n * [\"1\", \"2\", \"3\", \"4\"], [\"1\", \"2\", \"4\", \"3\"],\r\n * [\"1\", \"3\", \"2\", \"4\"], [\"1\", \"3\", \"4\", \"2\"],\r\n * [\"1\", \"4\", \"2\", \"3\"], [\"1\", \"4\", \"3\", \"2\"],\r\n * [\"2\", \"1\", \"3\", \"4\"], [\"2\", \"1\", \"4\", \"3\"],\r\n * [\"2\", \"3\", \"1\", \"4\"], [\"2\", \"3\", \"4\", \"1\"],\r\n * [\"2\", \"4\", \"1\", \"3\"], [\"2\", \"4\", \"3\", \"1\"],\r\n * [\"3\", \"1\", \"2\", \"4\"], [\"3\", \"1\", \"4\", \"2\"],\r\n * [\"3\", \"2\", \"1\", \"4\"], [\"3\", \"2\", \"4\", \"1\"],\r\n * [\"3\", \"4\", \"1\", \"2\"], [\"3\", \"4\", \"2\", \"1\"],\r\n * [\"4\", \"1\", \"2\", \"3\"], [\"4\", \"1\", \"3\", \"2\"],\r\n * [\"4\", \"2\", \"1\", \"3\"], [\"4\", \"2\", \"3\", \"1\"],\r\n * [\"4\", \"3\", \"1\", \"2\"], [\"4\", \"3\", \"2\", \"1\"]\r\n * ]\r\n * - Total: 24 permutações (4! = 4 × 3 × 2 × 1 = 24)\r\n * \r\n * 3. uniqueCombinations = new Set([\"1234\", \"1243\", \"1324\", \"1342\", ...])\r\n * - Converte cada permutação (array) em uma string usando join(\"\")\r\n * - Usa Set para garantir que não há duplicatas (neste caso não haveria, mas é uma precaução)\r\n * - Resultado: Set com 24 strings únicas\r\n * \r\n * 4. return Array.from(uniqueCombinations)\r\n * - Converte o Set de volta para array\r\n * - Retorna: [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\"]\r\n * \r\n * RESULTADO FINAL: Array com todas as 24 combinações únicas possíveis dos dígitos 1, 2, 3 e 4\r\n */\r\n","import { numberToDate } from \"./numberToDate\";\r\nimport { format } from \"date-fns\";\r\n\r\nexport const showFormatDate = (number: number, formatString?: string) => {\r\n if (!number) return \"N/A\";\r\n\r\n const date = numberToDate(number);\r\n\r\n if (!date) return \"N/A\";\r\n\r\n return format(date, formatString || \"dd/MM/yyyy\");\r\n};\r\n","export const numbersSelectedFormated = (numbersString: number[]): string => {\r\n const numbers = numbersString.map(Number);\r\n if (numbers.length === 0) return \"\";\r\n // Ordena os números para garantir que estejam em ordem crescente\r\n numbers.sort((a, b) => a - b);\r\n let result = \"\";\r\n let start = numbers[0]; // Início do intervalo\r\n let end = start; // Fim do intervalo\r\n for (let i = 1; i <= numbers.length; i++) {\r\n if (i < numbers.length && numbers[i] === end + 1) {\r\n // Se o próximo número for consecutivo, expande o intervalo\r\n end = numbers[i];\r\n } else {\r\n // Se o próximo número não for consecutivo, finaliza o intervalo\r\n if (start === end) {\r\n // Se o intervalo tem um único número\r\n result += start;\r\n } else {\r\n // Se o intervalo tem mais de um número\r\n result += `${start} ao ${end}`;\r\n }\r\n if (i < numbers.length) {\r\n // Adiciona uma vírgula se não for o último intervalo\r\n result += \", \";\r\n // Inicia um novo intervalo\r\n start = numbers[i];\r\n end = start;\r\n }\r\n }\r\n }\r\n return result;\r\n };","/**\r\n * Generate a unique id\r\n * @returns {string} - A unique id\r\n * @example\r\n * generateUniqueId('user')\r\n * => user-19a2c5db-23eb-9b2b-c764-695249595f59\r\n * @example\r\n * generateUniqueId()\r\n * => 19a2c5db-23eb-9b2b-c764-695249595f59\r\n **/\r\n\r\nexport const generateId = (prefix?: string) => {\r\n\tconst s4 = () => Math.floor((1 + Math.random()) * 0x10000)\r\n\t\t.toString(16)\r\n\t\t.substring(1)\r\n\treturn `${prefix ? `${prefix}-` : ''}${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`\r\n}","/**\r\n * @description Gera um código de autenticação aleatório entre os valores mínimo e máximo fornecidos.\r\n * @example getCodigoAuth(100000, 999999) -> 435231\r\n*/\r\nexport const getCodigoAuth = (min: number, max: number) => {\r\n min = Math.ceil(min);\r\n max = Math.floor(max);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n};\r\n","export const dividirArray = <T>(arrayGrande: T[], tamanho = 1000): T[][] => {\r\n const resultado: T[][] = [];\r\n\r\n // Percorre o array grande e divide em subarrays de tamanho especificado\r\n for (let i = 0; i < arrayGrande.length; i += tamanho) {\r\n const subarray = arrayGrande.slice(i, i + tamanho); // Cria um subarray de 500 elementos\r\n resultado.push(subarray); // Adiciona o subarray ao array de resultado\r\n }\r\n\r\n return resultado;\r\n};\r\n","/**\r\n * @description Retorna uma Promise que resolve após um determinado tempo (em milissegundos).\r\n *\r\n * Útil para simular atrasos ou criar efeitos assíncronos como \"sleep\".\r\n *\r\n * @param {number} ms - A quantidade de milissegundos para esperar.\r\n * @returns {Promise<void>} Uma Promise que resolve após o tempo especificado.\r\n *\r\n * @example\r\n * await delay(1000); // espera 1 segundo\r\n */\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n};\r\n","/**\r\n * @description Normaliza uma string para facilitar comparações e buscas textuais.\r\n * A normalização remove:\r\n * - Espaços extras nas extremidades\r\n * - Diferenças entre maiúsculas e minúsculas\r\n * - Acentos e caracteres diacríticos (como ç, á, é, ñ etc.)\r\n *\r\n * @param {string} str - A string que será normalizada.\r\n * @returns {string} A string normalizada, em minúsculas e sem acentos.\r\n *\r\n * @example\r\n * normalize('Árvore') // 'arvore'\r\n * normalize(' Café ') // 'cafe'\r\n * normalize('JoÃO') // 'joao'\r\n */\r\nexport const normalize = (str: string): string =>\r\n str\r\n .trim()\r\n .toLowerCase()\r\n .normalize(\"NFD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\");\r\n","import { normalize } from \"./normalize\";\r\n\r\n/**\r\n * @description Verifica se o texto contém a palavra de busca,\r\n * desconsiderando acentuação, letras maiúsculas/minúsculas e caracteres especiais.\r\n *\r\n * @param {string} text - O texto base no qual a busca será realizada.\r\n * @param {string} search - A string de busca a ser procurada dentro do texto.\r\n * @returns {boolean} Retorna `true` se a string de busca for encontrada dentro do texto normalizado, senão `false`.\r\n *\r\n * @example\r\n * matchNormalized('Retropolis', 'retro'); // true\r\n * matchNormalized('Café com Leite', 'cafe'); // true\r\n * matchNormalized('Firewall', 'blinding'); // false\r\n */\r\nexport const matchNormalized = (text: string, search: string): boolean => {\r\n return normalize(text).includes(normalize(search));\r\n};\r\n","/**\r\n * Retorna as iniciais de um nome completo.\r\n * \r\n * A função extrai as primeiras letras maiúsculas dos dois primeiros nomes\r\n * válidos (com ao menos 2 caracteres) de uma string representando o nome completo.\r\n *\r\n * @param nomeCompleto - Uma string contendo o nome completo.\r\n * @returns As iniciais maiúsculas dos dois primeiros nomes válidos, ou uma string vazia se não houver nomes válidos.\r\n *\r\n * @example\r\n * getInitials(\"Maria Joaquina Silva\") // retorna \"MJ\"\r\n * getInitials(\"Jo\") // retorna \"J\"\r\n * getInitials(\"A B\") // retorna \"\" (nomes com menos de 2 letras são ignorados)\r\n */\r\nexport const getInitials = (nomeCompleto: string): string => {\r\n if (!nomeCompleto) return '';\r\n\r\n const nomesValidos = nomeCompleto\r\n .trim()\r\n .split(/\\s+/)\r\n .filter((nome) => nome.length >= 2);\r\n\r\n const iniciais = nomesValidos\r\n .slice(0, 2)\r\n .map((nome) => nome[0].toUpperCase());\r\n\r\n return iniciais.join('');\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentage = (value: number): string => {\r\n value;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\nexport const parserPercentage = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2));\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2));\r\n return valueN;\r\n};","/**\n * Analisa e converte strings de porcentagem para números decimais\n * \n * Esta função remove caracteres não numéricos das strings de entrada e converte\n * para números decimais com precisão de 2 casas decimais. Quando um novo valor\n * é fornecido, ela trata casos especiais onde o novo valor é igual ao valor anterior.\n * \n * @param value String contendo a porcentagem (ex: \"25%\", \"25,50\", \"25.50\")\n * @param newValue String opcional contendo o novo valor de porcentagem\n * @returns Número decimal com 2 casas decimais (ex: 25.00, 25.50)\n * \n * @example\n * // Converte string simples para número\n * const result = parserPercentage(\"25%\");\n * // Retorna: 25.00\n * \n * @example\n * // Converte string com vírgula para número\n * const result = parserPercentage(\"25,50\");\n * // Retorna: 25.50\n * \n * @example\n * // Converte string com ponto para número\n * const result = parserPercentage(\"25.50\");\n * // Retorna: 25.50\n * \n * @example\n * // Com novo valor (remove último dígito se for igual ao valor anterior)\n * const result = parserPercentage(\"250\", \"2500\");\n * // Retorna: 250.00\n * \n * @example\n * // Com novo valor diferente\n * const result = parserPercentage(\"25\", \"30\");\n * // Retorna: 30.00\n * \n * @example\n * // String vazia ou inválida\n * const result = parserPercentage(\"\");\n * // Retorna: 0.00\n */\nexport const parserPercentage = (value: string, newValue?: string): number => {\n\tvalue = value.replace(/\\D/g, \"\");\n\tnewValue = newValue?.replace(/\\D/g, \"\");\n\n\tif (newValue) {\n\t\tif (Number(newValue) === Number(value))\n\t\t\tnewValue = newValue.slice(0, -1);\n\n\t\tlet newValueN = Number(Number(newValue || \"0\").toFixed(2));\n\t\treturn newValueN;\n\t}\n\n\tlet valueN = Number(Number(value || \"0\").toFixed(2));\n\treturn valueN;\n};\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentageDecimal = (value: number): string => {\r\n value *= 100;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\n/**\r\n * Converte uma string de porcentagem digitada pelo usuário em um valor decimal (0–1).\r\n * \r\n * - Remove todos os caracteres não numéricos (mantém apenas dígitos).\r\n * - Caso `newValue` seja passado, ele é usado como base para lidar com digitação interativa,\r\n * permitindo apagar o último dígito corretamente.\r\n * - O resultado final sempre será um número decimal entre `0` e `1`.\r\n *\r\n * @param {string} value - String contendo dígitos de porcentagem (ex: \"25\", \"25 %\", \"100%\").\r\n * @param {string} [newValue] - Novo valor bruto digitado (opcional, usado para edição em tempo real).\r\n * @returns {number} Valor decimal correspondente (ex: \"25\" → 0.25, \"100\" → 1).\r\n *\r\n * @example\r\n * parserPercentage(\"25\"); // 0.25\r\n * parserPercentage(\"100%\"); // 1\r\n * parserPercentage(\"25\", \"2\"); // 0.02 (simula digitação interativa)\r\n */\r\nexport const parserPercentageDecimal = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2)) / 100;\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2)) / 100;\r\n return valueN;\r\n};\r\n","/**\r\n * Remove todos os caracteres não numéricos de uma string\r\n * \r\n * Esta função usa uma expressão regular para filtrar qualquer caractere que não seja dígito (0-9),\r\n * mantendo apenas os caracteres numéricos na string.\r\n * \r\n * @param value - A string de entrada que pode conter letras, números e caracteres especiais\r\n * @returns Uma nova string contendo apenas os caracteres numéricos da entrada\r\n * \r\n * @example\r\n * ```typescript\r\n * removerLetters(\"abc123def456\") // retorna \"123456\"\r\n * removerLetters(\"telefone: (11) 99999-9999\") // retorna \"11999999999\"\r\n * removerLetters(\"sem números aqui\") // retorna \"\"\r\n * removerLetters(\"123\") // retorna \"123\"\r\n * ```\r\n */\r\nexport const removerLetters = (value: string): string => {\r\n\treturn value.replace(/[^0-9]/g, \"\");\r\n};","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeExtracao } from \"../types/extracao.type\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const ExtracaoModel = (obj?: Partial<TypeExtracao>): TypeExtracao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n horario: obj?.horario || 0,\r\n bloqueio: obj?.bloqueio || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n ativo: obj?.ativo ?? true,\r\n inativo_no_dia: obj?.inativo_no_dia || [],\r\n somente_nos_feriados: obj?.somente_nos_feriados || [],\r\n description: obj?.description || \"\",\r\n somente_no_feriado: obj?.somente_no_feriado || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n days: {\r\n 0: obj?.days?.[0] ?? false, // domingo\r\n 1: obj?.days?.[1] ?? false,\r\n 2: obj?.days?.[2] ?? false,\r\n 3: obj?.days?.[3] ?? false,\r\n 4: obj?.days?.[4] ?? false,\r\n 5: obj?.days?.[5] ?? false,\r\n 6: obj?.days?.[6] ?? false, // sabado\r\n },\r\n});\r\n","export { formatarNumero } from './formatarNumero';\r\nexport { generateDescargas } from '../descarga/generateDescargas';\r\nexport { gerarDezenas } from './gerarDezenas';\r\nexport { getSomaEnvio } from './getSomaEnvio';\r\nexport { getSomaVP } from './getSomaVP';\r\nexport { getCreatedBySystem } from './getCreatedBySystem';\r\nexport { getNumeroId } from './getNumeroId';\r\nexport { calculaValoresDosNumeros } from './calculaValoresDosNumeros';\r\nexport { getNumerosAcimaDoLimite } from './getNumerosAcimaDoLimite';\r\nexport { arredondarParaCima } from './arrendondarParaCima';\r\nexport { sortNumeros } from './sortNumeros';\r\nexport { getPropsPrefix } from './getPropsPrefix';\r\nexport { getPropsEnvioId } from './getPropsEnvioId';\r\nexport { getPropsEnvioIdOld } from './getPropsEnvioIdOld';\r\nexport { getPropsVP } from './getPropsVP';\r\nexport { getTiposJogos } from './getTiposJogos';\r\nexport { calcularValorDeNumero } from './calcularValorDeNumero';\r\nexport { getPremioFormato } from './getPremioFormato';\r\nexport { getSomaProps } from \"./getSomaProps\"\r\nexport { getLimiteSimulado } from './getLimiteSimulado';\r\nexport { arrendondarCasasDecimais } from './arrendondarCasasDecimais';","// Função que formata automaticamente a partir de um padrão\r\n\r\n/**\r\n * @description Esta função formata o numero para o formato de jogo passado\r\n * \r\n * @example formatarNumero(\"1234\", \"###\") // \"234\"\r\n * @example formatarNumero(\"1234\", \"##-##\") // \"12-34\"\r\n * @example formatarNumero(\"123456\", \"##-##-##\") // \"12-34-56\"\r\n*/\r\nexport const formatarNumero = (numero: string, formato: string) => {\r\n let resultado = '';\r\n let indiceNumero = numero.length - 1; // Começa do final do número\r\n let indiceFormato = formato.length - 1; // Começa do final do formato\r\n\r\n // Percorre o formato de trás para frente e substitui os dígitos conforme o padrão\r\n while (indiceFormato >= 0) {\r\n if (formato[indiceFormato] === '#') {\r\n resultado = numero[indiceNumero] + resultado; // Adiciona dígito do número\r\n indiceNumero--;\r\n } else if (formato[indiceFormato] === '-') {\r\n resultado = '-' + resultado; // Adiciona hífen no resultado\r\n }\r\n indiceFormato--; // Anda para o próximo caractere do formato\r\n }\r\n\r\n return resultado;\r\n \r\n};","import { DescargaModel } from \"../../models\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { TypeDescarga } from \"../../types/descarga.type\";\r\n\r\n/**\r\n * Gera uma descarga a partir de um número de aposta\r\n *\r\n * Esta função cria uma nova descarga (representação de uma aposta) baseada em um número específico.\r\n * Ela copia todas as propriedades do número para a descarga e adiciona propriedades adicionais\r\n * baseadas em prefixos específicos para diferentes tipos de dados.\r\n *\r\n * @param numero - O número de aposta que será usado para gerar a descarga\r\n * @param id - ID único da descarga que será usado\r\n * @returns Uma descarga completa com todas as propriedades necessárias\r\n *\r\n * @example\r\n * ```typescript\r\n * const numero = { numero: \"1234\", tipo_jogo: \"mega\", amount: 100, ... };\r\n * const descargaId = \"banca1_20240627140000_milhar_1_15\";\r\n * const descarga = generateDescarga(numero, descargaId);\r\n * ```\r\n */\r\nexport const generateDescarga = (\r\n numero: TypeNumero,\r\n id: string\r\n): TypeDescarga => {\r\n // Usa o ID fornecido como parâmetro para a descarga\r\n const descargaId = id;\r\n\r\n const lastEnvioId =\r\n numero?.envioIds?.length > 0\r\n ? numero.envioIds[numero.envioIds.length - 1]\r\n : \"\";\r\n\r\n // Cria uma nova instância de descarga usando o modelo, copiando todas as propriedades do número\r\n const descarga = DescargaModel({\r\n ...numero,\r\n id: descargaId, // ID único da descarga\r\n premio: numero.premio, // Valor do prêmio\r\n amount: numero.amount,\r\n numeros: [numero.numero], // Valor total da aposta\r\n amountEnviadoParaAssociacao: numero.amountEnviadoParaAssociacao, // Valor enviado para a banca\r\n valorAEnviarParaAssociacao: numero.valorAEnviarParaAssociacao, // Valor enviado para a banca\r\n envioId: lastEnvioId, // IDs dos envios relacionados\r\n dataAposta: numero.dataAposta, // Data em que a aposta foi feita\r\n bancaId: numero.bancaId, // ID da banca responsável\r\n valorArredondado: numero.valorArredondado, // Valor arredondado da aposta\r\n limiteJogoReal: numero.limiteJogoReal, // Limite para jogos reais\r\n limiteJogoSimulado: numero.limiteJogoSimulado, // Limite para jogos simulados\r\n valorJogo: numero.valorJogo, // Valor específico do jogo\r\n });\r\n\r\n // Retorna a descarga completa com todas as propriedades\r\n return descarga;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado nas propriedades do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta. O ID é formado pela concatenação de: bancaId (opcional), dataAposta,\r\n * tipo_jogo, premio e o amount arredondado (valor total da aposta).\r\n * \r\n * IMPORTANTE: Usa o 'amount' (valor total) em vez da soma dos VPs para garantir que\r\n * números com o mesmo valor total sejam agrupados na mesma descarga, evitando\r\n * descargas duplicadas quando apostas são feitas rapidamente.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param getByProperty - Propriedade opcional para usar um valor específico em vez do amount padrão\r\n * @returns Uma string única identificando a descarga\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: '20240627140000',\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * amount: 30\r\n * };\r\n * const descargaId = getDescargaIdPeloNumero(numero);\r\n * // Resultado: \"banca1_20240627140000_milhar_1_30\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloNumero = (\r\n numero: TypeNumero,\r\n getByProperty?: string\r\n) => {\r\n // Usa o amount (valor total da aposta) em vez da soma dos VPs para gerar o ID\r\n const valorParaId = getByProperty \r\n ? arredondarParaCima(Number(numero[getByProperty as keyof TypeNumero])) \r\n : arredondarParaCima(numero.amount);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${valorParaId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { TypeNumeros } from \"../../types\";\r\nimport { TypeDescargas } from \"../../types/descarga.type\";\r\nimport { generateDescarga } from \"./generateDescarga\";\r\nimport { getDescargaIdPeloNumero } from \"./getDescargaIdPeloNumero\";\r\n\r\n/**\r\n * Gera múltiplas descargas a partir de uma coleção de números de apostas\r\n * \r\n * Esta função agrupa números de apostas em descargas baseado em um ID único gerado\r\n * pelas propriedades de cada número. Números com o mesmo ID são agrupados na mesma\r\n * descarga, consolidando seus valores e arrays de números/envios.\r\n * \r\n * @param numeros - Coleção de números de apostas a serem processados\r\n * @param getByProperty - Propriedade opcional para usar no cálculo do ID da descarga\r\n * @returns Objeto com descargas agrupadas por ID único\r\n * \r\n * @example\r\n * ```typescript\r\n * const numeros = { \"1\": numero1, \"2\": numero2, ... };\r\n * const descargas = generateDescargas(numeros);\r\n * // Resultado: { \"descargaId1\": descarga1, \"descargaId2\": descarga2, ... }\r\n * ```\r\n */\r\nexport const generateDescargas = (\r\n numeros: TypeNumeros,\r\n getByProperty?: string\r\n): TypeDescargas => {\r\n const descargas: TypeDescargas = {};\r\n\r\n Object.entries(numeros).forEach(([, numero]) => {\r\n const descargaId = getDescargaIdPeloNumero(numero, getByProperty);\r\n\r\n if (!descargas[descargaId]) {\r\n // Se não existe, cria uma nova descarga usando o primeiro número como base e passa o ID gerado\r\n descargas[descargaId] = generateDescarga(numero, descargaId);\r\n } else {\r\n descargas[descargaId].numeros.push(numero.numero);\r\n }\r\n });\r\n\r\n return descargas;\r\n};\r\n","import { GAMES } from '../../constants/GAMES';\r\nimport { TypeBet } from '../../types/bet.type';\r\nimport { formatarNumero } from './formatarNumero';\r\n\r\n/**\r\n * @description Gera as dezenas a partir das apostas\r\n *\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"1234\", \"5678\"] } ] ) \r\n * -> [\"34\", \"78\"]\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"12-34\", \"56-78\"] } ] )\r\n * -> [\"12\", \"34\",\"56\", \"78\"]\r\n */\r\nexport const gerarDezenas = (bets: TypeBet[]): string[] => {\r\n const newNumbers: string[] = [];\r\n bets.forEach((bet) => {\r\n const TYPE_GAME = GAMES[bet.name];\r\n bet.numbers.forEach((number) => {\r\n if (TYPE_GAME.id === 'dezena') {\r\n const nums = number.split('-');\r\n for (const num of nums) {\r\n if (num.length < TYPE_GAME.format.length) continue;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n }\r\n return;\r\n }\r\n const num = number.replaceAll('-', '');\r\n if (num.length < TYPE_GAME.format.replaceAll('-', '').length) return;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n });\r\n });\r\n\r\n const uniqueCombinations = new Set(newNumbers);\r\n\r\n const nums = Array.from(uniqueCombinations);\r\n\r\n return nums;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaEnvio = (numero: TypeNumero): number => {\r\n let soma = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n soma += value;\r\n }\r\n });\r\n\r\n return soma;\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { getSomaEnvio } from \"./getSomaEnvio\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores de pule\r\n * e a quantidade de pules que possuem valor maior que 0\r\n *\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 0 }) -> { soma: 10, quantidadeDePules: 1 }\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 5 }) -> { soma: 15, quantidadeDePules: 2 }\r\n */\r\nexport const getSomaVP = (\r\n numero: TypeNumero\r\n): {\r\n soma: number;\r\n quantidadeDePulesMaiorQueZero: number;\r\n somaEnviadoParaAssociacao: number;\r\n} => {\r\n let soma = 0;\r\n let quantidadeDePulesMaiorQueZero = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n \r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n soma += value;\r\n if (value > 0) {\r\n quantidadeDePulesMaiorQueZero += 1;\r\n }\r\n }\r\n \r\n });\r\n\r\n const somaEnviadoParaAssociacao = getSomaEnvio(numero)\r\n\r\n soma -= somaEnviadoParaAssociacao;\r\n\r\n return { soma, quantidadeDePulesMaiorQueZero, somaEnviadoParaAssociacao };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { formatarNumero } from \"./formatarNumero\";\r\n\r\nexport const getNumeroId = (props: {\r\n dataAposta: number;\r\n jogo: keyof typeof GAMES;\r\n premio: string;\r\n numero: string;\r\n bancaId: string;\r\n descarregado?: boolean;\r\n}) => {\r\n const { dataAposta, jogo, numero, bancaId, premio, descarregado } = props;\r\n\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n const numeroFormatado = TYPE_GAME.markAll\r\n ? numero\r\n : formatarNumero(numero, TYPE_GAME.format);\r\n\r\n let descarregadoFormatado = descarregado ? \"true\" : \"false\";\r\n\r\n const numberId =\r\n (bancaId ? `${bancaId}_` : \"\") +\r\n `${dataAposta}_${jogo}_${premio}_${numeroFormatado}_${descarregadoFormatado}`;\r\n\r\n return numberId;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getTiposJogos = (tipos: string) => {\r\n const jogos = tipos.replaceAll(\".invertida\", \"\").split(\"@\");\r\n return jogos as (keyof typeof GAMES)[];\r\n};","// calcularValorDeNumero.ts\r\n\r\nimport { GAMES } from \"../../constants\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\n\r\n/**\r\n * Calcula o valor atribuído a cada número apostado, com base nos parâmetros do jogo.\r\n *\r\n * O cálculo segue três etapas:\r\n * 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n * 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n * 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n *\r\n * @param {Object} options — Parâmetros de entrada.\r\n * @param {number} options.quantidadeDeNumeros — Quantidade de números apostados.\r\n * @param {keyof typeof GAMES} options.tipoJogo — Tipo de jogo conforme chave de `GAMES`.\r\n * @param {number} options.valorPremio — Valor total do prêmio a ser distribuído.\r\n * @param {number} options.quantidadeDePremios — Quantidade de prêmios, se aplicável (usa 1 como fallback se zero).\r\n * @returns {number} — Valor calculado por número apostado.\r\n */\r\nexport const calcularValorDeNumero = ({\r\n quantidadeDeNumeros,\r\n tipoJogo,\r\n valorPremio,\r\n quantidadeDePremios,\r\n}: {\r\n quantidadeDeNumeros: number;\r\n tipoJogo: keyof typeof GAMES;\r\n valorPremio: number;\r\n quantidadeDePremios: number;\r\n}): number => {\r\n const TYPE_GAME = GAMES[tipoJogo];\r\n\r\n const jogos = getTiposJogos(tipoJogo);\r\n\r\n //* 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n let valorDoNumero = valorPremio / (jogos.length || 1);\r\n\r\n //* 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n valorDoNumero /= quantidadeDeNumeros;\r\n\r\n //* 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n if (!TYPE_GAME.markAll) {\r\n valorDoNumero /= (quantidadeDePremios || 1);\r\n }\r\n\r\n if(quantidadeDePremios === 0) valorDoNumero = 0\r\n\r\n return valorDoNumero;\r\n};\r\n","import { TypeGame, TypeNumeros } from \"../../types\";\r\nimport { GAMES, PREFIX_NUMBER, PREMIOS } from \"../../constants\";\r\nimport { NumberModel } from \"../../models\";\r\nimport { getNumeroId } from \"./getNumeroId\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\nimport { calcularValorDeNumero } from \"./calcularValorDeNumero\";\r\nimport { arredondarParaCima, arrendondarCasasDecimais, getPremioFormato } from \"../..\";\r\n\r\n// Função auxiliar para criar um novo NumberModel\r\nconst criarNumberModel = (\r\n numberId: string,\r\n numeroFormatado: string,\r\n premioFormato: keyof typeof PREMIOS,\r\n created: number,\r\n game: TypeGame,\r\n jogo: any\r\n) => {\r\n return NumberModel({\r\n id: numberId,\r\n numero: numeroFormatado,\r\n premio: premioFormato,\r\n created: created,\r\n bancaId: game.bancaId,\r\n amount: 0,\r\n valorArredondado: 0,\r\n dataAposta: game.dateBet,\r\n tipo_jogo: jogo,\r\n [`${PREFIX_NUMBER}${game.id}` as any]: 0,\r\n });\r\n};\r\n\r\n// Função auxiliar para processar um número e prêmio\r\nconst processarNumeroEPremio = (\r\n number: string,\r\n premio: keyof typeof PREMIOS,\r\n valorDoNumero: number,\r\n TYPE_GAME: any,\r\n game: TypeGame,\r\n jogo: any,\r\n numeros: TypeNumeros,\r\n) => {\r\n const premioFormato = TYPE_GAME.markAll ? PREMIOS[\"1-5\"].id : premio;\r\n const numeroFormatado = number;\r\n\r\n const numberId = getNumeroId({\r\n numero: number,\r\n bancaId: game.bancaId,\r\n dataAposta: game.dateBet,\r\n jogo: jogo,\r\n premio: premioFormato,\r\n });\r\n\r\n if (!numeros?.[numberId]) {\r\n numeros[numberId] = criarNumberModel(\r\n numberId,\r\n numeroFormatado,\r\n premioFormato,\r\n game.created,\r\n game,\r\n jogo\r\n );\r\n }\r\n\r\n const valor = arrendondarCasasDecimais(valorDoNumero);\r\n\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] += valor;\r\n numeros[numberId].amount += valor;\r\n numeros[numberId].valorArredondado += arredondarParaCima(valor);\r\n};\r\n\r\nexport const calculaValoresDosNumeros = (\r\n game: TypeGame,\r\n minimoParaSelecionarDo1ao5Premio = 0\r\n) => {\r\n const numeros: TypeNumeros = {};\r\n\r\n for (const bet of game.bets) {\r\n\r\n const jogos = getTiposJogos(bet.name);\r\n\r\n for (const jogo of jogos) {\r\n const TYPE_GAME = GAMES[jogo];\r\n \r\n const numbers = bet.numbers.filter((number) => {\r\n return number.length === TYPE_GAME.format.length;\r\n })\r\n\r\n const qtd_numeros = numbers.length;\r\n\r\n for (const number of numbers) {\r\n\r\n for (const prize of bet.prizes) {\r\n // Cálculo do valor do número (comum para ambos os casos)\r\n const valorDoNumero = calcularValorDeNumero({\r\n valorPremio: prize.value,\r\n tipoJogo: bet.name,\r\n quantidadeDeNumeros: qtd_numeros,\r\n quantidadeDePremios: prize.prizes.length,\r\n });\r\n\r\n // Caso especial: quando não é markAll e tem 5 prêmios\r\n if (\r\n minimoParaSelecionarDo1ao5Premio > 0 &&\r\n prize.prizes.length >= minimoParaSelecionarDo1ao5Premio\r\n ) {\r\n processarNumeroEPremio(\r\n number,\r\n PREMIOS[\"1-5\"].id,\r\n valorDoNumero,\r\n TYPE_GAME,\r\n game,\r\n jogo,\r\n numeros\r\n );\r\n\r\n continue;\r\n }\r\n\r\n // Caso geral: processar cada prêmio individualmente\r\n for (const premio of prize.prizes) {\r\n processarNumeroEPremio(\r\n number,\r\n getPremioFormato(premio),\r\n valorDoNumero,\r\n TYPE_GAME,\r\n game,\r\n jogo,\r\n numeros\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { numeros };\r\n};\r\n","import { arrendondarCasasDecimais, functionsCore } from \"..\";\r\nimport { TypeLimitGames, TypeNumero, TypeResultadoNumeroComDiferenca, TypeValueGames } from \"../../types\";\r\n\r\nexport const getNumerosAcimaDoLimite = (\r\n numeros: TypeNumero[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): TypeResultadoNumeroComDiferenca[] => {\r\n return numeros\r\n .map((numero) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n numero.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === numero.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = arrendondarCasasDecimais(numero.amount);\r\n const limiteAtingidoArredondado = arrendondarCasasDecimais(limiteAtingido);\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n numero,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as TypeResultadoNumeroComDiferenca[];\r\n};\r\n","export const arredondarParaCima = (valor: number): number => {\r\n // Trabalha com centavos de forma mais segura (com Math.round)\r\n let emCentavos = Math.round(valor * 100);\r\n\r\n // Se não for múltiplo de 5, arredonda para cima\r\n const resto = emCentavos % 5;\r\n if (resto !== 0) {\r\n emCentavos += 5 - resto;\r\n }\r\n\r\n const valorFinal = emCentavos / 100\r\n\r\n return valorFinal;\r\n}","import { GAMES } from \"../../constants\";\r\nimport { TypeNumeros } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortNumeros = (numeros: TypeNumeros): TypeNumeros => {\r\n const sortedDescargas = Object.values(numeros).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n\r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n\r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return a.amount > b.amount ? -1 : 1;\r\n });\r\n\r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeNumeros;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n numero: Partial<TypeNumero>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOld = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsVP = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero, TypePropsPrefix } from \"../../types\";\r\nimport { clone } from \"../../utils\";\r\nimport { getPropsEnvioId } from \"./getPropsEnvioId\";\r\nimport { getPropsEnvioIdOld } from \"./getPropsEnvioIdOld\";\r\nimport { getPropsVP } from \"./getPropsVP\";\r\n\r\nexport const getPropsPrefix = (numero: Partial<TypeNumero>): TypePropsPrefix => {\r\n const props: TypePropsPrefix = {\r\n [PREFIX_NUMBER]: {},\r\n [PREFIX_ENVIO]: {},\r\n [PREFIX_ENVIO_OLD]: {},\r\n };\r\n\r\n const vps = clone(getPropsVP(numero));\r\n const envio_ids = clone(getPropsEnvioId(numero));\r\n const envio_ids_old = clone(getPropsEnvioIdOld(numero));\r\n\r\n props[PREFIX_NUMBER] = clone(vps);\r\n props[PREFIX_ENVIO] = clone(envio_ids);\r\n props[PREFIX_ENVIO_OLD] = clone(envio_ids_old);\r\n\r\n return props;\r\n};\r\n","import { PREMIOS } from \"../../constants\";\r\n\r\n/**\r\n * @description Retorna o formato do prêmio\r\n * @param premio - Prêmio a ser formatado\r\n * @returns Formato do prêmio\r\n * @example getPremioFormato(1) // \"1\"\r\n * @example getPremioFormato(2) // \"2\"\r\n * @example getPremioFormato(3) // \"3\"\r\n * @example getPremioFormato(4) // \"4\"\r\n * @example getPremioFormato(5) // \"5\"\r\n */\r\nexport const getPremioFormato = (premio: number) => {\r\n if (premio === 1) return PREMIOS[\"1\"].id;\r\n if (premio === 2) return PREMIOS[\"2\"].id;\r\n if (premio === 3) return PREMIOS[\"3\"].id;\r\n if (premio === 4) return PREMIOS[\"4\"].id;\r\n if (premio === 5) return PREMIOS[\"5\"].id;\r\n return PREMIOS[\"1-5\"].id;\r\n};\r\n","/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaProps = (objeto: Record<string, number>): number => {\r\n let soma = 0;\r\n\r\n Object.values(objeto).forEach((value) => {\r\n soma += value;\r\n });\r\n\r\n return soma;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeLimitGame, TypeLimitGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o limite associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `limitsGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeLimitGames} limitsGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O limite correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const limitsGames = {\r\n * \"1\": { type_game: 'milhar', limit: 10 },\r\n * \"2\": { type_game: 'centena', limit: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(limitsGames, 'milhar');\r\n * resultado = { type_game: 'milhar', limit: 10 }\r\n */\r\nexport const getLimiteJogoPeloTipoJogo = (\r\n limitsGames: TypeLimitGames,\r\n type_game: keyof typeof GAMES\r\n): TypeLimitGame | undefined => {\r\n return Object.values(limitsGames).find((v) => v.type_game === type_game);\r\n};\r\n","export { calcularValorJogoPeloLimite } from \"./calcularValorJogoPeloLimite\"\r\nexport { getValorJogoPeloTipoJogo } from \"./getValorJogoPeloTipoJogo\"\r\nexport { getLimiteJogoPeloTipoJogo } from \"./getLimiteJogoPeloTipoJogo\"","/**\r\n * Calcula o valor unitário de uma jogada com base no limite total disponível.\r\n *\r\n * A função divide o limite (`limiteJogo.limit`) pelo valor fornecido em `valorJogo.value`.\r\n * Se `valorJogo.value` for `0`, será usado o valor padrão `1` para evitar divisão por zero.\r\n * \r\n * @param {number} limiteJogo - valor do limite de jogo.\r\n * @param {TypeValueGame} valorJogo - Objeto que contém o valor do jogo.\r\n * @returns {number} O valor resultante da divisão do limite pelo valor, representando o valor unitário por jogada.\r\n *\r\n * @example\r\n * const limiteJogo = { type_game: \"milhar\", limit: 40000 };\r\n * const valorJogo = { type_game: \"milhar\", value: 4000 };\r\n * const resultado = calcularValorJogoPeloLimite(limiteJogo, valorJogo);\r\n * resultado = 10\r\n */\r\nexport const calcularValorJogoPeloLimite = (\r\n limiteJogo: number,\r\n valorJogo: number\r\n) => {\r\n return limiteJogo / (valorJogo || 1);\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeValueGame, TypeValueGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o valor associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `valuesGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeValueGames} valuesGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O valor correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const valuesGames = {\r\n * \"1\": { type_game: 'milhar', value: 10 },\r\n * \"2\": { type_game: 'centena', value: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(valuesGames, 'milhar');\r\n * resultado = { type_game: 'milhar', value: 10 }\r\n */\r\nexport const getValorJogoPeloTipoJogo = (\r\n valuesGames: TypeValueGames,\r\n type_game: keyof typeof GAMES\r\n): TypeValueGame | undefined => {\r\n return Object.values(valuesGames).find((v) => v.type_game === type_game);\r\n};\r\n","/**\r\n * @description Arredonda um número para um número de casas decimais específico\r\n * @param numero Número a ser arredondado\r\n * @param casas Número de casas decimais para arredondar\r\n * @returns Número arredondado\r\n * @example arrendondarCasasDecimais(1.23456789, 2) // 1.23\r\n * @example arrendondarCasasDecimais(1.23456789, 3) // 1.235\r\n * @example arrendondarCasasDecimais(1.23456789, 4) // 1.2346\r\n * @example arrendondarCasasDecimais(1.23456789, 5) // 1.23457\r\n */\r\nexport const arrendondarCasasDecimais = (numero: number, casas: number = 10) => {\r\n return Number(numero.toFixed(casas));\r\n}","import { TypeLimitGames } from \"../../types/limit_value_type_game.type\";\r\nimport { TypeValueGames } from \"../../types/value_type_game.type\";\r\nimport { getLimiteJogoPeloTipoJogo } from \"../limite_jogos/getLimiteJogoPeloTipoJogo\";\r\nimport { getValorJogoPeloTipoJogo } from \"../limite_jogos\";\r\nimport { GAMES } from \"../../constants\";\r\nimport { arrendondarCasasDecimais } from \"./arrendondarCasasDecimais\";\r\n\r\nexport const getLimiteSimulado = (\r\n tipo_jogo: keyof typeof GAMES,\r\n valores: TypeValueGames,\r\n limites: TypeLimitGames,\r\n): number => {\r\n const valorJogo = getValorJogoPeloTipoJogo(valores, tipo_jogo);\r\n\r\n const limiteJogo = getLimiteJogoPeloTipoJogo(limites, tipo_jogo);\r\n\r\n const limiteSimulado = (limiteJogo?.limit || 0) / (valorJogo?.value || 1);\r\n\r\n return arrendondarCasasDecimais(limiteSimulado);\r\n};\r\n","export { getAvailableTimes } from \"./getAvailableTimes\"\r\nexport { pegarExtracoes } from \"./pegarExtracoes\"\r\nexport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\"\r\nexport { extracaoEstaAtivaBoolean } from \"./extracaoEstaAtivaBoolean\"\r\nexport { getProximaExtracaoDisponivelParaAposta } from \"./getProximaExtracaoDisponivelParaAposta\"","import { format, getDay } from 'date-fns';\r\nimport { getBetDateToNumber } from '../../functions/games';\r\nimport { TypeExtracao } from '../../types';\r\nimport { numberToDate, showFormatDate } from '../../utils';\r\n\r\n/**\r\n * @description\r\n * Retorna a lista de extrações válidas (horários disponíveis) para uma data de aposta específica,\r\n * levando em conta regras como feriados, dias da semana, bloqueios por horário e status de atividade.\r\n * \r\n * Regras aplicadas:\r\n * - Ignora extrações marcadas como **inativas para o dia da aposta** (`inativo_no_dia`).\r\n * - Se houver extrações exclusivas para feriados (`somente_no_feriado` === data da aposta),\r\n * retorna apenas essas extrações.\r\n * - Caso contrário, retorna extrações ativas e recorrentes para o **dia da semana da aposta**\r\n * (ex: segunda-feira), desde que não sejam exclusivas de feriado.\r\n * - Se `showAll` for `true`, ignora as regras acima e retorna todas as extrações ativas.\r\n * - Se `mobile` for `true` e `dateBet` for o dia atual (`dateNow`), filtra ainda mais: remove as extrações\r\n * cujo horário de **bloqueio já passou**, baseado na hora atual do dispositivo.\r\n * \r\n * A lista final é sempre ordenada do menor para o maior horário (`ext.horario`).\r\n *\r\n * @param extracoes - Lista de todas as extrações disponíveis no sistema.\r\n * @param dateBet - Data da aposta em formato numérico (ex: 20241001000000).\r\n * @param showAll - Se `true`, ignora filtros e retorna todas as extrações ativas.\r\n * @param mobile - Se `true`, aplica lógica de bloqueio com base na hora atual (`dateNow`).\r\n * @param dateNow - Data/hora atual usada para comparação, especialmente quando `mobile` estiver ativado.\r\n * \r\n * @returns Lista de extrações válidas, ordenadas por horário.\r\n */\r\nexport const getAvailableTimes = (\r\n extracoes: TypeExtracao[],\r\n dateBet: number,\r\n showAll?: boolean,\r\n mobile?: boolean,\r\n dateNow?: Date\r\n) => {\r\n // converte a data com horas,minutos e segundos com zero\r\n const data = getBetDateToNumber(dateBet, 20241001000000);1\r\n\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(data)\r\n );\r\n\r\n const DateBet = numberToDate(data);\r\n\r\n let validTimes: TypeExtracao[] = [];\r\n\r\n // verifica se no dia selecionado tem alguma extração com aquela data exata e se nao está inativa no dia\r\n const extracoesFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === data\r\n );\r\n\r\n // se tiver, mostra somente a extracao da data selecionada\r\n if (extracoesFeriado.length > 0) {\r\n validTimes = [...extracoesFeriado];\r\n } else {\r\n // se nao, mostra todas menos a com a data selecionada\r\n validTimes = extracoesAtivas.filter(\r\n (ext) =>\r\n DateBet &&\r\n ext.days[getDay(DateBet) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n }\r\n\r\n if (showAll) {\r\n validTimes = [...extracoesAtivas];\r\n }\r\n\r\n if (mobile && DateBet && dateNow) {\r\n if (format(dateNow, 'dd/MM/yyyy') === format(DateBet, 'dd/MM/yyyy')) {\r\n validTimes = validTimes.filter(\r\n (ext) =>\r\n Number(format(dateNow, 'HHmm')) <\r\n Number(showFormatDate(ext.bloqueio, 'HHmm'))\r\n );\r\n }\r\n }\r\n\r\n return validTimes.sort((extA, extB) =>\r\n Number(showFormatDate(extA.horario, 'HHmm')) <\r\n Number(showFormatDate(extB.horario, 'HHmm'))\r\n ? -1\r\n : 1\r\n );\r\n};\r\n","export { calculateAmount } from './calculateAmount';\r\nexport { calculateAmountGame } from './calculateAmountGame';\r\nexport { getBetDateToNumber } from './getBetDateToNumber';\r\nexport { formatPuleId } from './formatPuleId';\r\nexport { getFormattedPuleId } from './getFormattedPuleId';\r\nexport { fazerJogo } from './fazerJogo';\r\nexport { invertGame } from './invertGame';\r\nexport { getGamesUnicosList, getGamesUnicosObjeto } from './getGamesUnicos';\t","import { TypePrize } from \"../../types/bet.type\";\r\n\r\nexport const calculateAmount = (betValues: TypePrize[]) => {\r\n let total = 0;\r\n betValues.forEach((item) => {\r\n total += item.value;\r\n });\r\n return total;\r\n};\r\n","import { TypeBet } from \"../../types/bet.type\";\r\nimport { calculateAmount } from \"./calculateAmount\";\r\n\r\nexport const calculateAmountGame = (games: TypeBet[]) => {\r\n let total = 0;\r\n\r\n games.forEach((bet) => {\r\n total += calculateAmount(bet.prizes);\r\n });\r\n\r\n return total;\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { dateToNumber, numberToDate } from \"../../utils\";\r\n\r\n/**\r\n * Combina uma data base com o horário de uma extração para formar uma data completa\r\n * \r\n * Esta função pega uma data base (YYYYMMDDHHmmss) e combina com o horário de uma extração,\r\n * criando uma nova data que mantém a data base mas usa o horário da extração.\r\n * \r\n * @param date Data base no formato YYYYMMDDHHmmss (ano, mês, dia, hora, minuto, segundo)\r\n * @param extracaoDate Horário da extração no formato HHmmss (hora, minuto, segundo)\r\n * @returns Data combinada no formato YYYYMMDDHHmmss, ou 0 se algum parâmetro for inválido\r\n * \r\n * @example\r\n * // Combina data 2024-12-25 00:00:00 com horário 14:30:00\r\n * const result = getBetDateToNumber(20241225000000, 143000);\r\n * // Retorna: 20241225143000 (25/12/2024 às 14:30:00)\r\n * \r\n * @example\r\n * // Combina data 2024-12-25 10:15:30 com horário 09:45:00\r\n * const result = getBetDateToNumber(20241225101530, 94500);\r\n * // Retorna: 20241225094500 (25/12/2024 às 09:45:00)\r\n * \r\n * @example\r\n * // Parâmetros inválidos\r\n * const result = getBetDateToNumber(0, 0);\r\n * // Retorna: 0\r\n */\r\nexport const getBetDateToNumber = (\r\n date: number,\r\n extracaoDate: TypeExtracao[\"horario\"]\r\n): number => {\r\n const extDate = extracaoDate;\r\n\r\n const dateExtracao = numberToDate(extDate);\r\n\r\n let newDateBet = numberToDate(date);\r\n\r\n if(!newDateBet || !dateExtracao) return 0;\r\n\r\n newDateBet = setHours(newDateBet, dateExtracao.getHours());\r\n newDateBet = setMinutes(newDateBet, dateExtracao.getMinutes());\r\n newDateBet = setSeconds(newDateBet, 0);\r\n\r\n const number = dateToNumber(newDateBet);\r\n\r\n return number;\r\n};\r\n","/**\r\n * @description Formata o ID do pule na criação\r\n*/\r\nexport const formatPuleId = (n: number): string => {\r\n if (n < 1000) {\r\n return n.toString().padStart(4, '0');\r\n } else {\r\n return n.toString();\r\n }\r\n};\r\n","/**\r\n * @description Formata o ID do pule para exibir em tela, extraindo a última parte após o último hífen\r\n * \r\n * @param {string} id - O ID completo do pule que pode conter múltiplos hífens\r\n * @returns {string} A última parte do ID após o último hífen\r\n * \r\n * @example\r\n * getFormattedPuleId(\"1-0001\") // \"0001\"\r\n * @example\r\n * getFormattedPuleId(\"102-2344301\") // \"2344301\"\r\n * @example\r\n * getFormattedPuleId(\"df29e917-d922-afce-257b-7e766411ef79-0541\") // \"0541\"\r\n */\r\nexport const getFormattedPuleId = (id: string): string => {\r\n const parts = id.split('-');\r\n return parts[parts.length - 1];\r\n};\r\n","// Importa a constante GAMES que contém as configurações de todos os tipos de jogos disponíveis\r\nimport { GAMES } from \"../../constants\";\r\n// Importa o tipo TypeGame que representa a estrutura de um jogo completo\r\nimport { TypeGame } from \"../../types\";\r\n// Importa a função clone para fazer cópia profunda de objetos e getAllCombinations para gerar permutações\r\nimport { clone, getAllCombinations } from \"../../utils\";\r\n// Importa formatarNumero para formatar números conforme o padrão do jogo e getTiposJogos para extrair tipos de jogos\r\nimport { formatarNumero, getTiposJogos } from \"../numbers\";\r\n\r\n/**\r\n * Função que processa jogos invertidos, gerando todas as combinações possíveis dos números\r\n * para cada tipo de jogo especificado na aposta.\r\n *\r\n * @param game - O jogo completo contendo todas as apostas\r\n * @returns Um novo jogo com as apostas invertidas processadas (números expandidos em todas as combinações)\r\n *\r\n * @example\r\n * EXEMPLO COM NÚMERO 1234 DO TIPO \"milhar.invertida@centena.invertida\":\r\n *\r\n * Entrada:\r\n * game = {\r\n * bets: [{\r\n * name: \"milhar.invertida@centena.invertida\",\r\n * numbers: [\"1234\"],\r\n * prizes: [...]\r\n * }]\r\n * }\r\n *\r\n * Processamento:\r\n * 1. getTiposJogos(\"milhar.invertida@centena.invertida\")\r\n * -> Remove \".invertida\" de cada parte e divide por \"@\"\r\n * -> Resultado: [\"milhar\", \"centena\"]\r\n *\r\n * 2. Para tipo_jogo = \"milhar\":\r\n * - formatarNumero(\"1234\", \"####\") -> \"1234\" (formato milhar usa 4 dígitos)\r\n * - getAllCombinations(\"1234\") -> [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\"]\r\n * - Total: 24 combinações (4! = 24)\r\n *\r\n * 3. Para tipo_jogo = \"centena\":\r\n * - formatarNumero(\"1234\", \"###\") -> \"234\" (formato centena usa últimos 3 dígitos)\r\n * - getAllCombinations(\"234\") -> [\"234\", \"243\", \"324\", \"342\", \"423\", \"432\"]\r\n * - Total: 6 combinações (3! = 6)\r\n *\r\n * 4. Combinações totais: 24 + 6 = 30 combinações\r\n *\r\n * 5. Remove duplicatas (se houver) usando Set\r\n *\r\n * Saída:\r\n * game = {\r\n * bets: [{\r\n * name: \"milhar.invertida@centena.invertida\",\r\n * numbers: [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\",\r\n * \"234\", \"243\", \"324\", \"342\", \"423\", \"432\"],\r\n * prizes: [...]\r\n * }]\r\n * }\r\n */\r\nexport const invertGame = (game: TypeGame): TypeGame => {\r\n // Cria uma cópia profunda do jogo para não modificar o objeto original\r\n const newGame = clone(game);\r\n\r\n // Itera sobre todas as apostas do jogo, uma por uma\r\n for (let index = 0; index < newGame.bets.length; index++) {\r\n // Obtém a aposta atual do array de apostas\r\n let aposta = newGame.bets[index];\r\n\r\n // Extrai os tipos de jogos do nome da aposta\r\n // Exemplo: \"milhar.invertida@centena.invertida\" -> [\"milhar\", \"centena\"]\r\n // A função remove \".invertida\" e divide por \"@\" para obter os tipos base\r\n const tipos_jogos = getTiposJogos(aposta.name);\r\n\r\n // Obtém o array de números da aposta original\r\n const nums = aposta.numbers;\r\n // Inicializa um array vazio para armazenar todas as combinações geradas\r\n const result: string[] = [];\r\n\r\n // Itera sobre cada tipo de jogo extraído (ex: \"milhar\", \"centena\")\r\n for (const tipo_jogo of tipos_jogos) {\r\n // Itera sobre cada número da aposta original\r\n for (const num of nums) {\r\n // Formata o número conforme o formato do tipo de jogo\r\n // Exemplo: formatarNumero(\"1234\", \"####\") -> \"1234\" (milhar)\r\n // Exemplo: formatarNumero(\"1234\", \"###\") -> \"234\" (centena, pega últimos 3 dígitos)\r\n const numeroFormatado = formatarNumero(num, GAMES[tipo_jogo].format);\r\n \r\n // Verifica se o nome da aposta contém \"invertida\"\r\n // Se sim, gera todas as permutações possíveis do número formatado\r\n // Exemplo: getAllCombinations(\"1234\") -> [\"1234\", \"1243\", \"1324\", ...] (24 combinações)\r\n // Exemplo: getAllCombinations(\"234\") -> [\"234\", \"243\", \"324\", ...] (6 combinações)\r\n if (aposta.name.includes(\"invertida\")) {\r\n const n = getAllCombinations(numeroFormatado);\r\n // Adiciona todas as combinações geradas ao array de resultados\r\n // Usa spread operator (...) para adicionar cada elemento individualmente\r\n result.push(...n);\r\n continue;\r\n }\r\n\r\n // Se o número já tem o tamanho correto do formato do jogo, adiciona o número original\r\n // Isso evita formatação desnecessária quando o número já está no formato esperado\r\n if (num.length === GAMES[tipo_jogo].format.length) {\r\n result.push(num);\r\n continue;\r\n }\r\n\r\n // Caso contrário, adiciona o número formatado ao resultado\r\n result.push(numeroFormatado);\r\n }\r\n\r\n // Cria uma nova aposta mantendo todas as propriedades originais (name, prizes)\r\n // mas substituindo o array de numbers pelas combinações únicas geradas\r\n // Usa clone para garantir que o array de números seja uma cópia independente\r\n aposta = { ...aposta, numbers: clone(result) };\r\n\r\n // Atualiza a aposta no array de apostas do jogo com as novas combinações\r\n newGame.bets[index] = aposta;\r\n }\r\n }\r\n\r\n // Retorna o jogo modificado com todas as apostas invertidas processadas\r\n return newGame;\r\n};\r\n","import { GameModel } from \"../../models\";\r\nimport { TypeExtracao, TypeGame, TypeUser } from \"../../types\";\r\nimport { calculaValoresDosNumeros } from \"../numbers/calculaValoresDosNumeros\";\r\nimport { calculateAmountGame } from \"./calculateAmountGame\";\r\nimport { getBetDateToNumber } from \"./getBetDateToNumber\";\r\nimport { invertGame } from \"./invertGame\";\r\n\r\nexport const fazerJogo = (\r\n cart: TypeGame,\r\n profile: TypeUser,\r\n dateBet: number,\r\n extracao: TypeExtracao,\r\n puleId: string\r\n) => {\r\n\r\n const game = GameModel({\r\n ...cart,\r\n id: puleId,\r\n creator: profile,\r\n dateBet: getBetDateToNumber(dateBet, extracao.horario),\r\n totalAmount: calculateAmountGame(cart.bets),\r\n extracao: extracao,\r\n });\r\n\r\n const gameWIthInvertedNumbers = invertGame(game);\r\n\r\n const { numeros } = calculaValoresDosNumeros(\r\n gameWIthInvertedNumbers\r\n );\r\n\r\n return { numeros, game };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getGamesUnicosList = () =>\r\n Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\nexport const getGamesUnicosObjeto = () => {\r\n const filtrados = Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\n const obj = filtrados.reduce((acc, item) => {\r\n acc[item.id] = item;\r\n return acc;\r\n }, {} as Record<string, (typeof GAMES)[keyof typeof GAMES]>);\r\n\r\n return obj;\r\n};\r\n","import { format, getDay } from \"date-fns\";\r\nimport {\r\n dateToNumber,\r\n numberToDate,\r\n pegarHorarioSaoPaulo,\r\n showFormatDate,\r\n} from \"../../utils\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * @description\r\n * Retorna uma lista de extrações válidas para uma data de aposta, aplicando regras de negócio:\r\n *\r\n * Regras aplicadas:\r\n * 1. Se houver extrações exclusivas para feriado (`somente_no_feriado`), retorna apenas essas.\r\n * 2. Caso contrário, retorna extrações ativas que funcionam no dia da semana da aposta (`days`) e não são exclusivas de feriado.\r\n * 3. Se `retornar === \"do_dia\"`, retorna todas as extrações válidas para a data da aposta.\r\n * 4. Se `retornar === \"proximas\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário de bloqueio ainda não passou.\r\n * 5. Se `retornar === \"anteriores\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário já passou.\r\n * 6. A lista final é sempre ordenada do menor para o maior horário (`horario`).\r\n *\r\n * @param params.extracoes - Lista completa de extrações disponíveis.\r\n * @param params.dataAposta - Data da aposta em formato numérico (ex: 20241001000000). Default: hora atual em São Paulo.\r\n * @param params.dataAgora - Data/hora atual usada para comparação de próximas/anteriores. Default: hora atual em São Paulo.\r\n * @param params.retornar - Define o filtro de retorno:\r\n * - `\"do_dia\"`: retorna todas as extrações válidas para a data da aposta.\r\n * - `\"proximas\"`: retorna apenas extrações que ainda não passaram no dia da aposta.\r\n * - `\"anteriores\"`: retorna apenas extrações que já passaram no dia da aposta.\r\n *\r\n * @returns Lista de extrações válidas, ordenadas por horário crescente.\r\n */\r\nexport const pegarExtracoes = ({\r\n extracoes,\r\n dataAposta = dateToNumber(pegarHorarioSaoPaulo()), // Data da aposta padrão: hora atual SP\r\n dataAgora = dateToNumber(pegarHorarioSaoPaulo()), // Data/hora atual padrão: hora atual SP\r\n retornar = \"do_dia\", // Tipo de filtro padrão\r\n pegar = \"bloqueio\",\r\n}: {\r\n extracoes: TypeExtracao[];\r\n dataAposta?: number;\r\n dataAgora?: number;\r\n retornar?: \"do_dia\" | \"anteriores\" | \"proximas\";\r\n pegar?: \"horario\" | \"bloqueio\";\r\n}): TypeExtracao[] => {\r\n /**\r\n * @description Retorna o horário apropriado da extração baseado no parâmetro 'pegar'\r\n *\r\n * @param {TypeExtracao} extracao - A extração da qual se deseja obter o horário\r\n * @returns {number} O horário da extração (horario ou bloqueio) ou 0 se não especificado\r\n *\r\n * @example\r\n * // Retorna o horário da extração\r\n * getHorario(extracao) // quando pegar === \"horario\" -> retorna extracao.horario\r\n *\r\n * @example\r\n * // Retorna o horário de bloqueio da extração\r\n * getHorario(extracao) // quando pegar === \"bloqueio\" -> retorna extracao.bloqueio\r\n */\r\n const getHorario = (extracao: TypeExtracao) => {\r\n if (pegar === \"horario\") return extracao.horario;\r\n if (pegar === \"bloqueio\") return extracao.bloqueio;\r\n return 0;\r\n };\r\n\r\n // Converte a data da aposta para remover horas, minutos e segundos\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n // Converte a data agora para o mesmo formato de aposta (apenas data)\r\n const dataAgoraNumerica = getBetDateToNumber(dataAgora, 20241001000000);\r\n\r\n // Converte a data da aposta para objeto Date\r\n const dataApostaDate = numberToDate(dataApostaNumerica);\r\n\r\n if (!dataApostaDate) throw new Error(\"dataApostaDate é obrigatória!\");\r\n\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) =>\r\n ext.ativo &&\r\n !ext.inativo_no_dia.includes(dataApostaNumerica)\r\n );\r\n\r\n // Filtra extrações que são exclusivas para feriado na data da aposta\r\n // Normaliza somente_no_feriado para comparação (remove horas, minutos e segundos)\r\n const extracoesDeFeriado = extracoesAtivas.filter((ext) => {\r\n const somenteNoFeriadoNormalizado = ext.somente_no_feriado !== 0\r\n ? getBetDateToNumber(ext.somente_no_feriado, 20241001000000)\r\n : 0;\r\n return somenteNoFeriadoNormalizado === dataApostaNumerica;\r\n });\r\n\r\n // Filtra extrações normais (não exclusivas de feriado)\r\n const extracoesNormais = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === 0\r\n );\r\n\r\n // Determina as extrações válidas iniciais\r\n const extracoesValidas =\r\n // Se houver feriados, retorna apenas essas extrações\r\n extracoesDeFeriado.length > 0\r\n ? extracoesDeFeriado\r\n : // Caso contrário, retorna extrações normais do dia da semana ativo\r\n extracoesNormais.filter(\r\n (ext) =>\r\n ext.days[getDay(dataApostaDate) as keyof typeof ext.days]\r\n );\r\n\r\n // Retorna todas as extrações válidas do dia, ordenadas\r\n if (retornar === \"do_dia\") {\r\n return extracoesValidas.sort(sortExtracoes);\r\n }\r\n\r\n // Converte dataAgora para Date\r\n const dataAgoraDate = numberToDate(dataAgora);\r\n\r\n if (!dataAgoraDate) throw new Error(\"dataAgoraDate é obrigatória!\");\r\n\r\n // Extrai a hora atual no formato HHmm\r\n const horaAgora = Number(format(dataAgoraDate, \"HHmm\"));\r\n\r\n // Filtra extrações com base no tipo de retorno (\"proximas\" ou \"anteriores\")\r\n const extracoesFiltradas =\r\n retornar === \"proximas\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataApostaNumerica === dataAgoraNumerica\r\n ? horaAgora < Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica > dataAgoraNumerica\r\n )\r\n : retornar === \"anteriores\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataAgoraNumerica === dataApostaNumerica\r\n ? horaAgora >= Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica < dataAgoraNumerica\r\n )\r\n : [];\r\n\r\n // Ordena o resultado final por horário crescente\r\n return extracoesFiltradas.sort(sortExtracoes);\r\n};\r\n\r\n/**\r\n * @description Ordena as extrações do menor para o maior horário\r\n */\r\nconst sortExtracoes = (a: TypeExtracao, b: TypeExtracao) =>\r\n Number(showFormatDate(a.horario, \"HHmm\")) -\r\n Number(showFormatDate(b.horario, \"HHmm\"));\r\n","import { getDay } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { numberToDate } from \"../../utils\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * Verifica se a extração está ativa e lança exceção com mensagem específica caso não esteja.\r\n * Use esta função quando precisar saber o motivo específico do erro (ex: Cloud Functions).\r\n * @throws {Error} Lança erro com mensagem específica do problema\r\n * \r\n * @example \"Extração não está ativa.\"\r\n * @example \"Extração está inativa no dia da aposta.\"\r\n * @example \"Extração não funciona neste feriado.\"\r\n * @example \"Data da aposta inválida.\"\r\n * @example \"Extração não funciona neste dia da semana.\"\r\n */\r\nexport const extracaoEstaAtivaTryCatch = (\r\n dataAposta: number,\r\n extracao: TypeExtracao\r\n): void => {\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n\r\n if (!extracao.ativo) {\r\n throw new Error(\"Extração não está ativa.\");\r\n }\r\n\r\n // Normaliza a data da aposta removendo horas, minutos e segundos para comparação\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n if (extracao.inativo_no_dia.includes(dataApostaNumerica)) {\r\n throw new Error(\"Extração está inativa no dia da aposta.\");\r\n }\r\n\r\n // Normaliza somente_no_feriado para comparação (remove horas, minutos e segundos)\r\n const somenteNoFeriadoNormalizado = extracao.somente_no_feriado !== 0\r\n ? getBetDateToNumber(extracao.somente_no_feriado, 20241001000000)\r\n : 0;\r\n\r\n if (\r\n somenteNoFeriadoNormalizado !== 0 &&\r\n somenteNoFeriadoNormalizado !== dataApostaNumerica\r\n ) {\r\n throw new Error(\"Extração não funciona neste feriado.\");\r\n }\r\n\r\n const dataApostaDate = numberToDate(dataAposta);\r\n\r\n if (!dataApostaDate) {\r\n throw new Error(\"Data da aposta inválida.\");\r\n }\r\n\r\n if (!extracao.days[getDay(dataApostaDate) as keyof typeof extracao.days]) {\r\n const diasSemana = ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'];\r\n const diaDaSemana = diasSemana[getDay(dataApostaDate)];\r\n throw new Error(\r\n `Extração não funciona neste dia da semana (${diaDaSemana}).`\r\n );\r\n }\r\n};\r\n","import { TypeExtracao } from \"../../types\";\r\nimport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\";\r\n\r\n/**\r\n * Versão helper que retorna boolean sem lançar exceção.\r\n * Use esta função para validações simples no frontend (ex: desabilitar botões).\r\n * @returns {boolean} true se ativa, false se inativa (sem detalhes do motivo)\r\n */\r\nexport const extracaoEstaAtivaBoolean = (dataAposta: number, extracao: TypeExtracao): boolean => {\r\n try {\r\n extracaoEstaAtivaTryCatch(dataAposta, extracao);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};","import { TypeExtracao } from \"../../types/extracao.type\";\r\nimport { getBetDateToNumber } from \"../games\";\r\nimport { pegarExtracoes } from \"./pegarExtracoes\";\r\nimport { TypeResultado } from \"../../types/resultado.type\";\r\n\r\n/**\r\n * Busca a próxima extração disponível para aposta baseada na existência de resultado\r\n * \r\n * Esta função determina qual extração o usuário pode apostar considerando:\r\n * - Se não há resultado: permite apostar na primeira extração do dia\r\n * - Se há resultado: permite apostar apenas na próxima extração após a que teve resultado\r\n * \r\n * @param extracoes Lista completa de extrações disponíveis\r\n * @param data Data da aposta no formato YYYYMMDDHHmmss\r\n * @param resultado Resultado do jogo (opcional). Se undefined, retorna primeira extração. Se existe, procura a extração que teve esse resultado e retorna a próxima\r\n * @returns A próxima extração disponível para aposta, ou undefined se não há mais extrações disponíveis no dia\r\n * \r\n * @example\r\n * // Sem resultado - pode apostar desde o início\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, undefined);\r\n * // Retorna: primeira extração do dia\r\n * \r\n * @example\r\n * // Com resultado - só pode apostar na próxima extração\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, resultado);\r\n * // Retorna: próxima extração após a que teve resultado\r\n * \r\n * @example\r\n * // Última extração teve resultado - não pode mais apostar\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, resultadoUltima);\r\n * // Retorna: undefined\r\n */\r\nexport const getProximaExtracaoDisponivelParaAposta = (\r\n extracoes: TypeExtracao[],\r\n data: number, // YYYYMMDDHHmmss\r\n resultado?: TypeResultado\r\n): TypeExtracao | undefined => {\r\n if (!extracoes || extracoes.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Pega as extrações válidas para o dia usando a função reutilizável\r\n const extracoesDoDia = pegarExtracoes({\r\n extracoes,\r\n dataAgora: data,\r\n dataAposta: data,\r\n retornar: \"do_dia\"\r\n });\r\n\r\n if (extracoesDoDia.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Se não tem resultado, retorna a primeira extração (pode jogar desde o início)\r\n if (!resultado) {\r\n return extracoesDoDia[0];\r\n }\r\n\r\n // Procura qual extração teve resultado\r\n // Combina: data (YYYYMMDD) + horario da extracao (HHmmss) = YYYYMMDDHHmmss\r\n const indiceExtracaoComResultado = extracoesDoDia.findIndex((extracao) => {\r\n // Cria um horário base com a data fornecida para usar no combineDateTime\r\n const dataBase = data; // YYYYMMDD000000\r\n const horarioExtracao = extracao.horario; // HHmmss\r\n \r\n // Combina data + horário usando a função reutilizável\r\n const dataCompleta = getBetDateToNumber(dataBase, horarioExtracao);\r\n \r\n // Verifica se o resultado tem dataSorteio igual à data completa\r\n return resultado?.dataSorteio && resultado.dataSorteio === dataCompleta;\r\n });\r\n\r\n if (indiceExtracaoComResultado !== -1) {\r\n // Se encontrou a extração que teve resultado, retorna a próxima\r\n const proximaExtracao = extracoesDoDia[indiceExtracaoComResultado + 1];\r\n return proximaExtracao; // Se for a última extração, retorna undefined automaticamente\r\n } else {\r\n // Se não encontrou resultado para nenhuma extração, retorna a primeira\r\n return extracoesDoDia[0];\r\n }\r\n};\r\n","export {\r\n isAdm,\r\n isAdmOrSubAdm,\r\n isAssociacao,\r\n isCambista,\r\n isCambistaTalao,\r\n isDigitador,\r\n isDigitadorAdm,\r\n isSuperAdm,\r\n isDigitadorOrDigitadorAdm\r\n} from \"./permissions\";\r\nexport { getPermission } from \"./permissions\";\r\nexport { getLimitsRest } from \"./getLimitsRest\";\r\n","import { ROLES } from \"../../constants\";\r\nimport { TypeUser } from \"../../types\";\r\n\r\nconst IS_ADM = [\"admin\"] as TypeUser[\"role\"][];\r\nconst IS_ADM_OR_SUBADM = [\"admin\", \"sub_admin\"] as TypeUser[\"role\"][];\r\nconst IS_ASSOCIACAO = [\"associacao\"] as TypeUser[\"role\"][];\r\nconst IS_SUPER_ADMIN = [\"super_admin\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA_TALAO = [\"cambista_talao\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA = [\"cambista\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_ADM = [\"digitador_adm\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR = [\"digitador\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_AND_ADM = [\r\n \"digitador\",\r\n \"digitador_adm\",\r\n] as TypeUser[\"role\"][];\r\n\r\nexport const isAdm = (user: TypeUser) => IS_ADM.includes(user.role);\r\nexport const isAssociacao = (user: TypeUser) =>\r\n IS_ASSOCIACAO.includes(user.role);\r\nexport const isSuperAdm = (user: TypeUser) =>\r\n IS_SUPER_ADMIN.includes(user.role);\r\nexport const isAdmOrSubAdm = (user: TypeUser) =>\r\n IS_ADM_OR_SUBADM.includes(user.role);\r\nexport const isSubAdmin = (user: TypeUser) => user.role === ROLES.sub_admin.id;\r\nexport const isCambistaTalao = (user: TypeUser) =>\r\n IS_CAMBISTA_TALAO.includes(user.role);\r\nexport const isCambista = (user: TypeUser) => IS_CAMBISTA.includes(user.role);\r\nexport const isDigitadorAdm = (user: TypeUser) =>\r\n IS_DIGITADOR_ADM.includes(user.role);\r\nexport const isDigitador = (user: TypeUser) => IS_DIGITADOR.includes(user.role);\r\nexport const isDigitadorOrDigitadorAdm = (user: TypeUser) =>\r\n IS_DIGITADOR_AND_ADM.includes(user.role);\r\n\r\n/**\r\n * @description Verifica se o usuário tem permissão para enviar para a associação.\r\n * - Super admin e admin tem permissão para enviar para a associação, retorna true\r\n * - Sub admin tem permissão para enviar para a associação se tiver a permissão podeEnviarParaAssociacao, retorna true\r\n * - Se não for nenhum dos casos acima, retorna false\r\n * @param user - Usuário\r\n * @returns true se o usuário tem permissão, false caso contrário\r\n */\r\nexport const hasPermissionToSendToAssociation = (user: TypeUser) => {\r\n if (isSuperAdm(user)) return true;\r\n if (isAdm(user)) return true;\r\n if (isSubAdmin(user) && user.permissoes.podeEnviarParaAssociacao) return true;\r\n return false;\r\n};\r\n\r\n/**\r\n * @deprecated Depreciado pois o uso antigo era \"functionsCore.users.getPermission.isAdm()\"\r\n *\r\n * @description Agora deve-se usar \"functionsCore.users.isAdm()\"\r\n */\r\nexport const getPermission = {\r\n isAdm,\r\n isAssociacao,\r\n isSuperAdm,\r\n isAdmOrSubAdm,\r\n isCambistaTalao,\r\n isCambista,\r\n isDigitadorAdm,\r\n isDigitador,\r\n isDigitadorOrDigitadorAdm,\r\n hasPermissionToSendToAssociation,\r\n};\r\n","import { TypeUser } from \"../../types\";\r\n\r\nexport const getLimitsRest = (user: TypeUser) => {\r\n\r\n let hoje = 0;\r\n let pre = 0;\r\n \r\n Object.values(user.jogos.hoje).forEach((value) => hoje += value);\r\n Object.values(user.jogos.pre).forEach((value) => pre += value);\r\n\r\n return {\r\n hoje,\r\n pre\r\n }\r\n}","export * from \"./generateDescarga\";\r\nexport * from \"./generateDescargas\";\r\nexport * from \"./getDescargaIdPeloNumero\";\r\nexport * from \"./sortDescargas\";\r\nexport * from \"./getDescargasAcimaDoLimite\";\r\nexport * from \"./getPropsVPDescarga\";\r\nexport * from \"./getPropsEnvioIdDescarga\";\r\nexport * from \"./getPropsEnvioIdOldDescarga\";\r\nexport * from \"./getDescargaIdPeloEnvio\"\r\nexport * from \"./getTotalGeralDescarga\";","import { GAMES } from \"../../constants\";\r\nimport { TypeDescargas } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortDescargas = (descargas: TypeDescargas): TypeDescargas => {\r\n const sortedDescargas = Object.values(descargas).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n \r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n \r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return b.amount - a.amount;\r\n });\r\n \r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeDescargas;\r\n };\r\n ","import { arrendondarCasasDecimais, functionsCore } from \"..\";\r\nimport { TypeDescarga, TypeLimitGames, TypeResultadoDescargaComDiferenca, TypeValueGames } from \"../../types\";\r\n\r\nexport const getDescargasAcimaDoLimite = (\r\n descargas: TypeDescarga[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): TypeResultadoDescargaComDiferenca[] => {\r\n return descargas\r\n .map((descarga) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n descarga.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === descarga.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = arrendondarCasasDecimais(descarga.amount);\r\n const limiteAtingidoArredondado = arrendondarCasasDecimais(limiteAtingido);\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n descarga,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as TypeResultadoDescargaComDiferenca[];\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsVPDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (array.includes(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n descarga: Partial<TypeDescarga>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOldDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_ENVIO_OLD } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado no envio do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta e o ID do envio. O ID é formado pela concatenação de: bancaId (opcional),\r\n * dataAposta, tipo_jogo, premio, valor arredondado do envio e envioId.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param envioId - ID do envio para buscar o valor específico\r\n * @returns Uma string única identificando a descarga\r\n * @throws {Error} Se o valor do envio não existir ou for inválido\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: 20240627140000,\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * envio_old_123: 15.50\r\n * };\r\n * const descargaId = getDescargaIdPeloEnvio(numero, '123');\r\n * // Resultado: \"banca1_20240627140000_milhar_1_15.5_envio_123\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloEnvio = (\r\n numero: TypeNumero,\r\n envioId: string\r\n): string => {\r\n const envioKey = `${PREFIX_ENVIO_OLD}${envioId}` as keyof TypeNumero;\r\n const envioValue = numero[envioKey];\r\n\r\n if (envioValue === undefined || envioValue === null) {\r\n throw new Error(`Valor do envio '${envioId}' não encontrado no número.`);\r\n }\r\n\r\n if (typeof envioValue !== \"number\") {\r\n throw new Error(`Valor do envio '${envioId}' deve ser um número.`);\r\n }\r\n\r\n const somaArredondada = arredondarParaCima(envioValue);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${somaArredondada}_envio_${envioId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { COMISSOES_PADRAO } from \"../../constants\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga, TypeTotalGeral } from \"../../types\";\r\n\r\n/**\r\n * @description Calcula o total geral de uma descarga aplicando comissões específicas\r\n * @param totalBrutoJogos - Objeto com totais brutos por tipo de jogo\r\n * @param comissoes - Objeto com comissões configuradas por tipo de jogo\r\n * @returns Objeto com totais calculados, jogos processados e comissões aplicadas\r\n */\r\nexport const getTotalGeralDescarga = (\r\n totalBrutoJogos: TypeEnvioDescarga[\"totalGeralJogos\"],\r\n comissoes: TypeComissoesDescarga\r\n): TypeTotalGeral => {\r\n // Inicializa o objeto de retorno com estrutura vazia\r\n // Este objeto será preenchido durante o processamento\r\n const totalGeral: TypeTotalGeral = {\r\n jogos: {}, // Objeto que armazenará os dados processados de cada tipo de jogo\r\n totalBruto: 0, // Soma total de todos os valores enviados (antes das comissões)\r\n totalLiquido: 0, // Soma total após descontar todas as comissões\r\n totalComissao: 0, // Soma total de todas as comissões calculadas\r\n };\r\n\r\n // Converte o objeto totalBrutoJogos em array de [chave, valor] para facilitar iteração\r\n // Permite processar cada tipo de jogo individualmente\r\n const totalBrutoJogosArray = Object.entries(totalBrutoJogos);\r\n\r\n // Extrai apenas os valores das comissões (ignora as chaves dos IDs)\r\n // Facilita a busca por comissões específicas por tipo de jogo\r\n const listaComissoes = Object.values(comissoes);\r\n\r\n // Busca a comissão específica para jogos \"restante\" (jogos sem comissão específica)\r\n // Esta comissão será aplicada a todos os jogos que não têm comissão individual\r\n const comissaoRestante = listaComissoes.find(\r\n (comissao) => comissao.type_game === \"restante\"\r\n );\r\n\r\n // Itera sobre cada tipo de jogo e seus valores\r\n // Processa cada jogo individualmente para aplicar comissões específicas\r\n for (const [type_game, jogo] of totalBrutoJogosArray) {\r\n // Operador Nullish Coalescing (??) - converte undefined/null para 0\r\n // Garante que sempre temos um número válido para calcular, evitando erros\r\n const valorJogo = jogo ?? 0;\r\n\r\n // Busca se existe uma comissão específica para este tipo de jogo\r\n // Se não encontrar, o jogo será agrupado no \"restante\"\r\n const comissaoEncontrada = listaComissoes.find(\r\n (comissao) => type_game === comissao.type_game\r\n );\r\n\r\n // Sempre soma o valor bruto (antes de qualquer desconto)\r\n // Este valor representa o total enviado para este tipo de jogo\r\n totalGeral.totalBruto += valorJogo;\r\n\r\n // Verifica se encontrou uma comissão específica para este tipo de jogo\r\n if (comissaoEncontrada) {\r\n // Busca as informações padrão do jogo (ordem, label) nas constantes\r\n // Usa type assertion para acessar as propriedades do COMISSOES_PADRAO\r\n const comissaoPadrao =\r\n COMISSOES_PADRAO[type_game as keyof typeof COMISSOES_PADRAO];\r\n\r\n // Calcula o valor da comissão: valor * (porcentagem / 100)\r\n // Aplica a porcentagem configurada para este tipo de jogo\r\n const totalComissao = valorJogo * (comissaoEncontrada.porcentagem / 100);\r\n \r\n // Calcula o valor líquido: valor bruto - comissão\r\n // Este é o valor que efetivamente fica para o jogo\r\n const totalLiquido = valorJogo - totalComissao;\r\n\r\n // Armazena os dados calculados para este tipo de jogo\r\n // Cria a estrutura completa com todos os dados necessários\r\n totalGeral.jogos[type_game] = {\r\n totalEnviado: valorJogo, // Valor original enviado (antes da comissão)\r\n totalComissao: totalComissao, // Valor da comissão calculada\r\n totalLiquido: totalLiquido, // Valor após desconto da comissão\r\n ordem: comissaoPadrao?.order || 0, // Ordem de exibição (do COMISSOES_PADRAO)\r\n tipo: type_game as keyof typeof COMISSOES_PADRAO, // Tipo do jogo\r\n label: comissaoPadrao?.label || type_game, // Nome amigável do jogo\r\n };\r\n\r\n // Soma os valores calculados aos totais gerais\r\n // Acumula os valores para o resultado final\r\n totalGeral.totalLiquido += totalLiquido;\r\n totalGeral.totalComissao += totalComissao;\r\n } else {\r\n // Lógica para jogos sem comissão específica (grupo \"restante\")\r\n // Todos os jogos que não têm comissão individual são agrupados aqui\r\n \r\n // Se ainda não existe o grupo \"restante\", cria ele\r\n // Inicializa com valores zerados para acumular posteriormente\r\n if (!totalGeral.jogos[\"restante\"]) {\r\n totalGeral.jogos[\"restante\"] = {\r\n totalEnviado: 0, // Inicializa com 0 para acumular\r\n totalLiquido: 0, // Inicializa com 0 para acumular\r\n totalComissao: 0, // Inicializa com 0 para acumular\r\n ordem: 9, // Ordem fixa para o grupo restante (sempre por último)\r\n tipo: \"restante\", // Tipo fixo para identificação\r\n label: \"Restante\", // Label fixo para exibição\r\n };\r\n }\r\n\r\n // Soma o valor enviado ao total do grupo restante\r\n // Acumula todos os valores dos jogos sem comissão específica\r\n totalGeral.jogos[\"restante\"].totalEnviado += valorJogo;\r\n\r\n // Verifica se existe comissão para o grupo \"restante\"\r\n if (comissaoRestante) {\r\n // Calcula comissão para o grupo restante\r\n // Aplica a porcentagem configurada para jogos sem comissão específica\r\n const comissao = valorJogo * (comissaoRestante.porcentagem / 100);\r\n \r\n // Calcula valor líquido para o grupo restante\r\n // Valor bruto menos a comissão aplicada\r\n const totalLiquido = valorJogo - comissao;\r\n \r\n // Soma os valores ao grupo restante\r\n // Acumula os valores calculados\r\n totalGeral.jogos[\"restante\"].totalLiquido += totalLiquido;\r\n totalGeral.jogos[\"restante\"].totalComissao += comissao;\r\n \r\n // Soma os valores aos totais gerais\r\n // Contribui para os totais finais da descarga\r\n totalGeral.totalLiquido += totalLiquido;\r\n totalGeral.totalComissao += comissao;\r\n } else {\r\n // Sem comissão para restante -> valor líquido = valor bruto\r\n // Se não há comissão configurada, o valor líquido é igual ao bruto\r\n totalGeral.jogos[\"restante\"].totalLiquido += valorJogo;\r\n totalGeral.totalLiquido += valorJogo;\r\n }\r\n }\r\n }\r\n\r\n // Retorna o objeto com todos os cálculos realizados\r\n return totalGeral;\r\n};\r\n","export * from './agruparEnvioPorExtracao';\r\nexport * from './criarEstruturaJogo';\r\nexport * from './getComissoesDoEnvio';","import { TypeJogoComComissao } from \"../../types\";\r\n\r\n/**\r\n * @description Cria uma estrutura de jogo com comissão a partir dos dados fornecidos\r\n * Esta função é responsável por criar um objeto TypeJogoComComissao completo\r\n * com todas as propriedades necessárias para representar um jogo processado\r\n * \r\n * @param _jogoId - ID do jogo (não utilizado, mas mantido para compatibilidade)\r\n * @param jogoData - Dados do jogo com comissão já calculada pela função getTotalGeralDescarga\r\n * @returns Objeto TypeJogoComComissao com estrutura completa do jogo\r\n */\r\nexport const criarEstruturaJogo = (_jogoId: string, jogoData: TypeJogoComComissao): TypeJogoComComissao => {\r\n return {\r\n totalEnviado: jogoData.totalEnviado, // Valor total enviado para o jogo (antes das comissões)\r\n totalLiquido: jogoData.totalLiquido, // Valor líquido após descontar comissões\r\n totalComissao: jogoData.totalComissao, // Valor total das comissões aplicadas\r\n ordem: jogoData.ordem, // Ordem de exibição do jogo (definida no COMISSOES_PADRAO)\r\n tipo: jogoData.tipo, // Tipo do jogo (milhar, centena, restante, etc.)\r\n label: jogoData.label, // Nome amigável do jogo para exibição na interface\r\n };\r\n };","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeComissaoDescarga } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ComissaoDescargaModel = (\r\n obj: Partial<TypeComissaoDescarga> = {}\r\n): TypeComissaoDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n porcentagem: obj?.porcentagem || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { ComissaoDescargaModel } from \"../../models/ComissaoDescargaModel\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga } from \"../../types\";\r\nimport { generateId } from \"../../utils/generateId\";\r\n\r\nexport const getComissoesDoEnvio = (\r\n comissoesDescarga: TypeEnvioDescarga[\"comissoesDescarga\"]\r\n): TypeComissoesDescarga => {\r\n const comissoes: TypeComissoesDescarga = {};\r\n\r\n for (const comissao of comissoesDescarga) {\r\n const comissaoModel = ComissaoDescargaModel({\r\n ...comissao,\r\n id: comissao.id || generateId(),\r\n });\r\n comissoes[comissaoModel.id] = comissaoModel;\r\n }\r\n\r\n return comissoes;\r\n};\r\n","import { TypeEnvioDescargas, TypeEnviosExtracao, TypeJogoComComissao } from \"../../types\";\r\nimport { getTotalGeralDescarga } from \"../descarga\";\r\nimport { criarEstruturaJogo } from \"./criarEstruturaJogo\";\r\nimport { getComissoesDoEnvio } from \"./getComissoesDoEnvio\";\r\n\r\nexport const agruparEnvioPorExtracao = ({\r\n envios,\r\n}: {\r\n envios: TypeEnvioDescargas;\r\n}): TypeEnviosExtracao[] => {\r\n const enviosExtracao: TypeEnviosExtracao[] = [];\r\n\r\n const enviosLista = Object.values(envios);\r\n\r\n for (const envio of enviosLista) {\r\n\r\n const comissoes = getComissoesDoEnvio(envio.comissoesDescarga);\r\n\r\n const extracaoId = envio.extracao.id;\r\n\r\n const envioExtracao = enviosExtracao.find(\r\n (envioExtracao) => envioExtracao.extracao.id === extracaoId\r\n );\r\n\r\n const totalGeral = getTotalGeralDescarga(\r\n envio.totalGeralJogos,\r\n comissoes\r\n );\r\n\r\n // Se não existe agrupamento para esta extração, cria um novo\r\n if (!envioExtracao) {\r\n enviosExtracao.push({\r\n extracao: envio.extracao, // Informações da extração\r\n jogos: Object.entries(totalGeral.jogos).reduce(\r\n (acc, [jogoId, jogoData]) => {\r\n // Cria a estrutura do jogo com todos os dados necessários\r\n acc[jogoId] = criarEstruturaJogo(jogoId, jogoData);\r\n return acc;\r\n },\r\n {} as Record<string, TypeJogoComComissao>\r\n ),\r\n totalBruto: totalGeral.totalBruto, // Total bruto da extração\r\n totalLiquido: totalGeral.totalLiquido, // Total líquido da extração\r\n totalComissao: totalGeral.totalComissao, // Total de comissões da extração\r\n });\r\n } else {\r\n // Se já existe agrupamento para esta extração, consolida os valores\r\n // Itera sobre cada jogo do total geral para somar aos existentes\r\n for (const [jogoId, jogoData] of Object.entries(totalGeral.jogos)) {\r\n const jogos = envioExtracao.jogos; // Type assertion para acesso dinâmico\r\n if (jogos[jogoId]) {\r\n // Se o jogo já existe no agrupamento, soma os valores\r\n jogos[jogoId] = {\r\n totalEnviado: Number(jogos[jogoId].totalEnviado) + Number(jogoData.totalEnviado), // Soma total enviado\r\n totalLiquido: Number(jogos[jogoId].totalLiquido) + Number(jogoData.totalLiquido), // Soma total líquido\r\n totalComissao: Number(jogos[jogoId].totalComissao) + Number(jogoData.totalComissao), // Soma comissões\r\n ordem: jogoData.ordem, // Atualiza ordem (pode ser diferente)\r\n tipo: jogoData.tipo, // Atualiza tipo (pode ser diferente)\r\n label: jogoData.label, // Atualiza label (pode ser diferente)\r\n };\r\n } else {\r\n // Se o jogo não existe no agrupamento, adiciona como novo\r\n jogos[jogoId] = criarEstruturaJogo(jogoId, jogoData);\r\n }\r\n }\r\n // Soma os totais gerais ao agrupamento existente\r\n envioExtracao.totalBruto += Number(totalGeral.totalBruto); // Acumula total bruto\r\n envioExtracao.totalLiquido += Number(totalGeral.totalLiquido); // Acumula total líquido\r\n envioExtracao.totalComissao += Number(totalGeral.totalComissao); // Acumula total comissões\r\n }\r\n }\r\n\r\n return enviosExtracao;\r\n};\r\n","import * as numbers from './numbers';\r\nimport * as extracao from './extracao';\r\nimport * as games from './games';\r\nimport * as users from './users';\r\nimport * as limite_jogos from './limite_jogos';\r\nimport * as descarga from './descarga';\r\nimport * as utils from '../utils';\r\nimport * as envio from './envio';\r\n\r\nexport * from './numbers';\r\nexport * from './extracao';\r\nexport * from './games';\r\nexport * from './users';\r\nexport * from './limite_jogos';\r\nexport * from './envio';\r\n/**\r\n * @description Objeto que contém todas as funções do core, facilitando a importação e organização do código.\r\n*/\r\nexport const functionsCore = {\r\n numbers,\r\n extracao,\r\n descarga,\r\n games,\r\n users,\r\n limite_jogos,\r\n utils,\r\n envio\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeMessage } from \"../types/message.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const MessageModel = (obj?: Partial<TypeMessage>): TypeMessage => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n content: obj?.content || \"\",\r\n visualizacao: obj?.visualizacao || \"jogo_hoje\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n date: {\r\n from: obj?.date?.from || 0,\r\n to: obj?.date?.to || 0,\r\n },\r\n fixa: obj?.date?.to === 0 || obj?.date?.from === 0,\r\n tipo: obj?.tipo || [],\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultado } from \"../types/resultado.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoModel = (\r\n obj?: Partial<TypeResultado>\r\n): TypeResultado => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n description: obj?.extracao?.description || \"\",\r\n },\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n liberado: obj?.liberado ?? false,\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeRoute } from \"../types/rota.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const RouteModel = (obj?: Partial<TypeRoute>): TypeRoute => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n comission: obj?.comission ?? 0,\r\n name: obj?.name || \"\",\r\n responsible: obj?.responsible || \"\",\r\n codigo_rota: obj?.codigo_rota || \"\",\r\n tipo: obj?.tipo || \"cambista\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { GAMES, ROLES } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeUser } from \"../types/user.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const UserModel = (obj?: Partial<TypeUser>): TypeUser => ({\r\n id: obj?.id ?? \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n active: obj?.active ?? true,\r\n bet_limit: obj?.bet_limit ?? 0,\r\n comission: obj?.comission ?? 0,\r\n bancaId: obj?.bancaId || \"\",\r\n photoURL: obj?.photoURL || \"\",\r\n ultimaPule: obj?.ultimaPule || 0,\r\n name: obj?.name || \"\",\r\n sessionId: obj?.sessionId || \"\",\r\n codigo_cambista: obj?.codigo_cambista || \"\",\r\n deviceId: obj?.deviceId || \"\",\r\n role: obj?.role || ROLES.cambista.id,\r\n pre_date_limit: obj?.pre_date_limit || 0,\r\n dispositivos: {\r\n dispositivoIdAtual: obj?.dispositivos?.dispositivoIdAtual || \"\",\r\n listaDispositivosConectados:\r\n obj?.dispositivos?.listaDispositivosConectados || [],\r\n },\r\n route: {\r\n id: obj?.route?.id || \"\",\r\n name: obj?.route?.name || \"\",\r\n tipo: obj?.route?.tipo || ROLES.cambista.id,\r\n codigo_rota: obj?.route?.codigo_rota || \"\",\r\n id_integer: obj?.route?.id_integer || \"\",\r\n },\r\n type_games: obj?.type_games\r\n ? obj?.type_games.filter((type) => GAMES?.[type]?.id)\r\n : [],\r\n login: obj?.login || \"\",\r\n jogos: {\r\n hoje: obj?.jogos?.hoje || {},\r\n pre: obj?.jogos?.pre || {},\r\n },\r\n preferences: {\r\n darkMode: obj?.preferences?.darkMode ?? false,\r\n pdfLegado: obj?.preferences?.pdfLegado ?? false,\r\n },\r\n permissoes: {\r\n podeDigitar: obj?.permissoes?.podeDigitar ?? true,\r\n podeEditarBanca: obj?.permissoes?.podeEditarBanca ?? false,\r\n podeEnviarParaAssociacao: obj?.permissoes?.podeEnviarParaAssociacao ?? false,\r\n podeCancelarPule: obj?.permissoes?.podeCancelarPule ?? false,\r\n podeReservar: obj?.permissoes?.podeReservar ?? true,\r\n podeJogarSurpresinha: obj?.permissoes?.podeJogarSurpresinha ?? true,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeValueGame } from \"../types/value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ValueGameModel = (\r\n obj?: Partial<TypeValueGame>\r\n): TypeValueGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n value: obj?.value ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_PULE } from \"../constants/STATUS_PULE\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeGame } from \"../types\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { getCodigoAuth } from \"../utils/getCodigoAuth\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES } from \"../constants\";\r\n\r\nexport const GameModel = (obj: Partial<TypeGame> = {}): TypeGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n origem_pule_id: obj?.origem_pule_id || \"\",\r\n bets: obj.bets || [], // Array de TypeGameValues\r\n creator: {\r\n id: obj?.creator?.id || \"\",\r\n id_integer: obj?.creator?.id_integer || \"\",\r\n codigo_cambista: obj?.creator?.codigo_cambista || \"\",\r\n name: obj?.creator?.name || \"\",\r\n role: obj?.creator?.role || ROLES.cambista.id,\r\n login: obj?.creator?.login || \"\",\r\n comission: obj?.creator?.comission || 0,\r\n route: {\r\n id: obj?.creator?.route?.id || \"\",\r\n id_integer: obj?.creator?.route?.id_integer || \"\",\r\n codigo_rota: obj?.creator?.route?.codigo_rota || \"\",\r\n name: obj?.creator?.route?.name || \"\",\r\n tipo: obj?.creator?.route?.tipo || ROLES.cambista.id,\r\n }\r\n }, \r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n totalAmount: obj?.totalAmount || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n codigoAuth: obj?.codigoAuth || getCodigoAuth(100000, 999999).toString(),\r\n cancel: {\r\n canceled: obj?.cancel?.canceled ?? false,\r\n canceledAt: obj?.cancel?.canceledAt || 0,\r\n reason: obj?.cancel?.reason || \"\",\r\n canceledBy: {\r\n id: obj?.cancel?.canceledBy?.id || \"\",\r\n id_integer: obj?.cancel?.canceledBy?.id_integer || \"\",\r\n name: obj?.cancel?.canceledBy?.name || \"\",\r\n login: obj?.cancel?.canceledBy?.login || \"\",\r\n role: obj?.cancel?.canceledBy?.role || ROLES.cambista.id,\r\n }\r\n },\r\n valorNumerosNaPule: obj?.valorNumerosNaPule || {},\r\n infoJogos: obj?.infoJogos || [],\r\n tiposJogos: obj?.tiposJogos || {},\r\n reservada: obj?.reservada || false,\r\n dias_disponiveis: obj?.dias_disponiveis || [],\r\n dateBet: obj?.dateBet || 0,\r\n status: obj.status || STATUS_PULE.JOGADA.id, // Pega um valor padrão de STATUS_PULE\r\n statusReason: obj?.statusReason || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { TypeNumero } from \"../types/numero.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { getCreatedBySystem, getPropsPrefix } from \"../functions\";\r\n\r\nexport const NumberModel = (obj: Partial<TypeNumero> = {}): TypeNumero => {\r\n\r\n const ordemPremioExibicao = PREMIOS[obj?.premio as keyof typeof PREMIOS || \"1\"].order;\r\n const ordemJogoExibicao = GAMES[obj?.tipo_jogo as keyof typeof GAMES || \"milhar\"].order;\r\n \r\n let baseModel: TypeNumero = {\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n envioIds: obj?.envioIds || [],\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n numero: obj?.numero || \"\",\r\n amount: obj?.amount || 0,\r\n premio: obj?.premio || \"1\",\r\n bancaId: obj?.bancaId || \"\",\r\n valorArredondado: obj?.valorArredondado || 0,\r\n limiteJogoReal: obj?.limiteJogoReal || 0,\r\n limiteJogoSimulado: obj?.limiteJogoSimulado || 0,\r\n valorJogo: obj?.valorJogo || 0,\r\n amountEnviadoParaAssociacao: obj?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: obj?.valorAEnviarParaAssociacao || 0,\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n descarregado: obj?.descarregado ?? false,\r\n dataAposta: obj?.dataAposta || 0,\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(obj);\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import { TypeBet } from \"../types/bet.type\";\r\n\r\nexport const BetModel = (obj: Partial<TypeBet> = {}): TypeBet => ({\r\n name: obj?.name || \"milhar\",\r\n numbers: obj?.numbers || [],\r\n prizes: obj?.prizes || [],\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoModel = (\r\n obj: Partial<TypePremiacao> = {}\r\n): TypePremiacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n tipo: obj?.tipo || \"cambista\",\r\n \r\n // Informações da pule relacionada\r\n pule: {\r\n // ID da pule\r\n id: obj?.pule?.id || \"\",\r\n\r\n // ID incremental da pule\r\n id_integer: obj?.pule?.id_integer || \"\",\r\n \r\n // Data de criação da pule\r\n created: obj?.pule?.created || 0,\r\n \r\n // Informações de cancelamento da pule\r\n cancel: {\r\n // Se a pule foi cancelada\r\n canceled: obj?.pule?.cancel?.canceled || false,\r\n \r\n // Data do cancelamento\r\n canceledAt: obj?.pule?.cancel?.canceledAt || 0,\r\n \r\n // Motivo do cancelamento\r\n reason: obj?.pule?.cancel?.reason || \"\",\r\n\r\n canceledBy: {\r\n id: obj?.pule?.cancel?.canceledBy?.id || \"\",\r\n id_integer: obj?.pule?.cancel?.canceledBy?.id_integer || \"\",\r\n name: obj?.pule?.cancel?.canceledBy?.name || \"\",\r\n login: obj?.pule?.cancel?.canceledBy?.login || \"\",\r\n role: obj?.pule?.cancel?.canceledBy?.role || \"cambista\",\r\n }\r\n },\r\n \r\n createdBy: {\r\n id: obj?.pule?.createdBy?.id || \"\",\r\n id_integer: obj?.pule?.createdBy?.id_integer || \"\",\r\n role: obj?.pule?.createdBy?.role || \"cambista\",\r\n name: obj?.pule?.createdBy?.name || \"\",\r\n login: obj?.pule?.createdBy?.login || \"\",\r\n },\r\n \r\n // Informações do criador da pule\r\n creator: {\r\n // ID do criador\r\n id: obj?.pule?.creator?.id || \"\",\r\n \r\n // ID incremental do criador\r\n id_integer: obj?.pule?.creator?.id_integer || \"\",\r\n \r\n // Código do cambista\r\n codigo_cambista: obj?.pule?.creator?.codigo_cambista || \"\",\r\n \r\n // Login do criador\r\n login: obj?.pule?.creator?.login || \"\",\r\n \r\n // Nome do criador\r\n name: obj?.pule?.creator?.name || \"\",\r\n \r\n // Papel/função do criador\r\n role: obj?.pule?.creator?.role || \"cambista\",\r\n \r\n // Comissão do criador\r\n comission: obj?.pule?.creator?.comission || 0,\r\n \r\n // Informações da rota do criador\r\n route: {\r\n // ID da rota\r\n id: obj?.pule?.creator?.route?.id || \"\",\r\n \r\n // Nome da rota\r\n name: obj?.pule?.creator?.route?.name || \"\",\r\n \r\n // Tipo da rota\r\n tipo: obj?.pule?.creator?.route?.tipo || \"cambista\",\r\n\r\n codigo_rota: obj?.pule?.creator?.route?.codigo_rota || \"\",\r\n \r\n id_integer: obj?.pule?.creator?.route?.id_integer || \"\",\r\n },\r\n },\r\n },\r\n \r\n // Lista de itens premiados\r\n premiosItems: obj?.premiosItems || [],\r\n \r\n // Total que o cambista recebe\r\n valorTotalPremio: obj?.valorTotalPremio || 0,\r\n \r\n // Total que a banca recebe\r\n valorTotalPremioBanca: obj?.valorTotalPremioBanca || 0,\r\n \r\n // Total que a associação recebe\r\n valorTotalPremioAssociacao: obj?.valorTotalPremioAssociacao || 0,\r\n \r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePDFDescargas } from \"../types\";\r\n\r\nexport const PDFModel = (\r\n obj: Partial<TypePDFDescargas> = {}\r\n): TypePDFDescargas => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n descargas: obj?.descargas || {},\r\n link_pdf: obj?.link_pdf || \"\",\r\n bancaId: obj.bancaId || \"\",\r\n visualizado: obj?.visualizado || false,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || 0,\r\n updated: obj?.updated || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeBanca } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const BancaModel = (obj: Partial<TypeBanca> = {}): TypeBanca => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n nome: obj?.nome || \"\",\r\n codigo_banca: obj?.codigo_banca || \"\",\r\n settings: { \r\n urlLogo: obj?.settings?.urlLogo || \"\",\r\n urlLogoPretoBranco: obj?.settings?.urlLogoPretoBranco || \"\",\r\n logoBase64: obj?.settings?.logoBase64 || \"\",\r\n logoImpressaoBase64: obj?.settings?.logoImpressaoBase64 || \"\",\r\n urlBackground: obj?.settings?.urlBackground || \"\",\r\n color: obj?.settings?.color || \"\",\r\n preencherPremiosAPartirDe: obj?.settings?.preencherPremiosAPartirDe ?? 0,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeAuditLog } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const AuditLogModel = (obj: Partial<TypeAuditLog> = {}): TypeAuditLog => ({\r\n id: obj?.id || '',\r\n tipo: obj?.tipo || 'add',\r\n bancaId: obj?.bancaId || '',\r\n message: obj?.message || '',\r\n colecao: obj?.colecao || '',\r\n documentId: obj?.documentId || '',\r\n author: getCreatedBySystem(obj?.author),\r\n document: obj?.document || {},\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeLimitGame } from \"../types/limit_value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimitGameModel = (\r\n obj?: Partial<TypeLimitGame>\r\n): TypeLimitGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n limit: obj?.limit ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_DESCARGA } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeEnvioDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const EnvioDescargaModel = (\r\n obj?: Partial<TypeEnvioDescarga>\r\n): TypeEnvioDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n visualizado: obj?.visualizado || false,\r\n pdf_url: obj?.pdf_url || \"\",\r\n pdf_associacao_url: obj?.pdf_associacao_url || \"\",\r\n banca: {\r\n id: obj?.banca?.id || \"\",\r\n nome: obj?.banca?.nome || \"\",\r\n },\r\n dataAposta: obj?.dataAposta || 0,\r\n totalGeralJogos: {\r\n [\"milhar\"]: obj?.totalGeralJogos?.[\"milhar\"] ?? 0,\r\n [\"centena\"]: obj?.totalGeralJogos?.[\"centena\"] || 0,\r\n [\"dezena\"]: obj?.totalGeralJogos?.[\"dezena\"] || 0,\r\n [\"grupo\"]: obj?.totalGeralJogos?.[\"grupo\"] || 0,\r\n [\"terno.dezena\"]: obj?.totalGeralJogos?.[\"terno.dezena\"] || 0,\r\n [\"terno.grupo\"]: obj?.totalGeralJogos?.[\"terno.grupo\"] || 0,\r\n [\"duque.dezena\"]: obj?.totalGeralJogos?.[\"duque.dezena\"] || 0,\r\n [\"duque.grupo\"]: obj?.totalGeralJogos?.[\"duque.grupo\"] || 0,\r\n },\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n devolvidoPor: {\r\n id: obj?.devolvidoPor?.id || \"\",\r\n id_integer: obj?.devolvidoPor?.id_integer || \"\",\r\n name: obj?.devolvidoPor?.name || \"\",\r\n login: obj?.devolvidoPor?.login || \"\",\r\n },\r\n bancaId: obj?.bancaId || \"\",\r\n description: obj?.description || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n status: obj?.status || STATUS_DESCARGA.ENVIANDO.id,\r\n totalEnviados: obj?.totalEnviados || 0,\r\n totalRegistros: obj?.totalRegistros || 0,\r\n progresso: obj?.progresso || 0,\r\n mensagem: obj?.mensagem || \"\",\r\n concluidoEm: obj?.concluidoEm || 0,\r\n ultimaAtualizacao: obj?.ultimaAtualizacao || 0,\r\n metricas: {\r\n tempoMinimo: obj?.metricas?.tempoMinimo || 0,\r\n tempoMaximo: obj?.metricas?.tempoMaximo || 0,\r\n tempoMedio: obj?.metricas?.tempoMedio || 0,\r\n duracaoTotal: obj?.metricas?.duracaoTotal || 0,\r\n tempoEstimado: obj?.metricas?.tempoEstimado || 0,\r\n velocidadeProcessamento: obj?.metricas?.velocidadeProcessamento || 0,\r\n textosFormatados: {\r\n duracaoTotalText: obj?.metricas?.textosFormatados?.duracaoTotalText || \"\",\r\n tempoMinimoText: obj?.metricas?.textosFormatados?.tempoMinimoText || \"\",\r\n tempoMaximoText: obj?.metricas?.textosFormatados?.tempoMaximoText || \"\",\r\n tempoMedioText: obj?.metricas?.textosFormatados?.tempoMedioText || \"\",\r\n tempoEstimadoText:\r\n obj?.metricas?.textosFormatados?.tempoEstimadoText || \"\",\r\n },\r\n },\r\n atualizadoEm: obj?.atualizadoEm || 0,\r\n erro: obj?.erro || \"\",\r\n iniciadoEm: obj?.iniciadoEm || 0,\r\n user: {\r\n id: obj?.user?.id || \"\",\r\n id_integer: obj?.user?.id_integer || \"\",\r\n name: obj?.user?.name || \"\",\r\n login: obj?.user?.login || \"\",\r\n },\r\n valoresJogos: obj?.valoresJogos || [],\r\n limitesJogos: obj?.limitesJogos || [],\r\n comissoesDescarga: obj?.comissoesDescarga || [],\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { getPropsPrefix } from \"../functions\";\r\nimport { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\n\r\nimport { TypeDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const DescargaModel = (\r\n descarga: Partial<TypeDescarga> = {}\r\n): TypeDescarga => {\r\n const ordemPremioExibicao =\r\n PREMIOS[(descarga?.premio as keyof typeof PREMIOS) || \"1\"].order;\r\n const ordemJogoExibicao =\r\n GAMES[(descarga?.tipo_jogo as keyof typeof GAMES) || \"milhar\"].order;\r\n\r\n let baseDescarga: TypeDescarga = {\r\n id: descarga?.id || \"\",\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n numeros: descarga?.numeros || [],\r\n quantidadeDeNumeros: descarga?.quantidadeDeNumeros || 0,\r\n bancaId: descarga?.bancaId || \"\",\r\n amountEnviadoParaAssociacao: descarga?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: descarga?.valorAEnviarParaAssociacao || 0,\r\n envioId: descarga?.envioId || \"\",\r\n amount: descarga?.amount || 0,\r\n limiteJogoReal: descarga?.limiteJogoReal || 0,\r\n limiteJogoSimulado: descarga?.limiteJogoSimulado || 0,\r\n valorJogo: descarga?.valorJogo || 0,\r\n valorArredondado: descarga?.valorArredondado || 0,\r\n dataAposta: descarga?.dataAposta || 0,\r\n premio: descarga?.premio || \"1\",\r\n tipo_jogo: descarga?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(descarga?.createdBy),\r\n updated: descarga?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: descarga?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(descarga);\r\n\r\n baseDescarga = {\r\n ...baseDescarga,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseDescarga;\r\n};\r\n","import { STATUS_DEVICE } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeDevice } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const DeviceModel = (obj: Partial<TypeDevice> = {}): TypeDevice => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n userId: obj?.userId || \"\",\r\n createdBy: obj?.createdBy || getCreatedBySystem(),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n deviceId: obj?.deviceId || \"\",\r\n id_integer_usuario: obj?.id_integer_usuario || \"\",\r\n operadora: obj?.operadora || \"\",\r\n rotaId: obj?.rotaId || \"\",\r\n codigo_usuario: obj?.codigo_usuario || \"\",\r\n nome_usuario: obj?.nome_usuario || \"\",\r\n versaoAndroid: obj?.versaoAndroid || \"\",\r\n iccid: obj?.iccid || \"\",\r\n bancaId: obj?.bancaId || \"\",\r\n rotaNome: obj?.rotaNome || \"\",\r\n deviceName: obj?.deviceName || \"\",\r\n status: obj?.status || STATUS_DEVICE.EM_ESPERA.id,\r\n ultimoLogin: obj?.ultimoLogin || 0,\r\n plataforma: obj?.plataforma || \"mobile\",\r\n ip: obj?.ip || \"\",\r\n versaoApp: obj?.versaoApp || \"\",\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacaoAssociacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoAssociacaoModel = (\r\n obj: Partial<TypePremiacaoAssociacao> = {}\r\n): TypePremiacaoAssociacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n numero: obj?.numero || \"\",\r\n\r\n premio: obj?.premio || \"\",\r\n\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n\r\n valorPremioAReceber: obj?.valorPremioAReceber || 0,\r\n\r\n valorEnviadoParaAssociacao: obj?.valorEnviadoParaAssociacao || 0,\r\n\r\n limiteTipoJogo: obj?.limiteTipoJogo || 0,\r\n\r\n valorTipoJogo: obj?.valorTipoJogo || 0,\r\n\r\n pulesGanhadoras: obj?.pulesGanhadoras || {},\r\n\r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { TypeGuia } from \"../types\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES, STATUS_GUIA } from \"../constants\";\r\n\r\nexport const GuiaModel = (obj?: Partial<TypeGuia>): TypeGuia => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n bancaId: obj?.bancaId || \"\", \r\n impresso: obj?.impresso || false,\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n },\r\n rota: {\r\n id: obj?.rota?.id || \"\",\r\n id_integer: obj?.rota?.id_integer || \"\",\r\n codigo_rota: obj?.rota?.codigo_rota || \"\",\r\n name: obj?.rota?.name || \"\",\r\n tipo: obj?.rota?.tipo || ROLES.cambista_talao.id,\r\n comission: obj?.rota?.comission || 0,\r\n },\r\n cambistasIds: obj?.cambistasIds || [],\r\n dataAposta: obj?.dataAposta || 0,\r\n valorTotalVendas: obj?.valorTotalVendas || 0,\r\n valorTotalPremios: obj?.valorTotalPremios || 0,\r\n valorTotalComissao: obj?.valorTotalComissao || 0,\r\n status: obj?.status || STATUS_GUIA.vendas.id,\r\n puleIdsPremios: obj?.puleIdsPremios || [],\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { TypeGuiaItem } from \"../types\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES, STATUS_GUIA } from \"../constants\";\r\n\r\nexport const GuiaItemModel = (obj?: Partial<TypeGuiaItem>): TypeGuiaItem => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n guiaId: obj?.guiaId || \"\",\r\n bancaId: obj?.bancaId || \"\", \r\n extracaoId: obj?.extracaoId || \"\",\r\n rotaId: obj?.rotaId || \"\", \r\n cambista: {\r\n id: obj?.cambista?.id || \"\",\r\n id_integer: obj?.cambista?.id_integer || \"\",\r\n codigo_cambista: obj?.cambista?.codigo_cambista || \"\",\r\n name: obj?.cambista?.name || \"\",\r\n login: obj?.cambista?.login || \"\",\r\n role: obj?.cambista?.role || ROLES.cambista_talao.id,\r\n comission: obj?.cambista?.comission || 0,\r\n },\r\n valor: obj?.valor || 0,\r\n valorComissao: obj?.valorComissao || 0,\r\n pulePremiadaId: obj?.pulePremiadaId || \"\",\r\n tipo: obj?.tipo || STATUS_GUIA.vendas.id,\r\n dataAposta: obj?.dataAposta || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { TypeLimiteNumeroAposta } from \"../types/limite_numero_aposta.type\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimiteNumeroApostaModel = (obj?: Partial<TypeLimiteNumeroAposta>): TypeLimiteNumeroAposta => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n tipo_jogo: obj?.tipo_jogo || \"all\",\r\n limite: obj?.limite || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultadoAssociacao } from \"../types/resultado_associacao.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoAssociacaoModel = (\r\n obj?: Partial<TypeResultadoAssociacao>\r\n): TypeResultadoAssociacao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n bancaIds: obj?.bancaIds || [],\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { ROLES } from \"../constants/ROLES\";\r\nimport { TypeVendaCambista } from \"../types/vendas_cambista.type\";\r\n\r\nexport const VendaCambistaModel = (obj?: Partial<TypeVendaCambista >): TypeVendaCambista => ({\r\n id: obj?.id || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n amountVendas: obj?.amountVendas || 0,\r\n totalPules: obj?.totalPules || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n },\r\n cambista: {\r\n id: obj?.cambista?.id || \"\",\r\n id_integer: obj?.cambista?.id_integer || \"\",\r\n codigo_cambista: obj?.cambista?.codigo_cambista || \"\",\r\n name: obj?.cambista?.name || \"\",\r\n login: obj?.cambista?.login || \"\",\r\n role: obj?.cambista?.role || ROLES.cambista_talao.id,\r\n comission: obj?.cambista?.comission || 0,\r\n route: {\r\n id: obj?.cambista?.route?.id || \"\",\r\n name: obj?.cambista?.route?.name || \"\",\r\n tipo: obj?.cambista?.route?.tipo || ROLES.cambista_talao.id,\r\n codigo_rota: obj?.cambista?.route?.codigo_rota || \"\",\r\n id_integer: obj?.cambista?.route?.id_integer || \"\",\r\n }\r\n },\r\n primeiraPule: obj?.primeiraPule || 0,\r\n ultimaPule: obj?.ultimaPule || 0,\r\n});","import { TypeVendasPorDia } from \"../types\";\r\n\r\nexport const VendasPorDiaModel = (\r\n obj: Partial<TypeVendasPorDia> = {}\r\n): TypeVendasPorDia => {\r\n let baseModel: TypeVendasPorDia = {\r\n id: obj?.id || \"\",\r\n bancaId: obj?.bancaId || \"\",\r\n dataVendas: obj?.dataVendas || 0,\r\n extracoesIds: obj?.extracoesIds || [],\r\n rotasIds: obj?.rotasIds || [],\r\n valorTotalVendas: obj?.valorTotalVendas || 0,\r\n valorTotalComissoes: obj?.valorTotalComissoes || 0,\r\n totalPules: obj?.totalPules || 0,\r\n };\r\n\r\n // Extrai propriedades dinâmicas que começam com \"vendas_extracao_\"\r\n const vendasExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"vendas_extracao_\") && typeof value === \"number\") {\r\n vendasExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const totalPulesExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"total_pules_extracao_\") && typeof value === \"number\") {\r\n totalPulesExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const vendasRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"vendas_rota_\") && typeof value === \"number\") {\r\n vendasRotaProps[key] = value;\r\n }\r\n });\r\n\r\n const totalPulesRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"total_pules_rota_\") && typeof value === \"number\") {\r\n totalPulesRotaProps[key] = value;\r\n }\r\n });\r\n\r\n const comissaoExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"comissoes_extracao_\") && typeof value === \"number\") {\r\n comissaoExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const comissaoRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"comissoes_rota_\") && typeof value === \"number\") {\r\n comissaoRotaProps[key] = value;\r\n }\r\n });\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...vendasExtracaoProps,\r\n ...totalPulesExtracaoProps,\r\n ...vendasRotaProps,\r\n ...totalPulesRotaProps,\r\n ...comissaoExtracaoProps,\r\n ...comissaoRotaProps,\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import {\r\n AuditLogModel,\r\n BancaModel,\r\n DescargaModel,\r\n ExtracaoModel,\r\n GameModel,\r\n MessageModel,\r\n NumberModel,\r\n PDFModel,\r\n PremiacaoModel,\r\n ResultadoModel,\r\n RouteModel,\r\n UserModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n PremiacaoAssociacaoModel,\r\n ComissaoDescargaModel,\r\n GuiaModel,\r\n GuiaItemModel,\r\n LimiteNumeroApostaModel,\r\n ResultadoAssociacaoModel,\r\n VendaCambistaModel,\r\n VendasPorDiaModel\r\n} from \"../models\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados, com seus respectivos modelos.\r\n * Serve para facilitar para facilitar a criação de novos documentos no banco de dados e para facilitar a leitura do código.\r\n*/\r\nexport const collections = {\r\n mensagens: MessageModel,\r\n users: UserModel,\r\n guias: GuiaModel,\r\n guias_items: GuiaItemModel,\r\n limites_numero_aposta: LimiteNumeroApostaModel,\r\n valores_jogos: ValueGameModel,\r\n limites_jogos: LimitGameModel,\r\n pules: GameModel,\r\n extracoes: ExtracaoModel,\r\n resultados: ResultadoModel,\r\n resultados_associacao: ResultadoAssociacaoModel,\r\n rotas: RouteModel,\r\n envios_descarga: EnvioDescargaModel,\r\n numeros: NumberModel,\r\n descargas: DescargaModel,\r\n descargas_associacao: DescargaModel,\r\n premiacoes: PremiacaoModel,\r\n premiacoes_associacao: PremiacaoAssociacaoModel,\r\n pdf_descargas: PDFModel,\r\n pdf_descargas_associacao: PDFModel,\r\n bancas: BancaModel,\r\n auditLogs: AuditLogModel,\r\n dispositivos: DeviceModel,\r\n comissoes_descarga: ComissaoDescargaModel,\r\n vendas_cambistas: VendaCambistaModel,\r\n vendas_por_dias: VendasPorDiaModel\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contém os nomes das coleções como strings.\r\n * Útil para referenciar nomes de coleções de forma type-safe.\r\n *\r\n * @example\r\n * COLLECTIONS_NAMES.mensagens // \"mensagens\"\r\n * COLLECTIONS_NAMES.users // \"users\"\r\n */\r\nexport const COLLECTIONS_NAMES: Record<keyof typeof collections, string> = {\r\n mensagens: \"mensagens\",\r\n users: \"users\",\r\n guias: \"guias\",\r\n guias_items: \"guias_items\",\r\n limites_numero_aposta: \"limites_numero_aposta\",\r\n valores_jogos: \"valores_jogos\",\r\n limites_jogos: \"limites_jogos\",\r\n pules: \"pules\",\r\n extracoes: \"extracoes\",\r\n resultados: \"resultados\",\r\n resultados_associacao: \"resultados_associacao\",\r\n rotas: \"rotas\",\r\n envios_descarga: \"envios_descarga\",\r\n numeros: \"numeros\",\r\n descargas: \"descargas\",\r\n descargas_associacao: \"descargas_associacao\",\r\n premiacoes: \"premiacoes\",\r\n premiacoes_associacao: \"premiacoes_associacao\",\r\n pdf_descargas: \"pdf_descargas\",\r\n pdf_descargas_associacao: \"pdf_despcargas_associacao\",\r\n bancas: \"bancas\",\r\n auditLogs: \"auditLogs\",\r\n dispositivos: \"dispositivos\",\r\n comissoes_descarga: \"comissoes_descarga\",\r\n vendas_cambistas: \"vendas_cambistas\",\r\n vendas_por_dias: \"vendas_por_dias\",\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados que serão auditadas.\r\n * Define quais coleções devem ter auditoria habilitada (true) ou desabilitada (false).\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n*/\r\nexport const collectionsToAudit: Record<keyof typeof collections, boolean> = {\r\n mensagens: true,\r\n users: true,\r\n guias: true,\r\n guias_items: true,\r\n valores_jogos: true,\r\n limites_jogos: true,\r\n limites_numero_aposta: true,\r\n resultados_associacao: true,\r\n extracoes: true,\r\n resultados: true,\r\n rotas: true,\r\n comissoes_descarga: true,\r\n bancas: true,\r\n envios_descarga: true,\r\n dispositivos: true,\r\n pules: false,\r\n numeros: false,\r\n vendas_cambistas: false,\r\n vendas_por_dias: false,\r\n descargas: false,\r\n descargas_associacao: false,\r\n premiacoes: false,\r\n premiacoes_associacao: false,\r\n pdf_descargas: false,\r\n pdf_descargas_associacao: false,\r\n auditLogs: false, // Não auditamos os próprios logs de auditoria\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que define quantos dias cada coleção deve manter os documentos antes de serem apagados.\r\n * Define a política de retenção de dados para cada coleção.\r\n *\r\n * @example\r\n * - Se o valor for 30, documentos com created <= (data atual - 30 dias) serão apagados\r\n * - Se o valor for 0, os documentos não serão apagados automaticamente\r\n * - Se o valor for null, a coleção não terá política de retenção definida\r\n *\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n */\r\nexport const collectionsRetentionDays: Record<\r\n keyof typeof collections,\r\n number | null\r\n> = {\r\n auditLogs: 365, // Manter logs de auditoria por 1 ano (compliance)\r\n guias: 60, // Manter guias por 60 dias\r\n guias_items: 60, // Manter itens de guia por 60 dias\r\n pules: 60, // Manter pules por 60 dias\r\n resultados: 60, // Manter resultados por 60 dias\r\n resultados_associacao: 60, // Manter resultados de associação por 60 dias\r\n envios_descarga: 30, // Manter envios de descarga por 60 dias\r\n numeros: 30, // Manter números por 60 dias\r\n descargas: 30, // Descargas não são apagadas\r\n descargas_associacao: 30, // Descargas de associação não são apagadas\r\n premiacoes: 60, // Premiações não são apagadas\r\n premiacoes_associacao: 60, // Premiações de associação não são apagadas\r\n pdf_descargas: 60, // PDFs de descarga não são apagados\r\n pdf_descargas_associacao: 60, // PDFs de descarga de associação não são apagados\r\n vendas_cambistas: 365, // Vendas de cambista por 10 anos\r\n vendas_por_dias: 365 * 10, // Vendas por dias por 10 anos\r\n mensagens: null, // Manter mensagens por 30 dias\r\n limites_numero_aposta: null, // Limites de número de apostas não são apagados\r\n users: null, // Usuários nunca são apagados\r\n valores_jogos: null, // Valores de jogos não são apagados\r\n limites_jogos: null, // Limites de jogos não são apagados\r\n extracoes: null, // Extrações não são apagadas\r\n rotas: null, // Rotas nunca são apagadas\r\n bancas: null, // Bancas nunca são apagadas\r\n dispositivos: null, // Dispositivos não são apagados\r\n comissoes_descarga: null, // Comissões de descarga não são apagadas\r\n} as const;\r\n","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados que precisam de isolamento por bancaId.\r\n *\r\n * @example\r\n * - Se o valor for true, a coleção precisa de isolamento por bancaId\r\n * - Se o valor for false, a coleção não precisa de isolamento por bancaId\r\n *\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n */\r\nexport const collectionsWithIsolationByBancaId: Record<\r\n keyof typeof collections,\r\n boolean\r\n> = {\r\n auditLogs: false, // Não precisa de isolamento por bancaId\r\n bancas: false, // Não precisa de isolamento por bancaId\r\n mensagens: true, // Precisa de isolamento por bancaId\r\n guias: true, // Precisa de isolamento por bancaId\r\n guias_items: true, // Precisa de isolamento por bancaId\r\n pules: true, // Precisa de isolamento por bancaId\r\n resultados: true, // Precisa de isolamento por bancaId\r\n resultados_associacao: true, // Precisa de isolamento por bancaId\r\n envios_descarga: true, // Precisa de isolamento por bancaId\r\n numeros: true, // Precisa de isolamento por bancaId\r\n descargas: true, // Precisa de isolamento por bancaId\r\n descargas_associacao: true, // Precisa de isolamento por bancaId\r\n premiacoes: true, // Precisa de isolamento por bancaId\r\n premiacoes_associacao: true, // Precisa de isolamento por bancaId\r\n pdf_descargas: true, // Precisa de isolamento por bancaId\r\n pdf_descargas_associacao: true, // Precisa de isolamento por bancaId\r\n limites_numero_aposta: true, // Precisa de isolamento por bancaId\r\n users: true, // Precisa de isolamento por bancaId\r\n valores_jogos: true, // Precisa de isolamento por bancaId\r\n limites_jogos: true, // Precisa de isolamento por bancaId\r\n extracoes: true, // Precisa de isolamento por bancaId\r\n rotas: true, // Precisa de isolamento por bancaId\r\n dispositivos: true, // Precisa de isolamento por bancaId\r\n comissoes_descarga: true, // Precisa de isolamento por bancaId\r\n vendas_cambistas: true, // Precisa de isolamento por bancaId\r\n vendas_por_dias: true, // Precisa de isolamento por bancaId\r\n} as const;\r\n","import { ROLES } from \"../constants\";\r\nimport { generateId } from \"../utils\";\r\nimport { collections } from \"./collections\";\r\n\r\n// Types para compatibilidade entre plataformas\r\nexport type FirebaseApp<T = any> = T;\r\nexport type Firestore<T = any> = T;\r\nexport type CollectionReference<T = any> = T;\r\nexport type DocumentReference<T = any> = T;\r\nexport type Query<T = any> = T;\r\nexport type QuerySnapshot<T = any> = T;\r\nexport type DocumentSnapshot<T = any> = T;\r\nexport type WriteBatch<T = any> = T;\r\nexport type QueryConstraint<T = any> = T;\r\n\r\n// Interfaces para adaptadores de plataforma\r\nexport interface FirebaseAdapter<T = any> {\r\n // Collection operations\r\n collection: (db: Firestore, path: string) => CollectionReference<T>;\r\n doc: (db: Firestore, path: string, ...segments: string[]) => DocumentReference<T>;\r\n \r\n // Query operations\r\n query: (collection: CollectionReference<T>, ...constraints: QueryConstraint[]) => Query<T>;\r\n where: (field: string, operator: string, value: any) => QueryConstraint;\r\n orderBy: (field: string, direction?: \"asc\" | \"desc\") => QueryConstraint;\r\n limit: (count: number) => QueryConstraint;\r\n startAfter: (...fieldValues: any[]) => QueryConstraint;\r\n startAt: (...fieldValues: any[]) => QueryConstraint;\r\n endBefore: (...fieldValues: any[]) => QueryConstraint;\r\n endAt: (...fieldValues: any[]) => QueryConstraint;\r\n \r\n // Document operations\r\n getDocs: (query: Query<T>) => Promise<QuerySnapshot<T>>;\r\n getDoc: (docRef: DocumentReference<T>) => Promise<DocumentSnapshot<T>>;\r\n setDoc: (docRef: DocumentReference<T>, data: T, options?: any) => Promise<void>;\r\n updateDoc: (docRef: DocumentReference<T>, data: Partial<T>) => Promise<void>;\r\n deleteDoc: (docRef: DocumentReference<T>) => Promise<void>;\r\n \r\n // Batch operations\r\n writeBatch: (db: Firestore) => WriteBatch;\r\n batchSet: (batch: WriteBatch, docRef: DocumentReference<T>, data: T) => void;\r\n batchUpdate: (batch: WriteBatch, docRef: DocumentReference<T>, data: Partial<T>) => void;\r\n batchDelete: (batch: WriteBatch, docRef: DocumentReference<T>) => void;\r\n batchCommit: (batch: WriteBatch) => Promise<void>;\r\n \r\n // Real-time listeners\r\n onSnapshot: (query: Query<T>, callback: (snapshot: QuerySnapshot<T>) => void) => () => void;\r\n \r\n // ID generation\r\n generateId: () => string;\r\n}\r\n\r\n// Helper types para extrair valores válidos de um tipo\r\ntype WhereOperator = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"not-in\" | \"array-contains\" | \"array-contains-any\";\r\n\r\n// Helper para gerar campos encadeados até 5 níveis\r\ntype NestedPaths<T, Depth extends number = 5> = Depth extends 0\r\n ? never\r\n : T extends object\r\n ? {\r\n [K in keyof T & string]: T[K] extends object\r\n ? T[K] extends any[]\r\n ? K | `${K}.${number}` | `${K}.${NestedPaths<T[K][number], Prev<Depth>>}`\r\n : K | `${K}.${NestedPaths<T[K], Prev<Depth>>}`\r\n : K;\r\n }[keyof T & string]\r\n : never;\r\n\r\n// Helper para decrementar profundidade\r\ntype Prev<T extends number> = T extends 5 ? 4 : T extends 4 ? 3 : T extends 3 ? 2 : T extends 2 ? 1 : 0;\r\n\r\n// WhereCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type WhereCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n operator: WhereOperator;\r\n value: any;\r\n};\r\n\r\n// OrderByCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type OrderByCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n direction: \"asc\" | \"desc\";\r\n};\r\n\r\n// RepoQueryOptions com type-safety baseado no modelo\r\nexport type RepoQueryOptions<T = any> = {\r\n where?: WhereCondition<T>[];\r\n orderBy?: OrderByCondition<T>[];\r\n limit?: number;\r\n startAfter?: any; // Cursor para paginação (pode ser um documento ou valor)\r\n startAt?: any; // Inicia a partir de (inclusive)\r\n endBefore?: any; // Termina antes de (exclusive)\r\n endAt?: any; // Termina em (inclusive)\r\n};\r\n\r\n// Estratégias de busca por ID com type-safety\r\nexport type IdSearchStrategy<T> = \r\n | { type: \"field\"; fieldName: NestedPaths<T> } // Busca por campo específico (ex: \"id\", \"numero\")\r\n | { type: \"documentId\" } // Usa o ID do documento diretamente\r\n | { type: \"custom\"; resolver: (id: string) => Promise<DocumentReference<T>> }; // Resolver customizado\r\n\r\n// Configurações de isolamento (para bancaId, etc.) com type-safety\r\nexport type IsolationConfig<T> = {\r\n enabled: boolean;\r\n fieldName: keyof T; // ex: \"bancaId\" - deve ser um campo válido do modelo\r\n getValue: () => T[keyof T] | undefined; // Função para obter o valor de isolamento\r\n};\r\n\r\n// Configurações de cache\r\nexport type CacheConfig = {\r\n enabled: boolean;\r\n ttl?: number; // Time to live em ms\r\n maxSize?: number; // Tamanho máximo do cache\r\n};\r\n\r\n// Tipos de operações\r\nexport type OperationType = \"read\" | \"write\" | \"delete\";\r\n\r\n// Configurações de autorização por role\r\nexport type AuthorizationConfig = {\r\n enabled: boolean;\r\n allowedRoles: {\r\n read?: (keyof typeof ROLES)[]; // Roles permitidas para leitura (get, getAll, listen)\r\n write?: (keyof typeof ROLES)[]; // Roles permitidas para escrita (add, update)\r\n delete?: (keyof typeof ROLES)[]; // Roles permitidas para deletar (remove)\r\n };\r\n getUserRole: () => keyof typeof ROLES | undefined; // Função para obter o role do usuário atual\r\n onUnauthorized?: (operation: OperationType, userRole?: keyof typeof ROLES) => void; // Callback quando não autorizado\r\n};\r\n\r\nexport type RepoConfig<T extends { id: string }> = {\r\n collectionName: keyof typeof collections;\r\n model: (data: any) => T;\r\n idSearchStrategy: IdSearchStrategy<T>;\r\n isolation?: IsolationConfig<T>;\r\n cache?: CacheConfig;\r\n authorization?: AuthorizationConfig; // ✨ Nova configuração de autorização\r\n generateId?: () => string;\r\n};\r\n\r\n// Cache simples em memória\r\nclass MemoryCache {\r\n public cache = new Map<string, { data: any; timestamp: number }>();\r\n private ttl: number;\r\n private maxSize: number;\r\n\r\n constructor(ttl: number = 300000, maxSize: number = 1000) { // 5min default\r\n this.ttl = ttl;\r\n this.maxSize = maxSize;\r\n }\r\n\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n \r\n if (Date.now() - item.timestamp > this.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n \r\n return item.data;\r\n }\r\n\r\n set(key: string, data: any): void {\r\n // Limpa cache se exceder tamanho máximo\r\n if (this.cache.size >= this.maxSize) {\r\n const firstKey = this.cache.keys().next().value;\r\n if (firstKey) {\r\n this.cache.delete(firstKey);\r\n }\r\n }\r\n \r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n delete(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// Interface do repositório retornado\r\nexport interface GenericRepo<T extends { id: string }> {\r\n get: (id: string) => Promise<T | null>;\r\n getAll: (options?: RepoQueryOptions<T>) => Promise<{ [id: string]: T }>;\r\n listen: (options: RepoQueryOptions<T>, callback: (data: { [id: string]: T }) => void) => () => void;\r\n add: (docData: Partial<T> & { id?: string }) => Promise<string>;\r\n update: (id: string, docData: Partial<T>) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n batch: (docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]) => Promise<void>;\r\n clearCache: () => void;\r\n getCacheSize: () => number;\r\n}\r\n\r\nexport function createGenericRepo<T extends { id: string }>(\r\n db: Firestore,\r\n adapter: FirebaseAdapter<T>,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> {\r\n const { collectionName, model, idSearchStrategy, isolation, cache, authorization, generateId } = config;\r\n const memoryCache = cache?.enabled ? new MemoryCache(cache.ttl, cache.maxSize) : null;\r\n\r\n // Função para verificar autorização\r\n const checkAuthorization = (operation: OperationType): void => {\r\n if (!authorization?.enabled) return;\r\n \r\n const userRole = authorization.getUserRole();\r\n const allowedRoles = authorization.allowedRoles[operation];\r\n \r\n // Se não há roles definidas para a operação, permite tudo\r\n if (!allowedRoles || allowedRoles.length === 0) return;\r\n \r\n // Se usuário não está logado ou não tem role, bloqueia\r\n if (!userRole) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Operação '${operation}' requer autenticação na coleção '${collectionName}'`);\r\n }\r\n \r\n // Verifica se o role do usuário está na lista de permitidos\r\n if (!allowedRoles.includes(userRole)) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Role '${userRole}' não tem permissão para '${operation}' na coleção '${collectionName}'. Roles permitidas: ${allowedRoles.join(\", \")}`);\r\n }\r\n };\r\n\r\n // Função para obter constraints de isolamento\r\n const getIsolationConstraints = (): WhereCondition<T>[] => {\r\n if (!isolation?.enabled) return [];\r\n \r\n const value = isolation.getValue();\r\n if (!value) return [];\r\n \r\n return [{ field: isolation.fieldName as any, operator: \"==\", value }];\r\n };\r\n\r\n // Função para construir query\r\n const buildQuery = (options?: RepoQueryOptions<T>): Query<T> => {\r\n const constraints: QueryConstraint[] = [];\r\n \r\n // Adiciona constraints de isolamento primeiro\r\n const isolationConstraints = getIsolationConstraints();\r\n isolationConstraints.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n // Adiciona constraints da query\r\n options?.where?.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n options?.orderBy?.forEach(({ field, direction }) => {\r\n constraints.push(adapter.orderBy(field.toString(), direction));\r\n });\r\n \r\n if (options?.limit) {\r\n constraints.push(adapter.limit(options.limit));\r\n }\r\n \r\n // Adiciona cursores de paginação\r\n if (options?.startAfter !== undefined) {\r\n constraints.push(adapter.startAfter(options.startAfter));\r\n }\r\n \r\n if (options?.startAt !== undefined) {\r\n constraints.push(adapter.startAt(options.startAt));\r\n }\r\n \r\n if (options?.endBefore !== undefined) {\r\n constraints.push(adapter.endBefore(options.endBefore));\r\n }\r\n \r\n if (options?.endAt !== undefined) {\r\n constraints.push(adapter.endAt(options.endAt));\r\n }\r\n \r\n const collection = adapter.collection(db, collectionName);\r\n return adapter.query(collection, ...constraints);\r\n };\r\n\r\n // Função para resolver documento por ID\r\n const resolveDocument = async (id: string): Promise<DocumentReference<T>> => {\r\n switch (idSearchStrategy.type) {\r\n case \"documentId\":\r\n return adapter.doc(db, collectionName, id);\r\n \r\n case \"field\":\r\n // Para busca por campo, precisamos fazer uma query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n if ((snapshot as any).empty) throw new Error(`Document not found with ${String(idSearchStrategy.fieldName)}: ${id}`);\r\n return (snapshot as any).docs[0].ref;\r\n \r\n case \"custom\":\r\n return idSearchStrategy.resolver(id);\r\n \r\n default:\r\n throw new Error(`Unknown idSearchStrategy: ${(idSearchStrategy as any).type}`);\r\n }\r\n };\r\n\r\n // Função para gerar chave de cache\r\n const getCacheKey = (operation: string, ...params: any[]): string => {\r\n const isolationKey = isolation?.enabled ? `_${isolation.getValue()}` : '';\r\n return `${collectionName}${isolationKey}_${operation}_${JSON.stringify(params)}`;\r\n };\r\n\r\n const get = async (id: string): Promise<T | null> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n // Verifica cache primeiro\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n const cached = memoryCache.get(cacheKey);\r\n if (cached) return cached;\r\n }\r\n\r\n let docSnap: DocumentSnapshot<T>;\r\n \r\n if (idSearchStrategy.type === \"documentId\") {\r\n const docRef = adapter.doc(db, collectionName, id);\r\n docSnap = await adapter.getDoc(docRef);\r\n } else if (idSearchStrategy.type === \"field\") {\r\n // Para outros tipos, usa query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n docSnap = (snapshot as any).docs[0] || null;\r\n } else {\r\n const docRef = await resolveDocument(id);\r\n docSnap = await adapter.getDoc(docRef);\r\n }\r\n\r\n if (!(docSnap as any)?.exists()) return null;\r\n\r\n const result = model((docSnap as any).data());\r\n \r\n // Armazena no cache\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n memoryCache.set(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting document ${id}:`, error);\r\n return null;\r\n }\r\n };\r\n\r\n const getAll = async (options?: RepoQueryOptions<T>): Promise<{ [id: string]: T }> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n const snapshot = await adapter.getDocs(query);\r\n \r\n const result: { [id: string]: T } = {};\r\n (snapshot as any).forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting all documents:`, error);\r\n return {};\r\n }\r\n };\r\n\r\n const listen = (\r\n options: RepoQueryOptions<T>,\r\n callback: (data: { [id: string]: T }) => void\r\n ): (() => void) => {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n \r\n return adapter.onSnapshot(query, (snapshot: any) => {\r\n const result: { [id: string]: T } = {};\r\n snapshot.forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n callback(result);\r\n });\r\n };\r\n\r\n const add = async (docData: Partial<T> & { id?: string }): Promise<string> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const id = docData.id || generateId?.() || adapter.generateId();\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData, id };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const docRef = adapter.doc(db, collectionName, id);\r\n const modelData = model(completeData);\r\n \r\n await adapter.setDoc(docRef, modelData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n \r\n return id;\r\n } catch (error) {\r\n console.error(`Error adding document:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const update = async (id: string, docData: Partial<T>): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const docRef = await resolveDocument(id);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n await adapter.updateDoc(docRef, completeData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error updating document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const remove = async (id: string): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"delete\");\r\n \r\n const docRef = await resolveDocument(id);\r\n await adapter.deleteDoc(docRef);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error removing document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const batch = async (\r\n docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]\r\n ): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização para cada operação\r\n const operations = new Set(docs.map(d => d.operation));\r\n operations.forEach(op => {\r\n if (op === \"delete\") checkAuthorization(\"delete\");\r\n else checkAuthorization(\"write\");\r\n });\r\n \r\n const batch = adapter.writeBatch(db);\r\n \r\n for (const { id, data, operation } of docs) {\r\n const docId = id || generateId?.() || adapter.generateId();\r\n const docRef = adapter.doc(db, collectionName, docId);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...data, id: docId };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const modelData = model(completeData);\r\n \r\n switch (operation) {\r\n case \"add\":\r\n adapter.batchSet(batch, docRef, modelData);\r\n break;\r\n case \"update\":\r\n adapter.batchUpdate(batch, docRef, completeData);\r\n break;\r\n case \"delete\":\r\n adapter.batchDelete(batch, docRef);\r\n break;\r\n }\r\n }\r\n \r\n await adapter.batchCommit(batch);\r\n \r\n // Limpa cache\r\n if (memoryCache) {\r\n memoryCache.clear();\r\n }\r\n } catch (error) {\r\n console.error(`Error in batch operation:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n return {\r\n get,\r\n getAll,\r\n listen,\r\n add,\r\n update,\r\n remove,\r\n batch,\r\n // Utilitários\r\n clearCache: () => memoryCache?.clear(),\r\n getCacheSize: () => memoryCache?.cache.size || 0,\r\n };\r\n}\r\n\r\n// Detecção automática de versão do Firebase\r\nexport type FirebaseVersion = 'v8' | 'v9-modular' | 'unknown';\r\n\r\nexport const detectFirebaseVersion = (firebaseInstance: any): FirebaseVersion => {\r\n try {\r\n // Caso 1: Firebase v9+ modular - instância com funções como getFirestore\r\n if (firebaseInstance && typeof firebaseInstance.getFirestore === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 2: Firebase v9+ modular - objeto com funções do Firestore v9\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.query === 'function' &&\r\n typeof firebaseInstance.where === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 3: Firebase v8 - instância principal com firestore()\r\n if (firebaseInstance && typeof firebaseInstance.firestore === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 4: Firebase v8 - instância direta do Firestore v8\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.batch === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 5: Verifica se é um namespace v9+ (ex: firebase/app)\r\n if (firebaseInstance && \r\n firebaseInstance.initializeApp && \r\n typeof firebaseInstance.initializeApp === 'function') {\r\n // Se tem initializeApp, provavelmente é v9+\r\n return 'v9-modular';\r\n }\r\n \r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('Erro ao detectar versão do Firebase:', error);\r\n return 'unknown';\r\n }\r\n};\r\n\r\n// Adaptador para Firebase v9+ modular\r\nexport const createV9ModularAdapter = <T = any>(firebaseModular: any): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => firebaseModular.collection(db, path),\r\n doc: (db, path, ...segments) => firebaseModular.doc(db, path, ...segments),\r\n query: (collection, ...constraints) => firebaseModular.query(collection, ...constraints),\r\n where: (field, operator, value) => firebaseModular.where(field, operator, value),\r\n orderBy: (field, direction = 'asc') => firebaseModular.orderBy(field, direction),\r\n limit: (count) => firebaseModular.limit(count),\r\n startAfter: (...fieldValues) => firebaseModular.startAfter(...fieldValues),\r\n startAt: (...fieldValues) => firebaseModular.startAt(...fieldValues),\r\n endBefore: (...fieldValues) => firebaseModular.endBefore(...fieldValues),\r\n endAt: (...fieldValues) => firebaseModular.endAt(...fieldValues),\r\n getDocs: firebaseModular.getDocs,\r\n getDoc: firebaseModular.getDoc,\r\n setDoc: firebaseModular.setDoc,\r\n updateDoc: firebaseModular.updateDoc,\r\n deleteDoc: firebaseModular.deleteDoc,\r\n writeBatch: firebaseModular.writeBatch,\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: firebaseModular.onSnapshot,\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Adaptador para Firebase v8 legacy\r\nexport const createV8Adapter = <T = any>(): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => (db as any).collection(path),\r\n doc: (db, path, ...segments) => (db as any).collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n if (constraint.type === 'where') {\r\n query = (query as any).where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = (query as any).orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = (query as any).limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = (query as any).startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = (query as any).startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = (query as any).endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = (query as any).endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => (query as any).get(),\r\n getDoc: (docRef) => (docRef as any).get(),\r\n setDoc: (docRef, data, options) => (docRef as any).set(data, options),\r\n updateDoc: (docRef, data) => (docRef as any).update(data),\r\n deleteDoc: (docRef) => (docRef as any).delete(),\r\n writeBatch: (db) => (db as any).batch(),\r\n batchSet: (batch, docRef, data) => (batch as any).set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => (batch as any).update(docRef, data),\r\n batchDelete: (batch, docRef) => (batch as any).delete(docRef),\r\n batchCommit: (batch) => (batch as any).commit(),\r\n onSnapshot: (query, callback) => (query as any).onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Função principal que detecta automaticamente a versão e cria o adaptador apropriado\r\nexport const createWebAdapter = <T = any>(firebaseInstance: any): FirebaseAdapter<T> => {\r\n const version = detectFirebaseVersion(firebaseInstance);\r\n \r\n console.log(`🔥 Firebase version detected: ${version}`);\r\n \r\n switch (version) {\r\n case 'v9-modular':\r\n return createV9ModularAdapter(firebaseInstance);\r\n \r\n case 'v8':\r\n return createV8Adapter();\r\n \r\n default:\r\n console.warn('⚠️ Firebase version not detected, falling back to v8 adapter');\r\n return createV8Adapter();\r\n }\r\n};\r\n\r\n// Função utilitária para criar repositório com detecção automática de versão\r\nexport const createAutoRepo = <T extends { id: string }>(\r\n firebaseInstance: any,\r\n db: Firestore,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> => {\r\n const adapter = createWebAdapter(firebaseInstance);\r\n return createGenericRepo(db, adapter, config);\r\n};\r\n\r\nexport const createReactNativeAdapter = (): FirebaseAdapter => {\r\n // Implementação para React Native Firebase\r\n \r\n return {\r\n collection: (db, path) => db.collection(path),\r\n doc: (db, path, ...segments) => db.collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n // Adaptar constraints para React Native Firebase\r\n if (constraint.type === 'where') {\r\n query = query.where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = query.orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = query.limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = query.startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = query.startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = query.endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = query.endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => query.get(),\r\n getDoc: (docRef) => docRef.get(),\r\n setDoc: (docRef, data, options) => docRef.set(data, options),\r\n updateDoc: (docRef, data) => docRef.update(data),\r\n deleteDoc: (docRef) => docRef.delete(),\r\n writeBatch: (db) => db.batch(),\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: (query, callback) => query.onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n","/**\r\n * FACTORY PARA CRIAR TODOS OS REPOSITÓRIOS\r\n *\r\n * Este arquivo cria automaticamente todos os repositórios configurados\r\n * com type-safety completo, cache, isolamento por bancaId, etc.\r\n */\r\n\r\nimport {\r\n createGenericRepo,\r\n createWebAdapter,\r\n createReactNativeAdapter,\r\n type FirebaseAdapter,\r\n type Firestore,\r\n type GenericRepo,\r\n type RepoConfig,\r\n type AuthorizationConfig,\r\n type OperationType,\r\n} from \"./generic\";\r\n\r\nimport {\r\n UserModel,\r\n BancaModel,\r\n ExtracaoModel,\r\n ResultadoModel,\r\n MessageModel,\r\n RouteModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n GameModel,\r\n NumberModel,\r\n DescargaModel,\r\n PremiacaoModel,\r\n PremiacaoAssociacaoModel,\r\n PDFModel,\r\n AuditLogModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n VendaCambistaModel,\r\n VendasPorDiaModel,\r\n} from \"../models\";\r\n\r\nimport type {\r\n TypeUser,\r\n TypeBanca,\r\n TypeExtracao,\r\n TypeResultado,\r\n TypeMessage,\r\n TypeRoute,\r\n TypeValueGame,\r\n TypeLimitGame,\r\n TypeGame,\r\n TypeNumero,\r\n TypeDescarga,\r\n TypePremiacao,\r\n TypePremiacaoAssociacao,\r\n TypePDFDescargas,\r\n TypeAuditLog,\r\n TypeEnvioDescarga,\r\n TypeDevice,\r\n TypeVendaCambista,\r\n TypeVendasPorDia,\r\n} from \"../types\";\r\nimport { collections } from \"./collections\";\r\n\r\n// ============================================================================\r\n// TIPOS PARA CONFIGURAÇÃO\r\n// ============================================================================\r\n\r\nexport type RepoFactoryConfig = {\r\n db: Firestore;\r\n adapter: FirebaseAdapter;\r\n getBancaId?: () => string | undefined; // Função para obter bancaId atual\r\n getUserRole?: () => string | undefined; // ✨ Função para obter role do usuário atual\r\n cacheConfig?: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n };\r\n authorizationConfigs?: { // ✨ Configurações de autorização por coleção\r\n [collectionName in keyof typeof collections]: AuthorizationConfig;\r\n };\r\n onUnauthorized?: (operation: OperationType, userRole?: string, collection?: string) => void; // ✨ Callback global para não autorizado\r\n};\r\n\r\nexport type RepoCollections = {\r\n users_associacao: GenericRepo<TypeUser>;\r\n users: GenericRepo<TypeUser>;\r\n bancas: GenericRepo<TypeBanca>;\r\n extracoes: GenericRepo<TypeExtracao>;\r\n resultados: GenericRepo<TypeResultado>;\r\n mensagens: GenericRepo<TypeMessage>;\r\n rotas: GenericRepo<TypeRoute>;\r\n valores_jogos: GenericRepo<TypeValueGame>;\r\n limites_jogos: GenericRepo<TypeLimitGame>;\r\n pules: GenericRepo<TypeGame>;\r\n numeros: GenericRepo<TypeNumero>;\r\n descargas: GenericRepo<TypeDescarga>;\r\n descargas_associacao: GenericRepo<TypeDescarga>;\r\n premiacoes: GenericRepo<TypePremiacao>;\r\n premiacoes_associacao: GenericRepo<TypePremiacaoAssociacao>;\r\n pdf_descargas: GenericRepo<TypePDFDescargas>;\r\n pdf_descargas_associacao: GenericRepo<TypePDFDescargas>;\r\n auditLogs: GenericRepo<TypeAuditLog>;\r\n envios_descarga: GenericRepo<TypeEnvioDescarga>;\r\n dispositivos: GenericRepo<TypeDevice>;\r\n vendas_cambistas: GenericRepo<TypeVendaCambista>;\r\n vendas_por_dias: GenericRepo<TypeVendasPorDia>;\r\n};\r\n\r\n// ============================================================================\r\n// CONFIGURAÇÕES DE CADA COLEÇÃO\r\n// ============================================================================\r\n\r\nconst createConfigs = (\r\n getBancaId?: () => string | undefined,\r\n cacheConfig: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n } = { enabled: true, ttl: 300000, maxSize: 1000 },\r\n authorizationConfigs?: { [collectionName in keyof typeof collections]: AuthorizationConfig }\r\n) => {\r\n // Helper para isolamento por bancaId\r\n const withBancaIsolation = <T extends { id: string; bancaId?: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n isolation: getBancaId\r\n ? {\r\n enabled: true,\r\n fieldName: \"bancaId\" as keyof T,\r\n getValue: getBancaId as any,\r\n }\r\n : undefined,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName],\r\n });\r\n\r\n // Helper para coleções sem isolamento\r\n const withoutIsolation = <T extends { id: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName as keyof typeof collections],\r\n });\r\n\r\n return {\r\n\r\n // ========================================================================\r\n // USUÁRIOS - Com isolamento por bancaId\r\n // ========================================================================\r\n users_associacao: withoutIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // USUÁRIOS da banca - Com isolamento por bancaId\r\n // ========================================================================\r\n users: withBancaIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // BANCAS - Sem isolamento (dados globais)\r\n // ========================================================================\r\n bancas: withoutIsolation<TypeBanca>({\r\n collectionName: \"bancas\",\r\n model: BancaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // EXTRAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n extracoes: withBancaIsolation<TypeExtracao>({\r\n collectionName: \"extracoes\",\r\n model: ExtracaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // RESULTADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n resultados: withBancaIsolation<TypeResultado>({\r\n collectionName: \"resultados\",\r\n model: ResultadoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // MENSAGENS - Com isolamento por bancaId\r\n // ========================================================================\r\n mensagens: withBancaIsolation<TypeMessage>({\r\n collectionName: \"mensagens\",\r\n model: MessageModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ROTAS - Com isolamento por bancaId\r\n // ========================================================================\r\n rotas: withBancaIsolation<TypeRoute>({\r\n collectionName: \"rotas\",\r\n model: RouteModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VALORES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n valores_jogos: withBancaIsolation<TypeValueGame>({\r\n collectionName: \"valores_jogos\",\r\n model: ValueGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // LIMITES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n limites_jogos: withBancaIsolation<TypeLimitGame>({\r\n collectionName: \"limites_jogos\",\r\n model: LimitGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PULES (JOGOS) - Com isolamento por bancaId\r\n // ========================================================================\r\n pules: withBancaIsolation<TypeGame>({\r\n collectionName: \"pules\",\r\n model: GameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas_associacao: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas_associacao\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes: withBancaIsolation<TypePremiacao>({\r\n collectionName: \"premiacoes\",\r\n model: PremiacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes_associacao: withBancaIsolation<TypePremiacaoAssociacao>({\r\n collectionName: \"premiacoes_associacao\",\r\n model: PremiacaoAssociacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas_associacao: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas_associacao\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // AUDIT LOGS - Com isolamento por bancaId\r\n // ========================================================================\r\n auditLogs: withBancaIsolation<TypeAuditLog>({\r\n collectionName: \"auditLogs\",\r\n model: AuditLogModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ENVIOS DESCARGA - Com isolamento por bancaId\r\n // ========================================================================\r\n envios_descarga: withBancaIsolation<TypeEnvioDescarga>({\r\n collectionName: \"envios_descarga\",\r\n model: EnvioDescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DISPOSITIVOS - Com isolamento por bancaId\r\n // ========================================================================\r\n dispositivos: withBancaIsolation<TypeDevice>({\r\n collectionName: \"dispositivos\",\r\n model: DeviceModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VENDAS CAMBISTA - Com isolamento por bancaId\r\n // ========================================================================\r\n vendas_cambistas: withBancaIsolation<TypeVendaCambista>({\r\n collectionName: \"vendas_cambistas\",\r\n model: VendaCambistaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VENDAS POR DIA - Com isolamento por bancaId\r\n // ========================================================================\r\n vendas_por_dias: withBancaIsolation<TypeVendasPorDia>({\r\n collectionName: \"vendas_por_dias\",\r\n model: VendasPorDiaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// FACTORY PRINCIPAL\r\n// ============================================================================\r\n\r\nexport function createRepoFactory(config: RepoFactoryConfig): RepoCollections {\r\n const { db, adapter, getBancaId, cacheConfig, authorizationConfigs } = config;\r\n const configs = createConfigs(getBancaId, cacheConfig, authorizationConfigs);\r\n\r\n return {\r\n users_associacao: createGenericRepo(db, adapter, configs.users_associacao),\r\n users: createGenericRepo(db, adapter, configs.users),\r\n bancas: createGenericRepo(db, adapter, configs.bancas),\r\n extracoes: createGenericRepo(db, adapter, configs.extracoes),\r\n resultados: createGenericRepo(db, adapter, configs.resultados),\r\n mensagens: createGenericRepo(db, adapter, configs.mensagens),\r\n rotas: createGenericRepo(db, adapter, configs.rotas),\r\n valores_jogos: createGenericRepo(db, adapter, configs.valores_jogos),\r\n limites_jogos: createGenericRepo(db, adapter, configs.limites_jogos),\r\n pules: createGenericRepo(db, adapter, configs.pules),\r\n numeros: createGenericRepo(db, adapter, configs.numeros),\r\n descargas: createGenericRepo(db, adapter, configs.descargas),\r\n descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.descargas_associacao\r\n ),\r\n premiacoes: createGenericRepo(db, adapter, configs.premiacoes),\r\n premiacoes_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.premiacoes_associacao\r\n ),\r\n pdf_descargas: createGenericRepo(db, adapter, configs.pdf_descargas),\r\n pdf_descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.pdf_descargas_associacao\r\n ),\r\n auditLogs: createGenericRepo(db, adapter, configs.auditLogs),\r\n envios_descarga: createGenericRepo(db, adapter, configs.envios_descarga),\r\n dispositivos: createGenericRepo(db, adapter, configs.dispositivos),\r\n vendas_cambistas: createGenericRepo(db, adapter, configs.vendas_cambistas),\r\n vendas_por_dias: createGenericRepo(db, adapter, configs.vendas_por_dias),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS ESPECÍFICOS PARA WEB E REACT NATIVE\r\n// ============================================================================\r\n\r\n/**\r\n * Cria todos os repositórios para Firebase Web SDK\r\n *\r\n * @example\r\n * import { getFirestore, collection, doc, query, where } from 'firebase/firestore';\r\n * import { createWebRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const db = getFirestore();\r\n * const firebaseInstance = { collection, doc, query, where, getDocs, getDoc, setDoc, updateDoc, deleteDoc, writeBatch, onSnapshot };\r\n * const repo = createWebRepoFactory({\r\n * db,\r\n * firebaseInstance,\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const users = await repo.users.getAll({\r\n * where: [{ field: \"role\", operator: \"==\", value: \"admin\" }]\r\n * });\r\n */\r\nexport function createWebRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\"> & { firebaseInstance: any }\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createWebAdapter(config.firebaseInstance),\r\n });\r\n}\r\n\r\n/**\r\n * Cria todos os repositórios para React Native Firebase\r\n *\r\n * @example\r\n * import firestore from '@react-native-firebase/firestore';\r\n * import { createReactNativeRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const repo = createReactNativeRepoFactory({\r\n * db: firestore(),\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const numeros = await repo.numeros.getAll({\r\n * where: [{ field: \"tipo_jogo\", operator: \"==\", value: \"milhar\" }]\r\n * });\r\n */\r\nexport function createReactNativeRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\">\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createReactNativeAdapter(),\r\n });\r\n}\r\n"],"mappings":"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AO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,KAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,CAC3C,ECjIO,IAAME,GAAW,CACtB,SAAU,kBACV,iBAAkB,gCAClB,gBAAiB,oCACjB,mBAAoB,mBACpB,qBAAsB,wCACtB,eAAgB,4DAClB,ECPO,IAAMC,EAAQ,CACjB,YAAe,CACX,GAAM,cACN,MAAS,qBACb,EACA,WAAc,CACV,GAAM,aACN,MAAS,kBACb,EACA,MAAS,CACL,GAAM,QACN,MAAS,eACb,EACA,UAAa,CACT,GAAM,YACN,MAAS,mBACb,EACA,cAAiB,CACb,GAAM,gBACN,MAAS,yBACb,EACA,UAAa,CACT,GAAM,YACN,MAAS,WACb,EACA,eAAkB,CACd,GAAM,iBACN,MAAS,sBACb,EACA,SAAY,CACR,GAAM,WACN,MAAS,UACb,CACJ,ECjCO,IAAMC,GAAc,CACzB,YAAa,CACX,GAAI,cACJ,MAAO,cACP,MAAO,QACP,SAAU,GACV,MAAO,CACT,EACA,OAAQ,CACN,GAAI,SACJ,MAAO,gBACP,MAAO,QACP,SAAU,GACV,MAAO,CACT,EACA,wBAAyB,CACvB,GAAI,0BACJ,MAAO,0BACP,MAAO,SACP,SAAU,GACV,MAAO,CACT,EACA,UAAW,CACT,GAAI,YACJ,MAAO,aACP,MAAO,MACP,SAAU,GACV,MAAO,CACT,CACF,EC7BO,IAAMC,GAAoB,CAC7B,YAAe,CACX,GAAI,cACJ,MAAO,mBACX,EACA,UAAa,CACT,GAAI,YACJ,MAAO,cACX,CACJ,ECTO,IAAMC,GAAe,CACxB,MAAS,CACL,GAAI,QACJ,MAAO,OACX,EACA,UAAa,CACT,GAAI,YACJ,MAAO,WACX,EACA,gBAAmB,CACf,GAAI,kBACJ,MAAO,oBACX,EACA,UAAa,CACT,GAAI,YACJ,MAAO,WACX,CACJ,ECjBO,IAAMC,EAAgB,MCAtB,IAAMC,EAAmB,aCAzB,IAAMC,EAAe,SCArB,IAAMC,GAAkB,CAC3B,SAAY,CACR,GAAI,WACJ,WAAY,WACZ,gBAAiB,YACjB,MAAO,OACP,cAAe,GACf,mBAAoB,GACpB,MAAO,CACX,EACA,WAAc,CACV,GAAI,aACJ,WAAY,YACZ,gBAAiB,aACjB,MAAO,OACP,cAAe,GACf,mBAAoB,GACpB,MAAO,CACX,EACA,QAAW,CACP,GAAI,UACJ,WAAY,UACZ,gBAAiB,WACjB,MAAO,QACP,cAAe,GACf,mBAAoB,GACpB,MAAO,CACX,EACA,UAAa,CACT,GAAI,YACJ,WAAY,YACZ,gBAAiB,YACjB,MAAO,SACP,cAAe,GACf,mBAAoB,GACpB,MAAO,CACX,EACA,KAAQ,CACJ,GAAI,OACJ,WAAY,OACZ,gBAAiB,OACjB,MAAO,MACP,cAAe,GACf,mBAAoB,GACpB,MAAO,CACX,CACJ,EC9CO,IAAMC,GAAW,CAEtB,MAAO,CAAE,MAAO,QAAS,MAAO,OAAQ,EACxC,KAAM,CAAE,MAAO,OAAQ,MAAO,MAAO,EACrC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAClC,MAAO,CAAE,MAAO,SAAU,MAAO,OAAQ,EACzC,UAAW,CAAE,MAAO,YAAa,MAAO,WAAY,EACpD,OAAQ,CAAE,MAAO,MAAO,MAAO,QAAS,EACxC,OAAQ,CAAE,MAAO,MAAO,MAAO,QAAS,EACxC,UAAW,CAAE,MAAO,KAAM,MAAO,WAAY,EAC7C,UAAW,CAAE,MAAO,IAAK,MAAO,WAAY,EAC5C,SAAU,CAAE,MAAO,WAAY,MAAO,UAAW,EACjD,MAAO,CAAE,MAAO,IAAK,MAAO,OAAQ,EACpC,MAAO,CAAE,MAAO,IAAK,MAAO,eAAgB,EAE5C,OAAQ,CAAE,MAAO,SAAU,MAAO,QAAS,EAC3C,KAAM,CAAE,MAAO,OAAQ,MAAO,MAAO,EACrC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAClC,OAAQ,CAAE,MAAO,UAAW,MAAO,QAAS,EAC5C,SAAU,CAAE,MAAO,YAAa,MAAO,UAAW,EAElD,QAAS,CAAE,MAAO,SAAK,MAAO,SAAU,EACxC,UAAW,CAAE,MAAO,SAAK,MAAO,WAAY,EAC5C,UAAW,CAAE,MAAO,SAAK,MAAO,WAAY,EAC5C,WAAY,CAAE,MAAO,SAAK,MAAO,YAAa,EAG9C,QAAS,CAAE,MAAO,WAAY,MAAO,SAAU,EAO/C,IAAK,CAAE,MAAO,IAAK,MAAO,cAAe,EAGzC,OAAQ,CAAE,MAAO,IAAK,MAAO,cAAe,EAG5C,SAAU,CAAE,MAAO,IAAK,MAAO,gBAAiB,EAGhD,SAAU,CAAE,MAAO,IAAK,MAAO,kBAAmB,EAGlD,IAAK,CAAE,MAAO,IAAK,MAAO,iBAAkB,EAE5C,MAAO,CAAE,GAAI,QAAS,MAAO,IAAK,MAAO,OAAQ,EAKjD,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,GAAI,CAAE,MAAO,KAAM,MAAO,IAAK,EAC/B,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAClC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAClC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAKlC,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAK5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CA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","names":["EXTRACAO","GAMES","BICHOS","GRUPOS_BICHOS","MESSAGES","ROLES","STATUS_PULE","TIPO_VISUALIZACAO","VISUALIZACAO","PREFIX_NUMBER","PREFIX_ENVIO_OLD","PREFIX_ENVIO","STATUS_DESCARGA","KEYBOARD","STATUS_DEVICE","PREMIOS","COMISSOES_PADRAO","GAMES","STATUS_GUIA","getCreatedBySystem","obj","ROLES","utils_exports","__export","clone","combineDateTime","dateToNumber","delay","dividirArray","formatterBRL","formatterPercentage","formatterPercentageDecimal","generateId","getAllCombinations","getCodigoAuth","getDataInicioFim","getInitials","matchNormalized","normalize","numberToDate","numbersSelectedFormated","parserBRL","parserPercentage","parserPercentageDecimal","pegarHorarioSaoPaulo","removerLetters","showFormatDate","cloneDeep","clone","item","isValid","dateToNumber","date","year","month","day","hour","minute","second","parse","isValid","moment","pegarHorarioSaoPaulo","string","day","month","year","hour","minutes","seconds","milliseconds","numberToDate","number","str","year","month","day","hour","minute","second","dateString","dateNow","pegarHorarioSaoPaulo","date","parse","isValid","combineDateTime","dateA","dateB","dateAParts","numberToDate","dateBParts","year","month","day","hours","minutes","seconds","combinedDate","dateToNumber","setHours","setMinutes","setSeconds","getDataInicioFim","dataAposta","dataInicio","setSeconds","setMinutes","setHours","numberToDate","pegarHorarioSaoPaulo","dataFim","dateToNumber","formatterBRL","value","cloneValue","parserBRL","valueN","generatePermutations","arr","result","i","current","remaining","remainingPermutations","perm","getAllCombinations","num","numArr","permutations","uniqueCombinations","format","showFormatDate","number","formatString","date","numberToDate","numbersSelectedFormated","numbersString","numbers","a","b","result","start","end","i","generateId","prefix","s4","getCodigoAuth","min","max","dividirArray","arrayGrande","tamanho","resultado","i","subarray","delay","ms","resolve","normalize","str","matchNormalized","text","search","normalize","getInitials","nomeCompleto","nome","formatterPercentage","value","parserPercentage","value","newValue","formatterPercentageDecimal","value","parserPercentageDecimal","newValue","removerLetters","value","ExtracaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","numbers_exports","__export","arredondarParaCima","arrendondarCasasDecimais","calculaValoresDosNumeros","calcularValorDeNumero","formatarNumero","generateDescargas","gerarDezenas","getCreatedBySystem","getLimiteSimulado","getNumeroId","getNumerosAcimaDoLimite","getPremioFormato","getPropsEnvioId","getPropsEnvioIdOld","getPropsPrefix","getPropsVP","getSomaEnvio","getSomaProps","getSomaVP","getTiposJogos","sortNumeros","formatarNumero","numero","formato","resultado","indiceNumero","indiceFormato","generateDescarga","numero","id","descargaId","lastEnvioId","DescargaModel","getDescargaIdPeloNumero","numero","getByProperty","valorParaId","arredondarParaCima","generateDescargas","numeros","getByProperty","descargas","numero","descargaId","getDescargaIdPeloNumero","generateDescarga","gerarDezenas","bets","newNumbers","bet","TYPE_GAME","GAMES","number","nums","num","n","formatarNumero","uniqueCombinations","getSomaEnvio","numero","soma","key","value","array","getSomaVP","numero","soma","quantidadeDePulesMaiorQueZero","key","value","somaEnviadoParaAssociacao","getSomaEnvio","getNumeroId","props","dataAposta","jogo","numero","bancaId","premio","descarregado","TYPE_GAME","GAMES","numeroFormatado","formatarNumero","descarregadoFormatado","getTiposJogos","tipos","calcularValorDeNumero","quantidadeDeNumeros","tipoJogo","valorPremio","quantidadeDePremios","TYPE_GAME","GAMES","jogos","getTiposJogos","valorDoNumero","criarNumberModel","numberId","numeroFormatado","premioFormato","created","game","jogo","NumberModel","processarNumeroEPremio","number","premio","valorDoNumero","TYPE_GAME","numeros","PREMIOS","getNumeroId","valor","arrendondarCasasDecimais","arredondarParaCima","calculaValoresDosNumeros","minimoParaSelecionarDo1ao5Premio","bet","jogos","getTiposJogos","GAMES","numbers","qtd_numeros","prize","calcularValorDeNumero","getPremioFormato","getNumerosAcimaDoLimite","numeros","valoresJogos","limitesJogos","numero","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","arrendondarCasasDecimais","limiteAtingidoArredondado","diferenca","arredondarParaCima","valor","emCentavos","resto","sortNumeros","numeros","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getPropsEnvioId","numero","objeto","key","value","array","getPropsEnvioIdOld","numero","objeto","key","value","array","getPropsVP","numero","objeto","key","value","getPropsPrefix","numero","props","PREFIX_ENVIO","PREFIX_ENVIO_OLD","vps","clone","getPropsVP","envio_ids","getPropsEnvioId","envio_ids_old","getPropsEnvioIdOld","getPremioFormato","premio","PREMIOS","getSomaProps","objeto","soma","value","getLimiteJogoPeloTipoJogo","limitsGames","type_game","v","limite_jogos_exports","__export","calcularValorJogoPeloLimite","getLimiteJogoPeloTipoJogo","getValorJogoPeloTipoJogo","calcularValorJogoPeloLimite","limiteJogo","valorJogo","getValorJogoPeloTipoJogo","valuesGames","type_game","v","arrendondarCasasDecimais","numero","casas","getLimiteSimulado","tipo_jogo","valores","limites","valorJogo","getValorJogoPeloTipoJogo","limiteSimulado","getLimiteJogoPeloTipoJogo","arrendondarCasasDecimais","extracao_exports","__export","extracaoEstaAtivaBoolean","extracaoEstaAtivaTryCatch","getAvailableTimes","getProximaExtracaoDisponivelParaAposta","pegarExtracoes","format","getDay","games_exports","__export","calculateAmount","calculateAmountGame","fazerJogo","formatPuleId","getBetDateToNumber","getFormattedPuleId","getGamesUnicosList","getGamesUnicosObjeto","invertGame","calculateAmount","betValues","total","item","calculateAmountGame","games","total","bet","calculateAmount","setHours","setMinutes","setSeconds","getBetDateToNumber","date","extracaoDate","dateExtracao","numberToDate","newDateBet","setHours","setMinutes","setSeconds","dateToNumber","formatPuleId","n","getFormattedPuleId","id","parts","invertGame","game","newGame","clone","index","aposta","tipos_jogos","getTiposJogos","nums","result","tipo_jogo","num","numeroFormatado","formatarNumero","GAMES","n","getAllCombinations","fazerJogo","cart","profile","dateBet","extracao","puleId","game","GameModel","getBetDateToNumber","calculateAmountGame","gameWIthInvertedNumbers","invertGame","numeros","calculaValoresDosNumeros","getGamesUnicosList","GAMES","visu","getGamesUnicosObjeto","acc","item","getAvailableTimes","extracoes","dateBet","showAll","mobile","dateNow","data","getBetDateToNumber","extracoesAtivas","ext","DateBet","numberToDate","validTimes","extracoesFeriado","getDay","format","showFormatDate","extA","extB","format","getDay","pegarExtracoes","extracoes","dataAposta","dateToNumber","pegarHorarioSaoPaulo","dataAgora","retornar","pegar","getHorario","extracao","dataApostaNumerica","getBetDateToNumber","dataAgoraNumerica","dataApostaDate","numberToDate","extracoesAtivas","ext","extracoesDeFeriado","extracoesNormais","extracoesValidas","getDay","sortExtracoes","dataAgoraDate","horaAgora","format","showFormatDate","a","b","getDay","extracaoEstaAtivaTryCatch","dataAposta","extracao","dataApostaNumerica","getBetDateToNumber","somenteNoFeriadoNormalizado","dataApostaDate","numberToDate","getDay","diaDaSemana","extracaoEstaAtivaBoolean","dataAposta","extracao","extracaoEstaAtivaTryCatch","getProximaExtracaoDisponivelParaAposta","extracoes","data","resultado","extracoesDoDia","pegarExtracoes","indiceExtracaoComResultado","extracao","dataBase","horarioExtracao","dataCompleta","getBetDateToNumber","users_exports","__export","getLimitsRest","getPermission","isAdm","isAdmOrSubAdm","isAssociacao","isCambista","isCambistaTalao","isDigitador","isDigitadorAdm","isDigitadorOrDigitadorAdm","isSuperAdm","IS_ADM","IS_ADM_OR_SUBADM","IS_ASSOCIACAO","IS_SUPER_ADMIN","IS_CAMBISTA_TALAO","IS_CAMBISTA","IS_DIGITADOR_ADM","IS_DIGITADOR","IS_DIGITADOR_AND_ADM","isAdm","user","isAssociacao","isSuperAdm","isAdmOrSubAdm","isSubAdmin","ROLES","isCambistaTalao","isCambista","isDigitadorAdm","isDigitador","isDigitadorOrDigitadorAdm","hasPermissionToSendToAssociation","getPermission","getLimitsRest","user","hoje","pre","value","descarga_exports","__export","generateDescarga","generateDescargas","getDescargaIdPeloEnvio","getDescargaIdPeloNumero","getDescargasAcimaDoLimite","getPropsEnvioId","getPropsEnvioIdOldDescarga","getPropsVPDescarga","getTotalGeralDescarga","sortDescargas","sortDescargas","descargas","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getDescargasAcimaDoLimite","descargas","valoresJogos","limitesJogos","descarga","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","arrendondarCasasDecimais","limiteAtingidoArredondado","diferenca","getPropsVPDescarga","descarga","objeto","key","value","getPropsEnvioId","descarga","objeto","key","value","array","getPropsEnvioIdOldDescarga","descarga","objeto","key","value","array","getDescargaIdPeloEnvio","numero","envioId","envioKey","PREFIX_ENVIO_OLD","envioValue","somaArredondada","arredondarParaCima","getTotalGeralDescarga","totalBrutoJogos","comissoes","totalGeral","totalBrutoJogosArray","listaComissoes","comissaoRestante","comissao","type_game","jogo","valorJogo","comissaoEncontrada","comissaoPadrao","COMISSOES_PADRAO","totalComissao","totalLiquido","envio_exports","__export","agruparEnvioPorExtracao","criarEstruturaJogo","getComissoesDoEnvio","criarEstruturaJogo","_jogoId","jogoData","ComissaoDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getComissoesDoEnvio","comissoesDescarga","comissoes","comissao","comissaoModel","ComissaoDescargaModel","generateId","agruparEnvioPorExtracao","envios","enviosExtracao","enviosLista","envio","comissoes","getComissoesDoEnvio","extracaoId","envioExtracao","totalGeral","getTotalGeralDescarga","acc","jogoId","jogoData","criarEstruturaJogo","jogos","functionsCore","numbers_exports","extracao_exports","descarga_exports","games_exports","users_exports","limite_jogos_exports","utils_exports","envio_exports","MessageModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","RouteModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","UserModel","obj","ROLES","type","GAMES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ValueGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GameModel","obj","ROLES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getCodigoAuth","STATUS_PULE","NumberModel","obj","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseModel","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","BetModel","obj","PremiacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PDFModel","obj","getCreatedBySystem","BancaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","AuditLogModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimitGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","EnvioDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DESCARGA","DescargaModel","descarga","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseDescarga","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","DeviceModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DEVICE","PremiacaoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GuiaModel","obj","ROLES","STATUS_GUIA","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GuiaItemModel","obj","ROLES","STATUS_GUIA","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimiteNumeroApostaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","VendaCambistaModel","obj","ROLES","VendasPorDiaModel","obj","baseModel","vendasExtracaoProps","key","value","totalPulesExtracaoProps","vendasRotaProps","totalPulesRotaProps","comissaoExtracaoProps","comissaoRotaProps","collections","MessageModel","UserModel","GuiaModel","GuiaItemModel","LimiteNumeroApostaModel","ValueGameModel","LimitGameModel","GameModel","ExtracaoModel","ResultadoModel","ResultadoAssociacaoModel","RouteModel","EnvioDescargaModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","BancaModel","AuditLogModel","DeviceModel","ComissaoDescargaModel","VendaCambistaModel","VendasPorDiaModel","COLLECTIONS_NAMES","collectionsToAudit","collectionsRetentionDays","collectionsWithIsolationByBancaId","MemoryCache","ttl","maxSize","key","item","data","firstKey","createGenericRepo","db","adapter","config","collectionName","model","idSearchStrategy","isolation","cache","authorization","generateId","memoryCache","checkAuthorization","operation","userRole","allowedRoles","getIsolationConstraints","value","buildQuery","options","constraints","field","operator","direction","collection","resolveDocument","id","query","snapshot","getCacheKey","params","isolationKey","cacheKey","cached","docSnap","docRef","result","error","callback","docData","completeData","modelData","docs","d","op","batch","docId","detectFirebaseVersion","firebaseInstance","createV9ModularAdapter","firebaseModular","path","segments","count","fieldValues","createV8Adapter","constraint","createWebAdapter","version","createAutoRepo","createReactNativeAdapter","createConfigs","getBancaId","cacheConfig","authorizationConfigs","withBancaIsolation","config","withoutIsolation","UserModel","BancaModel","ExtracaoModel","ResultadoModel","MessageModel","RouteModel","ValueGameModel","LimitGameModel","GameModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","AuditLogModel","EnvioDescargaModel","DeviceModel","VendaCambistaModel","VendasPorDiaModel","createRepoFactory","db","adapter","configs","createGenericRepo","createWebRepoFactory","createWebAdapter","createReactNativeRepoFactory","createReactNativeAdapter"]}
1
+ {"version":3,"sources":["../src/constants/EXTRACAO.ts","../src/constants/GAMES.ts","../src/constants/GRUPOS_BICHOS.ts","../src/constants/MESSAGES.ts","../src/constants/ROLES.ts","../src/constants/STATUS_PULE.ts","../src/constants/TIPO_VISUALIZACAO.ts","../src/constants/VISUALIZACAO.ts","../src/constants/PREFIX_NUMBER.ts","../src/constants/PREFIX_ENVIO_OLD.ts","../src/constants/PREFIX_ENVIO.ts","../src/constants/STATUS_DESCARGA.ts","../src/constants/KEYBOARD.ts","../src/constants/STATUS_DEVICE.ts","../src/constants/PREMIOS.ts","../src/constants/COMISSOES_PADRAO.ts","../src/constants/STATUS_GUIA.ts","../src/functions/numbers/getCreatedBySystem.ts","../src/utils/index.ts","../src/utils/clone.ts","../src/utils/dateToNumber.ts","../src/utils/numberToDate.ts","../src/utils/pegarHorarioSaoPaulo.ts","../src/utils/combineDateTime.ts","../src/utils/getDataInicioFim.ts","../src/utils/formatBRL.ts","../src/utils/getAllCombinations.ts","../src/utils/showFormatDate.ts","../src/utils/numbersSelectedFormated.ts","../src/utils/generateId.ts","../src/utils/getCodigoAuth.ts","../src/utils/dividirArray.ts","../src/utils/delay.ts","../src/utils/normalize.ts","../src/utils/matchNormalized.ts","../src/utils/getInitials.ts","../src/utils/formatterPercentage.ts","../src/utils/parserPercentage.ts","../src/utils/formatterPercentageDecimal.ts","../src/utils/removerLetters.ts","../src/models/ExtracaoModel.ts","../src/functions/numbers/index.ts","../src/functions/numbers/formatarNumero.ts","../src/functions/descarga/generateDescarga.ts","../src/functions/descarga/getDescargaIdPeloNumero.ts","../src/functions/descarga/generateDescargas.ts","../src/functions/numbers/gerarDezenas.ts","../src/functions/numbers/getSomaEnvio.ts","../src/functions/numbers/getSomaVP.ts","../src/functions/numbers/getNumeroId.ts","../src/functions/numbers/getTiposJogos.ts","../src/functions/numbers/calcularValorDeNumero.ts","../src/functions/numbers/calculaValoresDosNumeros.ts","../src/functions/numbers/getNumerosAcimaDoLimite.ts","../src/functions/numbers/arrendondarParaCima.ts","../src/functions/numbers/sortNumeros.ts","../src/functions/numbers/getPropsEnvioId.ts","../src/functions/numbers/getPropsEnvioIdOld.ts","../src/functions/numbers/getPropsVP.ts","../src/functions/numbers/getPropsPrefix.ts","../src/functions/numbers/getPremioFormato.ts","../src/functions/numbers/getSomaProps.ts","../src/functions/limite_jogos/getLimiteJogoPeloTipoJogo.ts","../src/functions/limite_jogos/index.ts","../src/functions/limite_jogos/calcularValorJogoPeloLimite.ts","../src/functions/limite_jogos/getValorJogoPeloTipoJogo.ts","../src/functions/numbers/arrendondarCasasDecimais.ts","../src/functions/numbers/getLimiteSimulado.ts","../src/functions/extracao/index.ts","../src/functions/extracao/getAvailableTimes.ts","../src/functions/games/index.ts","../src/functions/games/calculateAmount.ts","../src/functions/games/calculateAmountGame.ts","../src/functions/games/getBetDateToNumber.ts","../src/functions/games/formatPuleId.ts","../src/functions/games/getFormattedPuleId.ts","../src/functions/games/invertGame.ts","../src/functions/games/fazerJogo.ts","../src/functions/games/getGamesUnicos.ts","../src/functions/extracao/pegarExtracoes.ts","../src/functions/extracao/extracaoEstaAtivaTryCatch.ts","../src/functions/extracao/extracaoEstaAtivaBoolean.ts","../src/functions/extracao/getProximaExtracaoDisponivelParaAposta.ts","../src/functions/users/index.ts","../src/functions/users/permissions.ts","../src/functions/users/getLimitsRest.ts","../src/functions/descarga/index.ts","../src/functions/descarga/sortDescargas.ts","../src/functions/descarga/getDescargasAcimaDoLimite.ts","../src/functions/descarga/getPropsVPDescarga.ts","../src/functions/descarga/getPropsEnvioIdDescarga.ts","../src/functions/descarga/getPropsEnvioIdOldDescarga.ts","../src/functions/descarga/getDescargaIdPeloEnvio.ts","../src/functions/descarga/getTotalGeralDescarga.ts","../src/functions/descarga/sortDescargasByEnvioId.ts","../src/functions/envio/index.ts","../src/functions/envio/criarEstruturaJogo.ts","../src/models/ComissaoDescargaModel.ts","../src/functions/envio/getComissoesDoEnvio.ts","../src/functions/envio/agruparEnvioPorExtracao.ts","../src/functions/index.ts","../src/models/MessageModel.ts","../src/models/ResultadoModel.ts","../src/models/RouteModel.ts","../src/models/UserModel.ts","../src/models/ValueGameModel.ts","../src/models/GameModel.ts","../src/models/NumberModel.ts","../src/models/BetModel.ts","../src/models/PremiacaoModel.ts","../src/models/PDFModel.ts","../src/models/BancaModel.ts","../src/models/AuditLogModel.ts","../src/models/LimitGameModel.ts","../src/models/EnvioDescargaModel.ts","../src/models/DescargaModel.ts","../src/models/DeviceModel.ts","../src/models/PremiacaoAssociacaoModel.ts","../src/models/GuiaModel.ts","../src/models/GuiaItemModel.ts","../src/models/LimiteNumeroApostaModel.ts","../src/models/ResultadoAssociacaoModel.ts","../src/models/VendaCambistaModel.ts","../src/models/VendasPorDiaModel.ts","../src/repo/collections.ts","../src/repo/COLLECTIONS_NAMES.ts","../src/repo/collectionsToAudit.ts","../src/repo/collectionsRetentionDays.ts","../src/repo/collectionsWithIsolationByBancaId.ts","../src/repo/generic.ts","../src/repo/createRepoFactory.ts"],"sourcesContent":["export const EXTRACAO = [13, 16, 19] as const","// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n// \"nome_jogo1-nome_jogo2\" -> 2 jogos\r\n\r\nexport const GAMES = {\r\n \"milhar\": {\r\n id: \"milhar\",\r\n label: \"Milhar\",\r\n sigla: \"M\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 1,\r\n showPerLine: 6,\r\n },\r\n \"centena\": {\r\n id: \"centena\",\r\n label: \"Centena\",\r\n sigla: \"C\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 2,\r\n showPerLine: 7,\r\n },\r\n \"dezena\": {\r\n id: \"dezena\",\r\n label: \"Dezena\",\r\n sigla: \"D\",\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n max: 0,\r\n order: 3,\r\n showPerLine: 0,\r\n },\r\n \"grupo\": {\r\n id: \"grupo\",\r\n label: \"Grupo\",\r\n sigla: \"G\",\r\n max: 25, // 0 a 25\r\n format: \"##\",\r\n formatDigitar: \"##\",\r\n markAll: false,\r\n order: 4,\r\n showPerLine: 0\r\n },\r\n \"terno.dezena\": {\r\n id: \"terno.dezena\",\r\n label: \"Terno de Dezena\",\r\n sigla: \"TD\",\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n max: 0,\r\n order: 5,\r\n showPerLine: 3,\r\n },\r\n \"terno.grupo\": {\r\n id: \"terno.grupo\",\r\n label: \"Terno de Grupo\",\r\n sigla: \"TG\",\r\n max: 25, // (0-25)-(0-25)-(0-25)\r\n format: \"##-##-##\",\r\n formatDigitar: \"######\",\r\n markAll: true,\r\n order: 6,\r\n showPerLine: 3\r\n },\r\n \"duque.dezena\": {\r\n id: \"duque.dezena\",\r\n label: \"Duque de Dezena\",\r\n sigla: \"DD\",\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n max: 0,\r\n order: 7,\r\n showPerLine: 5\r\n },\r\n \"duque.grupo\": {\r\n id: \"duque.grupo\",\r\n label: \"Duque de Grupo\",\r\n sigla: \"DG\",\r\n max: 25, // (0-25)-(0-25)\r\n format: \"##-##\",\r\n formatDigitar: \"####\",\r\n markAll: true,\r\n order: 8,\r\n showPerLine: 5\r\n },\r\n \"milhar.invertida\": {\r\n id: \"milhar.invertida\",\r\n label: \"Milhar Invertida\",\r\n sigla: \"MI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena.invertida\": {\r\n id: \"centena.invertida\",\r\n label: \"Centena Invertida\",\r\n sigla: \"CI\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n \"milhar@centena\": {\r\n id: \"milhar@centena\",\r\n label: \"Milhar Centena\",\r\n sigla: \"MC\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar.invertida@centena.invertida\": {\r\n id: \"milhar.invertida@centena.invertida\",\r\n label: \"Milhar e Centena Invertidas\",\r\n sigla: \"MCI\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@dezena\": {\r\n id: \"milhar@dezena\",\r\n label: \"Milhar e Dezena\",\r\n sigla: \"MD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"milhar@centena@dezena\": {\r\n id: \"milhar@centena@dezena\",\r\n label: \"Milhar, Centena e Dezena\",\r\n sigla: \"MCD\",\r\n format: \"####\",\r\n formatDigitar: \"####\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 6\r\n },\r\n \"centena@dezena\": {\r\n id: \"centena@dezena\",\r\n label: \"Centena Dezena\",\r\n sigla: \"CD\",\r\n format: \"###\",\r\n formatDigitar: \"###\",\r\n markAll: false,\r\n max: 0,\r\n order: 0,\r\n showPerLine: 7\r\n },\r\n} as const;","const BICHOS = {\r\n '01': 'Avestruz',\r\n '02': 'Águia',\r\n '03': 'Burro',\r\n '04': 'Borboleta',\r\n '05': 'Cachorro',\r\n '06': 'Cabra',\r\n '07': 'Carneiro',\r\n '08': 'Camelo',\r\n '09': 'Cobra',\r\n '10': 'Coelho',\r\n '11': 'Cavalo',\r\n '12': 'Elefante',\r\n '13': 'Galo',\r\n '14': 'Gato',\r\n '15': 'Jacaré',\r\n '16': 'Leão',\r\n '17': 'Macaco',\r\n '18': 'Porco',\r\n '19': 'Pavão',\r\n '20': 'Peru',\r\n '21': 'Touro',\r\n '22': 'Tigre',\r\n '23': 'Urso',\r\n '24': 'Veado',\r\n '25': 'Vaca'\r\n} as const;\r\n\r\nexport const GRUPOS_BICHOS = {\r\n '01': { grupo: '01', bicho: BICHOS['01'] },\r\n '02': { grupo: '01', bicho: BICHOS['01'] },\r\n '03': { grupo: '01', bicho: BICHOS['01'] },\r\n '04': { grupo: '01', bicho: BICHOS['01'] },\r\n '05': { grupo: '02', bicho: BICHOS['02'] },\r\n '06': { grupo: '02', bicho: BICHOS['02'] },\r\n '07': { grupo: '02', bicho: BICHOS['02'] },\r\n '08': { grupo: '02', bicho: BICHOS['02'] },\r\n '09': { grupo: '03', bicho: BICHOS['03'] },\r\n '10': { grupo: '03', bicho: BICHOS['03'] },\r\n '11': { grupo: '03', bicho: BICHOS['03'] },\r\n '12': { grupo: '03', bicho: BICHOS['03'] },\r\n '13': { grupo: '04', bicho: BICHOS['04'] },\r\n '14': { grupo: '04', bicho: BICHOS['04'] },\r\n '15': { grupo: '04', bicho: BICHOS['04'] },\r\n '16': { grupo: '04', bicho: BICHOS['04'] },\r\n '17': { grupo: '05', bicho: BICHOS['05'] },\r\n '18': { grupo: '05', bicho: BICHOS['05'] },\r\n '19': { grupo: '05', bicho: BICHOS['05'] },\r\n '20': { grupo: '05', bicho: BICHOS['05'] },\r\n '21': { grupo: '06', bicho: BICHOS['06'] },\r\n '22': { grupo: '06', bicho: BICHOS['06'] },\r\n '23': { grupo: '06', bicho: BICHOS['06'] },\r\n '24': { grupo: '06', bicho: BICHOS['06'] },\r\n '25': { grupo: '07', bicho: BICHOS['07'] },\r\n '26': { grupo: '07', bicho: BICHOS['07'] },\r\n '27': { grupo: '07', bicho: BICHOS['07'] },\r\n '28': { grupo: '07', bicho: BICHOS['07'] },\r\n '29': { grupo: '08', bicho: BICHOS['08'] },\r\n '30': { grupo: '08', bicho: BICHOS['08'] },\r\n '31': { grupo: '08', bicho: BICHOS['08'] },\r\n '32': { grupo: '08', bicho: BICHOS['08'] },\r\n '33': { grupo: '09', bicho: BICHOS['09'] },\r\n '34': { grupo: '09', bicho: BICHOS['09'] },\r\n '35': { grupo: '09', bicho: BICHOS['09'] },\r\n '36': { grupo: '09', bicho: BICHOS['09'] },\r\n '37': { grupo: '10', bicho: BICHOS['10'] },\r\n '38': { grupo: '10', bicho: BICHOS['10'] },\r\n '39': { grupo: '10', bicho: BICHOS['10'] },\r\n '40': { grupo: '10', bicho: BICHOS['10'] },\r\n '41': { grupo: '11', bicho: BICHOS['11'] },\r\n '42': { grupo: '11', bicho: BICHOS['11'] },\r\n '43': { grupo: '11', bicho: BICHOS['11'] },\r\n '44': { grupo: '11', bicho: BICHOS['11'] },\r\n '45': { grupo: '12', bicho: BICHOS['12'] },\r\n '46': { grupo: '12', bicho: BICHOS['12'] },\r\n '47': { grupo: '12', bicho: BICHOS['12'] },\r\n '48': { grupo: '12', bicho: BICHOS['12'] },\r\n '49': { grupo: '13', bicho: BICHOS['13'] },\r\n '50': { grupo: '13', bicho: BICHOS['13'] },\r\n '51': { grupo: '13', bicho: BICHOS['13'] },\r\n '52': { grupo: '13', bicho: BICHOS['13'] },\r\n '53': { grupo: '14', bicho: BICHOS['14'] },\r\n '54': { grupo: '14', bicho: BICHOS['14'] },\r\n '55': { grupo: '14', bicho: BICHOS['14'] },\r\n '56': { grupo: '14', bicho: BICHOS['14'] },\r\n '57': { grupo: '15', bicho: BICHOS['15'] },\r\n '58': { grupo: '15', bicho: BICHOS['15'] },\r\n '59': { grupo: '15', bicho: BICHOS['15'] },\r\n '60': { grupo: '15', bicho: BICHOS['15'] },\r\n '61': { grupo: '16', bicho: BICHOS['16'] },\r\n '62': { grupo: '16', bicho: BICHOS['16'] },\r\n '63': { grupo: '16', bicho: BICHOS['16'] },\r\n '64': { grupo: '16', bicho: BICHOS['16'] },\r\n '65': { grupo: '17', bicho: BICHOS['17'] },\r\n '66': { grupo: '17', bicho: BICHOS['17'] },\r\n '67': { grupo: '17', bicho: BICHOS['17'] },\r\n '68': { grupo: '17', bicho: BICHOS['17'] },\r\n '69': { grupo: '18', bicho: BICHOS['18'] },\r\n '70': { grupo: '18', bicho: BICHOS['18'] },\r\n '71': { grupo: '18', bicho: BICHOS['18'] },\r\n '72': { grupo: '18', bicho: BICHOS['18'] },\r\n '73': { grupo: '19', bicho: BICHOS['19'] },\r\n '74': { grupo: '19', bicho: BICHOS['19'] },\r\n '75': { grupo: '19', bicho: BICHOS['19'] },\r\n '76': { grupo: '19', bicho: BICHOS['19'] },\r\n '77': { grupo: '20', bicho: BICHOS['20'] },\r\n '78': { grupo: '20', bicho: BICHOS['20'] },\r\n '79': { grupo: '20', bicho: BICHOS['20'] },\r\n '80': { grupo: '20', bicho: BICHOS['20'] },\r\n '81': { grupo: '21', bicho: BICHOS['21'] },\r\n '82': { grupo: '21', bicho: BICHOS['21'] },\r\n '83': { grupo: '21', bicho: BICHOS['21'] },\r\n '84': { grupo: '21', bicho: BICHOS['21'] },\r\n '85': { grupo: '22', bicho: BICHOS['22'] },\r\n '86': { grupo: '22', bicho: BICHOS['22'] },\r\n '87': { grupo: '22', bicho: BICHOS['22'] },\r\n '88': { grupo: '22', bicho: BICHOS['22'] },\r\n '89': { grupo: '23', bicho: BICHOS['23'] },\r\n '90': { grupo: '23', bicho: BICHOS['23'] },\r\n '91': { grupo: '23', bicho: BICHOS['23'] },\r\n '92': { grupo: '23', bicho: BICHOS['23'] },\r\n '93': { grupo: '24', bicho: BICHOS['24'] },\r\n '94': { grupo: '24', bicho: BICHOS['24'] },\r\n '95': { grupo: '24', bicho: BICHOS['24'] },\r\n '96': { grupo: '24', bicho: BICHOS['24'] },\r\n '97': { grupo: '25', bicho: BICHOS['25'] },\r\n '98': { grupo: '25', bicho: BICHOS['25'] },\r\n '99': { grupo: '25', bicho: BICHOS['25'] },\r\n '00': { grupo: '25', bicho: BICHOS['25'] }\r\n} as const;\r\n\r\n","export const MESSAGES = {\r\n required: \"Obrigatório.\",\r\n list_length_zero: \"Selecione pelo menos um item.\",\r\n incorrect_login: \"Usuário e/ou senha incorretos!\",\r\n incorrect_password: \"Senha incorreta.\",\r\n email_already_in_use: \"Este login já está sendo usado!\",\r\n invalid_device: \"Este login já está sendo usado em outro dispositivo!\",\r\n} as const;\r\n","export const ROLES = {\r\n \"super_admin\": {\r\n \"id\": \"super_admin\",\r\n \"label\": \"Super Administrador\",\r\n },\r\n \"associacao\": {\r\n \"id\": \"associacao\",\r\n \"label\": \"Associação\",\r\n },\r\n \"admin\": { // Banca\r\n \"id\": \"admin\",\r\n \"label\": \"Administrador\",\r\n },\r\n \"sub_admin\": { // Banca sub-admin\r\n \"id\": \"sub_admin\",\r\n \"label\": \"Sub-administrador\",\r\n },\r\n \"digitador_adm\": { // pertence à banca\r\n \"id\": \"digitador_adm\",\r\n \"label\": \"Digitador Administrador\",\r\n },\r\n \"digitador\": { // pertence à banca\r\n \"id\": \"digitador\",\r\n \"label\": \"Digitador\",\r\n },\r\n \"cambista_talao\": { // pertence à banca // que usa talão\r\n \"id\": \"cambista_talao\",\r\n \"label\": \"Cambista de talão\",\r\n },\r\n \"cambista\": { // pertence à banca // que usa maquininha\r\n \"id\": \"cambista\",\r\n \"label\": \"Cambista\",\r\n },\r\n} as const","export const STATUS_PULE = {\r\n PROCESSANDO: {\r\n id: \"PROCESSANDO\",\r\n label: \"PROCESSANDO\",\r\n color: \"green\",\r\n showSite: false,\r\n ordem: 0,\r\n },\r\n JOGADA: {\r\n id: \"JOGADA\",\r\n label: \"PULES JOGADAS\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n AGUARDANDO_CANCELAMENTO: {\r\n id: \"AGUARDANDO_CANCELAMENTO\",\r\n label: \"AGUARDANDO CANCELAMENTO\",\r\n color: \"yellow\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n CANCELADA: {\r\n id: \"CANCELADA\",\r\n label: \"CANCELADAS\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;\r\n","export const TIPO_VISUALIZACAO = {\r\n \"notificacao\": {\r\n id: \"notificacao\",\r\n label: \"Notificação\"\r\n },\r\n \"impressao\": {\r\n id: \"impressao\",\r\n label: \"Impressão\"\r\n },\r\n} as const","export const VISUALIZACAO = {\r\n \"agora\": {\r\n id: \"agora\",\r\n label: \"Agora\"\r\n },\r\n \"jogo_hoje\": {\r\n id: \"jogo_hoje\",\r\n label: \"Jogo Hoje\"\r\n },\r\n \"jogo_pre_datado\": {\r\n id: \"jogo_pre_datado\",\r\n label: \"Jogo Pré-Datado\"\r\n },\r\n \"resultado\": {\r\n id: \"resultado\",\r\n label: \"Resultado\"\r\n }\r\n} as const","export const PREFIX_NUMBER = \"vp_\" as const;","export const PREFIX_ENVIO_OLD = \"envio_old_\" as const;","export const PREFIX_ENVIO = \"envio_\" as const;","export const STATUS_DESCARGA = {\r\n \"ENVIANDO\": {\r\n id: \"ENVIANDO\",\r\n labelBanca: \"ENVIANDO\",\r\n labelAssociacao: \"RECEBENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"DEVOLVENDO\": {\r\n id: \"DEVOLVENDO\",\r\n labelBanca: \"RECEBENDO\",\r\n labelAssociacao: \"DEVOLVENDO\",\r\n color: \"blue\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 1\r\n },\r\n \"ENVIADA\": {\r\n id: \"ENVIADA\",\r\n labelBanca: \"ENVIADA\",\r\n labelAssociacao: \"RECEBIDA\",\r\n color: \"green\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 2\r\n },\r\n \"DEVOLVIDA\": {\r\n id: \"DEVOLVIDA\",\r\n labelBanca: \"DEVOLVIDA\",\r\n labelAssociacao: \"DEVOLVIDA\",\r\n color: \"orange\",\r\n showSiteBanca: true,\r\n showSiteAssociacao: true,\r\n order: 3\r\n },\r\n \"ERRO\": {\r\n id: \"ERRO\",\r\n labelBanca: \"ERRO\",\r\n labelAssociacao: \"ERRO\",\r\n color: \"red\",\r\n showSiteBanca: false,\r\n showSiteAssociacao: false,\r\n order: 4\r\n }\r\n} as const","export const KEYBOARD = {\r\n\r\n Enter: { label: \"Enter\", value: \"enter\" },\r\n Ctrl: { label: \"Ctrl\", value: \"ctrl\" },\r\n Tab: { label: \"Tab\", value: \"tab\" },\r\n Space: { label: \"\\u23b5\", value: \"space\" },\r\n Backspace: { label: \"Backspace\", value: \"backspace\" },\r\n Escape: { label: \"Esc\", value: \"escape\" },\r\n Delete: { label: \"Del\", value: \"delete\" },\r\n Backslash: { label: \"\\\\\", value: \"backslash\" },\r\n Semicolon: { label: \";\", value: \"semicolon\" },\r\n CapsLock: { label: \"CapsLock\", value: \"capslock\" },\r\n Quote: { label: \"'\", value: \"quote\" },\r\n Comma: { label: \",\", value: \"decimal,comma\" },\r\n\r\n Insert: { label: \"Insert\", value: \"insert\" },\r\n Home: { label: \"Home\", value: \"home\" },\r\n End: { label: \"End\", value: \"end\" },\r\n PageUp: { label: \"Page Up\", value: \"pageup\" },\r\n PageDown: { label: \"Page Down\", value: \"pagedown\" },\r\n\r\n ArrowUp: { label: \"↑\", value: \"arrowup\" },\r\n ArrowDown: { label: \"↓\", value: \"arrowdown\" },\r\n ArrowLeft: { label: \"←\", value: \"arrowleft\" },\r\n ArrowRight: { label: \"→\", value: \"arrowright\" },\r\n\r\n \r\n NumLock: { label: \"Num Lock\", value: \"numlock\" },\r\n /**\r\n * @description The decimal point key (typically . or\r\n * , depending on the region).\r\n * In newer browsers, this value to be the character generated by the\r\n * decimal key (one of those two characters). [1]\r\n */\r\n Dot: { label: \".\", value: \"period,comma\" },\r\n\r\n /** The numeric keypad's multiplication key, /. */\r\n Divide: { label: \"/\", value: \"slash,divide\" },\r\n\r\n /** @description The numeric keypad's addition key, -. */\r\n Subtract: { label: \"-\", value: \"minus,subtract\" },\r\n\r\n /** The numeric keypad's multiplication key, *. */\r\n Multiply: { label: '*', value: 'multiply,shift+8' },\r\n\r\n /** The numeric keypad's addition key, +. */\r\n Add: { label: \"+\", value: \"add,shift+equal\" },\r\n\r\n Equal: { id: \"Equal\", label: \"=\", value: \"equal\" },\r\n\r\n // -------\r\n // FNs\r\n\r\n F1: { label: \"F1\", value: \"f1\" },\r\n F2: { label: \"F2\", value: \"f2\" },\r\n F3: { label: \"F3\", value: \"f3\" },\r\n F4: { label: \"F4\", value: \"f4\" },\r\n F5: { label: \"F5\", value: \"f5\" },\r\n F6: { label: \"F6\", value: \"f6\" },\r\n F7: { label: \"F7\", value: \"f7\" },\r\n F8: { label: \"F8\", value: \"f8\" },\r\n F9: { label: \"F9\", value: \"f9\" },\r\n F10: { label: \"F10\", value: \"f10\" },\r\n F11: { label: \"F11\", value: \"f11\" },\r\n F12: { label: \"F12\", value: \"f12\" },\r\n\r\n // -------\r\n // numbers\r\n\r\n 0: { label: \"0\", value: \"0\" },\r\n 1: { label: \"1\", value: \"1\" },\r\n 2: { label: \"2\", value: \"2\" },\r\n 3: { label: \"3\", value: \"3\" },\r\n 4: { label: \"4\", value: \"4\" },\r\n 5: { label: \"5\", value: \"5\" },\r\n 6: { label: \"6\", value: \"6\" },\r\n 7: { label: \"7\", value: \"7\" },\r\n 8: { label: \"8\", value: \"8\" },\r\n 9: { label: \"9\", value: \"9\" },\r\n\r\n // -------\r\n // letters\r\n\r\n A: { label: \"A\", value: \"a\" },\r\n B: { label: \"B\", value: \"b\" },\r\n C: { label: \"C\", value: \"c\" },\r\n D: { label: \"D\", value: \"d\" },\r\n E: { label: \"E\", value: \"e\" },\r\n F: { label: \"F\", value: \"f\" },\r\n G: { label: \"G\", value: \"g\" },\r\n H: { label: \"H\", value: \"h\" },\r\n I: { label: \"I\", value: \"i\" },\r\n J: { label: \"J\", value: \"j\" },\r\n K: { label: \"K\", value: \"k\" },\r\n L: { label: \"L\", value: \"l\" },\r\n M: { label: \"M\", value: \"m\" },\r\n N: { label: \"N\", value: \"n\" },\r\n O: { label: \"O\", value: \"o\" },\r\n P: { label: \"P\", value: \"p\" },\r\n Q: { label: \"Q\", value: \"q\" },\r\n R: { label: \"R\", value: \"r\" },\r\n S: { label: \"S\", value: \"s\" },\r\n T: { label: \"T\", value: \"t\" },\r\n U: { label: \"U\", value: \"u\" },\r\n V: { label: \"V\", value: \"v\" },\r\n W: { label: \"W\", value: \"w\" },\r\n X: { label: \"X\", value: \"x\" },\r\n Y: { label: \"Y\", value: \"y\" },\r\n Z: { label: \"Z\", value: \"z\" },\r\n\r\n} as const;\r\n","export const STATUS_DEVICE = {\r\n \"EM_ESPERA\": {\r\n \"id\": \"EM_ESPERA\",\r\n \"label\": \"Esperando aprovação\",\r\n \"color\": \"orange\"\r\n },\r\n \"APROVADO\": {\r\n \"id\": \"APROVADO\",\r\n \"label\": \"Aprovado\",\r\n \"color\": \"green\"\r\n },\r\n \"BLOQUEADO\": {\r\n \"id\": \"BLOQUEADO\",\r\n \"label\": \"Bloqueado\",\r\n \"color\": \"red\"\r\n }\r\n} as const","export const PREMIOS = {\r\n \"1\": {\r\n id: \"1\",\r\n order: 1,\r\n label: \"1º Prêmio\",\r\n labelShort: \"1º\",\r\n },\r\n \"2\": {\r\n id: \"2\",\r\n order: 2,\r\n label: \"2º Prêmio\",\r\n labelShort: \"2º\",\r\n },\r\n \"3\": {\r\n id: \"3\",\r\n order: 3,\r\n label: \"3º Prêmio\",\r\n labelShort: \"3º\",\r\n },\r\n \"4\": {\r\n id: \"4\",\r\n order: 4,\r\n label: \"4º Prêmio\",\r\n labelShort: \"4º\",\r\n },\r\n \"5\": {\r\n id: \"5\",\r\n order: 5,\r\n label: \"5º Prêmio\",\r\n labelShort: \"5º\",\r\n },\r\n \"1-5\": {\r\n id: \"1-5\",\r\n order: 6,\r\n label: \"1º ao 5º Prêmio\",\r\n labelShort: \"1º ao 5º\",\r\n }\r\n} as const","import { GAMES } from \"./GAMES\";\r\n\r\nexport const COMISSOES_PADRAO = {\r\n [GAMES.milhar.id]: {\r\n id: GAMES.milhar.id,\r\n label: GAMES.milhar.label,\r\n order: 1,\r\n },\r\n [GAMES.centena.id]: {\r\n id: GAMES.centena.id,\r\n label: GAMES.centena.label,\r\n order: 2,\r\n },\r\n [GAMES.dezena.id]: {\r\n id: GAMES.dezena.id,\r\n label: GAMES.dezena.label,\r\n order: 3,\r\n },\r\n [GAMES.grupo.id]: {\r\n id: GAMES.grupo.id,\r\n label: GAMES.grupo.label,\r\n order: 4,\r\n },\r\n [GAMES[\"terno.dezena\"].id]: {\r\n id: GAMES[\"terno.dezena\"].id,\r\n label: GAMES[\"terno.dezena\"].label,\r\n order: 5,\r\n },\r\n [GAMES[\"terno.grupo\"].id]: {\r\n id: GAMES[\"terno.grupo\"].id,\r\n label: GAMES[\"terno.grupo\"].label,\r\n order: 6,\r\n },\r\n [GAMES[\"duque.dezena\"].id]: {\r\n id: GAMES[\"duque.dezena\"].id,\r\n label: GAMES[\"duque.dezena\"].label,\r\n order: 7,\r\n },\r\n [GAMES[\"duque.grupo\"].id]: {\r\n id: GAMES[\"duque.grupo\"].id,\r\n label: GAMES[\"duque.grupo\"].label,\r\n order: 8,\r\n },\r\n restante: {\r\n id: \"restante\",\r\n label: \"Restante\",\r\n order: 9,\r\n },\r\n} as const;\r\n","export const STATUS_GUIA = {\r\n \"vendas\": {\r\n id: \"vendas\",\r\n label: \"Vendas\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 1,\r\n },\r\n \"premios\": {\r\n id: \"premios\",\r\n label: \"Prêmios\",\r\n color: \"red\",\r\n showSite: true,\r\n ordem: 2,\r\n },\r\n \"revisando\":{\r\n id: \"revisando\",\r\n label: \"Revisando\",\r\n color: \"blue\",\r\n showSite: true,\r\n ordem: 3,\r\n },\r\n \"concluida\": {\r\n id: \"concluida\",\r\n label: \"Concluída\",\r\n color: \"green\",\r\n showSite: true,\r\n ordem: 4,\r\n },\r\n} as const;","import { TypeMetaData } from \"../../types\";\r\nimport { ROLES } from \"../../constants\";\r\n\r\n/**\r\n * @description\r\n * Gera um objeto `createdBy` com informações de criação, usando dados fornecidos ou,\r\n * caso estejam ausentes, valores padrão definidos pelo sistema.\r\n * \r\n * Essa função é útil para garantir que todos os campos de autoria estejam preenchidos\r\n * corretamente mesmo quando não houver um usuário autenticado no contexto.\r\n * \r\n * Campos padrão utilizados:\r\n * - `id`: \"system\"\r\n * - `role`: \"super_admin\"\r\n * - `name`: \"Gerado automaticamente pelo sistema\"\r\n * - `login`: \"system\"\r\n */\r\nexport const getCreatedBySystem = (\r\n obj?: Partial<TypeMetaData[\"createdBy\"]>\r\n): TypeMetaData[\"createdBy\"] => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n role: obj?.role || ROLES.super_admin.id,\r\n name: obj?.name || \"Gerado automaticamente pelo sistema\",\r\n login: obj?.login || \"\",\r\n});\r\n","export { clone } from \"./clone\";\r\nexport { combineDateTime } from \"./combineDateTime\";\r\nexport { dateToNumber } from \"./dateToNumber\";\r\nexport { numberToDate } from \"./numberToDate\";\r\nexport { getDataInicioFim } from \"./getDataInicioFim\";\r\nexport { formatterBRL, parserBRL } from \"./formatBRL\";\r\nexport { getAllCombinations } from \"./getAllCombinations\";\r\nexport { showFormatDate } from \"./showFormatDate\";\r\nexport { numbersSelectedFormated } from \"./numbersSelectedFormated\";\r\nexport { generateId } from \"./generateId\";\r\nexport { getCodigoAuth } from \"./getCodigoAuth\";\r\nexport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\nexport { dividirArray } from \"./dividirArray\";\r\nexport { delay } from \"./delay\";\r\nexport { matchNormalized } from \"./matchNormalized\";\r\nexport { normalize } from \"./normalize\";\r\nexport { getInitials } from \"./getInitials\";\r\nexport { formatterPercentage } from \"./formatterPercentage\";\r\nexport { parserPercentage } from \"./parserPercentage\";\r\nexport { formatterPercentageDecimal, parserPercentageDecimal } from \"./formatterPercentageDecimal\";\r\nexport { removerLetters } from \"./removerLetters\";","import cloneDeep from 'clone-deep'\r\n\r\n/**\r\n*\t@description Função que clona um objeto, array ou data\r\n*\t@param {T} item - item a ser clonado\r\n*\t@returns {T} item clonado\r\n*\t@example\r\n*\tclone([1, 3, 4]) // [1, 3, 4]\r\n*/\r\nexport const clone = <T>(item: T): T =>\r\n\tcloneDeep(item)\r\n","import { isValid } from \"date-fns\";\r\n\r\n/**\r\n * Converte um objeto `Date` para um número no formato `yyyyMMddHHmmss`.\r\n * Se a data for inválida ou não informada, retorna 0.\r\n *\r\n * @param {Date} [date] - Objeto `Date` a ser convertido.\r\n * @returns {number} Representação numérica da data no formato `yyyyMMddHHmmss`.\r\n */\r\nexport const dateToNumber = (date?: Date): number => {\r\n if (!date || !isValid(date)) return 0;\r\n\r\n const year = date.getFullYear();\r\n const month = String(date.getMonth() + 1).padStart(2, '0');\r\n const day = String(date.getDate()).padStart(2, '0');\r\n const hour = String(date.getHours()).padStart(2, '0');\r\n const minute = String(date.getMinutes()).padStart(2, '0');\r\n const second = String(date.getSeconds()).padStart(2, '0');\r\n\r\n return Number(`${year}${month}${day}${hour}${minute}${second}`);\r\n};\r\n","import { parse, isValid } from \"date-fns\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * Converte um número no formato `yyyyMMddHHmmss` para um objeto `Date`.\r\n * Se o número for inválido ou não informado, retorna a data atual.\r\n *\r\n * @param {number} [number] - Número representando a data no formato `yyyyMMddHHmmss`.\r\n * @returns {Date} Objeto `Date` correspondente ao número informado.\r\n */\r\nexport const numberToDate = (number?: number): Date | undefined => {\r\n if (!number) return undefined;\r\n\r\n const str = number.toString();\r\n\r\n const year = str.slice(0, 4);\r\n const month = str.slice(4, 6);\r\n const day = str.slice(6, 8);\r\n const hour = str.slice(8, 10);\r\n const minute = str.slice(10, 12);\r\n const second = str.slice(12, 14);\r\n\r\n const dateString = `${year}-${month}-${day} ${hour}:${minute}:${second}`;\r\n\r\n const dateNow = pegarHorarioSaoPaulo();\r\n\r\n const date = parse(dateString, \"yyyy-MM-dd HH:mm:ss\", dateNow);\r\n\r\n return isValid(date) ? date : undefined;\r\n};\r\n","import moment from \"moment-timezone\";\r\n\r\nexport const pegarHorarioSaoPaulo = (): Date => {\r\n \r\n const string = moment\r\n .tz(new Date(), \"America/Sao_Paulo\")\r\n .format(\"DD_MM_YYYY_HH_mm_ss_SSS\");\r\n\r\n const [day, month, year, hour, minutes, seconds, milliseconds] =\r\n string.split(\"_\");\r\n\r\n return new Date(\r\n Number(year),\r\n Number(month) - 1,\r\n Number(day),\r\n Number(hour),\r\n Number(minutes),\r\n Number(seconds),\r\n Number(milliseconds)\r\n );\r\n};\r\n","import { dateToNumber } from \"./dateToNumber\";\r\nimport { numberToDate } from \"./numberToDate\";\r\n\r\n/**\r\n * @deprecated Esta função está depreciada. Use getBetDateToNumber ao invés desta.\r\n * \r\n * Combina a data (ano, mês, dia) de um timestamp (`dateA`)\r\n * com o horário (hora, minuto, segundo) de outro timestamp (`dateB`).\r\n * Ambos os timestamps devem estar no formato `yyyyMMddHHmmss`.\r\n *\r\n * @param {number} dateA - Número no formato `yyyyMMddHHmmss` contendo a data base (ano, mês e dia).\r\n * @param {number} dateB - Número no formato `yyyyMMddHHmmss` contendo o horário base (hora, minuto e segundo).\r\n * @returns {number} Um novo número no formato `yyyyMMddHHmmss` combinando a data de `dateA` com a hora de `dateB`.\r\n *\r\n * @example\r\n * // Combina 2023-12-25 com 14:30:00\r\n * const result = combineDateTime(20231225000000, 20230101143000);\r\n * 20231225143000\r\n */\r\nexport const combineDateTime = (dateA: number, dateB: number): number => {\r\n const dateAParts = numberToDate(dateA);\r\n const dateBParts = numberToDate(dateB);\r\n\r\n if (!dateAParts || !dateBParts) return 0;\r\n\r\n const year = dateAParts.getFullYear();\r\n const month = dateAParts.getMonth(); // zero-based\r\n const day = dateAParts.getDate();\r\n\r\n const hours = dateBParts.getHours();\r\n const minutes = dateBParts.getMinutes();\r\n const seconds = dateBParts.getSeconds();\r\n\r\n const combinedDate = new Date(year, month, day, hours, minutes, seconds, 0);\r\n\r\n return dateToNumber(combinedDate);\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { numberToDate } from \"./numberToDate\";\r\nimport { dateToNumber } from \"./dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"./pegarHorarioSaoPaulo\";\r\n\r\n/**\r\n * A partir de uma data no formato numérico (`yyyyMMddHHmmss`),\r\n * retorna o início e fim do dia dessa data no mesmo formato numérico.\r\n *\r\n * @param {Object} params - Parâmetro contendo a data.\r\n * @param {number} params.dataAposta - Data no formato `yyyyMMddHHmmss`.\r\n * @returns {{ dataInicio: number, dataFim: number }} Datas de início (00:00:00) e fim (23:59:59) do dia.\r\n */\r\nexport const getDataInicioFim = ({ dataAposta }: { dataAposta: number }) => {\r\n const dataInicio = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 0), 0),\r\n 0\r\n );\r\n\r\n const dataFim = setSeconds(\r\n setMinutes(setHours(numberToDate(dataAposta) || pegarHorarioSaoPaulo(), 23), 59),\r\n 59\r\n );\r\n\r\n return {\r\n dataInicio: dateToNumber(dataInicio),\r\n dataFim: dateToNumber(dataFim),\r\n };\r\n};\r\n","export const formatterBRL = (value: number) => {\r\n\r\n\tconst cloneValue = value\r\n\r\n\tconst valueS = new Intl.NumberFormat('pt-BR', {\r\n\t\tstyle: 'currency',\r\n\t\tcurrency: 'BRL',\r\n\t}).format(cloneValue || 0)\r\n\treturn valueS\r\n}\r\n\r\nexport const parserBRL = (value: string) => {\r\n\r\n\tlet cloneValue = value\r\n\r\n\tcloneValue = cloneValue.replace(/\\D/g, '')\r\n\tlet valueN = parseFloat(cloneValue || '0')\r\n\tvalueN /= 100\r\n\treturn valueN\r\n}\r\n","/**\r\n * Função para gerar todas as permutações de um array, sem duplicações.\r\n * @param arr - O array de números ou caracteres.\r\n * @returns Um array com todas as permutações possíveis, sem duplicações.\r\n */\r\nconst generatePermutations = (arr: string[]): string[][] => {\r\n // Verifica se o array está vazio: se sim, retorna um array contendo um array vazio (caso base da recursão)\r\n if (arr.length === 0) return [[]];\r\n\r\n // Cria um Set para armazenar as permutações e evitar duplicatas\r\n const result: Set<string[]> = new Set();\r\n\r\n // Itera sobre cada elemento do array, usando-o como primeiro elemento da permutação\r\n for (let i = 0; i < arr.length; i++) {\r\n // Pega o elemento atual na posição i\r\n const current = arr[i];\r\n // Cria um novo array com todos os elementos exceto o atual (elementos antes de i + elementos depois de i)\r\n const remaining = [...arr.slice(0, i), ...arr.slice(i + 1)];\r\n // Chama recursivamente a função para gerar todas as permutações dos elementos restantes\r\n const remainingPermutations = generatePermutations(remaining);\r\n\r\n // Itera sobre cada permutação gerada recursivamente\r\n for (const perm of remainingPermutations) {\r\n // Adiciona o elemento atual no início de cada permutação e adiciona ao Set de resultados\r\n result.add([current, ...perm]);\r\n }\r\n }\r\n\r\n // Converte o Set de arrays de strings de volta para um array comum e retorna\r\n return Array.from(result);\r\n};\r\n\r\n/**\r\n * Função para pegar um número e gerar todas as suas combinações únicas.\r\n * @param num - O número como string ou número.\r\n * @returns Um array de strings com todas as combinações possíveis, sem duplicações.\r\n */\r\nexport const getAllCombinations = (num: string): string[] => {\r\n // Converte o número para string e depois divide em um array de caracteres individuais\r\n const numArr = num.split(\"\");\r\n\r\n // Gera todas as permutações possíveis do array de caracteres\r\n const permutations = generatePermutations(numArr);\r\n\r\n // Usar um Set para garantir combinações únicas\r\n // Mapeia cada permutação (array de strings) para uma string única e cria um Set para eliminar duplicatas\r\n const uniqueCombinations = new Set(permutations.map((perm) => perm.join(\"\")));\r\n\r\n // Converte o Set de strings de volta para um array comum e retorna\r\n return Array.from(uniqueCombinations);\r\n};\r\n\r\n/**\r\n * EXEMPLO DE USO COM O NÚMERO 1234:\r\n * \r\n * getAllCombinations(1234) ou getAllCombinations(\"1234\")\r\n * \r\n * PASSO A PASSO:\r\n * \r\n * 1. numArr = \"1234\".split(\"\") → [\"1\", \"2\", \"3\", \"4\"]\r\n * - Converte o número para string e divide em um array de dígitos\r\n * \r\n * 2. permutations = generatePermutations([\"1\", \"2\", \"3\", \"4\"])\r\n * - Gera todas as permutações possíveis dos 4 dígitos\r\n * - Resultado: [\r\n * [\"1\", \"2\", \"3\", \"4\"], [\"1\", \"2\", \"4\", \"3\"],\r\n * [\"1\", \"3\", \"2\", \"4\"], [\"1\", \"3\", \"4\", \"2\"],\r\n * [\"1\", \"4\", \"2\", \"3\"], [\"1\", \"4\", \"3\", \"2\"],\r\n * [\"2\", \"1\", \"3\", \"4\"], [\"2\", \"1\", \"4\", \"3\"],\r\n * [\"2\", \"3\", \"1\", \"4\"], [\"2\", \"3\", \"4\", \"1\"],\r\n * [\"2\", \"4\", \"1\", \"3\"], [\"2\", \"4\", \"3\", \"1\"],\r\n * [\"3\", \"1\", \"2\", \"4\"], [\"3\", \"1\", \"4\", \"2\"],\r\n * [\"3\", \"2\", \"1\", \"4\"], [\"3\", \"2\", \"4\", \"1\"],\r\n * [\"3\", \"4\", \"1\", \"2\"], [\"3\", \"4\", \"2\", \"1\"],\r\n * [\"4\", \"1\", \"2\", \"3\"], [\"4\", \"1\", \"3\", \"2\"],\r\n * [\"4\", \"2\", \"1\", \"3\"], [\"4\", \"2\", \"3\", \"1\"],\r\n * [\"4\", \"3\", \"1\", \"2\"], [\"4\", \"3\", \"2\", \"1\"]\r\n * ]\r\n * - Total: 24 permutações (4! = 4 × 3 × 2 × 1 = 24)\r\n * \r\n * 3. uniqueCombinations = new Set([\"1234\", \"1243\", \"1324\", \"1342\", ...])\r\n * - Converte cada permutação (array) em uma string usando join(\"\")\r\n * - Usa Set para garantir que não há duplicatas (neste caso não haveria, mas é uma precaução)\r\n * - Resultado: Set com 24 strings únicas\r\n * \r\n * 4. return Array.from(uniqueCombinations)\r\n * - Converte o Set de volta para array\r\n * - Retorna: [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\"]\r\n * \r\n * RESULTADO FINAL: Array com todas as 24 combinações únicas possíveis dos dígitos 1, 2, 3 e 4\r\n */\r\n","import { numberToDate } from \"./numberToDate\";\r\nimport { format } from \"date-fns\";\r\n\r\nexport const showFormatDate = (number: number, formatString?: string) => {\r\n if (!number) return \"N/A\";\r\n\r\n const date = numberToDate(number);\r\n\r\n if (!date) return \"N/A\";\r\n\r\n return format(date, formatString || \"dd/MM/yyyy\");\r\n};\r\n","export const numbersSelectedFormated = (numbersString: number[]): string => {\r\n const numbers = numbersString.map(Number);\r\n if (numbers.length === 0) return \"\";\r\n // Ordena os números para garantir que estejam em ordem crescente\r\n numbers.sort((a, b) => a - b);\r\n let result = \"\";\r\n let start = numbers[0]; // Início do intervalo\r\n let end = start; // Fim do intervalo\r\n for (let i = 1; i <= numbers.length; i++) {\r\n if (i < numbers.length && numbers[i] === end + 1) {\r\n // Se o próximo número for consecutivo, expande o intervalo\r\n end = numbers[i];\r\n } else {\r\n // Se o próximo número não for consecutivo, finaliza o intervalo\r\n if (start === end) {\r\n // Se o intervalo tem um único número\r\n result += start;\r\n } else {\r\n // Se o intervalo tem mais de um número\r\n result += `${start} ao ${end}`;\r\n }\r\n if (i < numbers.length) {\r\n // Adiciona uma vírgula se não for o último intervalo\r\n result += \", \";\r\n // Inicia um novo intervalo\r\n start = numbers[i];\r\n end = start;\r\n }\r\n }\r\n }\r\n return result;\r\n };","/**\r\n * Generate a unique id\r\n * @returns {string} - A unique id\r\n * @example\r\n * generateUniqueId('user')\r\n * => user-19a2c5db-23eb-9b2b-c764-695249595f59\r\n * @example\r\n * generateUniqueId()\r\n * => 19a2c5db-23eb-9b2b-c764-695249595f59\r\n **/\r\n\r\nexport const generateId = (prefix?: string) => {\r\n\tconst s4 = () => Math.floor((1 + Math.random()) * 0x10000)\r\n\t\t.toString(16)\r\n\t\t.substring(1)\r\n\treturn `${prefix ? `${prefix}-` : ''}${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`\r\n}","/**\r\n * @description Gera um código de autenticação aleatório entre os valores mínimo e máximo fornecidos.\r\n * @example getCodigoAuth(100000, 999999) -> 435231\r\n*/\r\nexport const getCodigoAuth = (min: number, max: number) => {\r\n min = Math.ceil(min);\r\n max = Math.floor(max);\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n};\r\n","export const dividirArray = <T>(arrayGrande: T[], tamanho = 1000): T[][] => {\r\n const resultado: T[][] = [];\r\n\r\n // Percorre o array grande e divide em subarrays de tamanho especificado\r\n for (let i = 0; i < arrayGrande.length; i += tamanho) {\r\n const subarray = arrayGrande.slice(i, i + tamanho); // Cria um subarray de 500 elementos\r\n resultado.push(subarray); // Adiciona o subarray ao array de resultado\r\n }\r\n\r\n return resultado;\r\n};\r\n","/**\r\n * @description Retorna uma Promise que resolve após um determinado tempo (em milissegundos).\r\n *\r\n * Útil para simular atrasos ou criar efeitos assíncronos como \"sleep\".\r\n *\r\n * @param {number} ms - A quantidade de milissegundos para esperar.\r\n * @returns {Promise<void>} Uma Promise que resolve após o tempo especificado.\r\n *\r\n * @example\r\n * await delay(1000); // espera 1 segundo\r\n */\r\nexport const delay = (ms: number): Promise<void> => {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n};\r\n","/**\r\n * @description Normaliza uma string para facilitar comparações e buscas textuais.\r\n * A normalização remove:\r\n * - Espaços extras nas extremidades\r\n * - Diferenças entre maiúsculas e minúsculas\r\n * - Acentos e caracteres diacríticos (como ç, á, é, ñ etc.)\r\n *\r\n * @param {string} str - A string que será normalizada.\r\n * @returns {string} A string normalizada, em minúsculas e sem acentos.\r\n *\r\n * @example\r\n * normalize('Árvore') // 'arvore'\r\n * normalize(' Café ') // 'cafe'\r\n * normalize('JoÃO') // 'joao'\r\n */\r\nexport const normalize = (str: string): string =>\r\n str\r\n .trim()\r\n .toLowerCase()\r\n .normalize(\"NFD\")\r\n .replace(/[\\u0300-\\u036f]/g, \"\");\r\n","import { normalize } from \"./normalize\";\r\n\r\n/**\r\n * @description Verifica se o texto contém a palavra de busca,\r\n * desconsiderando acentuação, letras maiúsculas/minúsculas e caracteres especiais.\r\n *\r\n * @param {string} text - O texto base no qual a busca será realizada.\r\n * @param {string} search - A string de busca a ser procurada dentro do texto.\r\n * @returns {boolean} Retorna `true` se a string de busca for encontrada dentro do texto normalizado, senão `false`.\r\n *\r\n * @example\r\n * matchNormalized('Retropolis', 'retro'); // true\r\n * matchNormalized('Café com Leite', 'cafe'); // true\r\n * matchNormalized('Firewall', 'blinding'); // false\r\n */\r\nexport const matchNormalized = (text: string, search: string): boolean => {\r\n return normalize(text).includes(normalize(search));\r\n};\r\n","/**\r\n * Retorna as iniciais de um nome completo.\r\n * \r\n * A função extrai as primeiras letras maiúsculas dos dois primeiros nomes\r\n * válidos (com ao menos 2 caracteres) de uma string representando o nome completo.\r\n *\r\n * @param nomeCompleto - Uma string contendo o nome completo.\r\n * @returns As iniciais maiúsculas dos dois primeiros nomes válidos, ou uma string vazia se não houver nomes válidos.\r\n *\r\n * @example\r\n * getInitials(\"Maria Joaquina Silva\") // retorna \"MJ\"\r\n * getInitials(\"Jo\") // retorna \"J\"\r\n * getInitials(\"A B\") // retorna \"\" (nomes com menos de 2 letras são ignorados)\r\n */\r\nexport const getInitials = (nomeCompleto: string): string => {\r\n if (!nomeCompleto) return '';\r\n\r\n const nomesValidos = nomeCompleto\r\n .trim()\r\n .split(/\\s+/)\r\n .filter((nome) => nome.length >= 2);\r\n\r\n const iniciais = nomesValidos\r\n .slice(0, 2)\r\n .map((nome) => nome[0].toUpperCase());\r\n\r\n return iniciais.join('');\r\n};\r\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentage = (value: number): string => {\r\n value;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\nexport const parserPercentage = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2));\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2));\r\n return valueN;\r\n};","/**\n * Analisa e converte strings de porcentagem para números decimais\n * \n * Esta função remove caracteres não numéricos das strings de entrada e converte\n * para números decimais com precisão de 2 casas decimais. Quando um novo valor\n * é fornecido, ela trata casos especiais onde o novo valor é igual ao valor anterior.\n * \n * @param value String contendo a porcentagem (ex: \"25%\", \"25,50\", \"25.50\")\n * @param newValue String opcional contendo o novo valor de porcentagem\n * @returns Número decimal com 2 casas decimais (ex: 25.00, 25.50)\n * \n * @example\n * // Converte string simples para número\n * const result = parserPercentage(\"25%\");\n * // Retorna: 25.00\n * \n * @example\n * // Converte string com vírgula para número\n * const result = parserPercentage(\"25,50\");\n * // Retorna: 25.50\n * \n * @example\n * // Converte string com ponto para número\n * const result = parserPercentage(\"25.50\");\n * // Retorna: 25.50\n * \n * @example\n * // Com novo valor (remove último dígito se for igual ao valor anterior)\n * const result = parserPercentage(\"250\", \"2500\");\n * // Retorna: 250.00\n * \n * @example\n * // Com novo valor diferente\n * const result = parserPercentage(\"25\", \"30\");\n * // Retorna: 30.00\n * \n * @example\n * // String vazia ou inválida\n * const result = parserPercentage(\"\");\n * // Retorna: 0.00\n */\nexport const parserPercentage = (value: string, newValue?: string): number => {\n\tvalue = value.replace(/\\D/g, \"\");\n\tnewValue = newValue?.replace(/\\D/g, \"\");\n\n\tif (newValue) {\n\t\tif (Number(newValue) === Number(value))\n\t\t\tnewValue = newValue.slice(0, -1);\n\n\t\tlet newValueN = Number(Number(newValue || \"0\").toFixed(2));\n\t\treturn newValueN;\n\t}\n\n\tlet valueN = Number(Number(value || \"0\").toFixed(2));\n\treturn valueN;\n};\n","/**\r\n * Formata um número decimal (entre 0 e 1) como porcentagem inteira.\r\n *\r\n * @param {number} value - Um valor decimal (ex: 0.25) que será convertido em porcentagem (25 %).\r\n * @returns {string} A string formatada como porcentagem com base no locale \"pt-BR\".\r\n *\r\n * @example\r\n * formatterPercentage(0.25); // \"25 %\"\r\n * formatterPercentage(1); // \"100 %\"\r\n */\r\nexport const formatterPercentageDecimal = (value: number): string => {\r\n value *= 100;\r\n\r\n const valueS = new Intl.NumberFormat(\"pt-BR\", {\r\n style: \"decimal\",\r\n minimumFractionDigits: 0,\r\n maximumFractionDigits: 0,\r\n }).format(value || 0);\r\n\r\n return `${valueS} %`;\r\n};\r\n\r\n/**\r\n * Converte uma string de porcentagem digitada pelo usuário em um valor decimal (0–1).\r\n * \r\n * - Remove todos os caracteres não numéricos (mantém apenas dígitos).\r\n * - Caso `newValue` seja passado, ele é usado como base para lidar com digitação interativa,\r\n * permitindo apagar o último dígito corretamente.\r\n * - O resultado final sempre será um número decimal entre `0` e `1`.\r\n *\r\n * @param {string} value - String contendo dígitos de porcentagem (ex: \"25\", \"25 %\", \"100%\").\r\n * @param {string} [newValue] - Novo valor bruto digitado (opcional, usado para edição em tempo real).\r\n * @returns {number} Valor decimal correspondente (ex: \"25\" → 0.25, \"100\" → 1).\r\n *\r\n * @example\r\n * parserPercentage(\"25\"); // 0.25\r\n * parserPercentage(\"100%\"); // 1\r\n * parserPercentage(\"25\", \"2\"); // 0.02 (simula digitação interativa)\r\n */\r\nexport const parserPercentageDecimal = (value: string, newValue?: string): number => {\r\n value = value.replace(/\\D/g, \"\");\r\n newValue = newValue?.replace(/\\D/g, \"\");\r\n\r\n if (newValue) {\r\n if (Number(newValue) === Number(value))\r\n newValue = newValue.slice(0, -1);\r\n\r\n let newValueN = Number(Number(newValue || \"0\").toFixed(2)) / 100;\r\n return newValueN;\r\n }\r\n\r\n let valueN = Number(Number(value || \"0\").toFixed(2)) / 100;\r\n return valueN;\r\n};\r\n","/**\r\n * Remove todos os caracteres não numéricos de uma string\r\n * \r\n * Esta função usa uma expressão regular para filtrar qualquer caractere que não seja dígito (0-9),\r\n * mantendo apenas os caracteres numéricos na string.\r\n * \r\n * @param value - A string de entrada que pode conter letras, números e caracteres especiais\r\n * @returns Uma nova string contendo apenas os caracteres numéricos da entrada\r\n * \r\n * @example\r\n * ```typescript\r\n * removerLetters(\"abc123def456\") // retorna \"123456\"\r\n * removerLetters(\"telefone: (11) 99999-9999\") // retorna \"11999999999\"\r\n * removerLetters(\"sem números aqui\") // retorna \"\"\r\n * removerLetters(\"123\") // retorna \"123\"\r\n * ```\r\n */\r\nexport const removerLetters = (value: string): string => {\r\n\treturn value.replace(/[^0-9]/g, \"\");\r\n};","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeExtracao } from \"../types/extracao.type\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const ExtracaoModel = (obj?: Partial<TypeExtracao>): TypeExtracao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n horario: obj?.horario || 0,\r\n bloqueio: obj?.bloqueio || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n ativo: obj?.ativo ?? true,\r\n inativo_no_dia: obj?.inativo_no_dia || [],\r\n somente_nos_feriados: obj?.somente_nos_feriados || [],\r\n description: obj?.description || \"\",\r\n somente_no_feriado: obj?.somente_no_feriado || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n days: {\r\n 0: obj?.days?.[0] ?? false, // domingo\r\n 1: obj?.days?.[1] ?? false,\r\n 2: obj?.days?.[2] ?? false,\r\n 3: obj?.days?.[3] ?? false,\r\n 4: obj?.days?.[4] ?? false,\r\n 5: obj?.days?.[5] ?? false,\r\n 6: obj?.days?.[6] ?? false, // sabado\r\n },\r\n});\r\n","export { formatarNumero } from './formatarNumero';\r\nexport { generateDescargas } from '../descarga/generateDescargas';\r\nexport { gerarDezenas } from './gerarDezenas';\r\nexport { getSomaEnvio } from './getSomaEnvio';\r\nexport { getSomaVP } from './getSomaVP';\r\nexport { getCreatedBySystem } from './getCreatedBySystem';\r\nexport { getNumeroId } from './getNumeroId';\r\nexport { calculaValoresDosNumeros } from './calculaValoresDosNumeros';\r\nexport { getNumerosAcimaDoLimite } from './getNumerosAcimaDoLimite';\r\nexport { arredondarParaCima } from './arrendondarParaCima';\r\nexport { sortNumeros } from './sortNumeros';\r\nexport { getPropsPrefix } from './getPropsPrefix';\r\nexport { getPropsEnvioId } from './getPropsEnvioId';\r\nexport { getPropsEnvioIdOld } from './getPropsEnvioIdOld';\r\nexport { getPropsVP } from './getPropsVP';\r\nexport { getTiposJogos } from './getTiposJogos';\r\nexport { calcularValorDeNumero } from './calcularValorDeNumero';\r\nexport { getPremioFormato } from './getPremioFormato';\r\nexport { getSomaProps } from \"./getSomaProps\"\r\nexport { getLimiteSimulado } from './getLimiteSimulado';\r\nexport { arrendondarCasasDecimais } from './arrendondarCasasDecimais';","// Função que formata automaticamente a partir de um padrão\r\n\r\n/**\r\n * @description Esta função formata o numero para o formato de jogo passado\r\n * \r\n * @example formatarNumero(\"1234\", \"###\") // \"234\"\r\n * @example formatarNumero(\"1234\", \"##-##\") // \"12-34\"\r\n * @example formatarNumero(\"123456\", \"##-##-##\") // \"12-34-56\"\r\n*/\r\nexport const formatarNumero = (numero: string, formato: string) => {\r\n let resultado = '';\r\n let indiceNumero = numero.length - 1; // Começa do final do número\r\n let indiceFormato = formato.length - 1; // Começa do final do formato\r\n\r\n // Percorre o formato de trás para frente e substitui os dígitos conforme o padrão\r\n while (indiceFormato >= 0) {\r\n if (formato[indiceFormato] === '#') {\r\n resultado = numero[indiceNumero] + resultado; // Adiciona dígito do número\r\n indiceNumero--;\r\n } else if (formato[indiceFormato] === '-') {\r\n resultado = '-' + resultado; // Adiciona hífen no resultado\r\n }\r\n indiceFormato--; // Anda para o próximo caractere do formato\r\n }\r\n\r\n return resultado;\r\n \r\n};","import { DescargaModel } from \"../../models\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { TypeDescarga } from \"../../types/descarga.type\";\r\n\r\n/**\r\n * Gera uma descarga a partir de um número de aposta\r\n *\r\n * Esta função cria uma nova descarga (representação de uma aposta) baseada em um número específico.\r\n * Ela copia todas as propriedades do número para a descarga e adiciona propriedades adicionais\r\n * baseadas em prefixos específicos para diferentes tipos de dados.\r\n *\r\n * @param numero - O número de aposta que será usado para gerar a descarga\r\n * @param id - ID único da descarga que será usado\r\n * @returns Uma descarga completa com todas as propriedades necessárias\r\n *\r\n * @example\r\n * ```typescript\r\n * const numero = { numero: \"1234\", tipo_jogo: \"mega\", amount: 100, ... };\r\n * const descargaId = \"banca1_20240627140000_milhar_1_15\";\r\n * const descarga = generateDescarga(numero, descargaId);\r\n * ```\r\n */\r\nexport const generateDescarga = (\r\n numero: TypeNumero,\r\n id: string\r\n): TypeDescarga => {\r\n // Usa o ID fornecido como parâmetro para a descarga\r\n const descargaId = id;\r\n\r\n const lastEnvioId =\r\n numero?.envioIds?.length > 0\r\n ? numero.envioIds[numero.envioIds.length - 1]\r\n : \"\";\r\n\r\n // Cria uma nova instância de descarga usando o modelo, copiando todas as propriedades do número\r\n const descarga = DescargaModel({\r\n ...numero,\r\n id: descargaId, // ID único da descarga\r\n premio: numero.premio, // Valor do prêmio\r\n amount: numero.amount,\r\n numeros: [numero.numero], // Valor total da aposta\r\n amountEnviadoParaAssociacao: numero.amountEnviadoParaAssociacao, // Valor enviado para a banca\r\n valorAEnviarParaAssociacao: numero.valorAEnviarParaAssociacao, // Valor enviado para a banca\r\n envioId: lastEnvioId, // IDs dos envios relacionados\r\n dataAposta: numero.dataAposta, // Data em que a aposta foi feita\r\n bancaId: numero.bancaId, // ID da banca responsável\r\n valorArredondado: numero.valorArredondado, // Valor arredondado da aposta\r\n limiteJogoReal: numero.limiteJogoReal, // Limite para jogos reais\r\n limiteJogoSimulado: numero.limiteJogoSimulado, // Limite para jogos simulados\r\n valorJogo: numero.valorJogo, // Valor específico do jogo\r\n });\r\n\r\n // Retorna a descarga completa com todas as propriedades\r\n return descarga;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado nas propriedades do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta. O ID é formado pela concatenação de: bancaId (opcional), dataAposta,\r\n * tipo_jogo, premio e o amount arredondado (valor total da aposta).\r\n * \r\n * IMPORTANTE: Usa o 'amount' (valor total) em vez da soma dos VPs para garantir que\r\n * números com o mesmo valor total sejam agrupados na mesma descarga, evitando\r\n * descargas duplicadas quando apostas são feitas rapidamente.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param getByProperty - Propriedade opcional para usar um valor específico em vez do amount padrão\r\n * @returns Uma string única identificando a descarga\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: '20240627140000',\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * amount: 30\r\n * };\r\n * const descargaId = getDescargaIdPeloNumero(numero);\r\n * // Resultado: \"banca1_20240627140000_milhar_1_30\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloNumero = (\r\n numero: TypeNumero,\r\n getByProperty?: string\r\n) => {\r\n // Usa o amount (valor total da aposta) em vez da soma dos VPs para gerar o ID\r\n const valorParaId = getByProperty \r\n ? arredondarParaCima(Number(numero[getByProperty as keyof TypeNumero])) \r\n : arredondarParaCima(numero.amount);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${valorParaId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { TypeNumeros } from \"../../types\";\r\nimport { TypeDescargas } from \"../../types/descarga.type\";\r\nimport { generateDescarga } from \"./generateDescarga\";\r\nimport { getDescargaIdPeloNumero } from \"./getDescargaIdPeloNumero\";\r\n\r\n/**\r\n * Gera múltiplas descargas a partir de uma coleção de números de apostas\r\n * \r\n * Esta função agrupa números de apostas em descargas baseado em um ID único gerado\r\n * pelas propriedades de cada número. Números com o mesmo ID são agrupados na mesma\r\n * descarga, consolidando seus valores e arrays de números/envios.\r\n * \r\n * @param numeros - Coleção de números de apostas a serem processados\r\n * @param getByProperty - Propriedade opcional para usar no cálculo do ID da descarga\r\n * @returns Objeto com descargas agrupadas por ID único\r\n * \r\n * @example\r\n * ```typescript\r\n * const numeros = { \"1\": numero1, \"2\": numero2, ... };\r\n * const descargas = generateDescargas(numeros);\r\n * // Resultado: { \"descargaId1\": descarga1, \"descargaId2\": descarga2, ... }\r\n * ```\r\n */\r\nexport const generateDescargas = (\r\n numeros: TypeNumeros,\r\n getByProperty?: string\r\n): TypeDescargas => {\r\n const descargas: TypeDescargas = {};\r\n\r\n Object.entries(numeros).forEach(([, numero]) => {\r\n const descargaId = getDescargaIdPeloNumero(numero, getByProperty);\r\n\r\n if (!descargas[descargaId]) {\r\n // Se não existe, cria uma nova descarga usando o primeiro número como base e passa o ID gerado\r\n descargas[descargaId] = generateDescarga(numero, descargaId);\r\n } else {\r\n descargas[descargaId].numeros.push(numero.numero);\r\n }\r\n });\r\n\r\n return descargas;\r\n};\r\n","import { GAMES } from '../../constants/GAMES';\r\nimport { TypeBet } from '../../types/bet.type';\r\nimport { formatarNumero } from './formatarNumero';\r\n\r\n/**\r\n * @description Gera as dezenas a partir das apostas\r\n *\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"1234\", \"5678\"] } ] ) \r\n * -> [\"34\", \"78\"]\r\n * @example gerarDezenas( [ { name: \"milhar\", numbers: [\"12-34\", \"56-78\"] } ] )\r\n * -> [\"12\", \"34\",\"56\", \"78\"]\r\n */\r\nexport const gerarDezenas = (bets: TypeBet[]): string[] => {\r\n const newNumbers: string[] = [];\r\n bets.forEach((bet) => {\r\n const TYPE_GAME = GAMES[bet.name];\r\n bet.numbers.forEach((number) => {\r\n if (TYPE_GAME.id === 'dezena') {\r\n const nums = number.split('-');\r\n for (const num of nums) {\r\n if (num.length < TYPE_GAME.format.length) continue;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n }\r\n return;\r\n }\r\n const num = number.replaceAll('-', '');\r\n if (num.length < TYPE_GAME.format.replaceAll('-', '').length) return;\r\n const n = formatarNumero(num, TYPE_GAME.format);\r\n newNumbers.push(n);\r\n });\r\n });\r\n\r\n const uniqueCombinations = new Set(newNumbers);\r\n\r\n const nums = Array.from(uniqueCombinations);\r\n\r\n return nums;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaEnvio = (numero: TypeNumero): number => {\r\n let soma = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n soma += value;\r\n }\r\n });\r\n\r\n return soma;\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { getSomaEnvio } from \"./getSomaEnvio\";\r\n\r\n/**\r\n * @description Retorna a soma dos todos os valores de pule\r\n * e a quantidade de pules que possuem valor maior que 0\r\n *\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 0 }) -> { soma: 10, quantidadeDePules: 1 }\r\n * @example getSomaVP({ vp_15-0023: 10, vp_15-0024: 5 }) -> { soma: 15, quantidadeDePules: 2 }\r\n */\r\nexport const getSomaVP = (\r\n numero: TypeNumero\r\n): {\r\n soma: number;\r\n quantidadeDePulesMaiorQueZero: number;\r\n somaEnviadoParaAssociacao: number;\r\n} => {\r\n let soma = 0;\r\n let quantidadeDePulesMaiorQueZero = 0;\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n \r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n soma += value;\r\n if (value > 0) {\r\n quantidadeDePulesMaiorQueZero += 1;\r\n }\r\n }\r\n \r\n });\r\n\r\n const somaEnviadoParaAssociacao = getSomaEnvio(numero)\r\n\r\n soma -= somaEnviadoParaAssociacao;\r\n\r\n return { soma, quantidadeDePulesMaiorQueZero, somaEnviadoParaAssociacao };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { formatarNumero } from \"./formatarNumero\";\r\n\r\nexport const getNumeroId = (props: {\r\n dataAposta: number;\r\n jogo: keyof typeof GAMES;\r\n premio: string;\r\n numero: string;\r\n bancaId: string;\r\n descarregado?: boolean;\r\n}) => {\r\n const { dataAposta, jogo, numero, bancaId, premio, descarregado } = props;\r\n\r\n const TYPE_GAME = GAMES[jogo];\r\n\r\n const numeroFormatado = TYPE_GAME.markAll\r\n ? numero\r\n : formatarNumero(numero, TYPE_GAME.format);\r\n\r\n let descarregadoFormatado = descarregado ? \"true\" : \"false\";\r\n\r\n const numberId =\r\n (bancaId ? `${bancaId}_` : \"\") +\r\n `${dataAposta}_${jogo}_${premio}_${numeroFormatado}_${descarregadoFormatado}`;\r\n\r\n return numberId;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getTiposJogos = (tipos: string) => {\r\n const jogos = tipos.replaceAll(\".invertida\", \"\").split(\"@\");\r\n return jogos as (keyof typeof GAMES)[];\r\n};","// calcularValorDeNumero.ts\r\n\r\nimport { GAMES } from \"../../constants\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\n\r\n/**\r\n * Calcula o valor atribuído a cada número apostado, com base nos parâmetros do jogo.\r\n *\r\n * O cálculo segue três etapas:\r\n * 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n * 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n * 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n *\r\n * @param {Object} options — Parâmetros de entrada.\r\n * @param {number} options.quantidadeDeNumeros — Quantidade de números apostados.\r\n * @param {keyof typeof GAMES} options.tipoJogo — Tipo de jogo conforme chave de `GAMES`.\r\n * @param {number} options.valorPremio — Valor total do prêmio a ser distribuído.\r\n * @param {number} options.quantidadeDePremios — Quantidade de prêmios, se aplicável (usa 1 como fallback se zero).\r\n * @returns {number} — Valor calculado por número apostado.\r\n */\r\nexport const calcularValorDeNumero = ({\r\n quantidadeDeNumeros,\r\n tipoJogo,\r\n valorPremio,\r\n quantidadeDePremios,\r\n}: {\r\n quantidadeDeNumeros: number;\r\n tipoJogo: keyof typeof GAMES;\r\n valorPremio: number;\r\n quantidadeDePremios: number;\r\n}): number => {\r\n const TYPE_GAME = GAMES[tipoJogo];\r\n\r\n const jogos = getTiposJogos(tipoJogo);\r\n\r\n //* 1. Divide o prêmio total (`valorPremio`) pelo número de tipos de jogos (determinado por `getTiposJogos`).\r\n let valorDoNumero = valorPremio / (jogos.length || 1);\r\n\r\n //* 2. Divide o resultado pela quantidade de números apostados (`quantidadeDeNumeros`).\r\n valorDoNumero /= quantidadeDeNumeros;\r\n\r\n //* 3. Se `markAll` for falso, divide ainda pela quantidade de prêmios (`quantidadeDePremios`).\r\n if (!TYPE_GAME.markAll) {\r\n valorDoNumero /= (quantidadeDePremios || 1);\r\n }\r\n\r\n if(quantidadeDePremios === 0) valorDoNumero = 0\r\n\r\n return valorDoNumero;\r\n};\r\n","import { TypeGame, TypeNumeros } from \"../../types\";\r\nimport { GAMES, PREFIX_NUMBER, PREMIOS } from \"../../constants\";\r\nimport { NumberModel } from \"../../models\";\r\nimport { getNumeroId } from \"./getNumeroId\";\r\nimport { getTiposJogos } from \"./getTiposJogos\";\r\nimport { calcularValorDeNumero } from \"./calcularValorDeNumero\";\r\nimport { arredondarParaCima, arrendondarCasasDecimais, getPremioFormato } from \"../..\";\r\n\r\n// Função auxiliar para criar um novo NumberModel\r\nconst criarNumberModel = (\r\n numberId: string,\r\n numeroFormatado: string,\r\n premioFormato: keyof typeof PREMIOS,\r\n created: number,\r\n game: TypeGame,\r\n jogo: any\r\n) => {\r\n return NumberModel({\r\n id: numberId,\r\n numero: numeroFormatado,\r\n premio: premioFormato,\r\n created: created,\r\n bancaId: game.bancaId,\r\n amount: 0,\r\n valorArredondado: 0,\r\n dataAposta: game.dateBet,\r\n tipo_jogo: jogo,\r\n [`${PREFIX_NUMBER}${game.id}` as any]: 0,\r\n });\r\n};\r\n\r\n// Função auxiliar para processar um número e prêmio\r\nconst processarNumeroEPremio = (\r\n number: string,\r\n premio: keyof typeof PREMIOS,\r\n valorDoNumero: number,\r\n TYPE_GAME: any,\r\n game: TypeGame,\r\n jogo: any,\r\n numeros: TypeNumeros,\r\n) => {\r\n const premioFormato = TYPE_GAME.markAll ? PREMIOS[\"1-5\"].id : premio;\r\n const numeroFormatado = number;\r\n\r\n const numberId = getNumeroId({\r\n numero: number,\r\n bancaId: game.bancaId,\r\n dataAposta: game.dateBet,\r\n jogo: jogo,\r\n premio: premioFormato,\r\n });\r\n\r\n if (!numeros?.[numberId]) {\r\n numeros[numberId] = criarNumberModel(\r\n numberId,\r\n numeroFormatado,\r\n premioFormato,\r\n game.created,\r\n game,\r\n jogo\r\n );\r\n }\r\n\r\n const valor = arrendondarCasasDecimais(valorDoNumero);\r\n\r\n numeros[numberId][`${PREFIX_NUMBER}${game.id}`] += valor;\r\n numeros[numberId].amount += valor;\r\n numeros[numberId].valorArredondado += arredondarParaCima(valor);\r\n};\r\n\r\nexport const calculaValoresDosNumeros = (\r\n game: TypeGame,\r\n minimoParaSelecionarDo1ao5Premio = 0\r\n) => {\r\n const numeros: TypeNumeros = {};\r\n\r\n for (const bet of game.bets) {\r\n\r\n const jogos = getTiposJogos(bet.name);\r\n\r\n for (const jogo of jogos) {\r\n const TYPE_GAME = GAMES[jogo];\r\n \r\n const numbers = bet.numbers.filter((number) => {\r\n return number.length === TYPE_GAME.format.length;\r\n })\r\n\r\n const qtd_numeros = numbers.length;\r\n\r\n for (const number of numbers) {\r\n\r\n for (const prize of bet.prizes) {\r\n // Cálculo do valor do número (comum para ambos os casos)\r\n const valorDoNumero = calcularValorDeNumero({\r\n valorPremio: prize.value,\r\n tipoJogo: bet.name,\r\n quantidadeDeNumeros: qtd_numeros,\r\n quantidadeDePremios: prize.prizes.length,\r\n });\r\n\r\n // Caso especial: quando não é markAll e tem 5 prêmios\r\n if (\r\n minimoParaSelecionarDo1ao5Premio > 0 &&\r\n prize.prizes.length >= minimoParaSelecionarDo1ao5Premio\r\n ) {\r\n processarNumeroEPremio(\r\n number,\r\n PREMIOS[\"1-5\"].id,\r\n valorDoNumero,\r\n TYPE_GAME,\r\n game,\r\n jogo,\r\n numeros\r\n );\r\n\r\n continue;\r\n }\r\n\r\n // Caso geral: processar cada prêmio individualmente\r\n for (const premio of prize.prizes) {\r\n processarNumeroEPremio(\r\n number,\r\n getPremioFormato(premio),\r\n valorDoNumero,\r\n TYPE_GAME,\r\n game,\r\n jogo,\r\n numeros\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return { numeros };\r\n};\r\n","import { arrendondarCasasDecimais, functionsCore } from \"..\";\r\nimport { TypeLimitGames, TypeNumero, TypeResultadoNumeroComDiferenca, TypeValueGames } from \"../../types\";\r\n\r\nexport const getNumerosAcimaDoLimite = (\r\n numeros: TypeNumero[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): TypeResultadoNumeroComDiferenca[] => {\r\n return numeros\r\n .map((numero) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n numero.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === numero.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = arrendondarCasasDecimais(numero.amount);\r\n const limiteAtingidoArredondado = arrendondarCasasDecimais(limiteAtingido);\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n numero,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as TypeResultadoNumeroComDiferenca[];\r\n};\r\n","export const arredondarParaCima = (valor: number): number => {\r\n // Trabalha com centavos de forma mais segura (com Math.round)\r\n let emCentavos = Math.round(valor * 100);\r\n\r\n // Se não for múltiplo de 5, arredonda para cima\r\n const resto = emCentavos % 5;\r\n if (resto !== 0) {\r\n emCentavos += 5 - resto;\r\n }\r\n\r\n const valorFinal = emCentavos / 100\r\n\r\n return valorFinal;\r\n}","import { GAMES } from \"../../constants\";\r\nimport { TypeNumeros } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortNumeros = (numeros: TypeNumeros): TypeNumeros => {\r\n const sortedDescargas = Object.values(numeros).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n\r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n\r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return a.amount > b.amount ? -1 : 1;\r\n });\r\n\r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeNumeros;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n numero: Partial<TypeNumero>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOld = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\n\r\nexport const getPropsVP = (numero: Partial<TypeNumero>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(numero).forEach(([key, value]) => {\r\n if (key.startsWith(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeNumero, TypePropsPrefix } from \"../../types\";\r\nimport { clone } from \"../../utils\";\r\nimport { getPropsEnvioId } from \"./getPropsEnvioId\";\r\nimport { getPropsEnvioIdOld } from \"./getPropsEnvioIdOld\";\r\nimport { getPropsVP } from \"./getPropsVP\";\r\n\r\nexport const getPropsPrefix = (numero: Partial<TypeNumero>): TypePropsPrefix => {\r\n const props: TypePropsPrefix = {\r\n [PREFIX_NUMBER]: {},\r\n [PREFIX_ENVIO]: {},\r\n [PREFIX_ENVIO_OLD]: {},\r\n };\r\n\r\n const vps = clone(getPropsVP(numero));\r\n const envio_ids = clone(getPropsEnvioId(numero));\r\n const envio_ids_old = clone(getPropsEnvioIdOld(numero));\r\n\r\n props[PREFIX_NUMBER] = clone(vps);\r\n props[PREFIX_ENVIO] = clone(envio_ids);\r\n props[PREFIX_ENVIO_OLD] = clone(envio_ids_old);\r\n\r\n return props;\r\n};\r\n","import { PREMIOS } from \"../../constants\";\r\n\r\n/**\r\n * @description Retorna o formato do prêmio\r\n * @param premio - Prêmio a ser formatado\r\n * @returns Formato do prêmio\r\n * @example getPremioFormato(1) // \"1\"\r\n * @example getPremioFormato(2) // \"2\"\r\n * @example getPremioFormato(3) // \"3\"\r\n * @example getPremioFormato(4) // \"4\"\r\n * @example getPremioFormato(5) // \"5\"\r\n */\r\nexport const getPremioFormato = (premio: number) => {\r\n if (premio === 1) return PREMIOS[\"1\"].id;\r\n if (premio === 2) return PREMIOS[\"2\"].id;\r\n if (premio === 3) return PREMIOS[\"3\"].id;\r\n if (premio === 4) return PREMIOS[\"4\"].id;\r\n if (premio === 5) return PREMIOS[\"5\"].id;\r\n return PREMIOS[\"1-5\"].id;\r\n};\r\n","/**\r\n * @description Retorna a soma dos todos os valores do\r\n * número enviado em cada envio\r\n *\r\n * @example getSomaVP({ envio_23: 10, envio_24: 5 }) -> 15\r\n */\r\nexport const getSomaProps = (objeto: Record<string, number>): number => {\r\n let soma = 0;\r\n\r\n Object.values(objeto).forEach((value) => {\r\n soma += value;\r\n });\r\n\r\n return soma;\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeLimitGame, TypeLimitGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o limite associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `limitsGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeLimitGames} limitsGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O limite correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const limitsGames = {\r\n * \"1\": { type_game: 'milhar', limit: 10 },\r\n * \"2\": { type_game: 'centena', limit: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(limitsGames, 'milhar');\r\n * resultado = { type_game: 'milhar', limit: 10 }\r\n */\r\nexport const getLimiteJogoPeloTipoJogo = (\r\n limitsGames: TypeLimitGames,\r\n type_game: keyof typeof GAMES\r\n): TypeLimitGame | undefined => {\r\n return Object.values(limitsGames).find((v) => v.type_game === type_game);\r\n};\r\n","export { calcularValorJogoPeloLimite } from \"./calcularValorJogoPeloLimite\"\r\nexport { getValorJogoPeloTipoJogo } from \"./getValorJogoPeloTipoJogo\"\r\nexport { getLimiteJogoPeloTipoJogo } from \"./getLimiteJogoPeloTipoJogo\"","/**\r\n * Calcula o valor unitário de uma jogada com base no limite total disponível.\r\n *\r\n * A função divide o limite (`limiteJogo.limit`) pelo valor fornecido em `valorJogo.value`.\r\n * Se `valorJogo.value` for `0`, será usado o valor padrão `1` para evitar divisão por zero.\r\n * \r\n * @param {number} limiteJogo - valor do limite de jogo.\r\n * @param {TypeValueGame} valorJogo - Objeto que contém o valor do jogo.\r\n * @returns {number} O valor resultante da divisão do limite pelo valor, representando o valor unitário por jogada.\r\n *\r\n * @example\r\n * const limiteJogo = { type_game: \"milhar\", limit: 40000 };\r\n * const valorJogo = { type_game: \"milhar\", value: 4000 };\r\n * const resultado = calcularValorJogoPeloLimite(limiteJogo, valorJogo);\r\n * resultado = 10\r\n */\r\nexport const calcularValorJogoPeloLimite = (\r\n limiteJogo: number,\r\n valorJogo: number\r\n) => {\r\n return limiteJogo / (valorJogo || 1);\r\n};\r\n","import { GAMES } from \"../../constants\";\r\nimport { TypeValueGame, TypeValueGames } from \"../../types\";\r\n\r\n/**\r\n * Retorna o valor associado a um tipo de jogo específico a partir de um conjunto de jogos.\r\n *\r\n * A função percorre os valores do objeto `valuesGames` e retorna o primeiro item cujo campo `type_game`\r\n * seja igual ao tipo de jogo fornecido (`type_game`).\r\n *\r\n * @param {TypeValueGames} valuesGames - Objeto contendo os valores de todos os jogos, indexados por chave.\r\n * @param {keyof typeof GAMES} type_game - Tipo de jogo a ser buscado (deve ser uma chave válida de `GAMES`).\r\n * @returns {TypeValueGame | undefined} O valor correspondente ao tipo de jogo informado ou `undefined` se não for encontrado.\r\n *\r\n * @example\r\n * const valuesGames = {\r\n * \"1\": { type_game: 'milhar', value: 10 },\r\n * \"2\": { type_game: 'centena', value: 20 }\r\n * };\r\n * const resultado = getLimiteTipoJogo(valuesGames, 'milhar');\r\n * resultado = { type_game: 'milhar', value: 10 }\r\n */\r\nexport const getValorJogoPeloTipoJogo = (\r\n valuesGames: TypeValueGames,\r\n type_game: keyof typeof GAMES\r\n): TypeValueGame | undefined => {\r\n return Object.values(valuesGames).find((v) => v.type_game === type_game);\r\n};\r\n","/**\r\n * @description Arredonda um número para um número de casas decimais específico\r\n * @param numero Número a ser arredondado\r\n * @param casas Número de casas decimais para arredondar\r\n * @returns Número arredondado\r\n * @example arrendondarCasasDecimais(1.23456789, 2) // 1.23\r\n * @example arrendondarCasasDecimais(1.23456789, 3) // 1.235\r\n * @example arrendondarCasasDecimais(1.23456789, 4) // 1.2346\r\n * @example arrendondarCasasDecimais(1.23456789, 5) // 1.23457\r\n */\r\nexport const arrendondarCasasDecimais = (numero: number, casas: number = 10) => {\r\n return Number(numero.toFixed(casas));\r\n}","import { TypeLimitGames } from \"../../types/limit_value_type_game.type\";\r\nimport { TypeValueGames } from \"../../types/value_type_game.type\";\r\nimport { getLimiteJogoPeloTipoJogo } from \"../limite_jogos/getLimiteJogoPeloTipoJogo\";\r\nimport { getValorJogoPeloTipoJogo } from \"../limite_jogos\";\r\nimport { GAMES } from \"../../constants\";\r\nimport { arrendondarCasasDecimais } from \"./arrendondarCasasDecimais\";\r\n\r\nexport const getLimiteSimulado = (\r\n tipo_jogo: keyof typeof GAMES,\r\n valores: TypeValueGames,\r\n limites: TypeLimitGames,\r\n): number => {\r\n const valorJogo = getValorJogoPeloTipoJogo(valores, tipo_jogo);\r\n\r\n const limiteJogo = getLimiteJogoPeloTipoJogo(limites, tipo_jogo);\r\n\r\n const limiteSimulado = (limiteJogo?.limit || 0) / (valorJogo?.value || 1);\r\n\r\n return arrendondarCasasDecimais(limiteSimulado);\r\n};\r\n","export { getAvailableTimes } from \"./getAvailableTimes\"\r\nexport { pegarExtracoes } from \"./pegarExtracoes\"\r\nexport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\"\r\nexport { extracaoEstaAtivaBoolean } from \"./extracaoEstaAtivaBoolean\"\r\nexport { getProximaExtracaoDisponivelParaAposta } from \"./getProximaExtracaoDisponivelParaAposta\"","import { format, getDay } from 'date-fns';\r\nimport { getBetDateToNumber } from '../../functions/games';\r\nimport { TypeExtracao } from '../../types';\r\nimport { numberToDate, showFormatDate } from '../../utils';\r\n\r\n/**\r\n * @description\r\n * Retorna a lista de extrações válidas (horários disponíveis) para uma data de aposta específica,\r\n * levando em conta regras como feriados, dias da semana, bloqueios por horário e status de atividade.\r\n * \r\n * Regras aplicadas:\r\n * - Ignora extrações marcadas como **inativas para o dia da aposta** (`inativo_no_dia`).\r\n * - Se houver extrações exclusivas para feriados (`somente_no_feriado` === data da aposta),\r\n * retorna apenas essas extrações.\r\n * - Caso contrário, retorna extrações ativas e recorrentes para o **dia da semana da aposta**\r\n * (ex: segunda-feira), desde que não sejam exclusivas de feriado.\r\n * - Se `showAll` for `true`, ignora as regras acima e retorna todas as extrações ativas.\r\n * - Se `mobile` for `true` e `dateBet` for o dia atual (`dateNow`), filtra ainda mais: remove as extrações\r\n * cujo horário de **bloqueio já passou**, baseado na hora atual do dispositivo.\r\n * \r\n * A lista final é sempre ordenada do menor para o maior horário (`ext.horario`).\r\n *\r\n * @param extracoes - Lista de todas as extrações disponíveis no sistema.\r\n * @param dateBet - Data da aposta em formato numérico (ex: 20241001000000).\r\n * @param showAll - Se `true`, ignora filtros e retorna todas as extrações ativas.\r\n * @param mobile - Se `true`, aplica lógica de bloqueio com base na hora atual (`dateNow`).\r\n * @param dateNow - Data/hora atual usada para comparação, especialmente quando `mobile` estiver ativado.\r\n * \r\n * @returns Lista de extrações válidas, ordenadas por horário.\r\n */\r\nexport const getAvailableTimes = (\r\n extracoes: TypeExtracao[],\r\n dateBet: number,\r\n showAll?: boolean,\r\n mobile?: boolean,\r\n dateNow?: Date\r\n) => {\r\n // converte a data com horas,minutos e segundos com zero\r\n const data = getBetDateToNumber(dateBet, 20241001000000);1\r\n\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) => ext.ativo && !ext.inativo_no_dia.includes(data)\r\n );\r\n\r\n const DateBet = numberToDate(data);\r\n\r\n let validTimes: TypeExtracao[] = [];\r\n\r\n // verifica se no dia selecionado tem alguma extração com aquela data exata e se nao está inativa no dia\r\n const extracoesFeriado = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === data\r\n );\r\n\r\n // se tiver, mostra somente a extracao da data selecionada\r\n if (extracoesFeriado.length > 0) {\r\n validTimes = [...extracoesFeriado];\r\n } else {\r\n // se nao, mostra todas menos a com a data selecionada\r\n validTimes = extracoesAtivas.filter(\r\n (ext) =>\r\n DateBet &&\r\n ext.days[getDay(DateBet) as keyof typeof ext.days] &&\r\n ext.somente_no_feriado === 0\r\n );\r\n }\r\n\r\n if (showAll) {\r\n validTimes = [...extracoesAtivas];\r\n }\r\n\r\n if (mobile && DateBet && dateNow) {\r\n if (format(dateNow, 'dd/MM/yyyy') === format(DateBet, 'dd/MM/yyyy')) {\r\n validTimes = validTimes.filter(\r\n (ext) =>\r\n Number(format(dateNow, 'HHmm')) <\r\n Number(showFormatDate(ext.bloqueio, 'HHmm'))\r\n );\r\n }\r\n }\r\n\r\n return validTimes.sort((extA, extB) =>\r\n Number(showFormatDate(extA.horario, 'HHmm')) <\r\n Number(showFormatDate(extB.horario, 'HHmm'))\r\n ? -1\r\n : 1\r\n );\r\n};\r\n","export { calculateAmount } from './calculateAmount';\r\nexport { calculateAmountGame } from './calculateAmountGame';\r\nexport { getBetDateToNumber } from './getBetDateToNumber';\r\nexport { formatPuleId } from './formatPuleId';\r\nexport { getFormattedPuleId } from './getFormattedPuleId';\r\nexport { fazerJogo } from './fazerJogo';\r\nexport { invertGame } from './invertGame';\r\nexport { getGamesUnicosList, getGamesUnicosObjeto } from './getGamesUnicos';\t","import { TypePrize } from \"../../types/bet.type\";\r\n\r\nexport const calculateAmount = (betValues: TypePrize[]) => {\r\n let total = 0;\r\n betValues.forEach((item) => {\r\n total += item.value;\r\n });\r\n return total;\r\n};\r\n","import { TypeBet } from \"../../types/bet.type\";\r\nimport { calculateAmount } from \"./calculateAmount\";\r\n\r\nexport const calculateAmountGame = (games: TypeBet[]) => {\r\n let total = 0;\r\n\r\n games.forEach((bet) => {\r\n total += calculateAmount(bet.prizes);\r\n });\r\n\r\n return total;\r\n};\r\n","import { setHours, setMinutes, setSeconds } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { dateToNumber, numberToDate } from \"../../utils\";\r\n\r\n/**\r\n * Combina uma data base com o horário de uma extração para formar uma data completa\r\n * \r\n * Esta função pega uma data base (YYYYMMDDHHmmss) e combina com o horário de uma extração,\r\n * criando uma nova data que mantém a data base mas usa o horário da extração.\r\n * \r\n * @param date Data base no formato YYYYMMDDHHmmss (ano, mês, dia, hora, minuto, segundo)\r\n * @param extracaoDate Horário da extração no formato HHmmss (hora, minuto, segundo)\r\n * @returns Data combinada no formato YYYYMMDDHHmmss, ou 0 se algum parâmetro for inválido\r\n * \r\n * @example\r\n * // Combina data 2024-12-25 00:00:00 com horário 14:30:00\r\n * const result = getBetDateToNumber(20241225000000, 143000);\r\n * // Retorna: 20241225143000 (25/12/2024 às 14:30:00)\r\n * \r\n * @example\r\n * // Combina data 2024-12-25 10:15:30 com horário 09:45:00\r\n * const result = getBetDateToNumber(20241225101530, 94500);\r\n * // Retorna: 20241225094500 (25/12/2024 às 09:45:00)\r\n * \r\n * @example\r\n * // Parâmetros inválidos\r\n * const result = getBetDateToNumber(0, 0);\r\n * // Retorna: 0\r\n */\r\nexport const getBetDateToNumber = (\r\n date: number,\r\n extracaoDate: TypeExtracao[\"horario\"]\r\n): number => {\r\n const extDate = extracaoDate;\r\n\r\n const dateExtracao = numberToDate(extDate);\r\n\r\n let newDateBet = numberToDate(date);\r\n\r\n if(!newDateBet || !dateExtracao) return 0;\r\n\r\n newDateBet = setHours(newDateBet, dateExtracao.getHours());\r\n newDateBet = setMinutes(newDateBet, dateExtracao.getMinutes());\r\n newDateBet = setSeconds(newDateBet, 0);\r\n\r\n const number = dateToNumber(newDateBet);\r\n\r\n return number;\r\n};\r\n","/**\r\n * @description Formata o ID do pule na criação\r\n*/\r\nexport const formatPuleId = (n: number): string => {\r\n if (n < 1000) {\r\n return n.toString().padStart(4, '0');\r\n } else {\r\n return n.toString();\r\n }\r\n};\r\n","/**\r\n * @description Formata o ID do pule para exibir em tela, extraindo a última parte após o último hífen\r\n * \r\n * @param {string} id - O ID completo do pule que pode conter múltiplos hífens\r\n * @returns {string} A última parte do ID após o último hífen\r\n * \r\n * @example\r\n * getFormattedPuleId(\"1-0001\") // \"0001\"\r\n * @example\r\n * getFormattedPuleId(\"102-2344301\") // \"2344301\"\r\n * @example\r\n * getFormattedPuleId(\"df29e917-d922-afce-257b-7e766411ef79-0541\") // \"0541\"\r\n */\r\nexport const getFormattedPuleId = (id: string): string => {\r\n const parts = id.split('-');\r\n return parts[parts.length - 1];\r\n};\r\n","// Importa a constante GAMES que contém as configurações de todos os tipos de jogos disponíveis\r\nimport { GAMES } from \"../../constants\";\r\n// Importa o tipo TypeGame que representa a estrutura de um jogo completo\r\nimport { TypeGame } from \"../../types\";\r\n// Importa a função clone para fazer cópia profunda de objetos e getAllCombinations para gerar permutações\r\nimport { clone, getAllCombinations } from \"../../utils\";\r\n// Importa formatarNumero para formatar números conforme o padrão do jogo e getTiposJogos para extrair tipos de jogos\r\nimport { formatarNumero, getTiposJogos } from \"../numbers\";\r\n\r\n/**\r\n * Função que processa jogos invertidos, gerando todas as combinações possíveis dos números\r\n * para cada tipo de jogo especificado na aposta.\r\n *\r\n * @param game - O jogo completo contendo todas as apostas\r\n * @returns Um novo jogo com as apostas invertidas processadas (números expandidos em todas as combinações)\r\n *\r\n * @example\r\n * EXEMPLO COM NÚMERO 1234 DO TIPO \"milhar.invertida@centena.invertida\":\r\n *\r\n * Entrada:\r\n * game = {\r\n * bets: [{\r\n * name: \"milhar.invertida@centena.invertida\",\r\n * numbers: [\"1234\"],\r\n * prizes: [...]\r\n * }]\r\n * }\r\n *\r\n * Processamento:\r\n * 1. getTiposJogos(\"milhar.invertida@centena.invertida\")\r\n * -> Remove \".invertida\" de cada parte e divide por \"@\"\r\n * -> Resultado: [\"milhar\", \"centena\"]\r\n *\r\n * 2. Para tipo_jogo = \"milhar\":\r\n * - formatarNumero(\"1234\", \"####\") -> \"1234\" (formato milhar usa 4 dígitos)\r\n * - getAllCombinations(\"1234\") -> [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\"]\r\n * - Total: 24 combinações (4! = 24)\r\n *\r\n * 3. Para tipo_jogo = \"centena\":\r\n * - formatarNumero(\"1234\", \"###\") -> \"234\" (formato centena usa últimos 3 dígitos)\r\n * - getAllCombinations(\"234\") -> [\"234\", \"243\", \"324\", \"342\", \"423\", \"432\"]\r\n * - Total: 6 combinações (3! = 6)\r\n *\r\n * 4. Combinações totais: 24 + 6 = 30 combinações\r\n *\r\n * 5. Remove duplicatas (se houver) usando Set\r\n *\r\n * Saída:\r\n * game = {\r\n * bets: [{\r\n * name: \"milhar.invertida@centena.invertida\",\r\n * numbers: [\"1234\", \"1243\", \"1324\", \"1342\", \"1423\", \"1432\",\r\n * \"2134\", \"2143\", \"2314\", \"2341\", \"2413\", \"2431\",\r\n * \"3124\", \"3142\", \"3214\", \"3241\", \"3412\", \"3421\",\r\n * \"4123\", \"4132\", \"4213\", \"4231\", \"4312\", \"4321\",\r\n * \"234\", \"243\", \"324\", \"342\", \"423\", \"432\"],\r\n * prizes: [...]\r\n * }]\r\n * }\r\n */\r\nexport const invertGame = (game: TypeGame): TypeGame => {\r\n // Cria uma cópia profunda do jogo para não modificar o objeto original\r\n const newGame = clone(game);\r\n\r\n // Itera sobre todas as apostas do jogo, uma por uma\r\n for (let index = 0; index < newGame.bets.length; index++) {\r\n // Obtém a aposta atual do array de apostas\r\n let aposta = newGame.bets[index];\r\n\r\n // Extrai os tipos de jogos do nome da aposta\r\n // Exemplo: \"milhar.invertida@centena.invertida\" -> [\"milhar\", \"centena\"]\r\n // A função remove \".invertida\" e divide por \"@\" para obter os tipos base\r\n const tipos_jogos = getTiposJogos(aposta.name);\r\n\r\n // Obtém o array de números da aposta original\r\n const nums = aposta.numbers;\r\n // Inicializa um array vazio para armazenar todas as combinações geradas\r\n const result: string[] = [];\r\n\r\n // Itera sobre cada tipo de jogo extraído (ex: \"milhar\", \"centena\")\r\n for (const tipo_jogo of tipos_jogos) {\r\n // Itera sobre cada número da aposta original\r\n for (const num of nums) {\r\n // Formata o número conforme o formato do tipo de jogo\r\n // Exemplo: formatarNumero(\"1234\", \"####\") -> \"1234\" (milhar)\r\n // Exemplo: formatarNumero(\"1234\", \"###\") -> \"234\" (centena, pega últimos 3 dígitos)\r\n const numeroFormatado = formatarNumero(num, GAMES[tipo_jogo].format);\r\n \r\n // Verifica se o nome da aposta contém \"invertida\"\r\n // Se sim, gera todas as permutações possíveis do número formatado\r\n // Exemplo: getAllCombinations(\"1234\") -> [\"1234\", \"1243\", \"1324\", ...] (24 combinações)\r\n // Exemplo: getAllCombinations(\"234\") -> [\"234\", \"243\", \"324\", ...] (6 combinações)\r\n if (aposta.name.includes(\"invertida\")) {\r\n const n = getAllCombinations(numeroFormatado);\r\n // Adiciona todas as combinações geradas ao array de resultados\r\n // Usa spread operator (...) para adicionar cada elemento individualmente\r\n result.push(...n);\r\n continue;\r\n }\r\n\r\n // Se o número já tem o tamanho correto do formato do jogo, adiciona o número original\r\n // Isso evita formatação desnecessária quando o número já está no formato esperado\r\n if (num.length === GAMES[tipo_jogo].format.length) {\r\n result.push(num);\r\n continue;\r\n }\r\n\r\n // Caso contrário, adiciona o número formatado ao resultado\r\n result.push(numeroFormatado);\r\n }\r\n\r\n // Cria uma nova aposta mantendo todas as propriedades originais (name, prizes)\r\n // mas substituindo o array de numbers pelas combinações únicas geradas\r\n // Usa clone para garantir que o array de números seja uma cópia independente\r\n aposta = { ...aposta, numbers: clone(result) };\r\n\r\n // Atualiza a aposta no array de apostas do jogo com as novas combinações\r\n newGame.bets[index] = aposta;\r\n }\r\n }\r\n\r\n // Retorna o jogo modificado com todas as apostas invertidas processadas\r\n return newGame;\r\n};\r\n","import { GameModel } from \"../../models\";\r\nimport { TypeExtracao, TypeGame, TypeUser } from \"../../types\";\r\nimport { calculaValoresDosNumeros } from \"../numbers/calculaValoresDosNumeros\";\r\nimport { calculateAmountGame } from \"./calculateAmountGame\";\r\nimport { getBetDateToNumber } from \"./getBetDateToNumber\";\r\nimport { invertGame } from \"./invertGame\";\r\n\r\nexport const fazerJogo = (\r\n cart: TypeGame,\r\n profile: TypeUser,\r\n dateBet: number,\r\n extracao: TypeExtracao,\r\n puleId: string\r\n) => {\r\n\r\n const game = GameModel({\r\n ...cart,\r\n id: puleId,\r\n creator: profile,\r\n dateBet: getBetDateToNumber(dateBet, extracao.horario),\r\n totalAmount: calculateAmountGame(cart.bets),\r\n extracao: extracao,\r\n });\r\n\r\n const gameWIthInvertedNumbers = invertGame(game);\r\n\r\n const { numeros } = calculaValoresDosNumeros(\r\n gameWIthInvertedNumbers\r\n );\r\n\r\n return { numeros, game };\r\n};\r\n","import { GAMES } from \"../../constants\";\r\n\r\nexport const getGamesUnicosList = () =>\r\n Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\nexport const getGamesUnicosObjeto = () => {\r\n const filtrados = Object.values(GAMES).filter(\r\n (visu) => !visu.id.includes(\"@\") && !visu.id.includes(\"invertida\")\r\n );\r\n\r\n const obj = filtrados.reduce((acc, item) => {\r\n acc[item.id] = item;\r\n return acc;\r\n }, {} as Record<string, (typeof GAMES)[keyof typeof GAMES]>);\r\n\r\n return obj;\r\n};\r\n","import { format, getDay } from \"date-fns\";\r\nimport {\r\n dateToNumber,\r\n numberToDate,\r\n pegarHorarioSaoPaulo,\r\n showFormatDate,\r\n} from \"../../utils\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * @description\r\n * Retorna uma lista de extrações válidas para uma data de aposta, aplicando regras de negócio:\r\n *\r\n * Regras aplicadas:\r\n * 1. Se houver extrações exclusivas para feriado (`somente_no_feriado`), retorna apenas essas.\r\n * 2. Caso contrário, retorna extrações ativas que funcionam no dia da semana da aposta (`days`) e não são exclusivas de feriado.\r\n * 3. Se `retornar === \"do_dia\"`, retorna todas as extrações válidas para a data da aposta.\r\n * 4. Se `retornar === \"proximas\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário de bloqueio ainda não passou.\r\n * 5. Se `retornar === \"anteriores\"` e a aposta for no mesmo dia de `dataAgora`, retorna apenas extrações cujo horário já passou.\r\n * 6. A lista final é sempre ordenada do menor para o maior horário (`horario`).\r\n *\r\n * @param params.extracoes - Lista completa de extrações disponíveis.\r\n * @param params.dataAposta - Data da aposta em formato numérico (ex: 20241001000000). Default: hora atual em São Paulo.\r\n * @param params.dataAgora - Data/hora atual usada para comparação de próximas/anteriores. Default: hora atual em São Paulo.\r\n * @param params.retornar - Define o filtro de retorno:\r\n * - `\"do_dia\"`: retorna todas as extrações válidas para a data da aposta.\r\n * - `\"proximas\"`: retorna apenas extrações que ainda não passaram no dia da aposta.\r\n * - `\"anteriores\"`: retorna apenas extrações que já passaram no dia da aposta.\r\n *\r\n * @returns Lista de extrações válidas, ordenadas por horário crescente.\r\n */\r\nexport const pegarExtracoes = ({\r\n extracoes,\r\n dataAposta = dateToNumber(pegarHorarioSaoPaulo()), // Data da aposta padrão: hora atual SP\r\n dataAgora = dateToNumber(pegarHorarioSaoPaulo()), // Data/hora atual padrão: hora atual SP\r\n retornar = \"do_dia\", // Tipo de filtro padrão\r\n pegar = \"bloqueio\",\r\n}: {\r\n extracoes: TypeExtracao[];\r\n dataAposta?: number;\r\n dataAgora?: number;\r\n retornar?: \"do_dia\" | \"anteriores\" | \"proximas\";\r\n pegar?: \"horario\" | \"bloqueio\";\r\n}): TypeExtracao[] => {\r\n /**\r\n * @description Retorna o horário apropriado da extração baseado no parâmetro 'pegar'\r\n *\r\n * @param {TypeExtracao} extracao - A extração da qual se deseja obter o horário\r\n * @returns {number} O horário da extração (horario ou bloqueio) ou 0 se não especificado\r\n *\r\n * @example\r\n * // Retorna o horário da extração\r\n * getHorario(extracao) // quando pegar === \"horario\" -> retorna extracao.horario\r\n *\r\n * @example\r\n * // Retorna o horário de bloqueio da extração\r\n * getHorario(extracao) // quando pegar === \"bloqueio\" -> retorna extracao.bloqueio\r\n */\r\n const getHorario = (extracao: TypeExtracao) => {\r\n if (pegar === \"horario\") return extracao.horario;\r\n if (pegar === \"bloqueio\") return extracao.bloqueio;\r\n return 0;\r\n };\r\n\r\n // Converte a data da aposta para remover horas, minutos e segundos\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n // Converte a data agora para o mesmo formato de aposta (apenas data)\r\n const dataAgoraNumerica = getBetDateToNumber(dataAgora, 20241001000000);\r\n\r\n // Converte a data da aposta para objeto Date\r\n const dataApostaDate = numberToDate(dataApostaNumerica);\r\n\r\n if (!dataApostaDate) throw new Error(\"dataApostaDate é obrigatória!\");\r\n\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n const extracoesAtivas = extracoes.filter(\r\n (ext) =>\r\n ext.ativo &&\r\n !ext.inativo_no_dia.includes(dataApostaNumerica)\r\n );\r\n\r\n // Filtra extrações que são exclusivas para feriado na data da aposta\r\n // Normaliza somente_no_feriado para comparação (remove horas, minutos e segundos)\r\n const extracoesDeFeriado = extracoesAtivas.filter((ext) => {\r\n const somenteNoFeriadoNormalizado = ext.somente_no_feriado !== 0\r\n ? getBetDateToNumber(ext.somente_no_feriado, 20241001000000)\r\n : 0;\r\n return somenteNoFeriadoNormalizado === dataApostaNumerica;\r\n });\r\n\r\n // Filtra extrações normais (não exclusivas de feriado)\r\n const extracoesNormais = extracoesAtivas.filter(\r\n (ext) => ext.somente_no_feriado === 0\r\n );\r\n\r\n // Determina as extrações válidas iniciais\r\n const extracoesValidas =\r\n // Se houver feriados, retorna apenas essas extrações\r\n extracoesDeFeriado.length > 0\r\n ? extracoesDeFeriado\r\n : // Caso contrário, retorna extrações normais do dia da semana ativo\r\n extracoesNormais.filter(\r\n (ext) =>\r\n ext.days[getDay(dataApostaDate) as keyof typeof ext.days]\r\n );\r\n\r\n // Retorna todas as extrações válidas do dia, ordenadas\r\n if (retornar === \"do_dia\") {\r\n return extracoesValidas.sort(sortExtracoes);\r\n }\r\n\r\n // Converte dataAgora para Date\r\n const dataAgoraDate = numberToDate(dataAgora);\r\n\r\n if (!dataAgoraDate) throw new Error(\"dataAgoraDate é obrigatória!\");\r\n\r\n // Extrai a hora atual no formato HHmm\r\n const horaAgora = Number(format(dataAgoraDate, \"HHmm\"));\r\n\r\n // Filtra extrações com base no tipo de retorno (\"proximas\" ou \"anteriores\")\r\n const extracoesFiltradas =\r\n retornar === \"proximas\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataApostaNumerica === dataAgoraNumerica\r\n ? horaAgora < Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica > dataAgoraNumerica\r\n )\r\n : retornar === \"anteriores\"\r\n ? extracoesValidas.filter((ext) =>\r\n dataAgoraNumerica === dataApostaNumerica\r\n ? horaAgora >= Number(showFormatDate(getHorario(ext), \"HHmm\"))\r\n : dataApostaNumerica < dataAgoraNumerica\r\n )\r\n : [];\r\n\r\n // Ordena o resultado final por horário crescente\r\n return extracoesFiltradas.sort(sortExtracoes);\r\n};\r\n\r\n/**\r\n * @description Ordena as extrações do menor para o maior horário\r\n */\r\nconst sortExtracoes = (a: TypeExtracao, b: TypeExtracao) =>\r\n Number(showFormatDate(a.horario, \"HHmm\")) -\r\n Number(showFormatDate(b.horario, \"HHmm\"));\r\n","import { getDay } from \"date-fns\";\r\nimport { TypeExtracao } from \"../../types\";\r\nimport { numberToDate } from \"../../utils\";\r\nimport { getBetDateToNumber } from \"../games\";\r\n\r\n/**\r\n * Verifica se a extração está ativa e lança exceção com mensagem específica caso não esteja.\r\n * Use esta função quando precisar saber o motivo específico do erro (ex: Cloud Functions).\r\n * @throws {Error} Lança erro com mensagem específica do problema\r\n * \r\n * @example \"Extração não está ativa.\"\r\n * @example \"Extração está inativa no dia da aposta.\"\r\n * @example \"Extração não funciona neste feriado.\"\r\n * @example \"Data da aposta inválida.\"\r\n * @example \"Extração não funciona neste dia da semana.\"\r\n */\r\nexport const extracaoEstaAtivaTryCatch = (\r\n dataAposta: number,\r\n extracao: TypeExtracao\r\n): void => {\r\n // Filtra apenas extrações ativas e que não estão inativas no dia da aposta\r\n\r\n if (!extracao.ativo) {\r\n throw new Error(\"Extração não está ativa.\");\r\n }\r\n\r\n // Normaliza a data da aposta removendo horas, minutos e segundos para comparação\r\n const dataApostaNumerica = getBetDateToNumber(dataAposta, 20241001000000);\r\n\r\n if (extracao.inativo_no_dia.includes(dataApostaNumerica)) {\r\n throw new Error(\"Extração está inativa no dia da aposta.\");\r\n }\r\n\r\n // Normaliza somente_no_feriado para comparação (remove horas, minutos e segundos)\r\n const somenteNoFeriadoNormalizado = extracao.somente_no_feriado !== 0\r\n ? getBetDateToNumber(extracao.somente_no_feriado, 20241001000000)\r\n : 0;\r\n\r\n if (\r\n somenteNoFeriadoNormalizado !== 0 &&\r\n somenteNoFeriadoNormalizado !== dataApostaNumerica\r\n ) {\r\n throw new Error(\"Extração não funciona neste feriado.\");\r\n }\r\n\r\n const dataApostaDate = numberToDate(dataAposta);\r\n\r\n if (!dataApostaDate) {\r\n throw new Error(\"Data da aposta inválida.\");\r\n }\r\n\r\n if (!extracao.days[getDay(dataApostaDate) as keyof typeof extracao.days]) {\r\n const diasSemana = ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'];\r\n const diaDaSemana = diasSemana[getDay(dataApostaDate)];\r\n throw new Error(\r\n `Extração não funciona neste dia da semana (${diaDaSemana}).`\r\n );\r\n }\r\n};\r\n","import { TypeExtracao } from \"../../types\";\r\nimport { extracaoEstaAtivaTryCatch } from \"./extracaoEstaAtivaTryCatch\";\r\n\r\n/**\r\n * Versão helper que retorna boolean sem lançar exceção.\r\n * Use esta função para validações simples no frontend (ex: desabilitar botões).\r\n * @returns {boolean} true se ativa, false se inativa (sem detalhes do motivo)\r\n */\r\nexport const extracaoEstaAtivaBoolean = (dataAposta: number, extracao: TypeExtracao): boolean => {\r\n try {\r\n extracaoEstaAtivaTryCatch(dataAposta, extracao);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n};","import { TypeExtracao } from \"../../types/extracao.type\";\r\nimport { getBetDateToNumber } from \"../games\";\r\nimport { pegarExtracoes } from \"./pegarExtracoes\";\r\nimport { TypeResultado } from \"../../types/resultado.type\";\r\n\r\n/**\r\n * Busca a próxima extração disponível para aposta baseada na existência de resultado\r\n * \r\n * Esta função determina qual extração o usuário pode apostar considerando:\r\n * - Se não há resultado: permite apostar na primeira extração do dia\r\n * - Se há resultado: permite apostar apenas na próxima extração após a que teve resultado\r\n * \r\n * @param extracoes Lista completa de extrações disponíveis\r\n * @param data Data da aposta no formato YYYYMMDDHHmmss\r\n * @param resultado Resultado do jogo (opcional). Se undefined, retorna primeira extração. Se existe, procura a extração que teve esse resultado e retorna a próxima\r\n * @returns A próxima extração disponível para aposta, ou undefined se não há mais extrações disponíveis no dia\r\n * \r\n * @example\r\n * // Sem resultado - pode apostar desde o início\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, undefined);\r\n * // Retorna: primeira extração do dia\r\n * \r\n * @example\r\n * // Com resultado - só pode apostar na próxima extração\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, resultado);\r\n * // Retorna: próxima extração após a que teve resultado\r\n * \r\n * @example\r\n * // Última extração teve resultado - não pode mais apostar\r\n * const proxima = getProximaExtracaoDisponivelParaAposta(extracoes, 20241225000000, resultadoUltima);\r\n * // Retorna: undefined\r\n */\r\nexport const getProximaExtracaoDisponivelParaAposta = (\r\n extracoes: TypeExtracao[],\r\n data: number, // YYYYMMDDHHmmss\r\n resultado?: TypeResultado\r\n): TypeExtracao | undefined => {\r\n if (!extracoes || extracoes.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Pega as extrações válidas para o dia usando a função reutilizável\r\n const extracoesDoDia = pegarExtracoes({\r\n extracoes,\r\n dataAgora: data,\r\n dataAposta: data,\r\n retornar: \"do_dia\"\r\n });\r\n\r\n if (extracoesDoDia.length === 0) {\r\n return undefined;\r\n }\r\n\r\n // Se não tem resultado, retorna a primeira extração (pode jogar desde o início)\r\n if (!resultado) {\r\n return extracoesDoDia[0];\r\n }\r\n\r\n // Procura qual extração teve resultado\r\n // Combina: data (YYYYMMDD) + horario da extracao (HHmmss) = YYYYMMDDHHmmss\r\n const indiceExtracaoComResultado = extracoesDoDia.findIndex((extracao) => {\r\n // Cria um horário base com a data fornecida para usar no combineDateTime\r\n const dataBase = data; // YYYYMMDD000000\r\n const horarioExtracao = extracao.horario; // HHmmss\r\n \r\n // Combina data + horário usando a função reutilizável\r\n const dataCompleta = getBetDateToNumber(dataBase, horarioExtracao);\r\n \r\n // Verifica se o resultado tem dataSorteio igual à data completa\r\n return resultado?.dataSorteio && resultado.dataSorteio === dataCompleta;\r\n });\r\n\r\n if (indiceExtracaoComResultado !== -1) {\r\n // Se encontrou a extração que teve resultado, retorna a próxima\r\n const proximaExtracao = extracoesDoDia[indiceExtracaoComResultado + 1];\r\n return proximaExtracao; // Se for a última extração, retorna undefined automaticamente\r\n } else {\r\n // Se não encontrou resultado para nenhuma extração, retorna a primeira\r\n return extracoesDoDia[0];\r\n }\r\n};\r\n","export {\r\n isAdm,\r\n isAdmOrSubAdm,\r\n isAssociacao,\r\n isCambista,\r\n isCambistaTalao,\r\n isDigitador,\r\n isDigitadorAdm,\r\n isSuperAdm,\r\n isDigitadorOrDigitadorAdm\r\n} from \"./permissions\";\r\nexport { getPermission } from \"./permissions\";\r\nexport { getLimitsRest } from \"./getLimitsRest\";\r\n","import { ROLES } from \"../../constants\";\r\nimport { TypeUser } from \"../../types\";\r\n\r\nconst IS_ADM = [\"admin\"] as TypeUser[\"role\"][];\r\nconst IS_ADM_OR_SUBADM = [\"admin\", \"sub_admin\"] as TypeUser[\"role\"][];\r\nconst IS_ASSOCIACAO = [\"associacao\"] as TypeUser[\"role\"][];\r\nconst IS_SUPER_ADMIN = [\"super_admin\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA_TALAO = [\"cambista_talao\"] as TypeUser[\"role\"][];\r\nconst IS_CAMBISTA = [\"cambista\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_ADM = [\"digitador_adm\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR = [\"digitador\"] as TypeUser[\"role\"][];\r\nconst IS_DIGITADOR_AND_ADM = [\r\n \"digitador\",\r\n \"digitador_adm\",\r\n] as TypeUser[\"role\"][];\r\n\r\nexport const isAdm = (user: TypeUser) => IS_ADM.includes(user.role);\r\nexport const isAssociacao = (user: TypeUser) =>\r\n IS_ASSOCIACAO.includes(user.role);\r\nexport const isSuperAdm = (user: TypeUser) =>\r\n IS_SUPER_ADMIN.includes(user.role);\r\nexport const isAdmOrSubAdm = (user: TypeUser) =>\r\n IS_ADM_OR_SUBADM.includes(user.role);\r\nexport const isSubAdmin = (user: TypeUser) => user.role === ROLES.sub_admin.id;\r\nexport const isCambistaTalao = (user: TypeUser) =>\r\n IS_CAMBISTA_TALAO.includes(user.role);\r\nexport const isCambista = (user: TypeUser) => IS_CAMBISTA.includes(user.role);\r\nexport const isDigitadorAdm = (user: TypeUser) =>\r\n IS_DIGITADOR_ADM.includes(user.role);\r\nexport const isDigitador = (user: TypeUser) => IS_DIGITADOR.includes(user.role);\r\nexport const isDigitadorOrDigitadorAdm = (user: TypeUser) =>\r\n IS_DIGITADOR_AND_ADM.includes(user.role);\r\n\r\n/**\r\n * @description Verifica se o usuário tem permissão para enviar para a associação.\r\n * - Super admin e admin tem permissão para enviar para a associação, retorna true\r\n * - Sub admin tem permissão para enviar para a associação se tiver a permissão podeEnviarParaAssociacao, retorna true\r\n * - Se não for nenhum dos casos acima, retorna false\r\n * @param user - Usuário\r\n * @returns true se o usuário tem permissão, false caso contrário\r\n */\r\nexport const hasPermissionToSendToAssociation = (user: TypeUser) => {\r\n if (isSuperAdm(user)) return true;\r\n if (isAdm(user)) return true;\r\n if (isSubAdmin(user) && user.permissoes.podeEnviarParaAssociacao) return true;\r\n return false;\r\n};\r\n\r\n/**\r\n * @deprecated Depreciado pois o uso antigo era \"functionsCore.users.getPermission.isAdm()\"\r\n *\r\n * @description Agora deve-se usar \"functionsCore.users.isAdm()\"\r\n */\r\nexport const getPermission = {\r\n isAdm,\r\n isAssociacao,\r\n isSuperAdm,\r\n isAdmOrSubAdm,\r\n isCambistaTalao,\r\n isCambista,\r\n isDigitadorAdm,\r\n isDigitador,\r\n isDigitadorOrDigitadorAdm,\r\n hasPermissionToSendToAssociation,\r\n};\r\n","import { TypeUser } from \"../../types\";\r\n\r\nexport const getLimitsRest = (user: TypeUser) => {\r\n\r\n let hoje = 0;\r\n let pre = 0;\r\n \r\n Object.values(user.jogos.hoje).forEach((value) => hoje += value);\r\n Object.values(user.jogos.pre).forEach((value) => pre += value);\r\n\r\n return {\r\n hoje,\r\n pre\r\n }\r\n}","export * from \"./generateDescarga\";\r\nexport * from \"./generateDescargas\";\r\nexport * from \"./getDescargaIdPeloNumero\";\r\nexport * from \"./sortDescargas\";\r\nexport * from \"./getDescargasAcimaDoLimite\";\r\nexport * from \"./getPropsVPDescarga\";\r\nexport * from \"./getPropsEnvioIdDescarga\";\r\nexport * from \"./getPropsEnvioIdOldDescarga\";\r\nexport * from \"./getDescargaIdPeloEnvio\"\r\nexport * from \"./getTotalGeralDescarga\";\r\nexport * from \"./sortDescargasByEnvioId\";","import { GAMES } from \"../../constants\";\r\nimport { TypeDescargas } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortDescargas = (descargas: TypeDescargas): TypeDescargas => {\r\n const sortedDescargas = Object.values(descargas).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n \r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n \r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return b.amount - a.amount;\r\n });\r\n \r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeDescargas;\r\n };\r\n ","import { arrendondarCasasDecimais, functionsCore } from \"..\";\r\nimport { TypeDescarga, TypeLimitGames, TypeResultadoDescargaComDiferenca, TypeValueGames } from \"../../types\";\r\n\r\nexport const getDescargasAcimaDoLimite = (\r\n descargas: TypeDescarga[],\r\n valoresJogos: TypeValueGames,\r\n limitesJogos: TypeLimitGames\r\n): TypeResultadoDescargaComDiferenca[] => {\r\n return descargas\r\n .map((descarga) => {\r\n const valorJogo = functionsCore.limite_jogos.getValorJogoPeloTipoJogo(\r\n valoresJogos,\r\n descarga.tipo_jogo\r\n );\r\n\r\n const limiteJogo = Object.values(limitesJogos).find(\r\n (v) => v.type_game === descarga.tipo_jogo\r\n );\r\n\r\n const limiteAtingido =\r\n functionsCore.limite_jogos.calcularValorJogoPeloLimite(\r\n limiteJogo?.limit || 0,\r\n valorJogo?.value || 0\r\n );\r\n\r\n const amountArredondado = arrendondarCasasDecimais(descarga.amount);\r\n const limiteAtingidoArredondado = arrendondarCasasDecimais(limiteAtingido);\r\n\r\n const diferenca = amountArredondado - limiteAtingidoArredondado;\r\n\r\n if (amountArredondado > limiteAtingidoArredondado) {\r\n return {\r\n descarga,\r\n diferenca,\r\n };\r\n }\r\n\r\n return null;\r\n })\r\n .filter(Boolean) as TypeResultadoDescargaComDiferenca[];\r\n};\r\n","import { PREFIX_NUMBER } from \"../../constants\";\r\nimport { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsVPDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (array.includes(PREFIX_NUMBER) && typeof value === \"number\") {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioId = (\r\n descarga: Partial<TypeDescarga>\r\n): { [props: string]: number } => {\r\n const objeto: { [props: string]: number } = {};\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n !array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};\r\n","import { TypeDescarga } from \"../../types\";\r\n\r\nexport const getPropsEnvioIdOldDescarga = (descarga: Partial<TypeDescarga>): { [props: string]: number } => {\r\n\r\n const objeto: { [props: string]: number } = {}\r\n\r\n Object.entries(descarga).forEach(([key, value]) => {\r\n const array = key.split(\"_\");\r\n\r\n if (\r\n array.includes(\"envio\") &&\r\n array.includes(\"old\") &&\r\n typeof value === \"number\"\r\n ) {\r\n objeto[key] = value;\r\n }\r\n });\r\n\r\n return objeto;\r\n};","import { PREFIX_ENVIO_OLD } from \"../../constants\";\r\nimport { TypeNumero } from \"../../types\";\r\nimport { arredondarParaCima } from \"../numbers\";\r\n\r\n/**\r\n * Gera um ID de descarga único baseado no envio do número fornecido\r\n * \r\n * Esta função cria um identificador único para uma descarga combinando várias propriedades\r\n * do número de aposta e o ID do envio. O ID é formado pela concatenação de: bancaId (opcional),\r\n * dataAposta, tipo_jogo, premio, valor arredondado do envio e envioId.\r\n * \r\n * @param numero - O número de aposta que será usado para gerar o ID\r\n * @param envioId - ID do envio para buscar o valor específico\r\n * @returns Uma string única identificando a descarga\r\n * @throws {Error} Se o valor do envio não existir ou for inválido\r\n * \r\n * @example\r\n * ```ts\r\n * const numero = {\r\n * bancaId: 'banca1',\r\n * dataAposta: 20240627140000,\r\n * tipo_jogo: 'milhar',\r\n * premio: \"1\",\r\n * envio_old_123: 15.50\r\n * };\r\n * const descargaId = getDescargaIdPeloEnvio(numero, '123');\r\n * // Resultado: \"banca1_20240627140000_milhar_1_15.5_envio_123\"\r\n * ```\r\n */\r\nexport const getDescargaIdPeloEnvio = (\r\n numero: TypeNumero,\r\n envioId: string\r\n): string => {\r\n const envioKey = `${PREFIX_ENVIO_OLD}${envioId}` as keyof TypeNumero;\r\n const envioValue = numero[envioKey];\r\n\r\n if (envioValue === undefined || envioValue === null) {\r\n throw new Error(`Valor do envio '${envioId}' não encontrado no número.`);\r\n }\r\n\r\n if (typeof envioValue !== \"number\") {\r\n throw new Error(`Valor do envio '${envioId}' deve ser um número.`);\r\n }\r\n\r\n const somaArredondada = arredondarParaCima(envioValue);\r\n\r\n const descargaId =\r\n `${numero?.bancaId ? `${numero?.bancaId}_` : \"\"}` +\r\n `${numero.dataAposta}_${numero.tipo_jogo}_${numero.premio}_${somaArredondada}_envio_${envioId}`;\r\n\r\n return descargaId;\r\n};\r\n","import { COMISSOES_PADRAO } from \"../../constants\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga, TypeTotalGeral } from \"../../types\";\r\n\r\n/**\r\n * @description Calcula o total geral de uma descarga aplicando comissões específicas\r\n * @param totalBrutoJogos - Objeto com totais brutos por tipo de jogo\r\n * @param comissoes - Objeto com comissões configuradas por tipo de jogo\r\n * @returns Objeto com totais calculados, jogos processados e comissões aplicadas\r\n */\r\nexport const getTotalGeralDescarga = (\r\n totalBrutoJogos: TypeEnvioDescarga[\"totalGeralJogos\"],\r\n comissoes: TypeComissoesDescarga\r\n): TypeTotalGeral => {\r\n // Inicializa o objeto de retorno com estrutura vazia\r\n // Este objeto será preenchido durante o processamento\r\n const totalGeral: TypeTotalGeral = {\r\n jogos: {}, // Objeto que armazenará os dados processados de cada tipo de jogo\r\n totalBruto: 0, // Soma total de todos os valores enviados (antes das comissões)\r\n totalLiquido: 0, // Soma total após descontar todas as comissões\r\n totalComissao: 0, // Soma total de todas as comissões calculadas\r\n };\r\n\r\n // Converte o objeto totalBrutoJogos em array de [chave, valor] para facilitar iteração\r\n // Permite processar cada tipo de jogo individualmente\r\n const totalBrutoJogosArray = Object.entries(totalBrutoJogos);\r\n\r\n // Extrai apenas os valores das comissões (ignora as chaves dos IDs)\r\n // Facilita a busca por comissões específicas por tipo de jogo\r\n const listaComissoes = Object.values(comissoes);\r\n\r\n // Busca a comissão específica para jogos \"restante\" (jogos sem comissão específica)\r\n // Esta comissão será aplicada a todos os jogos que não têm comissão individual\r\n const comissaoRestante = listaComissoes.find(\r\n (comissao) => comissao.type_game === \"restante\"\r\n );\r\n\r\n // Itera sobre cada tipo de jogo e seus valores\r\n // Processa cada jogo individualmente para aplicar comissões específicas\r\n for (const [type_game, jogo] of totalBrutoJogosArray) {\r\n // Operador Nullish Coalescing (??) - converte undefined/null para 0\r\n // Garante que sempre temos um número válido para calcular, evitando erros\r\n const valorJogo = jogo ?? 0;\r\n\r\n // Busca se existe uma comissão específica para este tipo de jogo\r\n // Se não encontrar, o jogo será agrupado no \"restante\"\r\n const comissaoEncontrada = listaComissoes.find(\r\n (comissao) => type_game === comissao.type_game\r\n );\r\n\r\n // Sempre soma o valor bruto (antes de qualquer desconto)\r\n // Este valor representa o total enviado para este tipo de jogo\r\n totalGeral.totalBruto += valorJogo;\r\n\r\n // Verifica se encontrou uma comissão específica para este tipo de jogo\r\n if (comissaoEncontrada) {\r\n // Busca as informações padrão do jogo (ordem, label) nas constantes\r\n // Usa type assertion para acessar as propriedades do COMISSOES_PADRAO\r\n const comissaoPadrao =\r\n COMISSOES_PADRAO[type_game as keyof typeof COMISSOES_PADRAO];\r\n\r\n // Calcula o valor da comissão: valor * (porcentagem / 100)\r\n // Aplica a porcentagem configurada para este tipo de jogo\r\n const totalComissao = valorJogo * (comissaoEncontrada.porcentagem / 100);\r\n \r\n // Calcula o valor líquido: valor bruto - comissão\r\n // Este é o valor que efetivamente fica para o jogo\r\n const totalLiquido = valorJogo - totalComissao;\r\n\r\n // Armazena os dados calculados para este tipo de jogo\r\n // Cria a estrutura completa com todos os dados necessários\r\n totalGeral.jogos[type_game] = {\r\n totalEnviado: valorJogo, // Valor original enviado (antes da comissão)\r\n totalComissao: totalComissao, // Valor da comissão calculada\r\n totalLiquido: totalLiquido, // Valor após desconto da comissão\r\n ordem: comissaoPadrao?.order || 0, // Ordem de exibição (do COMISSOES_PADRAO)\r\n tipo: type_game as keyof typeof COMISSOES_PADRAO, // Tipo do jogo\r\n label: comissaoPadrao?.label || type_game, // Nome amigável do jogo\r\n };\r\n\r\n // Soma os valores calculados aos totais gerais\r\n // Acumula os valores para o resultado final\r\n totalGeral.totalLiquido += totalLiquido;\r\n totalGeral.totalComissao += totalComissao;\r\n } else {\r\n // Lógica para jogos sem comissão específica (grupo \"restante\")\r\n // Todos os jogos que não têm comissão individual são agrupados aqui\r\n \r\n // Se ainda não existe o grupo \"restante\", cria ele\r\n // Inicializa com valores zerados para acumular posteriormente\r\n if (!totalGeral.jogos[\"restante\"]) {\r\n totalGeral.jogos[\"restante\"] = {\r\n totalEnviado: 0, // Inicializa com 0 para acumular\r\n totalLiquido: 0, // Inicializa com 0 para acumular\r\n totalComissao: 0, // Inicializa com 0 para acumular\r\n ordem: 9, // Ordem fixa para o grupo restante (sempre por último)\r\n tipo: \"restante\", // Tipo fixo para identificação\r\n label: \"Restante\", // Label fixo para exibição\r\n };\r\n }\r\n\r\n // Soma o valor enviado ao total do grupo restante\r\n // Acumula todos os valores dos jogos sem comissão específica\r\n totalGeral.jogos[\"restante\"].totalEnviado += valorJogo;\r\n\r\n // Verifica se existe comissão para o grupo \"restante\"\r\n if (comissaoRestante) {\r\n // Calcula comissão para o grupo restante\r\n // Aplica a porcentagem configurada para jogos sem comissão específica\r\n const comissao = valorJogo * (comissaoRestante.porcentagem / 100);\r\n \r\n // Calcula valor líquido para o grupo restante\r\n // Valor bruto menos a comissão aplicada\r\n const totalLiquido = valorJogo - comissao;\r\n \r\n // Soma os valores ao grupo restante\r\n // Acumula os valores calculados\r\n totalGeral.jogos[\"restante\"].totalLiquido += totalLiquido;\r\n totalGeral.jogos[\"restante\"].totalComissao += comissao;\r\n \r\n // Soma os valores aos totais gerais\r\n // Contribui para os totais finais da descarga\r\n totalGeral.totalLiquido += totalLiquido;\r\n totalGeral.totalComissao += comissao;\r\n } else {\r\n // Sem comissão para restante -> valor líquido = valor bruto\r\n // Se não há comissão configurada, o valor líquido é igual ao bruto\r\n totalGeral.jogos[\"restante\"].totalLiquido += valorJogo;\r\n totalGeral.totalLiquido += valorJogo;\r\n }\r\n }\r\n }\r\n\r\n // Retorna o objeto com todos os cálculos realizados\r\n return totalGeral;\r\n};\r\n","import { GAMES, PREFIX_ENVIO_OLD } from \"../../constants\";\r\nimport { TypeDescargas } from \"../../types\";\r\n\r\n// Função de ordenação\r\nexport const sortDescargasByEnvioId = (descargas: TypeDescargas, envioId: string): TypeDescargas => {\r\n const sortedDescargas = Object.values(descargas).sort((a, b) => {\r\n // Ordena por tipo de jogo (ordem alfabética)\r\n\r\n const ORDER_GAME_A = GAMES[a.tipo_jogo].order\r\n const ORDER_GAME_B = GAMES[b.tipo_jogo].order\r\n\r\n if (ORDER_GAME_A < ORDER_GAME_B) return -1;\r\n if (ORDER_GAME_A > ORDER_GAME_B) return 1;\r\n \r\n // Ordena por prêmio (ordem numérica)\r\n if (a.premio < b.premio) return -1;\r\n if (a.premio > b.premio) return 1;\r\n \r\n // Ordena por valor da aposta (amount) (ordem numérica)\r\n return b[`${PREFIX_ENVIO_OLD}${envioId}`] - a[`${PREFIX_ENVIO_OLD}${envioId}`];\r\n });\r\n \r\n // Retorna o objeto ordenado com a estrutura de TypeDescargas\r\n return Object.fromEntries(\r\n sortedDescargas.map((item) => [item.id, item])\r\n ) as TypeDescargas;\r\n };\r\n ","export * from './agruparEnvioPorExtracao';\r\nexport * from './criarEstruturaJogo';\r\nexport * from './getComissoesDoEnvio';","import { TypeJogoComComissao } from \"../../types\";\r\n\r\n/**\r\n * @description Cria uma estrutura de jogo com comissão a partir dos dados fornecidos\r\n * Esta função é responsável por criar um objeto TypeJogoComComissao completo\r\n * com todas as propriedades necessárias para representar um jogo processado\r\n * \r\n * @param _jogoId - ID do jogo (não utilizado, mas mantido para compatibilidade)\r\n * @param jogoData - Dados do jogo com comissão já calculada pela função getTotalGeralDescarga\r\n * @returns Objeto TypeJogoComComissao com estrutura completa do jogo\r\n */\r\nexport const criarEstruturaJogo = (_jogoId: string, jogoData: TypeJogoComComissao): TypeJogoComComissao => {\r\n return {\r\n totalEnviado: jogoData.totalEnviado, // Valor total enviado para o jogo (antes das comissões)\r\n totalLiquido: jogoData.totalLiquido, // Valor líquido após descontar comissões\r\n totalComissao: jogoData.totalComissao, // Valor total das comissões aplicadas\r\n ordem: jogoData.ordem, // Ordem de exibição do jogo (definida no COMISSOES_PADRAO)\r\n tipo: jogoData.tipo, // Tipo do jogo (milhar, centena, restante, etc.)\r\n label: jogoData.label, // Nome amigável do jogo para exibição na interface\r\n };\r\n };","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeComissaoDescarga } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ComissaoDescargaModel = (\r\n obj: Partial<TypeComissaoDescarga> = {}\r\n): TypeComissaoDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n porcentagem: obj?.porcentagem || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { ComissaoDescargaModel } from \"../../models/ComissaoDescargaModel\";\r\nimport { TypeComissoesDescarga, TypeEnvioDescarga } from \"../../types\";\r\nimport { generateId } from \"../../utils/generateId\";\r\n\r\nexport const getComissoesDoEnvio = (\r\n comissoesDescarga: TypeEnvioDescarga[\"comissoesDescarga\"]\r\n): TypeComissoesDescarga => {\r\n const comissoes: TypeComissoesDescarga = {};\r\n\r\n for (const comissao of comissoesDescarga) {\r\n const comissaoModel = ComissaoDescargaModel({\r\n ...comissao,\r\n id: comissao.id || generateId(),\r\n });\r\n comissoes[comissaoModel.id] = comissaoModel;\r\n }\r\n\r\n return comissoes;\r\n};\r\n","import { TypeEnvioDescargas, TypeEnviosExtracao, TypeJogoComComissao } from \"../../types\";\r\nimport { getTotalGeralDescarga } from \"../descarga\";\r\nimport { criarEstruturaJogo } from \"./criarEstruturaJogo\";\r\nimport { getComissoesDoEnvio } from \"./getComissoesDoEnvio\";\r\n\r\nexport const agruparEnvioPorExtracao = ({\r\n envios,\r\n}: {\r\n envios: TypeEnvioDescargas;\r\n}): TypeEnviosExtracao[] => {\r\n const enviosExtracao: TypeEnviosExtracao[] = [];\r\n\r\n const enviosLista = Object.values(envios);\r\n\r\n for (const envio of enviosLista) {\r\n\r\n const comissoes = getComissoesDoEnvio(envio.comissoesDescarga);\r\n\r\n const extracaoId = envio.extracao.id;\r\n\r\n const envioExtracao = enviosExtracao.find(\r\n (envioExtracao) => envioExtracao.extracao.id === extracaoId\r\n );\r\n\r\n const totalGeral = getTotalGeralDescarga(\r\n envio.totalGeralJogos,\r\n comissoes\r\n );\r\n\r\n // Se não existe agrupamento para esta extração, cria um novo\r\n if (!envioExtracao) {\r\n enviosExtracao.push({\r\n extracao: envio.extracao, // Informações da extração\r\n jogos: Object.entries(totalGeral.jogos).reduce(\r\n (acc, [jogoId, jogoData]) => {\r\n // Cria a estrutura do jogo com todos os dados necessários\r\n acc[jogoId] = criarEstruturaJogo(jogoId, jogoData);\r\n return acc;\r\n },\r\n {} as Record<string, TypeJogoComComissao>\r\n ),\r\n totalBruto: totalGeral.totalBruto, // Total bruto da extração\r\n totalLiquido: totalGeral.totalLiquido, // Total líquido da extração\r\n totalComissao: totalGeral.totalComissao, // Total de comissões da extração\r\n });\r\n } else {\r\n // Se já existe agrupamento para esta extração, consolida os valores\r\n // Itera sobre cada jogo do total geral para somar aos existentes\r\n for (const [jogoId, jogoData] of Object.entries(totalGeral.jogos)) {\r\n const jogos = envioExtracao.jogos; // Type assertion para acesso dinâmico\r\n if (jogos[jogoId]) {\r\n // Se o jogo já existe no agrupamento, soma os valores\r\n jogos[jogoId] = {\r\n totalEnviado: Number(jogos[jogoId].totalEnviado) + Number(jogoData.totalEnviado), // Soma total enviado\r\n totalLiquido: Number(jogos[jogoId].totalLiquido) + Number(jogoData.totalLiquido), // Soma total líquido\r\n totalComissao: Number(jogos[jogoId].totalComissao) + Number(jogoData.totalComissao), // Soma comissões\r\n ordem: jogoData.ordem, // Atualiza ordem (pode ser diferente)\r\n tipo: jogoData.tipo, // Atualiza tipo (pode ser diferente)\r\n label: jogoData.label, // Atualiza label (pode ser diferente)\r\n };\r\n } else {\r\n // Se o jogo não existe no agrupamento, adiciona como novo\r\n jogos[jogoId] = criarEstruturaJogo(jogoId, jogoData);\r\n }\r\n }\r\n // Soma os totais gerais ao agrupamento existente\r\n envioExtracao.totalBruto += Number(totalGeral.totalBruto); // Acumula total bruto\r\n envioExtracao.totalLiquido += Number(totalGeral.totalLiquido); // Acumula total líquido\r\n envioExtracao.totalComissao += Number(totalGeral.totalComissao); // Acumula total comissões\r\n }\r\n }\r\n\r\n return enviosExtracao;\r\n};\r\n","import * as numbers from './numbers';\r\nimport * as extracao from './extracao';\r\nimport * as games from './games';\r\nimport * as users from './users';\r\nimport * as limite_jogos from './limite_jogos';\r\nimport * as descarga from './descarga';\r\nimport * as utils from '../utils';\r\nimport * as envio from './envio';\r\n\r\nexport * from './numbers';\r\nexport * from './extracao';\r\nexport * from './games';\r\nexport * from './users';\r\nexport * from './limite_jogos';\r\nexport * from './envio';\r\n/**\r\n * @description Objeto que contém todas as funções do core, facilitando a importação e organização do código.\r\n*/\r\nexport const functionsCore = {\r\n numbers,\r\n extracao,\r\n descarga,\r\n games,\r\n users,\r\n limite_jogos,\r\n utils,\r\n envio\r\n};\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeMessage } from \"../types/message.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const MessageModel = (obj?: Partial<TypeMessage>): TypeMessage => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n content: obj?.content || \"\",\r\n visualizacao: obj?.visualizacao || \"jogo_hoje\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n date: {\r\n from: obj?.date?.from || 0,\r\n to: obj?.date?.to || 0,\r\n },\r\n fixa: obj?.date?.to === 0 || obj?.date?.from === 0,\r\n tipo: obj?.tipo || [],\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultado } from \"../types/resultado.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoModel = (\r\n obj?: Partial<TypeResultado>\r\n): TypeResultado => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n description: obj?.extracao?.description || \"\",\r\n },\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n liberado: obj?.liberado ?? false,\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeRoute } from \"../types/rota.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const RouteModel = (obj?: Partial<TypeRoute>): TypeRoute => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n comission: obj?.comission ?? 0,\r\n name: obj?.name || \"\",\r\n responsible: obj?.responsible || \"\",\r\n codigo_rota: obj?.codigo_rota || \"\",\r\n tipo: obj?.tipo || \"cambista\",\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { GAMES, ROLES } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeUser } from \"../types/user.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const UserModel = (obj?: Partial<TypeUser>): TypeUser => ({\r\n id: obj?.id ?? \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n active: obj?.active ?? true,\r\n bet_limit: obj?.bet_limit ?? 0,\r\n comission: obj?.comission ?? 0,\r\n bancaId: obj?.bancaId || \"\",\r\n photoURL: obj?.photoURL || \"\",\r\n ultimaPule: obj?.ultimaPule || 0,\r\n name: obj?.name || \"\",\r\n sessionId: obj?.sessionId || \"\",\r\n codigo_cambista: obj?.codigo_cambista || \"\",\r\n deviceId: obj?.deviceId || \"\",\r\n role: obj?.role || ROLES.cambista.id,\r\n pre_date_limit: obj?.pre_date_limit || 0,\r\n dispositivos: {\r\n dispositivoIdAtual: obj?.dispositivos?.dispositivoIdAtual || \"\",\r\n listaDispositivosConectados:\r\n obj?.dispositivos?.listaDispositivosConectados || [],\r\n },\r\n route: {\r\n id: obj?.route?.id || \"\",\r\n name: obj?.route?.name || \"\",\r\n tipo: obj?.route?.tipo || ROLES.cambista.id,\r\n codigo_rota: obj?.route?.codigo_rota || \"\",\r\n id_integer: obj?.route?.id_integer || \"\",\r\n },\r\n type_games: obj?.type_games\r\n ? obj?.type_games.filter((type) => GAMES?.[type]?.id)\r\n : [],\r\n login: obj?.login || \"\",\r\n jogos: {\r\n hoje: obj?.jogos?.hoje || {},\r\n pre: obj?.jogos?.pre || {},\r\n },\r\n preferences: {\r\n darkMode: obj?.preferences?.darkMode ?? false,\r\n pdfLegado: obj?.preferences?.pdfLegado ?? false,\r\n },\r\n permissoes: {\r\n podeDigitar: obj?.permissoes?.podeDigitar ?? true,\r\n podeEditarBanca: obj?.permissoes?.podeEditarBanca ?? false,\r\n podeEnviarParaAssociacao: obj?.permissoes?.podeEnviarParaAssociacao ?? false,\r\n podeCancelarPule: obj?.permissoes?.podeCancelarPule ?? false,\r\n podeReservar: obj?.permissoes?.podeReservar ?? true,\r\n podeJogarSurpresinha: obj?.permissoes?.podeJogarSurpresinha ?? true,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeValueGame } from \"../types/value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ValueGameModel = (\r\n obj?: Partial<TypeValueGame>\r\n): TypeValueGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n value: obj?.value ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_PULE } from \"../constants/STATUS_PULE\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeGame } from \"../types\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { getCodigoAuth } from \"../utils/getCodigoAuth\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES } from \"../constants\";\r\n\r\nexport const GameModel = (obj: Partial<TypeGame> = {}): TypeGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n origem_pule_id: obj?.origem_pule_id || \"\",\r\n bets: obj.bets || [], // Array de TypeGameValues\r\n creator: {\r\n id: obj?.creator?.id || \"\",\r\n id_integer: obj?.creator?.id_integer || \"\",\r\n codigo_cambista: obj?.creator?.codigo_cambista || \"\",\r\n name: obj?.creator?.name || \"\",\r\n role: obj?.creator?.role || ROLES.cambista.id,\r\n login: obj?.creator?.login || \"\",\r\n comission: obj?.creator?.comission || 0,\r\n route: {\r\n id: obj?.creator?.route?.id || \"\",\r\n id_integer: obj?.creator?.route?.id_integer || \"\",\r\n codigo_rota: obj?.creator?.route?.codigo_rota || \"\",\r\n name: obj?.creator?.route?.name || \"\",\r\n tipo: obj?.creator?.route?.tipo || ROLES.cambista.id,\r\n }\r\n }, \r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n totalAmount: obj?.totalAmount || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n codigoAuth: obj?.codigoAuth || getCodigoAuth(100000, 999999).toString(),\r\n cancel: {\r\n canceled: obj?.cancel?.canceled ?? false,\r\n canceledAt: obj?.cancel?.canceledAt || 0,\r\n reason: obj?.cancel?.reason || \"\",\r\n canceledBy: {\r\n id: obj?.cancel?.canceledBy?.id || \"\",\r\n id_integer: obj?.cancel?.canceledBy?.id_integer || \"\",\r\n name: obj?.cancel?.canceledBy?.name || \"\",\r\n login: obj?.cancel?.canceledBy?.login || \"\",\r\n role: obj?.cancel?.canceledBy?.role || ROLES.cambista.id,\r\n }\r\n },\r\n valorNumerosNaPule: obj?.valorNumerosNaPule || {},\r\n infoJogos: obj?.infoJogos || [],\r\n tiposJogos: obj?.tiposJogos || {},\r\n reservada: obj?.reservada || false,\r\n dias_disponiveis: obj?.dias_disponiveis || [],\r\n dateBet: obj?.dateBet || 0,\r\n status: obj.status || STATUS_PULE.JOGADA.id, // Pega um valor padrão de STATUS_PULE\r\n statusReason: obj?.statusReason || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { TypeNumero } from \"../types/numero.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { getCreatedBySystem, getPropsPrefix } from \"../functions\";\r\n\r\nexport const NumberModel = (obj: Partial<TypeNumero> = {}): TypeNumero => {\r\n\r\n const ordemPremioExibicao = PREMIOS[obj?.premio as keyof typeof PREMIOS || \"1\"].order;\r\n const ordemJogoExibicao = GAMES[obj?.tipo_jogo as keyof typeof GAMES || \"milhar\"].order;\r\n \r\n let baseModel: TypeNumero = {\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n envioIds: obj?.envioIds || [],\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n numero: obj?.numero || \"\",\r\n amount: obj?.amount || 0,\r\n premio: obj?.premio || \"1\",\r\n bancaId: obj?.bancaId || \"\",\r\n valorArredondado: obj?.valorArredondado || 0,\r\n limiteJogoReal: obj?.limiteJogoReal || 0,\r\n limiteJogoSimulado: obj?.limiteJogoSimulado || 0,\r\n valorJogo: obj?.valorJogo || 0,\r\n amountEnviadoParaAssociacao: obj?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: obj?.valorAEnviarParaAssociacao || 0,\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n descarregado: obj?.descarregado ?? false,\r\n dataAposta: obj?.dataAposta || 0,\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(obj);\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import { TypeBet } from \"../types/bet.type\";\r\n\r\nexport const BetModel = (obj: Partial<TypeBet> = {}): TypeBet => ({\r\n name: obj?.name || \"milhar\",\r\n numbers: obj?.numbers || [],\r\n prizes: obj?.prizes || [],\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoModel = (\r\n obj: Partial<TypePremiacao> = {}\r\n): TypePremiacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n tipo: obj?.tipo || \"cambista\",\r\n \r\n // Informações da pule relacionada\r\n pule: {\r\n // ID da pule\r\n id: obj?.pule?.id || \"\",\r\n\r\n // ID incremental da pule\r\n id_integer: obj?.pule?.id_integer || \"\",\r\n \r\n // Data de criação da pule\r\n created: obj?.pule?.created || 0,\r\n \r\n // Informações de cancelamento da pule\r\n cancel: {\r\n // Se a pule foi cancelada\r\n canceled: obj?.pule?.cancel?.canceled || false,\r\n \r\n // Data do cancelamento\r\n canceledAt: obj?.pule?.cancel?.canceledAt || 0,\r\n \r\n // Motivo do cancelamento\r\n reason: obj?.pule?.cancel?.reason || \"\",\r\n\r\n canceledBy: {\r\n id: obj?.pule?.cancel?.canceledBy?.id || \"\",\r\n id_integer: obj?.pule?.cancel?.canceledBy?.id_integer || \"\",\r\n name: obj?.pule?.cancel?.canceledBy?.name || \"\",\r\n login: obj?.pule?.cancel?.canceledBy?.login || \"\",\r\n role: obj?.pule?.cancel?.canceledBy?.role || \"cambista\",\r\n }\r\n },\r\n \r\n createdBy: {\r\n id: obj?.pule?.createdBy?.id || \"\",\r\n id_integer: obj?.pule?.createdBy?.id_integer || \"\",\r\n role: obj?.pule?.createdBy?.role || \"cambista\",\r\n name: obj?.pule?.createdBy?.name || \"\",\r\n login: obj?.pule?.createdBy?.login || \"\",\r\n },\r\n \r\n // Informações do criador da pule\r\n creator: {\r\n // ID do criador\r\n id: obj?.pule?.creator?.id || \"\",\r\n \r\n // ID incremental do criador\r\n id_integer: obj?.pule?.creator?.id_integer || \"\",\r\n \r\n // Código do cambista\r\n codigo_cambista: obj?.pule?.creator?.codigo_cambista || \"\",\r\n \r\n // Login do criador\r\n login: obj?.pule?.creator?.login || \"\",\r\n \r\n // Nome do criador\r\n name: obj?.pule?.creator?.name || \"\",\r\n \r\n // Papel/função do criador\r\n role: obj?.pule?.creator?.role || \"cambista\",\r\n \r\n // Comissão do criador\r\n comission: obj?.pule?.creator?.comission || 0,\r\n \r\n // Informações da rota do criador\r\n route: {\r\n // ID da rota\r\n id: obj?.pule?.creator?.route?.id || \"\",\r\n \r\n // Nome da rota\r\n name: obj?.pule?.creator?.route?.name || \"\",\r\n \r\n // Tipo da rota\r\n tipo: obj?.pule?.creator?.route?.tipo || \"cambista\",\r\n\r\n codigo_rota: obj?.pule?.creator?.route?.codigo_rota || \"\",\r\n \r\n id_integer: obj?.pule?.creator?.route?.id_integer || \"\",\r\n },\r\n },\r\n },\r\n \r\n // Lista de itens premiados\r\n premiosItems: obj?.premiosItems || [],\r\n \r\n // Total que o cambista recebe\r\n valorTotalPremio: obj?.valorTotalPremio || 0,\r\n \r\n // Total que a banca recebe\r\n valorTotalPremioBanca: obj?.valorTotalPremioBanca || 0,\r\n \r\n // Total que a associação recebe\r\n valorTotalPremioAssociacao: obj?.valorTotalPremioAssociacao || 0,\r\n \r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePDFDescargas } from \"../types\";\r\n\r\nexport const PDFModel = (\r\n obj: Partial<TypePDFDescargas> = {}\r\n): TypePDFDescargas => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n descargas: obj?.descargas || {},\r\n link_pdf: obj?.link_pdf || \"\",\r\n bancaId: obj.bancaId || \"\",\r\n visualizado: obj?.visualizado || false,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || 0,\r\n updated: obj?.updated || 0,\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeBanca } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const BancaModel = (obj: Partial<TypeBanca> = {}): TypeBanca => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n nome: obj?.nome || \"\",\r\n codigo_banca: obj?.codigo_banca || \"\",\r\n settings: { \r\n urlLogo: obj?.settings?.urlLogo || \"\",\r\n urlLogoPretoBranco: obj?.settings?.urlLogoPretoBranco || \"\",\r\n logoBase64: obj?.settings?.logoBase64 || \"\",\r\n logoImpressaoBase64: obj?.settings?.logoImpressaoBase64 || \"\",\r\n urlBackground: obj?.settings?.urlBackground || \"\",\r\n color: obj?.settings?.color || \"\",\r\n preencherPremiosAPartirDe: obj?.settings?.preencherPremiosAPartirDe ?? 0,\r\n },\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\nimport { TypeAuditLog } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const AuditLogModel = (obj: Partial<TypeAuditLog> = {}): TypeAuditLog => ({\r\n id: obj?.id || '',\r\n tipo: obj?.tipo || 'add',\r\n bancaId: obj?.bancaId || '',\r\n message: obj?.message || '',\r\n colecao: obj?.colecao || '',\r\n documentId: obj?.documentId || '',\r\n author: getCreatedBySystem(obj?.author),\r\n document: obj?.document || {},\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeLimitGame } from \"../types/limit_value_type_game.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimitGameModel = (\r\n obj?: Partial<TypeLimitGame>\r\n): TypeLimitGame => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n type_game: obj?.type_game || \"milhar\",\r\n bancaId: obj?.bancaId || \"\",\r\n limit: obj?.limit ?? 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { STATUS_DESCARGA } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeEnvioDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const EnvioDescargaModel = (\r\n obj?: Partial<TypeEnvioDescarga>\r\n): TypeEnvioDescarga => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n visualizado: obj?.visualizado || false,\r\n pdf_url: obj?.pdf_url || \"\",\r\n pdf_associacao_url: obj?.pdf_associacao_url || \"\",\r\n banca: {\r\n id: obj?.banca?.id || \"\",\r\n nome: obj?.banca?.nome || \"\",\r\n },\r\n dataAposta: obj?.dataAposta || 0,\r\n totalGeralJogos: {\r\n [\"milhar\"]: obj?.totalGeralJogos?.[\"milhar\"] ?? 0,\r\n [\"centena\"]: obj?.totalGeralJogos?.[\"centena\"] || 0,\r\n [\"dezena\"]: obj?.totalGeralJogos?.[\"dezena\"] || 0,\r\n [\"grupo\"]: obj?.totalGeralJogos?.[\"grupo\"] || 0,\r\n [\"terno.dezena\"]: obj?.totalGeralJogos?.[\"terno.dezena\"] || 0,\r\n [\"terno.grupo\"]: obj?.totalGeralJogos?.[\"terno.grupo\"] || 0,\r\n [\"duque.dezena\"]: obj?.totalGeralJogos?.[\"duque.dezena\"] || 0,\r\n [\"duque.grupo\"]: obj?.totalGeralJogos?.[\"duque.grupo\"] || 0,\r\n },\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n horario: obj?.extracao?.horario || 0,\r\n },\r\n devolvidoPor: {\r\n id: obj?.devolvidoPor?.id || \"\",\r\n id_integer: obj?.devolvidoPor?.id_integer || \"\",\r\n name: obj?.devolvidoPor?.name || \"\",\r\n login: obj?.devolvidoPor?.login || \"\",\r\n },\r\n bancaId: obj?.bancaId || \"\",\r\n description: obj?.description || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n status: obj?.status || STATUS_DESCARGA.ENVIANDO.id,\r\n totalEnviados: obj?.totalEnviados || 0,\r\n totalRegistros: obj?.totalRegistros || 0,\r\n progresso: obj?.progresso || 0,\r\n mensagem: obj?.mensagem || \"\",\r\n concluidoEm: obj?.concluidoEm || 0,\r\n ultimaAtualizacao: obj?.ultimaAtualizacao || 0,\r\n metricas: {\r\n tempoMinimo: obj?.metricas?.tempoMinimo || 0,\r\n tempoMaximo: obj?.metricas?.tempoMaximo || 0,\r\n tempoMedio: obj?.metricas?.tempoMedio || 0,\r\n duracaoTotal: obj?.metricas?.duracaoTotal || 0,\r\n tempoEstimado: obj?.metricas?.tempoEstimado || 0,\r\n velocidadeProcessamento: obj?.metricas?.velocidadeProcessamento || 0,\r\n textosFormatados: {\r\n duracaoTotalText: obj?.metricas?.textosFormatados?.duracaoTotalText || \"\",\r\n tempoMinimoText: obj?.metricas?.textosFormatados?.tempoMinimoText || \"\",\r\n tempoMaximoText: obj?.metricas?.textosFormatados?.tempoMaximoText || \"\",\r\n tempoMedioText: obj?.metricas?.textosFormatados?.tempoMedioText || \"\",\r\n tempoEstimadoText:\r\n obj?.metricas?.textosFormatados?.tempoEstimadoText || \"\",\r\n },\r\n },\r\n atualizadoEm: obj?.atualizadoEm || 0,\r\n erro: obj?.erro || \"\",\r\n iniciadoEm: obj?.iniciadoEm || 0,\r\n user: {\r\n id: obj?.user?.id || \"\",\r\n id_integer: obj?.user?.id_integer || \"\",\r\n name: obj?.user?.name || \"\",\r\n login: obj?.user?.login || \"\",\r\n },\r\n valoresJogos: obj?.valoresJogos || [],\r\n limitesJogos: obj?.limitesJogos || [],\r\n comissoesDescarga: obj?.comissoesDescarga || [],\r\n});\r\n","import { GAMES, PREFIX_ENVIO, PREFIX_ENVIO_OLD, PREFIX_NUMBER, PREMIOS } from \"../constants\";\r\nimport { getPropsPrefix } from \"../functions\";\r\nimport { getCreatedBySystem } from \"../functions/numbers/getCreatedBySystem\";\r\n\r\nimport { TypeDescarga } from \"../types\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\n\r\nexport const DescargaModel = (\r\n descarga: Partial<TypeDescarga> = {}\r\n): TypeDescarga => {\r\n const ordemPremioExibicao =\r\n PREMIOS[(descarga?.premio as keyof typeof PREMIOS) || \"1\"].order;\r\n const ordemJogoExibicao =\r\n GAMES[(descarga?.tipo_jogo as keyof typeof GAMES) || \"milhar\"].order;\r\n\r\n let baseDescarga: TypeDescarga = {\r\n id: descarga?.id || \"\",\r\n ordemJogoExibicao: ordemJogoExibicao,\r\n ordemPremioExibicao: ordemPremioExibicao,\r\n numeros: descarga?.numeros || [],\r\n quantidadeDeNumeros: descarga?.quantidadeDeNumeros || 0,\r\n bancaId: descarga?.bancaId || \"\",\r\n amountEnviadoParaAssociacao: descarga?.amountEnviadoParaAssociacao || 0,\r\n valorAEnviarParaAssociacao: descarga?.valorAEnviarParaAssociacao || 0,\r\n envioId: descarga?.envioId || \"\",\r\n amount: descarga?.amount || 0,\r\n limiteJogoReal: descarga?.limiteJogoReal || 0,\r\n limiteJogoSimulado: descarga?.limiteJogoSimulado || 0,\r\n valorJogo: descarga?.valorJogo || 0,\r\n valorArredondado: descarga?.valorArredondado || 0,\r\n dataAposta: descarga?.dataAposta || 0,\r\n premio: descarga?.premio || \"1\",\r\n tipo_jogo: descarga?.tipo_jogo || \"milhar\",\r\n createdBy: getCreatedBySystem(descarga?.createdBy),\r\n updated: descarga?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n created: descarga?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n };\r\n\r\n const propsPrefix = getPropsPrefix(descarga);\r\n\r\n baseDescarga = {\r\n ...baseDescarga,\r\n ...propsPrefix[PREFIX_NUMBER],\r\n ...propsPrefix[PREFIX_ENVIO],\r\n ...propsPrefix[PREFIX_ENVIO_OLD],\r\n };\r\n\r\n return baseDescarga;\r\n};\r\n","import { STATUS_DEVICE } from \"../constants\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { TypeDevice } from \"../types\";\r\nimport { dateToNumber, pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const DeviceModel = (obj: Partial<TypeDevice> = {}): TypeDevice => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n userId: obj?.userId || \"\",\r\n createdBy: obj?.createdBy || getCreatedBySystem(),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n deviceId: obj?.deviceId || \"\",\r\n id_integer_usuario: obj?.id_integer_usuario || \"\",\r\n operadora: obj?.operadora || \"\",\r\n rotaId: obj?.rotaId || \"\",\r\n codigo_usuario: obj?.codigo_usuario || \"\",\r\n nome_usuario: obj?.nome_usuario || \"\",\r\n versaoAndroid: obj?.versaoAndroid || \"\",\r\n iccid: obj?.iccid || \"\",\r\n bancaId: obj?.bancaId || \"\",\r\n rotaNome: obj?.rotaNome || \"\",\r\n deviceName: obj?.deviceName || \"\",\r\n status: obj?.status || STATUS_DEVICE.EM_ESPERA.id,\r\n ultimoLogin: obj?.ultimoLogin || 0,\r\n plataforma: obj?.plataforma || \"mobile\",\r\n ip: obj?.ip || \"\",\r\n versaoApp: obj?.versaoApp || \"\",\r\n});\r\n","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypePremiacaoAssociacao } from \"../types\";\r\nimport { dateToNumber } from \"../utils\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\n/**\r\n * Cria uma instância de premiação com valores padrão\r\n * \r\n * Esta função gera um objeto de premiação completo, preenchendo campos opcionais\r\n * com valores padrão apropriados. É usada para criar novas premiações ou\r\n * normalizar dados de premiação existentes.\r\n * \r\n * @param obj - Objeto parcial com dados da premiação (opcional)\r\n * @returns Objeto de premiação completo com todos os campos preenchidos\r\n * \r\n * @example\r\n * ```typescript\r\n * // Criar premiação vazia\r\n * const premiacao = PremiacaoModel();\r\n * \r\n * // Criar premiação com dados parciais\r\n * const premiacao = PremiacaoModel({\r\n * id: \"premio_123\",\r\n * bancaId: \"banca_456\",\r\n * valorTotalPremio: 10000\r\n * });\r\n * ```\r\n */\r\nexport const PremiacaoAssociacaoModel = (\r\n obj: Partial<TypePremiacaoAssociacao> = {}\r\n): TypePremiacaoAssociacao => ({\r\n // ID único da premiação\r\n id: obj?.id || \"\",\r\n \r\n // ID incremental por banca\r\n id_integer: obj?.id_integer || \"\",\r\n \r\n // Data da aposta em formato numérico\r\n dataAposta: obj?.dataAposta || 0,\r\n \r\n // ID da banca responsável\r\n bancaId: obj?.bancaId || \"\",\r\n\r\n numero: obj?.numero || \"\",\r\n\r\n premio: obj?.premio || \"\",\r\n\r\n tipo_jogo: obj?.tipo_jogo || \"milhar\",\r\n\r\n valorPremioAReceber: obj?.valorPremioAReceber || 0,\r\n\r\n valorEnviadoParaAssociacao: obj?.valorEnviadoParaAssociacao || 0,\r\n\r\n limiteTipoJogo: obj?.limiteTipoJogo || 0,\r\n\r\n valorTipoJogo: obj?.valorTipoJogo || 0,\r\n\r\n pulesGanhadoras: obj?.pulesGanhadoras || {},\r\n\r\n // Informações de quem criou o registro\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n \r\n // Data de criação do registro\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n \r\n // Data de última atualização do registro\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});\r\n","import { TypeGuia } from \"../types\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES, STATUS_GUIA } from \"../constants\";\r\n\r\nexport const GuiaModel = (obj?: Partial<TypeGuia>): TypeGuia => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n bancaId: obj?.bancaId || \"\", \r\n impresso: obj?.impresso || false,\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n },\r\n rota: {\r\n id: obj?.rota?.id || \"\",\r\n id_integer: obj?.rota?.id_integer || \"\",\r\n codigo_rota: obj?.rota?.codigo_rota || \"\",\r\n name: obj?.rota?.name || \"\",\r\n tipo: obj?.rota?.tipo || ROLES.cambista_talao.id,\r\n comission: obj?.rota?.comission || 0,\r\n },\r\n cambistasIds: obj?.cambistasIds || [],\r\n dataAposta: obj?.dataAposta || 0,\r\n valorTotalVendas: obj?.valorTotalVendas || 0,\r\n valorTotalPremios: obj?.valorTotalPremios || 0,\r\n valorTotalComissao: obj?.valorTotalComissao || 0,\r\n status: obj?.status || STATUS_GUIA.vendas.id,\r\n puleIdsPremios: obj?.puleIdsPremios || [],\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { TypeGuiaItem } from \"../types\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\nimport { ROLES, STATUS_GUIA } from \"../constants\";\r\n\r\nexport const GuiaItemModel = (obj?: Partial<TypeGuiaItem>): TypeGuiaItem => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n guiaId: obj?.guiaId || \"\",\r\n bancaId: obj?.bancaId || \"\", \r\n extracaoId: obj?.extracaoId || \"\",\r\n rotaId: obj?.rotaId || \"\", \r\n cambista: {\r\n id: obj?.cambista?.id || \"\",\r\n id_integer: obj?.cambista?.id_integer || \"\",\r\n codigo_cambista: obj?.cambista?.codigo_cambista || \"\",\r\n name: obj?.cambista?.name || \"\",\r\n login: obj?.cambista?.login || \"\",\r\n role: obj?.cambista?.role || ROLES.cambista_talao.id,\r\n comission: obj?.cambista?.comission || 0,\r\n },\r\n valor: obj?.valor || 0,\r\n valorComissao: obj?.valorComissao || 0,\r\n pulePremiadaId: obj?.pulePremiadaId || \"\",\r\n tipo: obj?.tipo || STATUS_GUIA.vendas.id,\r\n dataAposta: obj?.dataAposta || 0,\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { TypeLimiteNumeroAposta } from \"../types/limite_numero_aposta.type\";\r\nimport { getCreatedBySystem } from \"../functions\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const LimiteNumeroApostaModel = (obj?: Partial<TypeLimiteNumeroAposta>): TypeLimiteNumeroAposta => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n tipo_jogo: obj?.tipo_jogo || \"all\",\r\n limite: obj?.limite || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n});","import { getCreatedBySystem } from \"../functions\";\r\nimport { TypeResultadoAssociacao } from \"../types/resultado_associacao.type\";\r\nimport { dateToNumber } from \"../utils/dateToNumber\";\r\nimport { pegarHorarioSaoPaulo } from \"../utils\";\r\n\r\nexport const ResultadoAssociacaoModel = (\r\n obj?: Partial<TypeResultadoAssociacao>\r\n): TypeResultadoAssociacao => ({\r\n id: obj?.id || \"\",\r\n id_integer: obj?.id_integer || \"\",\r\n createdBy: getCreatedBySystem(obj?.createdBy),\r\n created: obj?.created || dateToNumber(pegarHorarioSaoPaulo()),\r\n updated: obj?.updated || dateToNumber(pegarHorarioSaoPaulo()),\r\n bancaId: obj?.bancaId || \"\",\r\n extracaoIds: obj?.extracaoIds || [],\r\n bancaIds: obj?.bancaIds || [],\r\n milhares: {\r\n 1: obj?.milhares?.[1] ?? \"\",\r\n 2: obj?.milhares?.[2] ?? \"\",\r\n 3: obj?.milhares?.[3] ?? \"\",\r\n 4: obj?.milhares?.[4] ?? \"\",\r\n 5: obj?.milhares?.[5] ?? \"\",\r\n },\r\n grupos: {\r\n 1: obj?.grupos?.[1] ?? \"\",\r\n 2: obj?.grupos?.[2] ?? \"\",\r\n 3: obj?.grupos?.[3] ?? \"\",\r\n 4: obj?.grupos?.[4] ?? \"\",\r\n 5: obj?.grupos?.[5] ?? \"\",\r\n },\r\n bichos: {\r\n 1: obj?.bichos?.[1] ?? \"\",\r\n 2: obj?.bichos?.[2] ?? \"\",\r\n 3: obj?.bichos?.[3] ?? \"\",\r\n 4: obj?.bichos?.[4] ?? \"\",\r\n 5: obj?.bichos?.[5] ?? \"\",\r\n },\r\n dataSorteio: obj?.dataSorteio || 0,\r\n});\r\n","import { ROLES } from \"../constants/ROLES\";\r\nimport { TypeVendaCambista } from \"../types/vendas_cambista.type\";\r\n\r\nexport const VendaCambistaModel = (obj?: Partial<TypeVendaCambista >): TypeVendaCambista => ({\r\n id: obj?.id || \"\",\r\n dataAposta: obj?.dataAposta || 0,\r\n amountVendas: obj?.amountVendas || 0,\r\n totalPules: obj?.totalPules || 0,\r\n bancaId: obj?.bancaId || \"\",\r\n extracao: {\r\n id: obj?.extracao?.id || \"\",\r\n id_integer: obj?.extracao?.id_integer || \"\",\r\n description: obj?.extracao?.description || \"\",\r\n horario: obj?.extracao?.horario || 0,\r\n bloqueio: obj?.extracao?.bloqueio || 0,\r\n },\r\n cambista: {\r\n id: obj?.cambista?.id || \"\",\r\n id_integer: obj?.cambista?.id_integer || \"\",\r\n codigo_cambista: obj?.cambista?.codigo_cambista || \"\",\r\n name: obj?.cambista?.name || \"\",\r\n login: obj?.cambista?.login || \"\",\r\n role: obj?.cambista?.role || ROLES.cambista_talao.id,\r\n comission: obj?.cambista?.comission || 0,\r\n route: {\r\n id: obj?.cambista?.route?.id || \"\",\r\n name: obj?.cambista?.route?.name || \"\",\r\n tipo: obj?.cambista?.route?.tipo || ROLES.cambista_talao.id,\r\n codigo_rota: obj?.cambista?.route?.codigo_rota || \"\",\r\n id_integer: obj?.cambista?.route?.id_integer || \"\",\r\n }\r\n },\r\n primeiraPule: obj?.primeiraPule || 0,\r\n ultimaPule: obj?.ultimaPule || 0,\r\n});","import { TypeVendasPorDia } from \"../types\";\r\n\r\nexport const VendasPorDiaModel = (\r\n obj: Partial<TypeVendasPorDia> = {}\r\n): TypeVendasPorDia => {\r\n let baseModel: TypeVendasPorDia = {\r\n id: obj?.id || \"\",\r\n bancaId: obj?.bancaId || \"\",\r\n dataVendas: obj?.dataVendas || 0,\r\n extracoesIds: obj?.extracoesIds || [],\r\n rotasIds: obj?.rotasIds || [],\r\n valorTotalVendas: obj?.valorTotalVendas || 0,\r\n valorTotalComissoes: obj?.valorTotalComissoes || 0,\r\n totalPules: obj?.totalPules || 0,\r\n };\r\n\r\n // Extrai propriedades dinâmicas que começam com \"vendas_extracao_\"\r\n const vendasExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"vendas_extracao_\") && typeof value === \"number\") {\r\n vendasExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const totalPulesExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"total_pules_extracao_\") && typeof value === \"number\") {\r\n totalPulesExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const vendasRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"vendas_rota_\") && typeof value === \"number\") {\r\n vendasRotaProps[key] = value;\r\n }\r\n });\r\n\r\n const totalPulesRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"total_pules_rota_\") && typeof value === \"number\") {\r\n totalPulesRotaProps[key] = value;\r\n }\r\n });\r\n\r\n const comissaoExtracaoProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"comissoes_extracao_\") && typeof value === \"number\") {\r\n comissaoExtracaoProps[key] = value;\r\n }\r\n });\r\n\r\n const comissaoRotaProps: { [key: string]: number } = {};\r\n\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if (key.startsWith(\"comissoes_rota_\") && typeof value === \"number\") {\r\n comissaoRotaProps[key] = value;\r\n }\r\n });\r\n\r\n baseModel = {\r\n ...baseModel,\r\n ...vendasExtracaoProps,\r\n ...totalPulesExtracaoProps,\r\n ...vendasRotaProps,\r\n ...totalPulesRotaProps,\r\n ...comissaoExtracaoProps,\r\n ...comissaoRotaProps,\r\n };\r\n\r\n return baseModel;\r\n};\r\n","import {\r\n AuditLogModel,\r\n BancaModel,\r\n DescargaModel,\r\n ExtracaoModel,\r\n GameModel,\r\n MessageModel,\r\n NumberModel,\r\n PDFModel,\r\n PremiacaoModel,\r\n ResultadoModel,\r\n RouteModel,\r\n UserModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n PremiacaoAssociacaoModel,\r\n ComissaoDescargaModel,\r\n GuiaModel,\r\n GuiaItemModel,\r\n LimiteNumeroApostaModel,\r\n ResultadoAssociacaoModel,\r\n VendaCambistaModel,\r\n VendasPorDiaModel\r\n} from \"../models\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados, com seus respectivos modelos.\r\n * Serve para facilitar para facilitar a criação de novos documentos no banco de dados e para facilitar a leitura do código.\r\n*/\r\nexport const collections = {\r\n mensagens: MessageModel,\r\n users: UserModel,\r\n guias: GuiaModel,\r\n guias_items: GuiaItemModel,\r\n limites_numero_aposta: LimiteNumeroApostaModel,\r\n valores_jogos: ValueGameModel,\r\n limites_jogos: LimitGameModel,\r\n pules: GameModel,\r\n extracoes: ExtracaoModel,\r\n resultados: ResultadoModel,\r\n resultados_associacao: ResultadoAssociacaoModel,\r\n rotas: RouteModel,\r\n envios_descarga: EnvioDescargaModel,\r\n numeros: NumberModel,\r\n descargas: DescargaModel,\r\n descargas_associacao: DescargaModel,\r\n premiacoes: PremiacaoModel,\r\n premiacoes_associacao: PremiacaoAssociacaoModel,\r\n pdf_descargas: PDFModel,\r\n pdf_descargas_associacao: PDFModel,\r\n bancas: BancaModel,\r\n auditLogs: AuditLogModel,\r\n dispositivos: DeviceModel,\r\n comissoes_descarga: ComissaoDescargaModel,\r\n vendas_cambistas: VendaCambistaModel,\r\n vendas_por_dias: VendasPorDiaModel\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contém os nomes das coleções como strings.\r\n * Útil para referenciar nomes de coleções de forma type-safe.\r\n *\r\n * @example\r\n * COLLECTIONS_NAMES.mensagens // \"mensagens\"\r\n * COLLECTIONS_NAMES.users // \"users\"\r\n */\r\nexport const COLLECTIONS_NAMES: Record<keyof typeof collections, string> = {\r\n mensagens: \"mensagens\",\r\n users: \"users\",\r\n guias: \"guias\",\r\n guias_items: \"guias_items\",\r\n limites_numero_aposta: \"limites_numero_aposta\",\r\n valores_jogos: \"valores_jogos\",\r\n limites_jogos: \"limites_jogos\",\r\n pules: \"pules\",\r\n extracoes: \"extracoes\",\r\n resultados: \"resultados\",\r\n resultados_associacao: \"resultados_associacao\",\r\n rotas: \"rotas\",\r\n envios_descarga: \"envios_descarga\",\r\n numeros: \"numeros\",\r\n descargas: \"descargas\",\r\n descargas_associacao: \"descargas_associacao\",\r\n premiacoes: \"premiacoes\",\r\n premiacoes_associacao: \"premiacoes_associacao\",\r\n pdf_descargas: \"pdf_descargas\",\r\n pdf_descargas_associacao: \"pdf_despcargas_associacao\",\r\n bancas: \"bancas\",\r\n auditLogs: \"auditLogs\",\r\n dispositivos: \"dispositivos\",\r\n comissoes_descarga: \"comissoes_descarga\",\r\n vendas_cambistas: \"vendas_cambistas\",\r\n vendas_por_dias: \"vendas_por_dias\",\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados que serão auditadas.\r\n * Define quais coleções devem ter auditoria habilitada (true) ou desabilitada (false).\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n*/\r\nexport const collectionsToAudit: Record<keyof typeof collections, boolean> = {\r\n mensagens: true,\r\n users: true,\r\n guias: true,\r\n guias_items: true,\r\n valores_jogos: true,\r\n limites_jogos: true,\r\n limites_numero_aposta: true,\r\n resultados_associacao: true,\r\n extracoes: true,\r\n resultados: true,\r\n rotas: true,\r\n comissoes_descarga: true,\r\n bancas: true,\r\n envios_descarga: true,\r\n dispositivos: true,\r\n pules: false,\r\n numeros: false,\r\n vendas_cambistas: false,\r\n vendas_por_dias: false,\r\n descargas: false,\r\n descargas_associacao: false,\r\n premiacoes: false,\r\n premiacoes_associacao: false,\r\n pdf_descargas: false,\r\n pdf_descargas_associacao: false,\r\n auditLogs: false, // Não auditamos os próprios logs de auditoria\r\n} as const;","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que define quantos dias cada coleção deve manter os documentos antes de serem apagados.\r\n * Define a política de retenção de dados para cada coleção.\r\n *\r\n * @example\r\n * - Se o valor for 30, documentos com created <= (data atual - 30 dias) serão apagados\r\n * - Se o valor for 0, os documentos não serão apagados automaticamente\r\n * - Se o valor for null, a coleção não terá política de retenção definida\r\n *\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n */\r\nexport const collectionsRetentionDays: Record<\r\n keyof typeof collections,\r\n number | null\r\n> = {\r\n auditLogs: 365, // Manter logs de auditoria por 1 ano (compliance)\r\n guias: 60, // Manter guias por 60 dias\r\n guias_items: 60, // Manter itens de guia por 60 dias\r\n pules: 60, // Manter pules por 60 dias\r\n resultados: 60, // Manter resultados por 60 dias\r\n resultados_associacao: 60, // Manter resultados de associação por 60 dias\r\n envios_descarga: 30, // Manter envios de descarga por 60 dias\r\n numeros: 30, // Manter números por 60 dias\r\n descargas: 30, // Descargas não são apagadas\r\n descargas_associacao: 30, // Descargas de associação não são apagadas\r\n premiacoes: 60, // Premiações não são apagadas\r\n premiacoes_associacao: 60, // Premiações de associação não são apagadas\r\n pdf_descargas: 60, // PDFs de descarga não são apagados\r\n pdf_descargas_associacao: 60, // PDFs de descarga de associação não são apagados\r\n vendas_cambistas: 365, // Vendas de cambista por 10 anos\r\n vendas_por_dias: 365 * 10, // Vendas por dias por 10 anos\r\n mensagens: null, // Manter mensagens por 30 dias\r\n limites_numero_aposta: null, // Limites de número de apostas não são apagados\r\n users: null, // Usuários nunca são apagados\r\n valores_jogos: null, // Valores de jogos não são apagados\r\n limites_jogos: null, // Limites de jogos não são apagados\r\n extracoes: null, // Extrações não são apagadas\r\n rotas: null, // Rotas nunca são apagadas\r\n bancas: null, // Bancas nunca são apagadas\r\n dispositivos: null, // Dispositivos não são apagados\r\n comissoes_descarga: null, // Comissões de descarga não são apagadas\r\n} as const;\r\n","import { collections } from \"./collections\";\r\n\r\n/**\r\n * @description Objeto que contem todas as coleções do banco de dados que precisam de isolamento por bancaId.\r\n *\r\n * @example\r\n * - Se o valor for true, a coleção precisa de isolamento por bancaId\r\n * - Se o valor for false, a coleção não precisa de isolamento por bancaId\r\n *\r\n * Todas as chaves devem corresponder exatamente às chaves do objeto 'collections'.\r\n */\r\nexport const collectionsWithIsolationByBancaId: Record<\r\n keyof typeof collections,\r\n boolean\r\n> = {\r\n auditLogs: false, // Não precisa de isolamento por bancaId\r\n bancas: false, // Não precisa de isolamento por bancaId\r\n mensagens: true, // Precisa de isolamento por bancaId\r\n guias: true, // Precisa de isolamento por bancaId\r\n guias_items: true, // Precisa de isolamento por bancaId\r\n pules: true, // Precisa de isolamento por bancaId\r\n resultados: true, // Precisa de isolamento por bancaId\r\n resultados_associacao: true, // Precisa de isolamento por bancaId\r\n envios_descarga: true, // Precisa de isolamento por bancaId\r\n numeros: true, // Precisa de isolamento por bancaId\r\n descargas: true, // Precisa de isolamento por bancaId\r\n descargas_associacao: true, // Precisa de isolamento por bancaId\r\n premiacoes: true, // Precisa de isolamento por bancaId\r\n premiacoes_associacao: true, // Precisa de isolamento por bancaId\r\n pdf_descargas: true, // Precisa de isolamento por bancaId\r\n pdf_descargas_associacao: true, // Precisa de isolamento por bancaId\r\n limites_numero_aposta: true, // Precisa de isolamento por bancaId\r\n users: true, // Precisa de isolamento por bancaId\r\n valores_jogos: true, // Precisa de isolamento por bancaId\r\n limites_jogos: true, // Precisa de isolamento por bancaId\r\n extracoes: true, // Precisa de isolamento por bancaId\r\n rotas: true, // Precisa de isolamento por bancaId\r\n dispositivos: true, // Precisa de isolamento por bancaId\r\n comissoes_descarga: true, // Precisa de isolamento por bancaId\r\n vendas_cambistas: true, // Precisa de isolamento por bancaId\r\n vendas_por_dias: true, // Precisa de isolamento por bancaId\r\n} as const;\r\n","import { ROLES } from \"../constants\";\r\nimport { generateId } from \"../utils\";\r\nimport { collections } from \"./collections\";\r\n\r\n// Types para compatibilidade entre plataformas\r\nexport type FirebaseApp<T = any> = T;\r\nexport type Firestore<T = any> = T;\r\nexport type CollectionReference<T = any> = T;\r\nexport type DocumentReference<T = any> = T;\r\nexport type Query<T = any> = T;\r\nexport type QuerySnapshot<T = any> = T;\r\nexport type DocumentSnapshot<T = any> = T;\r\nexport type WriteBatch<T = any> = T;\r\nexport type QueryConstraint<T = any> = T;\r\n\r\n// Interfaces para adaptadores de plataforma\r\nexport interface FirebaseAdapter<T = any> {\r\n // Collection operations\r\n collection: (db: Firestore, path: string) => CollectionReference<T>;\r\n doc: (db: Firestore, path: string, ...segments: string[]) => DocumentReference<T>;\r\n \r\n // Query operations\r\n query: (collection: CollectionReference<T>, ...constraints: QueryConstraint[]) => Query<T>;\r\n where: (field: string, operator: string, value: any) => QueryConstraint;\r\n orderBy: (field: string, direction?: \"asc\" | \"desc\") => QueryConstraint;\r\n limit: (count: number) => QueryConstraint;\r\n startAfter: (...fieldValues: any[]) => QueryConstraint;\r\n startAt: (...fieldValues: any[]) => QueryConstraint;\r\n endBefore: (...fieldValues: any[]) => QueryConstraint;\r\n endAt: (...fieldValues: any[]) => QueryConstraint;\r\n \r\n // Document operations\r\n getDocs: (query: Query<T>) => Promise<QuerySnapshot<T>>;\r\n getDoc: (docRef: DocumentReference<T>) => Promise<DocumentSnapshot<T>>;\r\n setDoc: (docRef: DocumentReference<T>, data: T, options?: any) => Promise<void>;\r\n updateDoc: (docRef: DocumentReference<T>, data: Partial<T>) => Promise<void>;\r\n deleteDoc: (docRef: DocumentReference<T>) => Promise<void>;\r\n \r\n // Batch operations\r\n writeBatch: (db: Firestore) => WriteBatch;\r\n batchSet: (batch: WriteBatch, docRef: DocumentReference<T>, data: T) => void;\r\n batchUpdate: (batch: WriteBatch, docRef: DocumentReference<T>, data: Partial<T>) => void;\r\n batchDelete: (batch: WriteBatch, docRef: DocumentReference<T>) => void;\r\n batchCommit: (batch: WriteBatch) => Promise<void>;\r\n \r\n // Real-time listeners\r\n onSnapshot: (query: Query<T>, callback: (snapshot: QuerySnapshot<T>) => void) => () => void;\r\n \r\n // ID generation\r\n generateId: () => string;\r\n}\r\n\r\n// Helper types para extrair valores válidos de um tipo\r\ntype WhereOperator = \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\" | \"in\" | \"not-in\" | \"array-contains\" | \"array-contains-any\";\r\n\r\n// Helper para gerar campos encadeados até 5 níveis\r\ntype NestedPaths<T, Depth extends number = 5> = Depth extends 0\r\n ? never\r\n : T extends object\r\n ? {\r\n [K in keyof T & string]: T[K] extends object\r\n ? T[K] extends any[]\r\n ? K | `${K}.${number}` | `${K}.${NestedPaths<T[K][number], Prev<Depth>>}`\r\n : K | `${K}.${NestedPaths<T[K], Prev<Depth>>}`\r\n : K;\r\n }[keyof T & string]\r\n : never;\r\n\r\n// Helper para decrementar profundidade\r\ntype Prev<T extends number> = T extends 5 ? 4 : T extends 4 ? 3 : T extends 3 ? 2 : T extends 2 ? 1 : 0;\r\n\r\n// WhereCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type WhereCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n operator: WhereOperator;\r\n value: any;\r\n};\r\n\r\n// OrderByCondition com suporte a chaves encadeadas até 5 níveis\r\nexport type OrderByCondition<T = any> = {\r\n field: NestedPaths<T> | string; // Suporta campos encadeados, campos simples ou string customizada\r\n direction: \"asc\" | \"desc\";\r\n};\r\n\r\n// RepoQueryOptions com type-safety baseado no modelo\r\nexport type RepoQueryOptions<T = any> = {\r\n where?: WhereCondition<T>[];\r\n orderBy?: OrderByCondition<T>[];\r\n limit?: number;\r\n startAfter?: any; // Cursor para paginação (pode ser um documento ou valor)\r\n startAt?: any; // Inicia a partir de (inclusive)\r\n endBefore?: any; // Termina antes de (exclusive)\r\n endAt?: any; // Termina em (inclusive)\r\n};\r\n\r\n// Estratégias de busca por ID com type-safety\r\nexport type IdSearchStrategy<T> = \r\n | { type: \"field\"; fieldName: NestedPaths<T> } // Busca por campo específico (ex: \"id\", \"numero\")\r\n | { type: \"documentId\" } // Usa o ID do documento diretamente\r\n | { type: \"custom\"; resolver: (id: string) => Promise<DocumentReference<T>> }; // Resolver customizado\r\n\r\n// Configurações de isolamento (para bancaId, etc.) com type-safety\r\nexport type IsolationConfig<T> = {\r\n enabled: boolean;\r\n fieldName: keyof T; // ex: \"bancaId\" - deve ser um campo válido do modelo\r\n getValue: () => T[keyof T] | undefined; // Função para obter o valor de isolamento\r\n};\r\n\r\n// Configurações de cache\r\nexport type CacheConfig = {\r\n enabled: boolean;\r\n ttl?: number; // Time to live em ms\r\n maxSize?: number; // Tamanho máximo do cache\r\n};\r\n\r\n// Tipos de operações\r\nexport type OperationType = \"read\" | \"write\" | \"delete\";\r\n\r\n// Configurações de autorização por role\r\nexport type AuthorizationConfig = {\r\n enabled: boolean;\r\n allowedRoles: {\r\n read?: (keyof typeof ROLES)[]; // Roles permitidas para leitura (get, getAll, listen)\r\n write?: (keyof typeof ROLES)[]; // Roles permitidas para escrita (add, update)\r\n delete?: (keyof typeof ROLES)[]; // Roles permitidas para deletar (remove)\r\n };\r\n getUserRole: () => keyof typeof ROLES | undefined; // Função para obter o role do usuário atual\r\n onUnauthorized?: (operation: OperationType, userRole?: keyof typeof ROLES) => void; // Callback quando não autorizado\r\n};\r\n\r\nexport type RepoConfig<T extends { id: string }> = {\r\n collectionName: keyof typeof collections;\r\n model: (data: any) => T;\r\n idSearchStrategy: IdSearchStrategy<T>;\r\n isolation?: IsolationConfig<T>;\r\n cache?: CacheConfig;\r\n authorization?: AuthorizationConfig; // ✨ Nova configuração de autorização\r\n generateId?: () => string;\r\n};\r\n\r\n// Cache simples em memória\r\nclass MemoryCache {\r\n public cache = new Map<string, { data: any; timestamp: number }>();\r\n private ttl: number;\r\n private maxSize: number;\r\n\r\n constructor(ttl: number = 300000, maxSize: number = 1000) { // 5min default\r\n this.ttl = ttl;\r\n this.maxSize = maxSize;\r\n }\r\n\r\n get(key: string): any | null {\r\n const item = this.cache.get(key);\r\n if (!item) return null;\r\n \r\n if (Date.now() - item.timestamp > this.ttl) {\r\n this.cache.delete(key);\r\n return null;\r\n }\r\n \r\n return item.data;\r\n }\r\n\r\n set(key: string, data: any): void {\r\n // Limpa cache se exceder tamanho máximo\r\n if (this.cache.size >= this.maxSize) {\r\n const firstKey = this.cache.keys().next().value;\r\n if (firstKey) {\r\n this.cache.delete(firstKey);\r\n }\r\n }\r\n \r\n this.cache.set(key, { data, timestamp: Date.now() });\r\n }\r\n\r\n delete(key: string): void {\r\n this.cache.delete(key);\r\n }\r\n\r\n clear(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n\r\n// Interface do repositório retornado\r\nexport interface GenericRepo<T extends { id: string }> {\r\n get: (id: string) => Promise<T | null>;\r\n getAll: (options?: RepoQueryOptions<T>) => Promise<{ [id: string]: T }>;\r\n listen: (options: RepoQueryOptions<T>, callback: (data: { [id: string]: T }) => void) => () => void;\r\n add: (docData: Partial<T> & { id?: string }) => Promise<string>;\r\n update: (id: string, docData: Partial<T>) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n batch: (docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]) => Promise<void>;\r\n clearCache: () => void;\r\n getCacheSize: () => number;\r\n}\r\n\r\nexport function createGenericRepo<T extends { id: string }>(\r\n db: Firestore,\r\n adapter: FirebaseAdapter<T>,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> {\r\n const { collectionName, model, idSearchStrategy, isolation, cache, authorization, generateId } = config;\r\n const memoryCache = cache?.enabled ? new MemoryCache(cache.ttl, cache.maxSize) : null;\r\n\r\n // Função para verificar autorização\r\n const checkAuthorization = (operation: OperationType): void => {\r\n if (!authorization?.enabled) return;\r\n \r\n const userRole = authorization.getUserRole();\r\n const allowedRoles = authorization.allowedRoles[operation];\r\n \r\n // Se não há roles definidas para a operação, permite tudo\r\n if (!allowedRoles || allowedRoles.length === 0) return;\r\n \r\n // Se usuário não está logado ou não tem role, bloqueia\r\n if (!userRole) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Operação '${operation}' requer autenticação na coleção '${collectionName}'`);\r\n }\r\n \r\n // Verifica se o role do usuário está na lista de permitidos\r\n if (!allowedRoles.includes(userRole)) {\r\n authorization.onUnauthorized?.(operation, userRole);\r\n throw new Error(`❌ Não autorizado: Role '${userRole}' não tem permissão para '${operation}' na coleção '${collectionName}'. Roles permitidas: ${allowedRoles.join(\", \")}`);\r\n }\r\n };\r\n\r\n // Função para obter constraints de isolamento\r\n const getIsolationConstraints = (): WhereCondition<T>[] => {\r\n if (!isolation?.enabled) return [];\r\n \r\n const value = isolation.getValue();\r\n if (!value) return [];\r\n \r\n return [{ field: isolation.fieldName as any, operator: \"==\", value }];\r\n };\r\n\r\n // Função para construir query\r\n const buildQuery = (options?: RepoQueryOptions<T>): Query<T> => {\r\n const constraints: QueryConstraint[] = [];\r\n \r\n // Adiciona constraints de isolamento primeiro\r\n const isolationConstraints = getIsolationConstraints();\r\n isolationConstraints.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n // Adiciona constraints da query\r\n options?.where?.forEach(({ field, operator, value }) => {\r\n constraints.push(adapter.where(field.toString(), operator, value));\r\n });\r\n \r\n options?.orderBy?.forEach(({ field, direction }) => {\r\n constraints.push(adapter.orderBy(field.toString(), direction));\r\n });\r\n \r\n if (options?.limit) {\r\n constraints.push(adapter.limit(options.limit));\r\n }\r\n \r\n // Adiciona cursores de paginação\r\n if (options?.startAfter !== undefined) {\r\n constraints.push(adapter.startAfter(options.startAfter));\r\n }\r\n \r\n if (options?.startAt !== undefined) {\r\n constraints.push(adapter.startAt(options.startAt));\r\n }\r\n \r\n if (options?.endBefore !== undefined) {\r\n constraints.push(adapter.endBefore(options.endBefore));\r\n }\r\n \r\n if (options?.endAt !== undefined) {\r\n constraints.push(adapter.endAt(options.endAt));\r\n }\r\n \r\n const collection = adapter.collection(db, collectionName);\r\n return adapter.query(collection, ...constraints);\r\n };\r\n\r\n // Função para resolver documento por ID\r\n const resolveDocument = async (id: string): Promise<DocumentReference<T>> => {\r\n switch (idSearchStrategy.type) {\r\n case \"documentId\":\r\n return adapter.doc(db, collectionName, id);\r\n \r\n case \"field\":\r\n // Para busca por campo, precisamos fazer uma query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n if ((snapshot as any).empty) throw new Error(`Document not found with ${String(idSearchStrategy.fieldName)}: ${id}`);\r\n return (snapshot as any).docs[0].ref;\r\n \r\n case \"custom\":\r\n return idSearchStrategy.resolver(id);\r\n \r\n default:\r\n throw new Error(`Unknown idSearchStrategy: ${(idSearchStrategy as any).type}`);\r\n }\r\n };\r\n\r\n // Função para gerar chave de cache\r\n const getCacheKey = (operation: string, ...params: any[]): string => {\r\n const isolationKey = isolation?.enabled ? `_${isolation.getValue()}` : '';\r\n return `${collectionName}${isolationKey}_${operation}_${JSON.stringify(params)}`;\r\n };\r\n\r\n const get = async (id: string): Promise<T | null> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n // Verifica cache primeiro\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n const cached = memoryCache.get(cacheKey);\r\n if (cached) return cached;\r\n }\r\n\r\n let docSnap: DocumentSnapshot<T>;\r\n \r\n if (idSearchStrategy.type === \"documentId\") {\r\n const docRef = adapter.doc(db, collectionName, id);\r\n docSnap = await adapter.getDoc(docRef);\r\n } else if (idSearchStrategy.type === \"field\") {\r\n // Para outros tipos, usa query\r\n const query = buildQuery({\r\n where: [{ field: idSearchStrategy.fieldName, operator: \"==\", value: id }],\r\n limit: 1\r\n });\r\n const snapshot = await adapter.getDocs(query);\r\n docSnap = (snapshot as any).docs[0] || null;\r\n } else {\r\n const docRef = await resolveDocument(id);\r\n docSnap = await adapter.getDoc(docRef);\r\n }\r\n\r\n if (!(docSnap as any)?.exists()) return null;\r\n\r\n const result = model((docSnap as any).data());\r\n \r\n // Armazena no cache\r\n if (memoryCache) {\r\n const cacheKey = getCacheKey('get', id);\r\n memoryCache.set(cacheKey, result);\r\n }\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting document ${id}:`, error);\r\n return null;\r\n }\r\n };\r\n\r\n const getAll = async (options?: RepoQueryOptions<T>): Promise<{ [id: string]: T }> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n const snapshot = await adapter.getDocs(query);\r\n \r\n const result: { [id: string]: T } = {};\r\n (snapshot as any).forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n \r\n return result;\r\n } catch (error) {\r\n console.error(`Error getting all documents:`, error);\r\n return {};\r\n }\r\n };\r\n\r\n const listen = (\r\n options: RepoQueryOptions<T>,\r\n callback: (data: { [id: string]: T }) => void\r\n ): (() => void) => {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"read\");\r\n \r\n const query = buildQuery(options);\r\n \r\n return adapter.onSnapshot(query, (snapshot: any) => {\r\n const result: { [id: string]: T } = {};\r\n snapshot.forEach((docSnap: any) => {\r\n const data = model(docSnap.data());\r\n result[data.id] = data;\r\n });\r\n callback(result);\r\n });\r\n };\r\n\r\n const add = async (docData: Partial<T> & { id?: string }): Promise<string> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const id = docData.id || generateId?.() || adapter.generateId();\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData, id };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const docRef = adapter.doc(db, collectionName, id);\r\n const modelData = model(completeData);\r\n \r\n await adapter.setDoc(docRef, modelData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n \r\n return id;\r\n } catch (error) {\r\n console.error(`Error adding document:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const update = async (id: string, docData: Partial<T>): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"write\");\r\n \r\n const docRef = await resolveDocument(id);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...docData };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n await adapter.updateDoc(docRef, completeData);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error updating document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const remove = async (id: string): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização\r\n checkAuthorization(\"delete\");\r\n \r\n const docRef = await resolveDocument(id);\r\n await adapter.deleteDoc(docRef);\r\n \r\n // Limpa cache relacionado\r\n if (memoryCache) {\r\n memoryCache.delete(getCacheKey('get', id));\r\n }\r\n } catch (error) {\r\n console.error(`Error removing document ${id}:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n const batch = async (\r\n docs: { id?: string; data: T; operation: \"add\" | \"update\" | \"delete\" }[]\r\n ): Promise<void> => {\r\n try {\r\n // ✨ Verifica autorização para cada operação\r\n const operations = new Set(docs.map(d => d.operation));\r\n operations.forEach(op => {\r\n if (op === \"delete\") checkAuthorization(\"delete\");\r\n else checkAuthorization(\"write\");\r\n });\r\n \r\n const batch = adapter.writeBatch(db);\r\n \r\n for (const { id, data, operation } of docs) {\r\n const docId = id || generateId?.() || adapter.generateId();\r\n const docRef = adapter.doc(db, collectionName, docId);\r\n \r\n // Adiciona dados de isolamento se necessário\r\n const completeData = { ...data, id: docId };\r\n if (isolation?.enabled && isolation.getValue()) {\r\n (completeData as any)[isolation.fieldName] = isolation.getValue();\r\n }\r\n \r\n const modelData = model(completeData);\r\n \r\n switch (operation) {\r\n case \"add\":\r\n adapter.batchSet(batch, docRef, modelData);\r\n break;\r\n case \"update\":\r\n adapter.batchUpdate(batch, docRef, completeData);\r\n break;\r\n case \"delete\":\r\n adapter.batchDelete(batch, docRef);\r\n break;\r\n }\r\n }\r\n \r\n await adapter.batchCommit(batch);\r\n \r\n // Limpa cache\r\n if (memoryCache) {\r\n memoryCache.clear();\r\n }\r\n } catch (error) {\r\n console.error(`Error in batch operation:`, error);\r\n throw error;\r\n }\r\n };\r\n\r\n return {\r\n get,\r\n getAll,\r\n listen,\r\n add,\r\n update,\r\n remove,\r\n batch,\r\n // Utilitários\r\n clearCache: () => memoryCache?.clear(),\r\n getCacheSize: () => memoryCache?.cache.size || 0,\r\n };\r\n}\r\n\r\n// Detecção automática de versão do Firebase\r\nexport type FirebaseVersion = 'v8' | 'v9-modular' | 'unknown';\r\n\r\nexport const detectFirebaseVersion = (firebaseInstance: any): FirebaseVersion => {\r\n try {\r\n // Caso 1: Firebase v9+ modular - instância com funções como getFirestore\r\n if (firebaseInstance && typeof firebaseInstance.getFirestore === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 2: Firebase v9+ modular - objeto com funções do Firestore v9\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.query === 'function' &&\r\n typeof firebaseInstance.where === 'function') {\r\n return 'v9-modular';\r\n }\r\n \r\n // Caso 3: Firebase v8 - instância principal com firestore()\r\n if (firebaseInstance && typeof firebaseInstance.firestore === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 4: Firebase v8 - instância direta do Firestore v8\r\n if (firebaseInstance && \r\n typeof firebaseInstance.collection === 'function' && \r\n typeof firebaseInstance.doc === 'function' &&\r\n typeof firebaseInstance.batch === 'function') {\r\n return 'v8';\r\n }\r\n \r\n // Caso 5: Verifica se é um namespace v9+ (ex: firebase/app)\r\n if (firebaseInstance && \r\n firebaseInstance.initializeApp && \r\n typeof firebaseInstance.initializeApp === 'function') {\r\n // Se tem initializeApp, provavelmente é v9+\r\n return 'v9-modular';\r\n }\r\n \r\n return 'unknown';\r\n } catch (error) {\r\n console.warn('Erro ao detectar versão do Firebase:', error);\r\n return 'unknown';\r\n }\r\n};\r\n\r\n// Adaptador para Firebase v9+ modular\r\nexport const createV9ModularAdapter = <T = any>(firebaseModular: any): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => firebaseModular.collection(db, path),\r\n doc: (db, path, ...segments) => firebaseModular.doc(db, path, ...segments),\r\n query: (collection, ...constraints) => firebaseModular.query(collection, ...constraints),\r\n where: (field, operator, value) => firebaseModular.where(field, operator, value),\r\n orderBy: (field, direction = 'asc') => firebaseModular.orderBy(field, direction),\r\n limit: (count) => firebaseModular.limit(count),\r\n startAfter: (...fieldValues) => firebaseModular.startAfter(...fieldValues),\r\n startAt: (...fieldValues) => firebaseModular.startAt(...fieldValues),\r\n endBefore: (...fieldValues) => firebaseModular.endBefore(...fieldValues),\r\n endAt: (...fieldValues) => firebaseModular.endAt(...fieldValues),\r\n getDocs: firebaseModular.getDocs,\r\n getDoc: firebaseModular.getDoc,\r\n setDoc: firebaseModular.setDoc,\r\n updateDoc: firebaseModular.updateDoc,\r\n deleteDoc: firebaseModular.deleteDoc,\r\n writeBatch: firebaseModular.writeBatch,\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: firebaseModular.onSnapshot,\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Adaptador para Firebase v8 legacy\r\nexport const createV8Adapter = <T = any>(): FirebaseAdapter<T> => {\r\n return {\r\n collection: (db, path) => (db as any).collection(path),\r\n doc: (db, path, ...segments) => (db as any).collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n if (constraint.type === 'where') {\r\n query = (query as any).where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = (query as any).orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = (query as any).limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = (query as any).startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = (query as any).startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = (query as any).endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = (query as any).endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => (query as any).get(),\r\n getDoc: (docRef) => (docRef as any).get(),\r\n setDoc: (docRef, data, options) => (docRef as any).set(data, options),\r\n updateDoc: (docRef, data) => (docRef as any).update(data),\r\n deleteDoc: (docRef) => (docRef as any).delete(),\r\n writeBatch: (db) => (db as any).batch(),\r\n batchSet: (batch, docRef, data) => (batch as any).set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => (batch as any).update(docRef, data),\r\n batchDelete: (batch, docRef) => (batch as any).delete(docRef),\r\n batchCommit: (batch) => (batch as any).commit(),\r\n onSnapshot: (query, callback) => (query as any).onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n\r\n// Função principal que detecta automaticamente a versão e cria o adaptador apropriado\r\nexport const createWebAdapter = <T = any>(firebaseInstance: any): FirebaseAdapter<T> => {\r\n const version = detectFirebaseVersion(firebaseInstance);\r\n \r\n console.log(`🔥 Firebase version detected: ${version}`);\r\n \r\n switch (version) {\r\n case 'v9-modular':\r\n return createV9ModularAdapter(firebaseInstance);\r\n \r\n case 'v8':\r\n return createV8Adapter();\r\n \r\n default:\r\n console.warn('⚠️ Firebase version not detected, falling back to v8 adapter');\r\n return createV8Adapter();\r\n }\r\n};\r\n\r\n// Função utilitária para criar repositório com detecção automática de versão\r\nexport const createAutoRepo = <T extends { id: string }>(\r\n firebaseInstance: any,\r\n db: Firestore,\r\n config: RepoConfig<T>\r\n): GenericRepo<T> => {\r\n const adapter = createWebAdapter(firebaseInstance);\r\n return createGenericRepo(db, adapter, config);\r\n};\r\n\r\nexport const createReactNativeAdapter = (): FirebaseAdapter => {\r\n // Implementação para React Native Firebase\r\n \r\n return {\r\n collection: (db, path) => db.collection(path),\r\n doc: (db, path, ...segments) => db.collection(path).doc(segments.join('/')),\r\n query: (collection, ...constraints) => {\r\n let query = collection;\r\n constraints.forEach(constraint => {\r\n // Adaptar constraints para React Native Firebase\r\n if (constraint.type === 'where') {\r\n query = query.where(constraint.field, constraint.opStr, constraint.value);\r\n } else if (constraint.type === 'orderBy') {\r\n query = query.orderBy(constraint.field, constraint.direction);\r\n } else if (constraint.type === 'limit') {\r\n query = query.limit(constraint.limit);\r\n } else if (constraint.type === 'startAfter') {\r\n query = query.startAfter(...constraint.values);\r\n } else if (constraint.type === 'startAt') {\r\n query = query.startAt(...constraint.values);\r\n } else if (constraint.type === 'endBefore') {\r\n query = query.endBefore(...constraint.values);\r\n } else if (constraint.type === 'endAt') {\r\n query = query.endAt(...constraint.values);\r\n }\r\n });\r\n return query;\r\n },\r\n where: (field, operator, value) => ({ type: 'where', field, opStr: operator, value }),\r\n orderBy: (field, direction = 'asc') => ({ type: 'orderBy', field, direction }),\r\n limit: (count) => ({ type: 'limit', limit: count }),\r\n startAfter: (...fieldValues) => ({ type: 'startAfter', values: fieldValues }),\r\n startAt: (...fieldValues) => ({ type: 'startAt', values: fieldValues }),\r\n endBefore: (...fieldValues) => ({ type: 'endBefore', values: fieldValues }),\r\n endAt: (...fieldValues) => ({ type: 'endAt', values: fieldValues }),\r\n getDocs: (query) => query.get(),\r\n getDoc: (docRef) => docRef.get(),\r\n setDoc: (docRef, data, options) => docRef.set(data, options),\r\n updateDoc: (docRef, data) => docRef.update(data),\r\n deleteDoc: (docRef) => docRef.delete(),\r\n writeBatch: (db) => db.batch(),\r\n batchSet: (batch, docRef, data) => batch.set(docRef, data),\r\n batchUpdate: (batch, docRef, data) => batch.update(docRef, data),\r\n batchDelete: (batch, docRef) => batch.delete(docRef),\r\n batchCommit: (batch) => batch.commit(),\r\n onSnapshot: (query, callback) => query.onSnapshot(callback),\r\n generateId: () => generateId(),\r\n };\r\n};\r\n","/**\r\n * FACTORY PARA CRIAR TODOS OS REPOSITÓRIOS\r\n *\r\n * Este arquivo cria automaticamente todos os repositórios configurados\r\n * com type-safety completo, cache, isolamento por bancaId, etc.\r\n */\r\n\r\nimport {\r\n createGenericRepo,\r\n createWebAdapter,\r\n createReactNativeAdapter,\r\n type FirebaseAdapter,\r\n type Firestore,\r\n type GenericRepo,\r\n type RepoConfig,\r\n type AuthorizationConfig,\r\n type OperationType,\r\n} from \"./generic\";\r\n\r\nimport {\r\n UserModel,\r\n BancaModel,\r\n ExtracaoModel,\r\n ResultadoModel,\r\n MessageModel,\r\n RouteModel,\r\n ValueGameModel,\r\n LimitGameModel,\r\n GameModel,\r\n NumberModel,\r\n DescargaModel,\r\n PremiacaoModel,\r\n PremiacaoAssociacaoModel,\r\n PDFModel,\r\n AuditLogModel,\r\n EnvioDescargaModel,\r\n DeviceModel,\r\n VendaCambistaModel,\r\n VendasPorDiaModel,\r\n} from \"../models\";\r\n\r\nimport type {\r\n TypeUser,\r\n TypeBanca,\r\n TypeExtracao,\r\n TypeResultado,\r\n TypeMessage,\r\n TypeRoute,\r\n TypeValueGame,\r\n TypeLimitGame,\r\n TypeGame,\r\n TypeNumero,\r\n TypeDescarga,\r\n TypePremiacao,\r\n TypePremiacaoAssociacao,\r\n TypePDFDescargas,\r\n TypeAuditLog,\r\n TypeEnvioDescarga,\r\n TypeDevice,\r\n TypeVendaCambista,\r\n TypeVendasPorDia,\r\n} from \"../types\";\r\nimport { collections } from \"./collections\";\r\n\r\n// ============================================================================\r\n// TIPOS PARA CONFIGURAÇÃO\r\n// ============================================================================\r\n\r\nexport type RepoFactoryConfig = {\r\n db: Firestore;\r\n adapter: FirebaseAdapter;\r\n getBancaId?: () => string | undefined; // Função para obter bancaId atual\r\n getUserRole?: () => string | undefined; // ✨ Função para obter role do usuário atual\r\n cacheConfig?: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n };\r\n authorizationConfigs?: { // ✨ Configurações de autorização por coleção\r\n [collectionName in keyof typeof collections]: AuthorizationConfig;\r\n };\r\n onUnauthorized?: (operation: OperationType, userRole?: string, collection?: string) => void; // ✨ Callback global para não autorizado\r\n};\r\n\r\nexport type RepoCollections = {\r\n users_associacao: GenericRepo<TypeUser>;\r\n users: GenericRepo<TypeUser>;\r\n bancas: GenericRepo<TypeBanca>;\r\n extracoes: GenericRepo<TypeExtracao>;\r\n resultados: GenericRepo<TypeResultado>;\r\n mensagens: GenericRepo<TypeMessage>;\r\n rotas: GenericRepo<TypeRoute>;\r\n valores_jogos: GenericRepo<TypeValueGame>;\r\n limites_jogos: GenericRepo<TypeLimitGame>;\r\n pules: GenericRepo<TypeGame>;\r\n numeros: GenericRepo<TypeNumero>;\r\n descargas: GenericRepo<TypeDescarga>;\r\n descargas_associacao: GenericRepo<TypeDescarga>;\r\n premiacoes: GenericRepo<TypePremiacao>;\r\n premiacoes_associacao: GenericRepo<TypePremiacaoAssociacao>;\r\n pdf_descargas: GenericRepo<TypePDFDescargas>;\r\n pdf_descargas_associacao: GenericRepo<TypePDFDescargas>;\r\n auditLogs: GenericRepo<TypeAuditLog>;\r\n envios_descarga: GenericRepo<TypeEnvioDescarga>;\r\n dispositivos: GenericRepo<TypeDevice>;\r\n vendas_cambistas: GenericRepo<TypeVendaCambista>;\r\n vendas_por_dias: GenericRepo<TypeVendasPorDia>;\r\n};\r\n\r\n// ============================================================================\r\n// CONFIGURAÇÕES DE CADA COLEÇÃO\r\n// ============================================================================\r\n\r\nconst createConfigs = (\r\n getBancaId?: () => string | undefined,\r\n cacheConfig: {\r\n enabled: boolean;\r\n ttl?: number;\r\n maxSize?: number;\r\n } = { enabled: true, ttl: 300000, maxSize: 1000 },\r\n authorizationConfigs?: { [collectionName in keyof typeof collections]: AuthorizationConfig }\r\n) => {\r\n // Helper para isolamento por bancaId\r\n const withBancaIsolation = <T extends { id: string; bancaId?: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n isolation: getBancaId\r\n ? {\r\n enabled: true,\r\n fieldName: \"bancaId\" as keyof T,\r\n getValue: getBancaId as any,\r\n }\r\n : undefined,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName],\r\n });\r\n\r\n // Helper para coleções sem isolamento\r\n const withoutIsolation = <T extends { id: string }>(\r\n config: Omit<RepoConfig<T>, \"isolation\" | \"cache\" | \"authorization\">\r\n ): RepoConfig<T> => ({\r\n ...config,\r\n cache: cacheConfig,\r\n authorization: authorizationConfigs?.[config.collectionName as keyof typeof collections],\r\n });\r\n\r\n return {\r\n\r\n // ========================================================================\r\n // USUÁRIOS - Com isolamento por bancaId\r\n // ========================================================================\r\n users_associacao: withoutIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // USUÁRIOS da banca - Com isolamento por bancaId\r\n // ========================================================================\r\n users: withBancaIsolation<TypeUser>({\r\n collectionName: \"users\",\r\n model: UserModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // BANCAS - Sem isolamento (dados globais)\r\n // ========================================================================\r\n bancas: withoutIsolation<TypeBanca>({\r\n collectionName: \"bancas\",\r\n model: BancaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // EXTRAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n extracoes: withBancaIsolation<TypeExtracao>({\r\n collectionName: \"extracoes\",\r\n model: ExtracaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // RESULTADOS - Com isolamento por bancaId\r\n // ========================================================================\r\n resultados: withBancaIsolation<TypeResultado>({\r\n collectionName: \"resultados\",\r\n model: ResultadoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // MENSAGENS - Com isolamento por bancaId\r\n // ========================================================================\r\n mensagens: withBancaIsolation<TypeMessage>({\r\n collectionName: \"mensagens\",\r\n model: MessageModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ROTAS - Com isolamento por bancaId\r\n // ========================================================================\r\n rotas: withBancaIsolation<TypeRoute>({\r\n collectionName: \"rotas\",\r\n model: RouteModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VALORES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n valores_jogos: withBancaIsolation<TypeValueGame>({\r\n collectionName: \"valores_jogos\",\r\n model: ValueGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // LIMITES DE JOGOS - Com isolamento por bancaId\r\n // ========================================================================\r\n limites_jogos: withBancaIsolation<TypeLimitGame>({\r\n collectionName: \"limites_jogos\",\r\n model: LimitGameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PULES (JOGOS) - Com isolamento por bancaId\r\n // ========================================================================\r\n pules: withBancaIsolation<TypeGame>({\r\n collectionName: \"pules\",\r\n model: GameModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // NÚMEROS - Com isolamento por bancaId\r\n // ========================================================================\r\n numeros: withBancaIsolation<TypeNumero>({\r\n collectionName: \"numeros\",\r\n model: NumberModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n descargas_associacao: withBancaIsolation<TypeDescarga>({\r\n collectionName: \"descargas_associacao\",\r\n model: DescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes: withBancaIsolation<TypePremiacao>({\r\n collectionName: \"premiacoes\",\r\n model: PremiacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PREMIAÇÕES ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n premiacoes_associacao: withBancaIsolation<TypePremiacaoAssociacao>({\r\n collectionName: \"premiacoes_associacao\",\r\n model: PremiacaoAssociacaoModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // PDF DESCARGAS ASSOCIAÇÃO - Com isolamento por bancaId\r\n // ========================================================================\r\n pdf_descargas_associacao: withBancaIsolation<TypePDFDescargas>({\r\n collectionName: \"pdf_descargas_associacao\",\r\n model: PDFModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // AUDIT LOGS - Com isolamento por bancaId\r\n // ========================================================================\r\n auditLogs: withBancaIsolation<TypeAuditLog>({\r\n collectionName: \"auditLogs\",\r\n model: AuditLogModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // ENVIOS DESCARGA - Com isolamento por bancaId\r\n // ========================================================================\r\n envios_descarga: withBancaIsolation<TypeEnvioDescarga>({\r\n collectionName: \"envios_descarga\",\r\n model: EnvioDescargaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // DISPOSITIVOS - Com isolamento por bancaId\r\n // ========================================================================\r\n dispositivos: withBancaIsolation<TypeDevice>({\r\n collectionName: \"dispositivos\",\r\n model: DeviceModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VENDAS CAMBISTA - Com isolamento por bancaId\r\n // ========================================================================\r\n vendas_cambistas: withBancaIsolation<TypeVendaCambista>({\r\n collectionName: \"vendas_cambistas\",\r\n model: VendaCambistaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n\r\n // ========================================================================\r\n // VENDAS POR DIA - Com isolamento por bancaId\r\n // ========================================================================\r\n vendas_por_dias: withBancaIsolation<TypeVendasPorDia>({\r\n collectionName: \"vendas_por_dias\",\r\n model: VendasPorDiaModel,\r\n idSearchStrategy: { type: \"documentId\" },\r\n }),\r\n };\r\n};\r\n\r\n// ============================================================================\r\n// FACTORY PRINCIPAL\r\n// ============================================================================\r\n\r\nexport function createRepoFactory(config: RepoFactoryConfig): RepoCollections {\r\n const { db, adapter, getBancaId, cacheConfig, authorizationConfigs } = config;\r\n const configs = createConfigs(getBancaId, cacheConfig, authorizationConfigs);\r\n\r\n return {\r\n users_associacao: createGenericRepo(db, adapter, configs.users_associacao),\r\n users: createGenericRepo(db, adapter, configs.users),\r\n bancas: createGenericRepo(db, adapter, configs.bancas),\r\n extracoes: createGenericRepo(db, adapter, configs.extracoes),\r\n resultados: createGenericRepo(db, adapter, configs.resultados),\r\n mensagens: createGenericRepo(db, adapter, configs.mensagens),\r\n rotas: createGenericRepo(db, adapter, configs.rotas),\r\n valores_jogos: createGenericRepo(db, adapter, configs.valores_jogos),\r\n limites_jogos: createGenericRepo(db, adapter, configs.limites_jogos),\r\n pules: createGenericRepo(db, adapter, configs.pules),\r\n numeros: createGenericRepo(db, adapter, configs.numeros),\r\n descargas: createGenericRepo(db, adapter, configs.descargas),\r\n descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.descargas_associacao\r\n ),\r\n premiacoes: createGenericRepo(db, adapter, configs.premiacoes),\r\n premiacoes_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.premiacoes_associacao\r\n ),\r\n pdf_descargas: createGenericRepo(db, adapter, configs.pdf_descargas),\r\n pdf_descargas_associacao: createGenericRepo(\r\n db,\r\n adapter,\r\n configs.pdf_descargas_associacao\r\n ),\r\n auditLogs: createGenericRepo(db, adapter, configs.auditLogs),\r\n envios_descarga: createGenericRepo(db, adapter, configs.envios_descarga),\r\n dispositivos: createGenericRepo(db, adapter, configs.dispositivos),\r\n vendas_cambistas: createGenericRepo(db, adapter, configs.vendas_cambistas),\r\n vendas_por_dias: createGenericRepo(db, adapter, configs.vendas_por_dias),\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// HELPERS ESPECÍFICOS PARA WEB E REACT NATIVE\r\n// ============================================================================\r\n\r\n/**\r\n * Cria todos os repositórios para Firebase Web SDK\r\n *\r\n * @example\r\n * import { getFirestore, collection, doc, query, where } from 'firebase/firestore';\r\n * import { createWebRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const db = getFirestore();\r\n * const firebaseInstance = { collection, doc, query, where, getDocs, getDoc, setDoc, updateDoc, deleteDoc, writeBatch, onSnapshot };\r\n * const repo = createWebRepoFactory({\r\n * db,\r\n * firebaseInstance,\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const users = await repo.users.getAll({\r\n * where: [{ field: \"role\", operator: \"==\", value: \"admin\" }]\r\n * });\r\n */\r\nexport function createWebRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\"> & { firebaseInstance: any }\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createWebAdapter(config.firebaseInstance),\r\n });\r\n}\r\n\r\n/**\r\n * Cria todos os repositórios para React Native Firebase\r\n *\r\n * @example\r\n * import firestore from '@react-native-firebase/firestore';\r\n * import { createReactNativeRepoFactory } from '@cristian.aragao/milharis-core';\r\n *\r\n * const repo = createReactNativeRepoFactory({\r\n * db: firestore(),\r\n * getBancaId: () => getCurrentUser()?.bancaId\r\n * });\r\n *\r\n * // Usar com type-safety completo!\r\n * const numeros = await repo.numeros.getAll({\r\n * where: [{ field: \"tipo_jogo\", operator: \"==\", value: \"milhar\" }]\r\n * });\r\n */\r\nexport function createReactNativeRepoFactory(\r\n config: Omit<RepoFactoryConfig, \"adapter\">\r\n): RepoCollections {\r\n return createRepoFactory({\r\n ...config,\r\n adapter: createReactNativeAdapter(),\r\n });\r\n}\r\n"],"mappings":"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AO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,IAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE,EACzC,GAAM,CAAE,MAAO,KAAM,MAAOA,EAAO,EAAI,CAAE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AClC,IAAK,CAAE,MAAO,MAAO,MAAO,KAAM,EAKlC,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAK5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CAAE,MAAO,IAAK,MAAO,GAAI,EAC5B,EAAG,CA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","names":["EXTRACAO","GAMES","BICHOS","GRUPOS_BICHOS","MESSAGES","ROLES","STATUS_PULE","TIPO_VISUALIZACAO","VISUALIZACAO","PREFIX_NUMBER","PREFIX_ENVIO_OLD","PREFIX_ENVIO","STATUS_DESCARGA","KEYBOARD","STATUS_DEVICE","PREMIOS","COMISSOES_PADRAO","GAMES","STATUS_GUIA","getCreatedBySystem","obj","ROLES","utils_exports","__export","clone","combineDateTime","dateToNumber","delay","dividirArray","formatterBRL","formatterPercentage","formatterPercentageDecimal","generateId","getAllCombinations","getCodigoAuth","getDataInicioFim","getInitials","matchNormalized","normalize","numberToDate","numbersSelectedFormated","parserBRL","parserPercentage","parserPercentageDecimal","pegarHorarioSaoPaulo","removerLetters","showFormatDate","cloneDeep","clone","item","isValid","dateToNumber","date","year","month","day","hour","minute","second","parse","isValid","moment","pegarHorarioSaoPaulo","string","day","month","year","hour","minutes","seconds","milliseconds","numberToDate","number","str","year","month","day","hour","minute","second","dateString","dateNow","pegarHorarioSaoPaulo","date","parse","isValid","combineDateTime","dateA","dateB","dateAParts","numberToDate","dateBParts","year","month","day","hours","minutes","seconds","combinedDate","dateToNumber","setHours","setMinutes","setSeconds","getDataInicioFim","dataAposta","dataInicio","setSeconds","setMinutes","setHours","numberToDate","pegarHorarioSaoPaulo","dataFim","dateToNumber","formatterBRL","value","cloneValue","parserBRL","valueN","generatePermutations","arr","result","i","current","remaining","remainingPermutations","perm","getAllCombinations","num","numArr","permutations","uniqueCombinations","format","showFormatDate","number","formatString","date","numberToDate","numbersSelectedFormated","numbersString","numbers","a","b","result","start","end","i","generateId","prefix","s4","getCodigoAuth","min","max","dividirArray","arrayGrande","tamanho","resultado","i","subarray","delay","ms","resolve","normalize","str","matchNormalized","text","search","normalize","getInitials","nomeCompleto","nome","formatterPercentage","value","parserPercentage","value","newValue","formatterPercentageDecimal","value","parserPercentageDecimal","newValue","removerLetters","value","ExtracaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","numbers_exports","__export","arredondarParaCima","arrendondarCasasDecimais","calculaValoresDosNumeros","calcularValorDeNumero","formatarNumero","generateDescargas","gerarDezenas","getCreatedBySystem","getLimiteSimulado","getNumeroId","getNumerosAcimaDoLimite","getPremioFormato","getPropsEnvioId","getPropsEnvioIdOld","getPropsPrefix","getPropsVP","getSomaEnvio","getSomaProps","getSomaVP","getTiposJogos","sortNumeros","formatarNumero","numero","formato","resultado","indiceNumero","indiceFormato","generateDescarga","numero","id","descargaId","lastEnvioId","DescargaModel","getDescargaIdPeloNumero","numero","getByProperty","valorParaId","arredondarParaCima","generateDescargas","numeros","getByProperty","descargas","numero","descargaId","getDescargaIdPeloNumero","generateDescarga","gerarDezenas","bets","newNumbers","bet","TYPE_GAME","GAMES","number","nums","num","n","formatarNumero","uniqueCombinations","getSomaEnvio","numero","soma","key","value","array","getSomaVP","numero","soma","quantidadeDePulesMaiorQueZero","key","value","somaEnviadoParaAssociacao","getSomaEnvio","getNumeroId","props","dataAposta","jogo","numero","bancaId","premio","descarregado","TYPE_GAME","GAMES","numeroFormatado","formatarNumero","descarregadoFormatado","getTiposJogos","tipos","calcularValorDeNumero","quantidadeDeNumeros","tipoJogo","valorPremio","quantidadeDePremios","TYPE_GAME","GAMES","jogos","getTiposJogos","valorDoNumero","criarNumberModel","numberId","numeroFormatado","premioFormato","created","game","jogo","NumberModel","processarNumeroEPremio","number","premio","valorDoNumero","TYPE_GAME","numeros","PREMIOS","getNumeroId","valor","arrendondarCasasDecimais","arredondarParaCima","calculaValoresDosNumeros","minimoParaSelecionarDo1ao5Premio","bet","jogos","getTiposJogos","GAMES","numbers","qtd_numeros","prize","calcularValorDeNumero","getPremioFormato","getNumerosAcimaDoLimite","numeros","valoresJogos","limitesJogos","numero","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","arrendondarCasasDecimais","limiteAtingidoArredondado","diferenca","arredondarParaCima","valor","emCentavos","resto","sortNumeros","numeros","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getPropsEnvioId","numero","objeto","key","value","array","getPropsEnvioIdOld","numero","objeto","key","value","array","getPropsVP","numero","objeto","key","value","getPropsPrefix","numero","props","PREFIX_ENVIO","PREFIX_ENVIO_OLD","vps","clone","getPropsVP","envio_ids","getPropsEnvioId","envio_ids_old","getPropsEnvioIdOld","getPremioFormato","premio","PREMIOS","getSomaProps","objeto","soma","value","getLimiteJogoPeloTipoJogo","limitsGames","type_game","v","limite_jogos_exports","__export","calcularValorJogoPeloLimite","getLimiteJogoPeloTipoJogo","getValorJogoPeloTipoJogo","calcularValorJogoPeloLimite","limiteJogo","valorJogo","getValorJogoPeloTipoJogo","valuesGames","type_game","v","arrendondarCasasDecimais","numero","casas","getLimiteSimulado","tipo_jogo","valores","limites","valorJogo","getValorJogoPeloTipoJogo","limiteSimulado","getLimiteJogoPeloTipoJogo","arrendondarCasasDecimais","extracao_exports","__export","extracaoEstaAtivaBoolean","extracaoEstaAtivaTryCatch","getAvailableTimes","getProximaExtracaoDisponivelParaAposta","pegarExtracoes","format","getDay","games_exports","__export","calculateAmount","calculateAmountGame","fazerJogo","formatPuleId","getBetDateToNumber","getFormattedPuleId","getGamesUnicosList","getGamesUnicosObjeto","invertGame","calculateAmount","betValues","total","item","calculateAmountGame","games","total","bet","calculateAmount","setHours","setMinutes","setSeconds","getBetDateToNumber","date","extracaoDate","dateExtracao","numberToDate","newDateBet","setHours","setMinutes","setSeconds","dateToNumber","formatPuleId","n","getFormattedPuleId","id","parts","invertGame","game","newGame","clone","index","aposta","tipos_jogos","getTiposJogos","nums","result","tipo_jogo","num","numeroFormatado","formatarNumero","GAMES","n","getAllCombinations","fazerJogo","cart","profile","dateBet","extracao","puleId","game","GameModel","getBetDateToNumber","calculateAmountGame","gameWIthInvertedNumbers","invertGame","numeros","calculaValoresDosNumeros","getGamesUnicosList","GAMES","visu","getGamesUnicosObjeto","acc","item","getAvailableTimes","extracoes","dateBet","showAll","mobile","dateNow","data","getBetDateToNumber","extracoesAtivas","ext","DateBet","numberToDate","validTimes","extracoesFeriado","getDay","format","showFormatDate","extA","extB","format","getDay","pegarExtracoes","extracoes","dataAposta","dateToNumber","pegarHorarioSaoPaulo","dataAgora","retornar","pegar","getHorario","extracao","dataApostaNumerica","getBetDateToNumber","dataAgoraNumerica","dataApostaDate","numberToDate","extracoesAtivas","ext","extracoesDeFeriado","extracoesNormais","extracoesValidas","getDay","sortExtracoes","dataAgoraDate","horaAgora","format","showFormatDate","a","b","getDay","extracaoEstaAtivaTryCatch","dataAposta","extracao","dataApostaNumerica","getBetDateToNumber","somenteNoFeriadoNormalizado","dataApostaDate","numberToDate","getDay","diaDaSemana","extracaoEstaAtivaBoolean","dataAposta","extracao","extracaoEstaAtivaTryCatch","getProximaExtracaoDisponivelParaAposta","extracoes","data","resultado","extracoesDoDia","pegarExtracoes","indiceExtracaoComResultado","extracao","dataBase","horarioExtracao","dataCompleta","getBetDateToNumber","users_exports","__export","getLimitsRest","getPermission","isAdm","isAdmOrSubAdm","isAssociacao","isCambista","isCambistaTalao","isDigitador","isDigitadorAdm","isDigitadorOrDigitadorAdm","isSuperAdm","IS_ADM","IS_ADM_OR_SUBADM","IS_ASSOCIACAO","IS_SUPER_ADMIN","IS_CAMBISTA_TALAO","IS_CAMBISTA","IS_DIGITADOR_ADM","IS_DIGITADOR","IS_DIGITADOR_AND_ADM","isAdm","user","isAssociacao","isSuperAdm","isAdmOrSubAdm","isSubAdmin","ROLES","isCambistaTalao","isCambista","isDigitadorAdm","isDigitador","isDigitadorOrDigitadorAdm","hasPermissionToSendToAssociation","getPermission","getLimitsRest","user","hoje","pre","value","descarga_exports","__export","generateDescarga","generateDescargas","getDescargaIdPeloEnvio","getDescargaIdPeloNumero","getDescargasAcimaDoLimite","getPropsEnvioId","getPropsEnvioIdOldDescarga","getPropsVPDescarga","getTotalGeralDescarga","sortDescargas","sortDescargasByEnvioId","sortDescargas","descargas","sortedDescargas","a","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","item","getDescargasAcimaDoLimite","descargas","valoresJogos","limitesJogos","descarga","valorJogo","functionsCore","limiteJogo","v","limiteAtingido","amountArredondado","arrendondarCasasDecimais","limiteAtingidoArredondado","diferenca","getPropsVPDescarga","descarga","objeto","key","value","getPropsEnvioId","descarga","objeto","key","value","array","getPropsEnvioIdOldDescarga","descarga","objeto","key","value","array","getDescargaIdPeloEnvio","numero","envioId","envioKey","PREFIX_ENVIO_OLD","envioValue","somaArredondada","arredondarParaCima","getTotalGeralDescarga","totalBrutoJogos","comissoes","totalGeral","totalBrutoJogosArray","listaComissoes","comissaoRestante","comissao","type_game","jogo","valorJogo","comissaoEncontrada","comissaoPadrao","COMISSOES_PADRAO","totalComissao","totalLiquido","sortDescargasByEnvioId","descargas","envioId","sortedDescargas","b","ORDER_GAME_A","GAMES","ORDER_GAME_B","PREFIX_ENVIO_OLD","item","envio_exports","__export","agruparEnvioPorExtracao","criarEstruturaJogo","getComissoesDoEnvio","criarEstruturaJogo","_jogoId","jogoData","ComissaoDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getComissoesDoEnvio","comissoesDescarga","comissoes","comissao","comissaoModel","ComissaoDescargaModel","generateId","agruparEnvioPorExtracao","envios","enviosExtracao","enviosLista","envio","comissoes","getComissoesDoEnvio","extracaoId","envioExtracao","totalGeral","getTotalGeralDescarga","acc","jogoId","jogoData","criarEstruturaJogo","jogos","functionsCore","numbers_exports","extracao_exports","descarga_exports","games_exports","users_exports","limite_jogos_exports","utils_exports","envio_exports","MessageModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","RouteModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","UserModel","obj","ROLES","type","GAMES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ValueGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GameModel","obj","ROLES","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","getCodigoAuth","STATUS_PULE","NumberModel","obj","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseModel","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","BetModel","obj","PremiacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","PDFModel","obj","getCreatedBySystem","BancaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","AuditLogModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimitGameModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","EnvioDescargaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DESCARGA","DescargaModel","descarga","ordemPremioExibicao","PREMIOS","ordemJogoExibicao","GAMES","baseDescarga","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","propsPrefix","getPropsPrefix","PREFIX_ENVIO","PREFIX_ENVIO_OLD","DeviceModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","STATUS_DEVICE","PremiacaoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GuiaModel","obj","ROLES","STATUS_GUIA","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","GuiaItemModel","obj","ROLES","STATUS_GUIA","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","LimiteNumeroApostaModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","ResultadoAssociacaoModel","obj","getCreatedBySystem","dateToNumber","pegarHorarioSaoPaulo","VendaCambistaModel","obj","ROLES","VendasPorDiaModel","obj","baseModel","vendasExtracaoProps","key","value","totalPulesExtracaoProps","vendasRotaProps","totalPulesRotaProps","comissaoExtracaoProps","comissaoRotaProps","collections","MessageModel","UserModel","GuiaModel","GuiaItemModel","LimiteNumeroApostaModel","ValueGameModel","LimitGameModel","GameModel","ExtracaoModel","ResultadoModel","ResultadoAssociacaoModel","RouteModel","EnvioDescargaModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","BancaModel","AuditLogModel","DeviceModel","ComissaoDescargaModel","VendaCambistaModel","VendasPorDiaModel","COLLECTIONS_NAMES","collectionsToAudit","collectionsRetentionDays","collectionsWithIsolationByBancaId","MemoryCache","ttl","maxSize","key","item","data","firstKey","createGenericRepo","db","adapter","config","collectionName","model","idSearchStrategy","isolation","cache","authorization","generateId","memoryCache","checkAuthorization","operation","userRole","allowedRoles","getIsolationConstraints","value","buildQuery","options","constraints","field","operator","direction","collection","resolveDocument","id","query","snapshot","getCacheKey","params","isolationKey","cacheKey","cached","docSnap","docRef","result","error","callback","docData","completeData","modelData","docs","d","op","batch","docId","detectFirebaseVersion","firebaseInstance","createV9ModularAdapter","firebaseModular","path","segments","count","fieldValues","createV8Adapter","constraint","createWebAdapter","version","createAutoRepo","createReactNativeAdapter","createConfigs","getBancaId","cacheConfig","authorizationConfigs","withBancaIsolation","config","withoutIsolation","UserModel","BancaModel","ExtracaoModel","ResultadoModel","MessageModel","RouteModel","ValueGameModel","LimitGameModel","GameModel","NumberModel","DescargaModel","PremiacaoModel","PremiacaoAssociacaoModel","PDFModel","AuditLogModel","EnvioDescargaModel","DeviceModel","VendaCambistaModel","VendasPorDiaModel","createRepoFactory","db","adapter","configs","createGenericRepo","createWebRepoFactory","createWebAdapter","createReactNativeRepoFactory","createReactNativeAdapter"]}