{"id":51054478,"url":"https://github.com/dedslash/joseph-yusuf","last_synced_at":"2026-06-22T20:01:08.144Z","repository":{"id":363928246,"uuid":"1232273783","full_name":"DedSlash/joseph-yusuf","owner":"DedSlash","description":"SaaS de gestion de revenus — 10 microservices Spring Boot 3 + Spring Cloud, frontends Angular admin/user, CI/CD Jenkins + SonarQube, en production sur josephyusuf.com","archived":false,"fork":false,"pushed_at":"2026-06-18T17:54:42.000Z","size":6899,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T18:15:25.716Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","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/DedSlash.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support-service/Dockerfile","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-07T19:08:10.000Z","updated_at":"2026-06-18T17:54:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/DedSlash/joseph-yusuf","commit_stats":null,"previous_names":["dedslash/joseph-yusuf"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DedSlash/joseph-yusuf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DedSlash%2Fjoseph-yusuf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DedSlash%2Fjoseph-yusuf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DedSlash%2Fjoseph-yusuf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DedSlash%2Fjoseph-yusuf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DedSlash","download_url":"https://codeload.github.com/DedSlash/joseph-yusuf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DedSlash%2Fjoseph-yusuf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34663524,"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-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T20:01:07.327Z","updated_at":"2026-06-22T20:01:08.137Z","avatar_url":"https://github.com/DedSlash.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/banner.png\" alt=\"Joseph·Yusuf\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eJoseph·Yusuf\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eSaaS de gestion des revenus pour freelances et salariés à revenus variables,\n  basé sur le Principe biblique de Joseph : épargner pendant l'abondance,\n  tenir pendant la disette.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://josephyusuf.com\"\u003e\u003cimg alt=\"Live\" src=\"https://img.shields.io/badge/live-josephyusuf.com-1F8A2D?style=flat-square\" /\u003e\u003c/a\u003e\n  \u003cimg alt=\"Statut\" src=\"https://img.shields.io/badge/statut-production%20publique-C9A84C?style=flat-square\" /\u003e\n  \u003cimg alt=\"Stack\" src=\"https://img.shields.io/badge/Java-17-orange?style=flat-square\" /\u003e\n  \u003cimg alt=\"Stack\" src=\"https://img.shields.io/badge/Spring%20Boot-3.2-6DB33F?style=flat-square\" /\u003e\n  \u003cimg alt=\"Stack\" src=\"https://img.shields.io/badge/Angular-17-DD0031?style=flat-square\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Démo\n\n| Lien                                      | Compte                                                       |\n|-------------------------------------------|--------------------------------------------------------------|\n| https://josephyusuf.com                   | `demo.portfolio@josephyusuf.com` / *mot de passe sur demande* |\n| https://admin.josephyusuf.com             | *réservé super-admin — non public*                            |\n\n\u003e Le compte démo est régénéré chaque nuit à 03h00 UTC\n\u003e (`scripts/reset-demo-account.sh`).\n\n## Statut\n\n\u003e **En production publique** depuis le **23 mai 2026**.\n\u003e Stack complète déployée sur VPS Hetzner CPX32 derrière Nginx + Let's Encrypt.\n\u003e Monétisation Stripe / PayDunya / PayTech **en cours d'activation**\n\u003e (`PAYMENTS_ACTIVE=false` — les trials sont prolongés automatiquement\n\u003e jusqu'à finalisation du dashboard Stripe).\n\n---\n\n## Architecture\n\n```\n                                  ┌──────────────────────┐\n                                  │   Nginx + Let's       │\n   Internet  ────────► HTTPS ────►│   Encrypt (VPS)       │\n                                  └──────────┬───────────┘\n                                             │\n                ┌────────────────────────────┼────────────────────────────┐\n                ▼                            ▼                            ▼\n        josephyusuf.com           api.josephyusuf.com         admin.josephyusuf.com\n        (frontend SPA)            (gateway-service)           (admin-frontend SPA)\n                                         │\n                              Spring Cloud Gateway 8080\n                                         │\n              ┌──────────────────────────┼──────────────────────────┐\n              ▼                          ▼                          ▼\n       Eureka Discovery          ─── 8 microservices métier ───\n       (discovery-server)             (lb:// routing)\n                                         │\n              ┌────────────┬────────────┼────────────┬────────────┬────────────┐\n              ▼            ▼            ▼            ▼            ▼            ▼\n        auth-service   income-svc  rule-engine   alert-svc   report-svc   subscription\n              │            │            │            │            │            │\n              └─── joseph_auth ─── joseph_income ─── joseph_alerts ─── ... ───┘\n                                  (PostgreSQL multi-schema)\n                                         │\n                              Kafka (events)  +  Redis (cache)\n```\n\n## Microservices\n\n| Service              | Port | Rôle                                                                       |\n|----------------------|------|----------------------------------------------------------------------------|\n| `discovery-server`   | 8761 | Registre Eureka (service discovery)                                        |\n| `gateway-service`    | 8080 | API Gateway Spring Cloud, JWT relay, CORS, routes `/api/**`                |\n| `auth-service`       | 8081 | Authentification JWT, plans FREE/PREMIUM/PREMIUM_PLUS, reset password      |\n| `income-service`     | 8082 | Sources \u0026 revenus, classification Joseph (ABUNDANCE/LEAN/NORMAL), épargne  |\n| `rule-engine-service`| 8083 | Règles financières (50/30/20, etc.) — pattern Strategy extensible          |\n| `alert-service`      | 8084 | Alertes basées sur les événements Kafka (recommandations d'épargne)        |\n| `report-service`     | 8085 | Rapports PDF mensuels (JasperReports)                                      |\n| `subscription-service`|8086 | Abonnements Stripe + PayDunya + PayTech, webhooks, coupon `EARLY50`        |\n| `admin-service`      | 8087 | Back-office : users, transactions, codes promo, KPIs, audit log            |\n| `support-service`    | 8088 | Tickets support + base de connaissances FAQ, WebSocket notifications admin |\n\nPlus 2 SPAs Angular : `frontend` (utilisateur) et `admin-frontend` (admin).\n\n## Stack technique\n\n**Backend** — Java 17 · Spring Boot 3.2.5 · Spring Cloud 2023.0.1\n(Gateway + Eureka) · JJWT 0.12 · MapStruct 1.5 · Lombok · Flyway ·\nPostgreSQL 15 (multi-schema) · Kafka 7.4 · Redis 7 · JasperReports ·\nSpring Mail.\n\n**Frontend** — Angular 17.3 (standalone components) · PrimeNG 17.18\n(`lara-dark-amber`, accent gold `#C9A84C`) · Chart.js 4 · Stripe.js 9 ·\nSheetJS (import Excel/CSV/JSON côté navigateur).\n\n**Infrastructure** — Docker Compose · Ansible · Jenkins (multibranch +\nPR pipeline) · SonarQube (Quality Gate bloquant sur new code) ·\nNginx + Let's Encrypt · VPS Hetzner CPX32 (Ubuntu 26.04).\n\n## Logique métier — Principe de Joseph\n\nPour chaque mois, le revenu est classé en comparant à la moyenne\ndes 3 mois précédents :\n\n```\nABUNDANCE  ⟵  revenu  \u003e  moyenne × 1.15\nNORMAL     ⟵  entre les deux\nLEAN       ⟵  revenu  \u003c  moyenne × 0.85\n```\n\nLa recommandation d'épargne suit le statut :\n\n```\nABUNDANCE  →  max(monthlyTarget, (revenu − moyenne) + 0.5 × monthlyTarget)\nNORMAL     →  max(monthlyTarget, monthlyTargetPercent × revenu)\nLEAN       →  0  (pause d'épargne)\n```\n\nLa recommandation est répartie au prorata du restant à atteindre entre\nles objectifs `ACTIVE`. Un événement Kafka `joseph.savings.recommendation`\nest publié à chaque classification et consommé par l'`alert-service`\nqui crée une alerte `SAVINGS_RECOMMENDATION` par utilisateur / mois /\nobjectif.\n\n## Captures\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/dashboard-revenus.jpg\" alt=\"Dashboard revenus\" width=\"80%\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/mobile-landing.png\"   alt=\"Landing mobile\"   width=\"32%\" /\u003e\n  \u0026nbsp;\n  \u003cimg src=\"docs/images/mobile-dashboard.png\" alt=\"Dashboard mobile\" width=\"32%\" /\u003e\n\u003c/p\u003e\n\n## Démarrer en local\n\nPrérequis : Docker ≥ 24, Docker Compose v2, Java 17, Maven, ~6 Go RAM libres.\n\n```bash\ngit clone https://github.com/DedSlash/joseph-yusuf.git\ncd joseph-yusuf\n\n# 1. Préparer les variables d'environnement\ncp .env.example .env\n# Éditer .env :\n#   - DB_PASSWORD = un nouveau mot de passe\n#   - JWT_SECRET  = 64+ caractères aléatoires\n#   - STRIPE_SECRET_KEY = sk_test_… (pour tester les paiements)\n\n# 2. Build des microservices\nmvn -DskipTests clean package\n\n# 3. Lancer la stack\ndocker compose up -d --build\n\n# 4. Vérifier l'état des services\ndocker compose ps\ncurl http://localhost:8080/actuator/health\n```\n\nStack accessible à :\n\n- Frontend       → http://localhost:4200\n- Admin frontend → http://localhost:4201\n- API Gateway    → http://localhost:8080\n- Eureka         → http://localhost:8761\n\nGuide pas-à-pas complet : [`docs/SMOKE-TEST.md`](docs/SMOKE-TEST.md).\n\n## CI/CD\n\n- `Jenkinsfile` — pipeline multibranch (build, tests, JaCoCo, SonarQube\n  Quality Gate, build Docker, déploiement via Ansible).\n- `Jenkinsfile.pr` — pipeline allégé pour les PR (build + tests + Sonar\n  uniquement, pas de déploiement).\n- `ansible/playbooks/` — `setup.yml`, `deploy.yml`, `deploy-all.yml`,\n  `rollback.yml`.\n- `scripts/deploy.sh` — déploiement rapide depuis la machine de dev.\n\n## Documentation\n\n- [`docs/SMOKE-TEST.md`](docs/SMOKE-TEST.md) — validation E2E complète\n- [`docs/PAYMENT-INTEGRATION.md`](docs/PAYMENT-INTEGRATION.md) — flow Stripe + état Wave/Orange Money\n- [`docs/JENKINS-SETUP.md`](docs/JENKINS-SETUP.md) — configuration Jenkins\n- [`CONTRIBUTING.md`](CONTRIBUTING.md) — stratégie de branches Git\n\n## Crédits\n\nConception, développement, déploiement : **Rey Dedy Pangou**\n([@DedSlash](https://github.com/DedSlash)).\n\nStack assistée par **Claude Code** (Anthropic) pour la génération de\ncode, la revue et l'écriture des migrations / tests.\n\n## License\n\n**All rights reserved.** © 2026 Rey Dedy Pangou.\n\nCe dépôt est public à des fins de démonstration (portfolio). Le code\nn'est pas distribué sous license open source : usage, copie,\nmodification ou redistribution ne sont **pas** autorisés sans accord\nécrit explicite. Le contenu de `docs/` (hors captures) est consultable\nà titre informatif.\n\nContact : [@DedSlash](https://github.com/DedSlash) ·\ndedypangou@gmail.com\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdedslash%2Fjoseph-yusuf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdedslash%2Fjoseph-yusuf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdedslash%2Fjoseph-yusuf/lists"}