3. Package Structure
3.1 Project Inventory
| Project | Path | Target | Version | Role |
|---|---|---|---|---|
Shumoul.Framework.EInvoicing | Shumoul.Framework/Shumoul.Framework.EInvoicing/ | net9.0 | 1.0.48 | Core SDK |
Shumoul.Framework.EInvoicing.Api | Shumoul.Framework/Shumoul.Framework.EInvoicing.Api/ | net9.0 | 1.0.48 | Thin controllers over core SDK |
Shumoul.Framework.EInvoicing.Tenancy | Shumoul.Framework/Shumoul.Framework.EInvoicing.Tenancy/ | net9.0 | 1.0.48 | Duplicate SDK fork for multi-tenant host |
Shumoul.Framework.EInvoicing.TenancyApi | Shumoul.Framework/Shumoul.Framework.EInvoicing.TenancyApi/ | net9.0 | 1.0.48 | Thin controllers over Tenancy SDK |
Shumoul.Framework.EInvoicing.Test | Shumoul.Framework/UnitTests/Shumoul.Framework.EInvoicing.Test/ | net9.0 | — (test project) | 217+ test cases, validators + Phase 0.2 regression tests |
Version 1.0.48 reflects the Phase 0.2 critical-fix release. Legacy .nupkg/.nuspec artifacts also carry a
Bayan.Framework.EInvoicing* PackageId remnant from the platform's pre-rename name — harmless build
history, not a live conflict.
3.2 Project References (Internal to the Framework Repo)
Shumoul.Framework.EInvoicing.Api → Shumoul.Framework.EInvoicing
Shumoul.Framework.EInvoicing.TenancyApi → Shumoul.Framework.EInvoicing.Tenancy
Shumoul.Framework.EInvoicing → Shumoul.Framework.Application, Shumoul.Framework.Infrastructure
Shumoul.Framework.EInvoicing.Tenancy → Shumoul.Framework.Application, Shumoul.Framework.Infrastructure
Shumoul.Framework.EInvoicing.Test → Shumoul.Framework.EInvoicing (core only — .Tenancy has no test project)
Zero reference from any EInvoicing project to ERP-internal Shumoul.Application/Shumoul.Infrastructure/
Shumoul.Domain — those names collide with the Framework's own Shumoul.Framework.Application/
Shumoul.Framework.Infrastructure, but are confirmed to be different assemblies by full namespace.
3.3 Package References — Consumers
| Consumer | Package | Version |
|---|---|---|
Shumoul.Infrastructure.csproj (Shumoul.Saas.Api) | Shumoul.Framework.EInvoicing.Api | 1.0.48 |
Shumoul.Framework.MultiTenancy.Api.csproj (Shumoul.MultiTenancyApi) | Shumoul.Framework.EInvoicing.TenancyApi | 1.0.48 |
Shumoul.BackEnd.sln contains zero direct project references to any EInvoicing project — consumption is
exclusively via the compiled NuGet package, sourced from local-packages/.
3.4 Third-Party Package References (Core SDK)
<PackageReference Include="AutoMapper" Version="15.1.1" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.9" />
<PackageReference Include="RestSharp" Version="112.1.0" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="System.Security.Cryptography.Xml" Version="9.0.17" />
Undeclared direct dependency: the signing/certificate code uses real Org.BouncyCastle.* types
(Pkcs10CertificationRequest, SecObjectIdentifiers, Asn1SignatureFactory), and
BouncyCastle.Cryptography 2.6.2 is present in the resolved build graph, but no explicit
<PackageReference Include="BouncyCastle..."> exists in the .csproj — it resolves only as a transitive
dependency. See Chapter 11 — Technical Debt.
No QR-image library (QRCoder, ZXing, SkiaSharp) is referenced anywhere — the SDK produces only the base64 TLV payload string, not a rendered barcode image.
No PDF/UBL wrapper library — the entire UBL 2.1 object model (~150 files under Ubl/) plus embedded
XSD/XSLT resources is hand-written against System.Xml.Serialization.XmlSerializer, not a third-party UBL
library.
3.5 Test Project
Microsoft.NET.Test.Sdk, Moq, xunit, coverlet.collector
217 [Fact]/[Theory] cases across 29 files, all originally under ValidationRules/ — exercising
FluentValidation DTO rules only. A Phase 0.2 follow-up added focused regression tests for the
RestClient-authentication-attachment fix and the file-download path-traversal fix (see
Chapter 7 — Security); signing, certificate management (CSR/CSID), hashing, and QR
generation otherwise remain without automated test coverage.
3.6 Build Configuration Asymmetry
Directory.Build.props exists at Shumoul.Framework.EInvoicing/Directory.Build.props (sets
TargetFramework=net9.0, DisableFastUpToDateCheck=true, CopyLocalLockFileAssemblies=true) — no
equivalent file exists under Shumoul.Framework.EInvoicing.Tenancy/. A stray backup file,
UnitTests/Shumoul.Framework.EInvoicing.Test/Shumoul.Framework.EInvoicing.Test.csproj.Backup.tmp, is also
committed to git and never cleaned up.
