Skip to main content
Version: Latest

3. Package Structure

3.1 Project Inventory

ProjectPathTargetVersionRole
Shumoul.Framework.EInvoicingShumoul.Framework/Shumoul.Framework.EInvoicing/net9.01.0.48Core SDK
Shumoul.Framework.EInvoicing.ApiShumoul.Framework/Shumoul.Framework.EInvoicing.Api/net9.01.0.48Thin controllers over core SDK
Shumoul.Framework.EInvoicing.TenancyShumoul.Framework/Shumoul.Framework.EInvoicing.Tenancy/net9.01.0.48Duplicate SDK fork for multi-tenant host
Shumoul.Framework.EInvoicing.TenancyApiShumoul.Framework/Shumoul.Framework.EInvoicing.TenancyApi/net9.01.0.48Thin controllers over Tenancy SDK
Shumoul.Framework.EInvoicing.TestShumoul.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

ConsumerPackageVersion
Shumoul.Infrastructure.csproj (Shumoul.Saas.Api)Shumoul.Framework.EInvoicing.Api1.0.48
Shumoul.Framework.MultiTenancy.Api.csproj (Shumoul.MultiTenancyApi)Shumoul.Framework.EInvoicing.TenancyApi1.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.