{"id":50487054,"url":"https://github.com/guilherme006/payup","last_synced_at":"2026-06-01T23:03:36.983Z","repository":{"id":356669387,"uuid":"1233574112","full_name":"Guilherme006/PayUp","owner":"Guilherme006","description":"PayUp é um aplicativo iOS para organizar cobranças de clientes. O app permite cadastrar clientes, registrar valor e data de cobrança, listar lançamentos por dia, calcular recebimentos do dia e agendar lembretes locais para cobranças recorrentes.","archived":false,"fork":false,"pushed_at":"2026-05-09T06:00:44.000Z","size":483,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T07:30:21.543Z","etag":null,"topics":["autolayout","sqlite","swift","uikit","usernotifications","xcode"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Guilherme006.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-09T05:32:16.000Z","updated_at":"2026-05-09T06:00:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Guilherme006/PayUp","commit_stats":null,"previous_names":["guilherme006/payup"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Guilherme006/PayUp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FPayUp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FPayUp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FPayUp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FPayUp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Guilherme006","download_url":"https://codeload.github.com/Guilherme006/PayUp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Guilherme006%2FPayUp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33797128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["autolayout","sqlite","swift","uikit","usernotifications","xcode"],"created_at":"2026-06-01T23:03:34.986Z","updated_at":"2026-06-01T23:03:36.969Z","avatar_url":"https://github.com/Guilherme006.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PayUp\n\nPayUp é um aplicativo iOS para organizar cobranças de clientes. O app permite cadastrar clientes, registrar valor e data de cobrança, listar lançamentos por dia, calcular recebimentos do dia e agendar lembretes locais para cobranças recorrentes.\n\nO projeto foi desenvolvido com UIKit, Swift e interface programática, sem Storyboards para as telas principais.\n\n\u003cimg width=\"1920\" height=\"1080\" alt=\"image\" src=\"https://github.com/user-attachments/assets/7b586846-0dd2-4c9c-9e74-3a04cf9a01ea\" /\u003e\n\n## Visão Geral\n\nPrincipais funcionalidades:\n\n- Cadastro de clientes com nome, contato, telefone, CNPJ, endereço, valor e data de cobrança.\n- Edição e exclusão de clientes cadastrados.\n- Listagem horizontal de clientes na Home.\n- Visualização de lançamentos por dia da semana.\n- Cálculo do total de recebimentos do dia atual.\n- Filtro de lançamentos por nome do cliente.\n- Agendamento de notificações locais para cobranças recorrentes.\n- Identidade visual própria com cores, fontes K2D e assets customizados.\n\n## Tecnologias\n\n- Swift 5\n- UIKit\n- Auto Layout programático\n- SQLite3\n- UserNotifications\n- Xcode 16.3\n- Assets.xcassets\n- Fonte K2D\n\n## Estrutura do Projeto\n\n```text\nPayUp.xcodeproj\nPayUp/\n  AppDelegate.swift\n  SceneDelegate.swift\n  Info.plist\n  Resources/\n    Assets.xcassets\n    K2D/\n  Sources/\n    Core/\n      Colors/\n      Components/\n      Database/\n      Extensions/\n      Model/\n      Typography/\n    Features/\n      Form/\n      Home/\n      Splash/\n```\n\n## Arquitetura\n\nO projeto segue uma organização próxima de MVVM usando UIKit:\n\n- `ViewController`: coordena ciclo de vida da tela, eventos do usuário, apresentação de telas e conexão entre view e view model.\n- `View`: monta a interface visual usando UIKit e Auto Layout.\n- `ViewModel`: concentra regras de apresentação, formatação e acesso aos dados.\n- `Model`: representa as entidades e estruturas usadas pelo app.\n- `DatabaseManager`: centraliza persistência local em SQLite.\n- `NotificationManager`: centraliza o agendamento e cancelamento de notificações locais.\n\n## Ciclo de Inicialização\n\nO ponto de entrada do app fica em `AppDelegate.swift`, marcado com `@main`.\n\nDurante a inicialização, o app solicita permissão para notificações locais:\n\n```swift\nUNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound])\n```\n\nA janela principal é configurada em `SceneDelegate.swift`. O app cria uma `UIWindow`, instancia uma `UINavigationController` e define a `HomeViewController` como tela inicial.\n\n## Features\n\n### Home\n\nArquivos principais:\n\n- `Sources/Features/Home/View/HomeView.swift`\n- `Sources/Features/Home/View/HomeViewController.swift`\n- `Sources/Features/Home/ViewModel/HomeViewModel.swift`\n\nA Home é a tela principal do aplicativo. Ela exibe:\n\n- Cabeçalho com logo, botão de notificação e imagem de perfil.\n- Seletor horizontal de dias da semana.\n- Card com recebimentos de hoje.\n- Botão para adicionar cliente.\n- Lista horizontal de clientes.\n- Seção de lançamentos.\n- Botão de filtro por nome.\n\nResponsabilidades principais:\n\n- Buscar clientes no banco local.\n- Transformar clientes em modelos de exibição.\n- Calcular o total de recebimentos do dia atual.\n- Filtrar lançamentos por nome.\n- Atualizar a lista quando dados de cliente mudam.\n\n### Formulário de Cliente\n\nArquivos principais:\n\n- `Sources/Features/Form/View/ClientFormView.swift`\n- `Sources/Features/Form/View/ClientFormViewController.swift`\n- `Sources/Features/Form/View/ClientFormViewDelegate.swift`\n- `Sources/Features/Form/ViewModel/ClientFormViewModel.swift`\n\nO formulário funciona em dois modos:\n\n- `.add`: adiciona um novo cliente.\n- `.edit(Client)`: edita ou exclui um cliente existente.\n\nCampos do formulário:\n\n- Valor\n- Data de cobrança\n- Cobrança recorrente\n- Frequência da recorrência\n- Dia selecionado\n- Nome do cliente\n- Contato\n- Telefone\n- CNPJ\n- Endereço\n\nAo salvar, os dados são convertidos em um `Client` e enviados ao `ClientFormViewModel`, que usa o `DatabaseManager` para persistir. Caso o cliente tenha cobrança recorrente, o `NotificationManager` agenda os lembretes.\n\n### Splash\n\nArquivos principais:\n\n- `Sources/Features/Splash/View/SplashView.swift`\n- `Sources/Features/Splash/View/SplashViewController.swift`\n- `Sources/Features/Splash/ViewModel/SplashViewModel.swift`\n\nA feature de Splash contém uma animação inicial com logo e triângulo. Atualmente, a tela inicial configurada no `SceneDelegate` é a `HomeViewController`; então, a Splash existe no projeto, mas não está conectada ao fluxo inicial.\n\n## Core\n\n### Components\n\nComponentes reutilizáveis do app:\n\n- `AuthenticationView`: tela/componente visual de autenticação.\n- `CompanyCell`: célula da lista horizontal de empresas/clientes.\n- `CompanyListView`: collection view horizontal para clientes.\n- `CurrencyTextField`: campo customizado para valor monetário.\n- `DatePickerTextField`: campo customizado com seletor de data.\n- `DaySelectorView`: seletor horizontal de dias da semana.\n- `InputTextFieldView`: campo de texto padronizado com máscaras por tipo.\n- `PaymentCardView`: card visual para valores e lançamentos.\n\n### Models\n\nModelos principais:\n\n- `Client`: representa um cliente/cobrança persistida.\n- `ClientFormMode`: define modo de abertura do formulário.\n- `CompanyItemModel`: modelo visual para item da lista de clientes.\n- `InputTextFieldType`: define o tipo de campo e máscaras.\n- `PaymentCardModel`: modelo visual para cards de pagamento.\n- `PaymentCardType`: define tipo, ícone e subtítulo do card.\n\n### Database\n\nO app usa SQLite localmente via `SQLite3`.\n\nArquivo principal:\n\n- `Sources/Core/Database/DatabaseManager.swift`\n\nBanco criado:\n\n```text\nclients.sqlite\n```\n\nLocal:\n\n```text\nDocuments directory do app\n```\n\nTabela principal:\n\n```text\nclients\n```\n\nCampos:\n\n- `id`\n- `name`\n- `contact`\n- `phone`\n- `cnpj`\n- `address`\n- `value`\n- `due_date`\n- `is_recurring`\n- `frequency`\n- `selected_day`\n\nOperações disponíveis:\n\n- Inserir cliente.\n- Atualizar cliente.\n- Buscar todos os clientes.\n- Buscar cliente por ID.\n- Excluir cliente.\n\n### Notifications\n\nArquivo principal:\n\n- `Sources/Core/Database/NotificationManager.swift`\n\nO `NotificationManager` agenda notificações locais para clientes recorrentes usando `UNUserNotificationCenter`.\n\nFrequências tratadas:\n\n- `Diariamente`\n- `Semanalmente`\n- `Mensalmente`\n\nObservação: o formulário também apresenta a opção `Anualmente`, mas a lógica atual de notificação ainda não possui tratamento para essa frequência.\n\n### Colors\n\nArquivo:\n\n- `Sources/Core/Colors/Colors.swift`\n\nCentraliza a paleta visual do app. A interface usa fundo escuro e cor de destaque verde.\n\n### Typography\n\nArquivo:\n\n- `Sources/Core/Typography/Fonts.swift`\n\nCentraliza os estilos tipográficos com a fonte K2D:\n\n- `K2D-Bold`\n- `K2D-Regular`\n- `K2D-SemiBold`\n\nAs fontes são registradas no `Info.plist` em `UIAppFonts`.\n\n### Extensions\n\nExtensões utilitárias:\n\n- `UITextField+Ext.swift`: adiciona padding lateral ao `UITextField`.\n- `UIView+Ext.swift`: permite encontrar o view controller pai de uma view.\n\n## Recursos\n\n### Assets\n\nOs assets ficam em:\n\n```text\nPayUp/Resources/Assets.xcassets\n```\n\nIncluem:\n\n- Ícone do app\n- Cor de destaque\n- Logo principal\n- Ícones de cobrança\n- Imagens de perfil\n- Assets da Splash\n- Assets de Face ID/autenticação\n\n### Fontes\n\nAs fontes ficam em:\n\n```text\nPayUp/Resources/K2D\n```\n\nArquivos:\n\n- `K2D-Bold.ttf`\n- `K2D-Regular.ttf`\n- `K2D-SemiBold.ttf`\n- `OFL.txt`\n\n## Como Rodar\n\n1. Clone o repositório:\n\n```bash\ngit clone https://github.com/Guilherme006/PayUp.git\n```\n\n2. Abra o projeto no Xcode:\n\n```bash\nopen PayUp.xcodeproj\n```\n\n3. Selecione o scheme `PayUp`.\n\n4. Escolha um simulador ou dispositivo físico.\n\n5. Rode o app com `Cmd + R`.\n\n## Permissões\n\nO app solicita permissão para notificações locais no primeiro launch. Essa permissão é necessária para os lembretes de cobranças recorrentes.\n\n## Persistência de Dados\n\nOs dados são armazenados localmente no dispositivo. Não há backend remoto, sincronização em nuvem ou autenticação externa implementada no fluxo atual.\n\n## Pontos de Atenção\n\n- A Splash existe, mas não está definida como tela inicial no fluxo atual.\n- A opção `Anualmente` aparece no formulário, mas ainda não é tratada no cálculo de próximas notificações.\n- O filtro da Home atualmente filtra lançamentos por nome.\n- O banco SQLite não possui migrações versionadas.\n- O projeto ainda não possui testes automatizados versionados.\n- Arquivos de produto compilado, como `PayUp.app`, não devem ser versionados.\n\n## Convenções do Projeto\n\n- Interfaces são criadas por código usando UIKit.\n- Views customizadas ficam em `Sources/Core/Components`.\n- Features ficam isoladas em `Sources/Features`.\n- Estilos globais ficam em `Colors` e `Typography`.\n- Persistência e notificações ficam centralizadas em managers.\n\n## Status Atual\n\nO app contém a base funcional para cadastro, edição, exclusão, listagem e notificações locais de cobranças. A estrutura atual permite evoluir o produto adicionando autenticação real, dashboard financeiro, histórico de pagamentos, status de cobrança, migrações de banco e testes automatizados.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilherme006%2Fpayup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguilherme006%2Fpayup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguilherme006%2Fpayup/lists"}