▲ 0 r/PHP

We added a test that fails if anyone injects a tenant-scoped service into a singleton

I build Teradion, practice management software for French accounting firms. The app runs in FrankenPHP worker mode, and each firm brings its own Brevo API key.

In that setup, a singleton holding one firm's key would stay alive while requests for other firms are handled. The code avoids that: tenant-scoped providers are not constructor dependencies. A factory creates a fresh client for each operation from the account passed as an argument. The key is stored encrypted and only decrypted inside the factory.

We have two tests around this rule. MultiTenantKeyIsolationTest runs two accounts in sequence and checks that the second does not receive the first account's key.

ProviderNotInjectedAsServiceTest is more direct. It scans src/Service, src/MessageHandler and src/Controller, then fails when a constructor takes NewsletterProviderInterface. It reads the source, so the Symfony container is not involved.

It is an architectural decision encoded as a grep, which feels a little blunt. Still, if someone adds that constructor dependency later, the test points at the class immediately.

Has anyone used this kind of structural test in a Symfony codebase?

reddit.com
u/These_Reality519 — 1 day ago

Building with public administration systems that have no SLA, versioning, or status page

I build Teradion, practice management software for French accounting firms. Tax and payroll deadline tracking, CRM, tasks, AML compliance, password vault. It syncs with six external systems: the tax portal, URSSAF, customs, and three accounting platforms.

Three of those six are public administrations. No contract, no SLA, no versioning, no status page. They are part of the environment rather than something you integrate with on agreed terms.

One consequence shows up in the schema. The entities holding what we pull down carry a rawData json column next to the parsed fields, so whatever they sent is kept as it arrived. Months later that copy is what settles an argument about what actually came back.

The awkward part is that the same fact lives in several of them. Has this return been filed? The tax portal can answer, so can the platform that transmitted it, so can the firm's own books. They do not update at the same moment, so filed is not one value arriving from one obvious authority. It depends which source you read and when.

reddit.com
u/These_Reality519 — 4 days ago
▲ 71 r/PHP

We moved a Symfony app to FrankenPHP worker mode. Got maybe 20%, not 3.5x.

Number in the title so nobody has to read to the end: about 20%. And I should say up front that this is from memory, I didn't keep the before and after. So take it as one guy telling you it felt meaningfully faster, not as a benchmark.

Context: I work on Teradion, practice management software for French accounting firms. Symfony, and most of what it does all day is pull filings and deadlines out of six systems we don't control. We were on nginx plus PHP-FPM, we're now on FrankenPHP in worker mode.

