• 1.0.8-rc25 4ec169ed71

    1.0.8-rc25
    Some checks failed
    Dotnet build and test / build (pull_request) Has been cancelled
    Forgejo Release / release (push) Successful in 26m22s
    Pre-release

    notazof released this 2026-10-11 02:05:29 +01:00 | 11 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Added

    • [Yavsc.Api] Notification du performer à la création d'un rendez-vous
      depuis PostIt, selon ses préférences de contact, sans supprimer l'envoi Org.
    • [Yavsc.Api][Yavsc.Server] Notification du performer à la signature
      client d'un devis (JSON ou image), enregistrée pour l'accueil PostIt
      et transmise par e-mail et SignalR.
    • [Yavsc.Api] Nouveau point d'entrée GET /api/v1/notifications/me
      pour exposer les notifications publiques et ciblées à PostIt sur la
      Home page ; les notifications d'administration restent filtrées.
    • [PostIt] Affichage des notifications sur la page d'accueil, avec
      actualisation, indicateur de chargement et message d'erreur. Les
      notifications publiques sont accessibles sans connexion et la liste
      est rechargée lors d'un changement de session.

    Changed

    • [PostIt] Insertion des liens de fichiers dès leur ajout au brouillon ;
      les liens provisoires des nouveaux billets sont résolus au premier
      enregistrement. Save conserve l'édition ouverte et est mis en valeur
      lorsque le titre, le corps ou les pièces jointes sont modifiés.

    • [Projet] Instructions Copilot persistantes : mise à jour du changelog
      par défaut à chaque commit, avec justification explicite des exceptions.

    Fixed

    • [PostIt] Les liens Markdown des pièces jointes utilisent désormais
      le même filtre de nom que l'upload serveur, avant l'encodage URL.
      Le libellé conserve le nom original, notamment ses accents.

    • [Yavsc.Abstract][Yavsc.Blogs] Encodage des caractères non supportés
      dans les noms de fichiers téléversés avec _ au lieu de #, pour
      éviter les fragments d'URL et permettre le téléchargement via les
      fichiers statiques, notamment pour les noms accentués.

    • [Yavsc.Api][Yavsc.Blogs] Les appels API et la bande passante sont
      désormais enregistrés côté serveur pour les requêtes authentifiées :
      le middleware de télémétrie est maintenant branché après
      l'authentification, ce qui permet de comptabiliser ApiCalls et
      BandwidthMb au lieu d'enregistrer des zéros.

    Downloads
  • 1.0.8-rc24 ebdf51f468

    1.0.8-rc24
    All checks were successful
    Forgejo Release / release (push) Successful in 7m38s
    Dotnet build and test / build (pull_request) Successful in 8m25s
    Pre-release

    notazof released this 2026-10-09 18:32:47 +01:00 | 21 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Added

    • [PostIt] Reconnection automatique aux salons de discussion au reconnect

    Changed

    • [PostIt] La liste des billets et l'éditeur Markdown se partagent
      l'espace disponible et défilent séparément ; un séparateur permet
      de redimensionner les deux zones.

    Fixed

    • [PostIt] Défilement des articles longs en édition et en aperçu :
      suppression de la limite de hauteur qui masquait le contenu Markdown
      et du défilement imbriqué autour d'AvaloniaEdit. Six tests headless
      couvrent les barres automatiques, le redimensionnement et le
      défilement indépendant de la liste.
    Downloads
  • 1.0.8-rc23 a3207352c3

    1.0.8-rc23
    All checks were successful
    Forgejo Release / release (push) Successful in 14m32s
    Dotnet build and test / build (pull_request) Successful in 17m1s
    Pre-release

    notazof released this 2026-10-09 16:02:01 +01:00 | 26 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Added

    • [PostIt] Gestion native du compte inspirée de /Manage : modification
      du nom d'utilisateur, du nom complet et de l'adresse, téléversement
      d'avatar, confirmation e-mail, préférence de courriel mensuel,
      création ou changement de mot de passe et activation/désactivation
      de l'authentification à deux facteurs.
    • [PostIt][Yavsc.Api] Sélection d'un agenda Google, gestion séparée des
      comptes bancaires, dissociation des connexions externes et suppression
      du compte avec confirmation du nom d'utilisateur.
    • [PostIt] Configuration du profil professionnel et des activités,
      navigation vers les cercles et les publications depuis le compte.
    • [PostIt][Yavsc.Api] Administration des utilisateurs avec recherche
      dans les métadonnées du profil et consultation de la consommation
      de ressources.
    • [Yavsc.Server][Yavsc.Api][Yavsc.Blogs] Suivi de la consommation de
      ressources, API de synthèse et migration ResourceUsageRecords.
    • [Tests] Couverture des parcours profil et professionnel, de l'API de
      consommation de ressources et du renouvellement des jetons :
      rotation à usage unique, appels simultanés, réponses 401 concurrentes
      et rejet d'un jeton de renouvellement révoqué.

    Changed

    • [PostIt] Réorganisation de la page de compte en sections de profil,
      sécurité et préférences ; actions de modification désactivées tant
      que le profil n'est pas chargé ou qu'une opération est en cours.
    • [PostIt] Utilisation de PlaceholderText à la place de Watermark
      dans les pages de profil et de configuration professionnelle.
    • [Yavsc.Api] GET account/me renvoie le DTO partagé attendu par
      PostIt, avec l'état de sécurité, les connexions externes, les comptes
      bancaires et les compteurs du compte.

    Fixed

    • [Yavsc.Api] Enregistrement des services ASP.NET Identity et des stores
      EF nécessaires à UserManager<ApplicationUser> : leur absence
      empêchait l'activation du contrôleur de compte et provoquait une 500.
    • [Yavsc.Api] Chargement du profil : réponse adaptée lorsqu'un jeton
      ne contient pas d'identifiant utilisateur ou que le compte n'existe
      plus, au lieu d'une exception serveur.
    • [PostIt] Synchronisation de tous les chemins de renouvellement des
      jetons, y compris après une 401 et au démarrage : les appels
      concurrents ne réutilisent plus le même refresh_token. Un rejet
      invalid_grant efface la session et invite à se reconnecter.
    • [PostIt] Effacement des informations obsolètes après un échec de
      rechargement du profil et normalisation des valeurs de calendrier
      lors de la sauvegarde.
    • [PostIt][Yavsc.Api] Préservation de l'identité du profil professionnel
      lors de son enregistrement.
    • [Yavsc.Api] Les coordonnées bancaires ne sont plus modifiées à partir
      d'un résumé agrégé : opérations dédiées avec contrôle de propriété
      et validation de longueur des champs.

    Known limitations

    • [PostIt] L'ajout d'un nouveau fournisseur OAuth et la gestion des
      crédits ne sont pas encore disponibles dans l'interface native.
    Downloads
  • 1.0.8-rc22 7d10060efd

    1.0.8-rc22
    All checks were successful
    Dotnet build and test / build (push) Successful in 14m59s
    Forgejo Release / release (push) Successful in 9m31s
    Pre-release

    notazof released this 2026-10-05 14:48:55 +01:00 | 39 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Fixed

    User experience login into PostIt

    Downloads
  • 1.0.8-rc21 eeae7379e6

    1.0.8-rc21
    All checks were successful
    Dotnet build and test / build (push) Successful in 12m29s
    Forgejo Release / release (push) Successful in 8m27s
    Pre-release

    notazof released this 2026-10-04 21:58:50 +01:00 | 41 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Fixed

    User experience editing the blog article.

    Downloads
  • 1.0.8-rc20 84c98cb938

    1.0.8-rc20
    All checks were successful
    Dotnet build and test / build (push) Successful in 17m3s
    Forgejo Release / release (push) Successful in 8m21s
    Pre-release

    notazof released this 2026-10-04 00:43:44 +01:00 | 46 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Chat SignalR fonctionnel de bout en bout (connexion, salons multiples,
    envoi/réception de messages), enregistreur audio et localisation dans
    PostIt, intégration Live.Avalonia démarrée, et reverse-proxy nginx
    apprêté pour WebSocket.

    Added

    • [PostIt] Interface de chat : page ChatPage (connexion au hub,
      saisie du nom de salon, liste des messages et des membres présents),
      entrée depuis la page d'accueil.
    • [PostIt] Envoi de messages dans un salon joint : DTO ChatMessage
      (Name/Room/Message) pour l'événement ReceiveMessage, saisie avec
      envoi sur Enter, commande inactive tant qu'aucune salle n'est en
      focus (le hub refuse l'envoi hors salon, LabNoJoinNoSend).
    • [PostIt] Modèle multi-salles côté client : JoinedRooms,
      SelectedRoom (salle en focus), messages et utilisateurs indexés par
      salle (FocusedMessages/FocusedUsers), ComboBox de choix de la
      salle active ; un Join sur une salle déjà jointe ne fait que
      changer le focus.
    • [PostIt] Enregistreur audio (AudioRecorder, interface
      IPCMProcessor) et ressources de localisation
      (Resources.{resx,en-EN,pt-PT}).
    • [PostIt][WIP] Début d'intégration Live.Avalonia (preview XAML à
      chaud ; encore KO).
    • [contrib] Bloc location /chathub dans template.vhost : upgrade
      WebSocket (Upgrade/Connection), proxy_read_timeout 3600s et
      proxy_buffering off — sans quoi la connexion SignalR tombait au
      premier silence ou l'upgrade échouait derrière nginx.

    Changed

    • [PostIt] StatusNotice déplacé de Models vers ViewModels et
      enrichi d'une commande d'action optionnelle (CheckCommand +
      CheckCommandLabel, interface IWithLabel) : le bandeau de statut
      propose désormais l'action contextuelle (Connecter / Déconnecter /
      Reconnecter / Vérifier la connexion).
    • [PostIt] ChatViewModel suit le cycle de vie complet de la
      connexion : handlers Reconnecting / Reconnected / Closed de
      WithAutomaticReconnect, pour refléter l'état réel au lieu d'un
      IsConnected optimiste.
    • [Yavsc.Api] AddSignalR().AddJsonProtocol(IncludeFields = true) :
      ChatRoomInfo n'expose que des champs publics, que System.Text.Json
      ne sérialise pas par défaut — le client recevait des objets vides
      (Name null, Users vide) et la liste des salons joints n'était
      jamais alimentée.
    • [Yavsc.Server] IConnexionManager.OnConnected prend le userName
      en paramètre (résolu depuis les claims dans ChatHub) au lieu de le
      relire depuis un dictionnaire jamais alimenté.
    • [PostIt.Android] network_security_config.xml déplacé sous
      Resources/xml/ (chemin canonique Android).

    Fixed

    • [Yavsc.Server] KeyNotFoundException dans
      HubConnectionManager.OnConnected à chaque connexion SignalR :
      ChatUserNames (et ChatCxIds) n'étaient jamais alimentés — relique
      d'un SetUserName disparu lors d'une refactorisation. L'exception
      dans OnConnectedAsync faisait fermer la connexion par le hub, et
      PostIt affichait « Déconnecté (The server closed the connection…) »
      immédiatement après la connexion.
    • [PostIt] URL du hub SignalR : retrait du préfixe /api/v1 de
      ApiUrl avant d'apposer Constants.ChatHubPath (le hub est mappé à
      la racine du service, pas sous le préfixe versionné).
    • [PostIt] La StatusBar de la page chat référençait Grid.Row="4"
      sur une grille à 3 rangées (rangée hors limites, bandeau invisible).
    Downloads
  • 1.0.8-rc19 549bae3b5f

    1.0.8-rc19
    Some checks failed
    Forgejo Release / release (push) Successful in 11m13s
    Dotnet build and test / build (push) Failing after 14m19s
    Pre-release

    notazof released this 2026-09-27 21:29:58 +01:00 | 59 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    [PostIt] Blogs UX

    Fixed

    La saisie du billet est maintenant plutôt possible,
    en petit écran.

    Downloads
  • 1.0.8-rc18 a94a5a0497

    1.0.8-rc18
    Some checks failed
    Forgejo Release / release (push) Successful in 6m39s
    Dotnet build and test / build (pull_request) Failing after 9m34s
    Pre-release

    notazof released this 2026-09-26 01:51:28 +01:00 | 65 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Accès aux fichiers personnels PostIt rendu fonctionnel de bout en bout
    (arbre de stockage indexé par le login, pas par le sub), boutons
    d'action des listes réparés (binding $parent), revendication name
    enfin présente dans les access tokens (branchement du ProfileService),
    et négociation HTTP/3 côté client PostIt.

    Added

    • [PostIt] Négociation HTTP/3 (QUIC) pour les appels API Yavsc :
      DefaultRequestVersion = 3.0, DefaultVersionPolicy = RequestVersionOrLower sur le HttpClient partagé de YavscApiClient,
      avec repli h2/h1.1 où QUIC n'est pas disponible (WASM fetch, Android/
      desktop sans libmsquic).
    • [Tests] MyFilesPageHeadlessTests : monte MyFilesPage via
      NavigationPage + Window.Show() et vérifie que chaque bouton de
      ligne (Télécharger / Supprimer) a sa Command liée, est armé
      (CanExecute) et déclenche l'appel API au clic.
    • [Tests] Remoting.PasswordToken_carries_name_claim_equal_to_login :
      mint un vrai JWT via le token endpoint IdentityServer (password grant,
      openid profile) et asserte que l'access token porte name=login et
      que GetUserName() résout vers ce login.
    • [Tests] FileSystemApiTests.Get_fs_lists_files_stored_under_the_user_login :
      découple sub et login, téléverse sous le login, et asserte que
      GET /api/v1/fs retourne le fichier (et que le répertoire nommé d'après
      le sub n'existe pas).

    Changed

    • [Yavsc.Org] Branchement du ProfileService custom
      (AddProfileService<ProfileService>() après
      AddAspNetIdentity<ApplicationUser>()). La classe était du code mort :
      IdentityServer8 retombait sur son profile service par défaut, qui
      n'émet que les claims listés dans les UserClaims des API resources.
      name n'en faisait jamais partie, donc tout access token était sans
      name et GetUserName() résolvait à null sur les hosts ressources
      (Blogs/Api) — cause du 500 sur l'upload MyFiles et du
      User.Identity.Name injoignable. Le service émet désormais
      name=user.UserName, email et les rôles pour tout client dont
      les AllowedScopes contiennent profile, indépendamment du caller.
    • [Yavsc.Server] ServiceExtensions : NameClaimType = JwtClaimTypes.Name, MapInboundClaims = false (conserver les noms
      courts de claims tels qu'émis).
    • [Yavsc.Blogs] FileSystemHelpers.EnsureDestinationDirectory utilise
      GetUserName() (claim name) au lieu de User.Identity.Name pour
      la racine de stockage par utilisateur.
    • [Tests] WebServerFixture : AccessTokenType = 0 (Jwt dans IS8 ;
      1 = Reference, l'inverse de Duende) ; openid+profile sur le client
      de test ; réensemencement des identity resources openid/profile dans
      ReseedAuthTestData (un ResetAndMigrateDatabase vide le store
      in-memory partagé et les laissait absentes → invalid_scope).
    • [Tests] TestTokenIssuer.Issue gagne un paramètre name optionnel
      (défaut = subject) pour refléter la forme production où
      sub (GUID) ≠ name (login).
    • [Tests] BillingServiceTests : [Collection("Yavsc Server")] pour
      sérialiser avec le build d'hôte qui mute les registres statiques
      BillingService/Config (race parallèle pré-existante).

    Fixed

    • [Yavsc.Blogs] La liste GET /api/v1/fs cherchait sous
      {Blog}/{sub-GUID} (User.GetUserId()), alors que l'arbre de
      stockage perso est indexé par le login partout ailleurs
      (EnsureDestinationDirectory écrit sous {Blog}/{name-claim},
      le endpoint de téléchargement et les avatars utilisent
      user.UserName). Une fois l'upload corrigé, les fichiers
      atterrissaient sous {Blog}/{login} tandis que la liste cherchait
      sous {Blog}/{GUID} — un arbre vide — d'où la page PostIt
      « Mes fichiers » qui ne listait rien. GetDir résout désormais
      l'utilisateur en base et liste sous user.UserName.
      UploadedFile.OwnerId reste sub, donc EnrichWithFileIds
      interpole toujours par uid.
    • [PostIt] Boutons d'action des lignes de liste grisés et inactifs au
      clic (Télécharger / Supprimer / Joindre sur MyFiles ; download/detach
      sur les listes de pièces jointes de BillingQueryDetailsPage et
      EstimateEditionPage). Le binding $parent[vm:XxxViewModel].Cmd
      cherchait un ancêtre CONTRÔLE de type XxxViewModel — un viewmodel,
      pas un contrôle — donc résolvait à null et le Button restait
      désactivé (grisé) et inerte au clic. Corrigé en
      $parent[ContentPage].((vm:XxxViewModel)DataContext).Cmd (syntaxe
      déjà en vigueur dans CirclesPage / EstimateListPage).
    • [PostIt] Les messages de la barre de statut (StatusBar) n'étaient
      pas sélectionnables/copiables : le texte était un TextBlock (non
      sélectionnable dans Avalonia). Remplacé par SelectableTextBlock.
    • [Yavsc.Blogs] La suppression d'un fichier (DELETE api/v1/fs/{name})
      renvoyait un 40x alors que le fichier était bien supprimé du disque.
      DeleteUserDirOrFile (et DeleteUserFile) lisaient
      FileInfo.Length après fi.Delete() ; or FileInfo.Length
      lève FileNotFoundException une fois le fichier disparu — le catch
      du contrôleur transformait cette exception en 400, d'où le message
      perçu « le fichier n'existe pas sur le serveur » tandis que la
      suppression avait réussi. La taille est désormais capturée avant la
      suppression.
    • PostIt default settings
    Downloads
  • 1.0.8-rc17 94d8eb538c

    1.0.8-rc17
    All checks were successful
    Forgejo Release / release (push) Successful in 9m46s
    Dotnet build and test / build (pull_request) Successful in 10m42s
    Pre-release

    notazof released this 2026-09-25 18:42:40 +01:00 | 78 commits to main since this release

    Signed by notazof
    GPG key ID: AD4B9B545FBD7D12

    Fichiers utilisateur et pièces jointes sur les devis/demandes (PostIt +
    API), système de génération contrib (vhosts nginx HTTP/3 edge +
    appsettings jq + QUIC logiciel Kestrel), et correction du bug de
    production où IsPublished disparaissait du payload de liste du blog API.

    Added

    • [PostIt] Espace de stockage personnel (« MyFiles ») : page de gestion
      des fichiers de l'utilisateur, entrée depuis la page d'accueil.
    • [PostIt] Pièces jointes aux devis et aux demandes : attachement depuis
      le détail de demande et la page d'édition de devis.
    • [Yavsc.Api] Endpoints d'attachement de fichiers sur les devis
      (EstimateApiController) et les demandes front-office
      (FrontOfficeApiController).
    • [Yavsc.Api.Client] UserFilesApiClient + DTOs associés ; méthodes
      d'attachement sur EstimateApiClient et FrontOfficeApiClient.
    • [Yavsc.Server] Modèles EstimateAttachedFile, QueryAttachedFile,
      BlogAttachedFile, AttachFileRequest ; migration EF Core
      UserFileAttachments.
    • [contrib] Système de génération Makefile : vhosts nginx HTTP/3 edge
      (template.vhost, QUIC_OPTS), appsettings générés via jq
      (template.appsettings-{org,api,blogs}.json, échappement JSON-safe des
      secrets), QUIC logiciel Kestrel (Http1AndHttp2AndHttp3), et
      README.nginx.md.
    • [Tests] Projet Yavsc.Server.Tests : tests du service
      BlogSpotService.Details + ServerServicesFixture (SQLite :memory:
      par défaut, Npgsql opt-in via YAVSC_SERVER_TEST_DB_PROVIDER).
    • [Tests] IBlogPostWireShapeTests (forme du wire blog),
      EstimateAttachmentsApiTests, FrontOfficeQueryAttachmentsApiTests,
      FileSystemApiTests (pièces jointes et stockage perso).
    • [CI] Intégration Gitleaks / analyse de secrets (.pre-commit-config.yaml).

    Changed

    • [contrib] QUIC_OPTS (reuseport) désormais activé uniquement en
      production sur le vhost Org. La preprod et la prod partageant la même
      IP, reuseport — légal une seule fois par addr:port (443/udp) —
      serait sinon en conflit entre preprod-Org et prod-Org et ferait refuser
      la config par nginx.
    • [Yavsc.Api.Test] ApiWebServerFixture : la connexion admin PostgreSQL
      provient de la variable d'environnement
      YAVSC_API_TEST_NPGSQL_ADMIN_CONNECTION ; plus de mot de passe en
      source.

    Fixed

    • [Yavsc.Blogs] Bug de production : IsPublished était absent du payload
      de la liste du blog API. Le endpoint GetBlogspot retourne
      IEnumerable<IBlogPost> sérialisé par System.Text.Json d'après le type
      déclaré (l'interface), qui omet les propriétés du type concret —
      IsPublished vivait sur BlogPost / BlogPostDto mais pas sur
      IBlogPost. PostIt lisait donc IsPublished == false pour tout billet,
      y compris publiés (https://yavsc.pschneider.fr/BlogSpot/Details/13).
      Corrigé en déclarant IsPublished sur IBlogPost.
    • [Yavsc.Org] Accès au Swagger UI : les actions MVC scaffoldées de
      CommentsController (Index/Details/…) atterrissaient sur la même route
      POST api/v1/blogcomments que l'action d'API Post, provoquant une
      SwaggerGeneratorException (conflit method/path) au chargement de
      /swagger. Corrigé par [ApiExplorerSettings(IgnoreApi = true)] sur
      les actions scaffoldées.
    Downloads
  • 1.0.8-rc16 988de7c366

    1.0.8-rc16
    All checks were successful
    Forgejo Release / release (push) Successful in 14m46s
    Pre-release

    notazof released this 2026-09-22 18:39:53 +01:00 | 99 commits to main since this release

    Flux de signature et de génération de devis : un devis peut désormais être
    signé par les deux parties (fournisseur et client) puis téléchargé en PDF
    ou TeX depuis PostIt, avec les signatures dessinées en vecteur.

    Added

    • [PostIt] Pad de signature sur la page de validation d'un devis : on valide
      ou on refuse en joignant une signature (côté fournisseur ou client), capturée
      au format filaire PostIt (strokes) et envoyée sur l'acceptation.
    • [Yavsc.Api] Finalisation de POST /api/v1/front/query/accept et .../reject :
      autorisation selon le rôle (fournisseur/client/admin), signature optionnelle
      persistée sur l'estimate avec horodatage ProviderValidationDate /
      ClientValidationDate selon le côté signataire.
    • [Yavsc.Api] QueryStatus.Accepted éclaté en ProAccepted / ClientAccepted
      pour distinguer l'acceptation de chaque partie.
    • [Yavsc.Api] Endpoints de devis GET /api/v1/front/query/{id}/estimate.tex et
      estimate.pdf (clé par id de query). Le flux de génération TeX/PDF est
      rapatrié de Yavsc.Org vers Yavsc.Api (TeXHelpers, PdfGenerationViewModel,
      BillViewComponent, modèles Bill/Estimate, _ViewImports ; Program.cs
      câble AddControllersWithViews + SiteSettings).
    • [Yavsc.Api] Signatures du devis dessinées en TikZ vectoriel
      (TeXHelpers.SignatureToTikz) en bas du document, fournisseur et client
      côte à côte dans deux minipages ; plus de dépendance à un PNG de signature.
    • [Yavsc.Api.Client] DownloadAsync sur le client + GetEstimateTexAsync /
      GetEstimatePdfAsync ; boutons « Télécharger PDF » / « Télécharger TeX »
      dans PostIt sur la page de validation du devis et le détail de commande,
      avec un helper StorageProvider d'enregistrement de fichier.
    • [PostIt] La liste des devis se rafraîchit au retour de navigation (pop-back),
      de sorte qu'un devis validé quitte immédiatement la liste du signataire.
    • [PostIt] Renommage des titres de liste : « Devis en attente de signature
      fournisseur » / « Devis en attente de signature client ».
    • [Yavsc.Abstract] SignatureType déplacé dans Yavsc.Abstract.Billing.
    • [CLI] Option -c configuration-file.json au lancement.
    • [Tests] EstimatePdfGenerationTests : tests unitaires du pipeline
      signature → TikZ → PDF (devis signé des deux côtés), assertant que le PDF
      existe au chemin de sortie attendu et que seul le PDF persiste (aux/log
      nettoyés) ; skip propre si lualatex est absent.
    • [README] Dépendances système au runtime pour la génération PDF :
      texlive-binaries (lualatex), texlive-luatex (luaotfload),
      texlive-pictures (tikz), texlive-fonts-extra (bera).

    Changed

    • [Yavsc.Api] GetOngoingEstimatesAsProvider filtre désormais sur
      ProviderValidationDate : un devis signé par le fournisseur quitte sa liste
      « en attente ».
    • [Yavsc.Api] La génération PDF compile via le lualatex système, le TeX fourni
      sur l'entrée standard (/dev/stdin), le PDF écrit directement dans le
      répertoire des factures (Site.Bills), les artefacts .aux/.log nettoyés
      afin que seul le .pdf persiste.

    Fixed

    • [Yavsc.Api] Emergency stop à la génération PDF : lualatex sans argument
      fichier lit stdin en mode terminal et s'arrête après la première ligne d'un
      document multi-lignes. Corrigé en passant /dev/stdin comme nom de fichier
      d'entrée — stdin est alors traité comme un fichier régulier et le document
      multi-lignes compile. C'était la cause racine de l'échec en production, pas
      bera ni luaotfload (problèmes réels mais séparés, comblés côté paquets).
    • [Yavsc.Api] I can't write on file 'estimate-1.log' : le chemin relatif
      Site.Bills ("bills") était imbriqué quand il servait à la fois de
      -output-directory et de répertoire de travail ; résolu en chemin absolu.
    • [Yavsc.Api] NRE dans RenderViewToString (RouteData / ViewData.Model
      nuls) : reconstruit sur le ControllerContext du contrôleur ; IViewEngine
      résolu via IRazorViewEngine (.NET 10 n'enregistre pas de IViewEngine
      unique).
    • [Yavsc.Api] Layout = "null" (chaîne) dans les modèles TeX cherchait
      null.cshtml ; corrigé en Layout = null (null C#).
    • [Yavsc.Api] texi2pdf (outil Texinfo, inadapté au LaTeX) remplacé par
      lualatex.
    • [Yavsc.Api] Les diagnostics lualatex étaient perdus (écrits dans le .log
      qu'on supprimait) ; stdout/stderr sont désormais capturés dans le message
      d'erreur, et le .log est conservé en cas d'échec.
    Downloads