Disponible pour un poste de développeur .NET · Casablanca / Télétravail

Souna El Hassan

Développeur Full-Stack .NET confirmé — Systèmes d'information métier (ERP / CRM)

Je développe et maintiens des applications de gestion en production : un ERP / CRM utilisé chaque jour pour les ventes, la logistique et la finance. Cinq ans sur un système ASP.NET en exploitation. Je mène aujourd'hui sa migration progressive de WebForms (.NET Framework 4.7.2) vers .NET 10 et Blazor, module par module, sur une stack que j'exploite déjà en production sur un outil interne.

Poste actuel
Distribution médicale · Casablanca
Spécialité
.NET 10 · Blazor · SQL Server
Expérience en production
5 ans
Type d'engagement
Temps plein · Ouvert au télétravail
À propos

Développer les systèmes de gestion dont l'entreprise dépend.

Cinq ans à développer, corriger et faire évoluer un ERP/CRM critique en production, dans un contexte où une régression peut bloquer une journée d'activité.

// since 2017

Mon travail quotidien consiste à garder le système fiable : performance SQL, services backend avec une gestion d'erreurs explicite, intégrations avec des services tiers, et un front-end modernisé page par page pour ne jamais interrompre l'exploitation.

Je mène la migration de l'ERP de WebForms sur .NET Framework 4.7.2 vers .NET 10 et Blazor selon le pattern strangler-fig : les nouveaux modules remplacent les pages legacy une par une, sur la même base SQL Server, pendant que l'application existante continue de tourner. Un premier pilote en .NET 8 Razor Pages a validé l'approche. La cible est désormais .NET 10 LTS, la stack de l'outil interne de pilotage IT que j'ai développé et que j'exploite en production.

Je pars de l'impact métier : un rapport lent qui fait perdre du temps chaque semaine, un deadlock qui bloque la facturation, une intégration fragile qui mobilise le support. Puis je corrige la cause, avec des tests, des journaux et une possibilité de retour arrière.

Architecture lisible

Chaque module a des couches claires (pages, services, données), une gestion d'erreurs explicite et un historique des modifications.

Performance en conditions réelles

Plans d'exécution, index, niveaux d'isolation et transactions, mesurés sur les données réelles de production.

Moderniser sans régression

Legacy ne veut pas dire réécriture. L'ancien et le nouveau tournent côte à côte et les pages migrent une par une, sans interrompre l'activité.

Expérience

Cinq ans sur un système métier critique, plus du conseil ERP / CRM.

// 2017 — present

Développeur .NET Full-Stack · Systèmes d'Information Métier

2021 — Présent
Société de distribution médicale (PME) · Casablanca
  • Maintenance et modernisation d'un ERP / CRM critique couvrant les ventes, la logistique, la finance et le reporting : plus de 160 écrans et 15 services backend en exploitation continue.
  • Pilotage de la migration progressive de WebForms (.NET Framework 4.7.2) vers .NET 10 / Blazor selon le pattern strangler-fig. Approche validée par un pilote en .NET 8 Razor Pages ; stack cible standardisée sur .NET 10 LTS.
  • Conception et livraison de nouveaux modules métier (soldes clients paramétrables, workflow de retours, tableaux de bord analytiques multi-niveaux) sur une architecture en couches Pages → Services → Données.
  • Intégration de l'API Anthropic Claude pour générer des documents métier : client HTTP dédié, parsing Markdown, traçabilité complète des appels (historique, retry, gestion des erreurs).
  • Réduction d'une procédure stockée critique de 60–90 s à environ 500 ms (index couvrants, prédicats sargables, réécriture de la requête) sans modifier le schéma de la base.
  • Migration d'un front-end ASP.NET legacy vers un design system centralisé (tokens CSS, dark mode automatique) : 305 couleurs codées en dur converties, aucune régression signalée en production.
  • Développement et mise en production d'un outil interne de pilotage IT sur .NET 10 / Blazor (projets, demandes IT, constats d'audit sécurité) : EF Core 10, connexion Active Directory, tests unitaires et d'intégration xUnit, CI sur GitHub Actions.