The reason I bothered writing any of this down is the 3.5x on the FrankenPHP homepage. I went looking for where that number comes from and there's no methodology published anywhere that I could find. The benchmarks in the demo repo are from October 2022. They measure latency at low load, there's a sleep in the script, no RPS figure at all, and classic mode comes out slower than FPM in them (if I'm misreading that, tell me, genuinely). The issue asking for reproducible benchmarks is #481 and it's been open since January 2024.

What actually reframed it for me was the Tideways comparison from September 2025, methodology published, Hetzner CCX33, Vegeta, and they found essentially no performance or throughput difference between PHP-FPM and FrankenPHP in classic mode. Which fits what our 20% is. None of it comes from the server. It comes from the worker not rebooting your app on every single request. Swap nginx for Caddy and stay in classic mode and you've done a migration for nothing.

Stuff that cost us time, in no particular order.

The first one is just dumb. After the switch a pile of files came out 0600, JWT private key included, so login 500'd and the logs said nothing at all.

Then the runtime env var in systemd, which wants doubled backslashes in Environment. Single ones get rejected outright, and if you go through EnvironmentFile instead they get stripped on the way in. The official doc says otherwise. Worker just wouldn't boot.

And then state surviving between requests, which is the one that actually hurt. A filter stayed active from one request into the next and broke logins intermittently, which is the worst way for anything to break. In our defence it's documented to death: FrankenPHP says static state persists by design and that $_ENV isn't reset, Symfony says any state captured by the kernel or its services may leak across requests unless the relevant services implement ResetInterface. I'd read both. Shipped it anyway.

Two things made that hunt much longer than it needed to be. PrivateTmp, so the debug logging we added to /tmp went somewhere we couldn't see it. And getSubscribedEvents is compiled, so restarting does nothing, you have to clear the cache.

I'm glad we did it, but if I'm honest the payoff is one binary and one config instead of nginx plus php-fpm, and not thinking about certs anymore. Speed was a bonus. Even the Tideways piece that finds no perf difference says moving to FrankenPHP can reduce operations complexity.

If anyone has real production numbers, post them. I looked and couldn't find a single public case study with figures.

reddit.com
u/These_Reality519 — 6 days ago

Combien de dossiers par collaborateur en cabinet comptable ? J'ai essayé de retrouver d'où sort le fameux 20 à 40

Je bosse sur un outil de gestion pour cabinets, et la question du nombre de dossiers par collaborateur revient tout le temps. Partout on lit 20 à 40. Je voulais juste sourcer la fourchette proprement avant de m'en servir, et j'y ai passé beaucoup plus de temps que prévu.

Ça vient d'un article de 2005 paru dans Comptabilité Contrôle Audit (2005/1, tome 11, p. 39), sur la culture organisationnelle des cabinets perçue par les experts-comptables stagiaires. La phrase : « Compte tenu du nombre important de dossiers à gérer par collaborateur qui peut varier de 20 à 40 selon la taille des dossiers, il est indispensable que l'expert-comptable dirigeant délègue les travaux de base ». C'est une incise, sans référence, qui sert à amener un propos sur la délégation. L'article ne mesure pas la charge de travail, il construit une échelle de mesure de la culture organisationnelle, à partir de 114 réponses de stagiaires inscrits en Aquitaine au 1er janvier 2002.

Je ne dis pas que 20 à 40 soit faux, hein. Vous êtes largement mieux placés que moi pour dire si ça correspond à quelque chose sur le terrain. Ce que je dis c'est que ça n'a pas la source qu'on lui prête.

Du coup j'ai cherché s'il existait une vraie donnée quelque part. Rien trouvé. Ni au Conseil de l'Ordre, ni chez l'OMECA (l'observatoire de branche paritaire, quand même), ni à l'ATH. J'ai ouvert les baromètres OMECA 2024 et 2025 : activité, effectifs, recrutement, attractivité, mais rien sur la charge en dossiers. Ça s'explique peut-être par la structure de la branche : 73 % des entreprises ont moins de 10 salariés, et en même temps 23 % des salariés bossent dans des structures de 250 et plus (OMECA d'après DARES, IDCC 787, au 31/12/2021). Je vois mal quelle moyenne nationale voudrait dire quelque chose là-dedans.

Et puis un dossier n'est pas un dossier. Sur Compta Online, quelqu'un donnait un ordre de grandeur qui me parle plus : des responsables sur 5 très gros dossiers d'un côté, 100 et plus en BNC ou en LMNP de l'autre.

En revanche l'OMECA mesure très bien le recrutement. Baromètre S1 2025 : 55 % de cabinets en difficulté de recrutement en 2024, et 81 % de difficulté sur les profils 5 à 10 ans d'expérience contre 51 % sur les jeunes diplômés, la tension est sur l'expérience intermédiaire. Et quand ils parlent de fidélisation, ce qui revient c'est le lissage de la charge de travail, pas un nombre de dossiers.

Bref, si quelqu'un a une source institutionnelle que j'ai ratée je prends volontiers, j'ai peut-être mal cherché. Sinon je n'ai trouvé que des articles commerciaux qui se recopient entre eux.

reddit.com
u/These_Reality519 — 8 days ago

Facturation électronique : qui doit conserver les factures ? Pas la plateforme, et c'est 10 ans

Je bosse sur la facturation électronique pour des cabinets comptables. En comparant deux versions des spécifications DGFiP, je suis tombé sur un truc que je n'ai vu remonter nulle part.

Jusqu'à la version 2.4 de juin 2024 (§ 2.9), les spécifications disaient que le portail public conserverait les factures « pour leur permettre d'assurer le respect des exigences légales », avec renvoi à l'article L102 B du LPF et à l'article L123-22 du code de commerce. La phrase saute dans la version 3.0 de décembre 2024, et rien ne l'a remplacée depuis, ni en 3.1 ni en 3.2.

Du coup j'ai regardé ce que les textes imposent vraiment aux plateformes agréées. La liste de l'article 242 nonies E de l'annexe II au CGI est limitative : émettre, transmettre, recevoir, contrôler, faire remonter des données à l'administration (des données, pas les factures). Huit services, la conservation n'en fait pas partie. La seule chose qu'une plateforme est tenue de conserver, c'est l'accord par lequel vous l'avez désignée, et pendant trois ans. Beaucoup proposent de l'archivage, souvent à valeur probante, mais c'est une offre commerciale, pas une obligation.

Le texte qui prend le relais au 1er janvier 2027 désigne d'ailleurs les responsables noir sur blanc (art. L. 216-38 du code des impositions sur les biens et services) : « Le destinataire conserve l'original de la facture et le fournisseur conserve un double de la facture. »

Il y a un contre-argument, autant le poser tout de suite : les plateformes doivent garantir la lisibilité « jusqu'à la fin de la période de conservation ». C'est exact, mais le complément d'objet de cette phrase, c'est la transmission. La conservation, elle, s'effectue « dans des conditions déterminées par l'assujetti ».

En pratique ça change trois choses.

La durée d'abord. Au comptable, 10 ans, ce n'est pas nouveau (L123-22 du code de commerce). Au fiscal, le délai de 6 ans passe à 10 ans au 1er janvier 2027, pour toute pièce dont le délai expire après cette date (loi du 25 juin 2026). Ça englobe toutes les factures de la réforme, et les articles qui annoncent encore 6 ans sont déjà périmés.

Le format ensuite, et c'est celui qu'on rate le plus souvent. Ce qu'il faut garder, c'est le fichier structuré. Le BOFiP prend exactement cet exemple (BOI-CF-COM-10-10-30, § 180) : une entreprise qui reçoit ses factures en XML doit les conserver dans ce format, et ne peut les convertir en PDF que pour sa gestion interne, à condition de garder l'original à côté. Avec le Factur-X c'est vicieux, parce que le fichier est un PDF qui contient un XML embarqué : un outil qui aplatit ou régénère le PDF, une GED, un scan, une réimpression, supprime la partie qui porte la valeur juridique, et rien ne vous alerte. Ouvrez un de vos PDF archivés et vérifiez qu'il a bien une pièce jointe dedans. Je précise que c'est ma lecture, aucun BOFiP ne traite spécifiquement du Factur-X.

Reste le jour où vous changez de plateforme, ou pire, où elle s'arrête. Les mots restitution, réversibilité et portabilité n'apparaissent ni dans le décret, ni dans l'arrêté, ni dans les annexes. Le dossier d'immatriculation exige du SecNumCloud et de l'ISO 27001, mais les modalités d'extraction qu'il impose visent l'administration fiscale. La continuité d'un an qu'on cite souvent ne joue qu'en cas de changement volontaire, et seulement sur les statuts de factures. Et tant que vous n'êtes raccordé à rien, vous n'êtes plus en état de recevoir vos factures : 1 000 € par trimestre (CGI, art. 1737).

Sur les sanctions, le défaut de conservation coûte 10 000 € par demande de l'administration (CGI, art. 1734), ce qui reste encaissable. Le vrai sujet est dans le BOFiP déjà cité, au § 350 : le défaut de conservation des factures originales peut entraîner la remise en cause des déductions de TVA, et là il n'y a plus de plafond.

Les trois questions qui me paraissent utiles à poser par écrit avant de signer avec une plateforme : combien de temps elle garde les fichiers, dans quel format exact, et ce qu'on récupère le jour où on part. Si quelqu'un a un texte qui dit l'inverse, je prends, ça m'arrangerait, parce que j'ai cherché et je n'ai pas trouvé.

reddit.com
u/These_Reality519 — 10 days ago

Facturation électronique : vérifier tout un portefeuille dans l'annuaire, et pourquoi un logiciel de facturation ne suffit pas

On est en train de passer des portefeuilles en revue et il y a deux ou trois confusions qui reviennent tout le temps. Je les mets ici, ça évitera peut-être des surprises fin août.

La réception et l'émission ne tombent pas à la même date. Au 1er septembre, toute entreprise établie en France et assujettie à la TVA, franchise en base comprise, doit être en capacité de recevoir une facture électronique. L'obligation d'émettre n'arrive qu'au 1er septembre 2027 pour les TPE, PME et micro, contre 2026 pour les grandes entreprises et les ETI. Le client qui dit « je suis prêt, c'est pour 2027 » regarde la mauvaise échéance.

Avoir un compte chez un logiciel de facturation ne vaut pas désignation, et c'est le faux positif le plus fréquent. Depuis le décret du 27 juillet il y a un critère net : une plateforme agréée ne peut inscrire votre client dans l'annuaire qu'avec son accord formel, daté et signé (art. 242 nonies E bis nouveau, annexe II au CGI). Pas d'accord signé quelque part, pas d'inscription, quel que soit l'outil utilisé.

Donc la seule source de vérité c'est l'annuaire, pas l'écran du prestataire : https://facturation.chorus-pro.gouv.fr/annuaire/ . Accès libre, pas de compte à créer, juste un CAPTCHA à l'entrée. Deux choses à savoir avant de cliquer.

Ce que vous voyez, c'est si l'entité est concernée par la réforme et si elle a une adresse de facturation active, établissement par établissement. Vous ne verrez pas le nom de la plateforme ni les adresses elles-mêmes, c'est réservé aux plateformes agréées au titre du secret commercial.

Et il y a une recherche par lot dont personne ne parle : vous déposez un .csv ou .txt de SIREN, un par ligne, sans séparateur, moins d'un Mo, et vous récupérez un CSV de résultats. Tout un portefeuille en une passe. C'est documenté dans la base Chorus Pro (KB0012174), je ne l'aurais jamais trouvée sans creuser.

Une absence ne prouve pas que la demande s'est perdue, ça peut être en file d'attente côté plateforme, mais au moins vous relancez sur du concret plutôt que sur un « activation en cours » affiché depuis six semaines.

Deux précisions pour ne pas être alarmiste. Le guide pratique DGFiP de juillet dit qu'il n'y aura pas de sanction au démarrage pour les entreprises engagées dans une trajectoire sérieuse de mise en conformité, et que sur la réception c'est mise en demeure puis trois mois avant la première amende de 500 €. Et la loi permet toujours à un décret de repousser la première échéance au 1er décembre au plus tard : rien n'a été pris à ce jour, le décret du 27 juillet a plutôt verrouillé le dispositif, mais ça reste ouvert.

Dernier point que peu de gens ont en tête : l'e-reporting arrive en même temps que l'émission et il passe par la plateforme agréée. Plus rien ne se dépose sur impots.gouv, le portail public a été abandonné comme plateforme d'échange par la loi de finances 2026.

De notre côté, sur les dossiers qu'on suit, on est autour de 65 % qui ont déjà adhéré à une plateforme. C'est plus haut que ce que je craignais, mais je ne sais pas si c'est représentatif, nos cabinets sont peut-être en avance. Ceux qui ont déjà balayé leur portefeuille, vous tombez sur quoi ?

Je précise d'où je parle : je suis Davy, fondateur de Teradion, un outil de suivi pour les cabinets comptables. Je ne suis ni plateforme agréée ni éditeur de facturation, je n'ai rien à vendre sur ce sujet précis.

reddit.com
u/These_Reality519 — 16 days ago