C#.NET 10BlazorEF CoreSQL ServerT-SQLxUnitASP.NET WebFormsLINQ to SQLClaude API

Consultant Développeur ERP / CRM · .NET

2017 — 2019
Inovteam · Casablanca · ESN, clients multisectoriels
  • Modules .NET sur mesure et fonctionnalités ERP / CRM pour des clients de plusieurs secteurs, de l'analyse fonctionnelle avec les référents métier jusqu'à la livraison.
  • Conception de dashboards Power BI pour le pilotage d'activité et l'aide à la décision : rapports automatisés, indicateurs métier, analyses drill-through.
  • Support technique et formation des équipes clientes sur les solutions livrées.
  • Rapports et éditions métier avec Crystal Reports et SSRS, selon des exigences fonctionnelles et de conformité strictes.
C#.NETSQL ServerPower BIDAXCrystal ReportsSSRS
Projets sélectionnés

Ce que j'ai développé et exploité en production.

L'essentiel de ce travail se trouve dans des applications métier privées : le code ne peut pas être partagé. Chaque entrée décrit le périmètre, l'approche et le résultat.

// 7 projects
.NET Framework 4.7.2legacy
WebForms · LINQ to SQLlegacy
.NET 8 · Razor Pagespilot
.NET 10 · Blazortarget
EF Core 10 · SQL Servertarget
01 / ERPEn cours

Modernisation ERP : WebForms vers .NET 10 / Blazor

Migration strangler-fig d'un ERP WebForms (.NET Framework 4.7.2) vers .NET 10 / Blazor : les nouveaux modules remplacent les pages legacy une par une, sur la même base SQL Server. Un pilote en .NET 8 Razor Pages a validé l'approche ; la stack cible tourne déjà en production sur un outil interne.

.NET 10BlazorEF CoreSQL ServerStrangler-fig
Blazor Web App · Interactive Serverui
EF Core 10 · SQL Serverdata
Active Directory sign-inauth
xUnit · integration teststests
GitHub Actionsci
02 / Internal toolEn production

Outil interne de pilotage IT sur .NET 10 / Blazor

Application web de suivi des projets IT, des demandes et des constats d'audit sécurité, développée de zéro et en production sur IIS. Blazor Web App (Interactive Server), EF Core 10 et SQL Server, connexion Active Directory, droits vérifiés dans chaque service, historique des modifications et CSP stricte. Couverte par des tests unitaires et d'intégration xUnit, avec une CI sur GitHub Actions.

.NET 10BlazorEF Core 10xUnitGitHub Actions
before60–90 s
after~0.5 s
03 / ERPPerformance

Performance SQL — refonte de procédures stratégiques

Audit et réécriture de procédures stockées critiques : analyse des plans d'exécution, index couvrants et filtrés, réécriture des requêtes, sans changement de schéma. La plus lente est passée de 60–90 s à environ 500 ms.

SQL ServerT-SQLQuery plansIndexingTx isolation
ClaudeClient.cs
// generate business doc
var req = new ClaudeRequest {
model: "claude-sonnet",
messages: prompt,
stream: true
};
await http.PostAsync(req);
04 / ERPIntégration IA

API Anthropic Claude — automatisation documentaire

Client HTTP .NET pour l'API Anthropic Claude qui génère des documents métier : parsing Markdown, stockage et traçabilité complète des appels (historique, gestion des erreurs réseau, retry avec backoff, secrets hors du code).

C#HttpClientRESTMarkdownAnthropic API
05 / ERPDesign system

Design system et dark mode pour un front-end legacy

Tokens CSS centralisés et dark mode automatique, ajoutés par couches au-dessus des composants existants. 305 couleurs codées en dur d'un front-end ASP.NET legacy converties, sans régression signalée en production.

CSS tokensDark modeBootstrapVanilla JSLegacy migration
PDF
DOCX
XLSX
06 / ERPOutils

Moteur de reporting — PDF / Word / Excel

Génération de documents métier : factures, rapports et exports BI en PDF, Word et Excel. Crystal Reports historique maintenu aux côtés d'iTextSharp, PdfSharp + MigraDoc et de l'OpenXML SDK.

Crystal ReportsiTextSharpPdfSharpOpenXMLSSRS
MEASURES
DAX
ANALYSIS
Drill-through
REFRESH
Scheduled
07 / ConsultingConseil

Tableaux de bord Power BI pour le pilotage d'activité

Tableaux de bord Power BI pour des clients de plusieurs secteurs : rapports automatisés, indicateurs métier et analyses drill-through, de l'analyse fonctionnelle avec les référents métier jusqu'à la livraison et la formation.

Power BIDAXSQL ServerReportingBI
Études de cas

Trois études de cas : problème, décisions, résultat.

Chaque cas vient de mon travail en production et décrit le problème métier, les contraintes, les décisions techniques et le résultat.

// 3 deep dives
Étude de cas · Modernisation legacy

Migrer un ERP WebForms de 10 ans vers .NET 10 / Blazor, un module à la fois.

.NET 10
Stack cible (LTS)

Problème

ERP ASP.NET WebForms de dix ans sur .NET Framework 4.7.2 : difficile à faire évoluer, pas d'interface responsive, pas d'authentification moderne, peu d'outillage. Chaque mise en production était un risque, donc on évitait les changements.

Contraintes

  • Aucune interruption : l'activité quotidienne en dépend
  • Même SQL Server, même schéma, mêmes données
  • Legacy et moderne doivent cohabiter en production
  • Un seul développeur, livraison incrémentale

Décisions

  • Pattern strangler-fig : remplacer l'application module par module
  • Pilote en .NET 8 Razor Pages pour valider l'accès aux données et la cohabitation
  • Cible passée à .NET 10 LTS + Blazor (Interactive Server) ; le support de .NET 8 se termine en novembre 2026
  • Même stack et mêmes conventions que l'outil interne déjà en production

Impact

  • Approche validée par le pilote .NET 8 (5 domaines fonctionnels)
  • Stack cible éprouvée en production sur l'outil interne de pilotage IT
  • Base SQL Server partagée : aucune migration de données
  • Statut : en cours, migration des prochains modules
Étude de cas · Performance

Réduire une procédure stockée critique de 60–90 s à environ 500 ms.

~0.5 s
Avant : 60–90 s

Problème

La procédure stockée du rapport de coût de revient tournait 60–90 s chaque jour ouvré et retardait la clôture quotidienne de la comptabilité. Logique en lecture seule, mais jointures lourdes et scans non bornés.

Contraintes

  • Aucune modification du schéma autorisée
  • Production — pas de fenêtre de maintenance
  • Résultats identiques, ligne pour ligne
  • Doit tenir avec la croissance des données

Décisions

  • Analyse des plans d'exécution (live + estimé)
  • Indexes couvrants + filtrés sur les colonnes chaudes
  • Prédicats sargables, ORDER BY réécrit
  • UPDATE STATISTICS intégré au script de déploiement

Impact

  • 60–90 s → environ 500 ms
  • Clôture quotidienne n'est plus bloquée
  • Aucun changement de schéma, résultats identiques
  • Plans d'exécution archivés avant et après
Étude de cas · Modernisation UI

Migrer 305 couleurs codées en dur vers un design system, sans régression signalée.

0
Régressions

Problème

Front-end legacy avec 305 valeurs de couleur codées en dur réparties sur plus de 160 pages. Pas de dark mode, pas de cohérence, et chaque changement visuel imposait une recherche dans le CSS.

Contraintes

  • Zéro régression visuelle sur les pages en production
  • Pas de restructuration HTML — additif uniquement
  • Balisage WebForms existant préservé
  • Migration menée en parallèle des évolutions

Décisions

  • CSS custom properties comme design tokens
  • Remplacement token-first, page par page
  • Dark mode automatique via la sémantique des tokens
  • Revue de diff visuelle à chaque remplacement

Impact

  • 305 / 305 couleurs migrées
  • Aucune régression signalée en production
  • Dark mode construit sur les mêmes tokens
  • Couleurs désormais modifiées à un seul endroit
Architecture système

Comment l'ERP legacy et ses nouveaux modules cohabitent.

Vue générique du dispositif strangler-fig : l'application WebForms continue de tourner sur IIS pendant que les nouveaux modules sont développés en .NET 10 / Blazor sur la même base SQL Server. Les modules migrent un par un.

// hybrid stack
CLIENTSBrowser · WebFormsLegacy screens · 160+ASP.NET WebForms · jQueryBrowser · BlazorModern UI · responsive.NET 10 · Blazor ServerPower BIDashboards · analyticsDAX · reportsOperations teamDocuments · exportsPDF · Word · ExcelAPPLICATION LAYER · IIS.NET Framework 4.7.2 (legacy)ASP.NET WebForms · C#ADO.NET · LINQ to SQLServices · TransactionScope · retry.NET 10 LTS (target)Blazor Web App · QuickGridEF Core 10 · dependency injectionLayered architecture · xUnit testsExternal APIsAnthropic Claude APIHttpClient · retryReportingCrystal Reports · SSRSPdfSharp · OpenXMLBI / AnalyticsPower BI · DAXViews · stored proceduresCross-cuttingAuth · audit · loggingDefensive code · retryDATA LAYERSQL Server · shared by legacy and new modulesStored procedures · indexes · transactions
Stack cible — .NET 10 / BlazorStack legacy — .NET Framework 4.7.2 / WebFormsCouche données partagée — SQL Server
Compétences

Stack et outils.

Ce que j'utilise en pratique, par domaine. Le socle legacy que je maintiens est listé à part.

// hands-on

Backend & langages

C#.NET 10ASP.NET CoreBlazor (Interactive Server)EF CoreLINQasync/awaitDependency injectionSerilog

Bases de données & performance

SQL ServerT-SQLStored proceduresIndexingExecution plansIsolation levelsDeadlock resolutionUPDATE STATISTICSSargable predicates

Frontend & UX

Blazor componentsQuickGridJavaScript (ES6+)jQueryChart.jsBootstrapHTML5 · CSS3Design tokensDark modeResponsive design

API & intégration

RESTHttpClientAnthropic Claude APIJSONMarkdownRetry / backoffAudit trail

Reporting & BI

Power BI · DAXSSRSCrystal ReportsPdfSharp + MigraDocOpenXML SDKiTextSharp

Tests, CI & outillage

xUnitIntegration testsGitHub ActionsGitNuGet auditIISWindows ServerVisual StudioSSMS

Architecture & méthodes

Layered architectureStrangler-fig migrationAuthentication / AuthorizationActive DirectoryDefensive programmingLegacy refactoringMERISE · UML

Socle legacy (maintenu)

ASP.NET WebForms.NET Framework 4.7.2ADO.NETLINQ to SQLTransactionScopeWeb.config · IIS AppPool

Langues

Arabe · Langue maternelleFrançais · C2Anglais · B2
Impact métier

Résultats en production.

Chiffres issus de mon travail sur l'ERP en production.

~0.5 s
Procédure stockée critique, contre 60–90 s avant
0
Couleurs migrées vers des tokens
0+
Écrans ERP maintenus en production
0+
Années sur un système métier critique
Clôture comptable quotidienne débloquée : une procédure stockée critique réécrite, de 60–90 s à environ 500 ms.
Outil interne développé et mis en production sur .NET 10 / Blazor, avec tests unitaires et d'intégration et CI. C'est désormais la stack de référence pour la migration de l'ERP.
Deadlock récurrent corrigé (SQL 1205) en production : ajustement du niveau d'isolation, retry avec backoff et consolidation des DataContext.
Génération documentaire automatisée avec l'API Anthropic Claude : historique complet, retry, secrets hors du code.

Prenons contact.

Ouvert à un poste de développeur .NET (CDI, mission ou conseil) sur des systèmes critiques pour l'activité. Basé à Casablanca, ouvert au télétravail. Je transmets mon CV sur demande.