Compare commits

...

11 commits

30 changed files with 1315 additions and 230 deletions

2
.gitignore vendored
View file

@ -361,3 +361,5 @@ MigrationBackup/
# Fody - auto-generated XML schema # Fody - auto-generated XML schema
FodyWeavers.xsd FodyWeavers.xsd
/docs/tools
/docs/phpdoc.dist.xml

View file

@ -1,16 +1,38 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections> <startup>
</configSections> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
<startup> </startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> <appSettings>
</startup> <add key="ApiAuthentication" value="admin:adminpwd" />
<runtime> <add key="ApiUri" value="http://localhost/rest_mediatekdocuments/" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> </appSettings>
<dependentAssembly> <runtime>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" /> <dependentAssembly>
</dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
</assemblyBinding> <bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</runtime> </dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.34.1.0" newVersion="3.34.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Serilog" publicKeyToken="24c2f752a8e58a10" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration> </configuration>

View file

@ -12,6 +12,8 @@
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@ -22,6 +24,7 @@
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Debug\MediaTekDocuments.xml</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@ -33,20 +36,94 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942" /> <Reference Include="BouncyCastle.Crypto, Version=1.8.5.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<Reference Include="Google.Protobuf, Version=3.19.4.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604" /> <HintPath>..\packages\BouncyCastle.1.8.5\lib\BouncyCastle.Crypto.dll</HintPath>
<Reference Include="K4os.Compression.LZ4.Streams, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d" /> </Reference>
<Reference Include="MySql.Data, Version=8.0.29.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" /> <Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
<HintPath>..\packages\BouncyCastle.Cryptography.2.6.2\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
</Reference>
<Reference Include="Google.Protobuf, Version=3.34.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
<HintPath>..\packages\Google.Protobuf.3.34.1\lib\net45\Google.Protobuf.dll</HintPath>
</Reference>
<Reference Include="K4os.Compression.LZ4, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll</HintPath>
</Reference>
<Reference Include="K4os.Compression.LZ4.Streams, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll</HintPath>
</Reference>
<Reference Include="K4os.Hash.xxHash, Version=1.0.8.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL">
<HintPath>..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="MySql.Data, Version=8.0.29.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.29\lib\net452\MySql.Data.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="Serilog, Version=4.3.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.4.3.1\lib\net471\Serilog.dll</HintPath>
</Reference>
<Reference Include="Serilog.Sinks.File, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10, processorArchitecture=MSIL">
<HintPath>..\packages\Serilog.Sinks.File.7.0.0\lib\net471\Serilog.Sinks.File.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />
<Reference Include="System.Configuration.ConfigurationManager, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll</HintPath>
</Reference>
<Reference Include="System.Configuration.Install" /> <Reference Include="System.Configuration.Install" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Diagnostics.DiagnosticSource, Version=8.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
</Reference>
<Reference Include="System.IO.Pipelines, Version=5.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.5.0.2\lib\net461\System.IO.Pipelines.dll</HintPath>
</Reference>
<Reference Include="System.Management" /> <Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" /> <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" /> <HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net" />
<Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.2.0.20126.16343\lib\net40\System.Net.Http.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Formatting.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.Formatting.Extension.5.2.3.0\lib\System.Net.Http.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.2.0.20126.16343\lib\net40\System.Net.Http.WebRequest.dll</HintPath>
<Private>True</Private>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Channels, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Channels.8.0.0\lib\net462\System.Threading.Channels.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Transactions" /> <Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
@ -54,11 +131,17 @@
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Deployment" /> <Reference Include="System.Deployment" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> <Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> <HintPath>..\packages\MySql.Data.8.0.29\lib\net452\Ubiety.Dns.Core.dll</HintPath>
</Reference>
<Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<HintPath>..\packages\MySql.Data.8.0.29\lib\net452\ZstdNet.dll</HintPath>
</Reference>
<Reference Include="ZstdSharp, Version=0.8.6.0, Culture=neutral, PublicKeyToken=8d151af33a4ad5cf, processorArchitecture=MSIL">
<HintPath>..\packages\ZstdSharp.Port.0.8.6\lib\net462\ZstdSharp.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="controller\FrmAuthController.cs" /> <Compile Include="controller\FrmAuthController.cs" />
@ -124,4 +207,13 @@
</ItemGroup> </ItemGroup>
<ItemGroup /> <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\ZstdNet.1.4.5\build\ZstdNet.targets" Condition="Exists('..\packages\ZstdNet.1.4.5\build\ZstdNet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Ce projet fait référence à des packages NuGet qui sont manquants sur cet ordinateur. Utilisez l'option de restauration des packages NuGet pour les télécharger. Pour plus d'informations, consultez http://go.microsoft.com/fwlink/?LinkID=322105. Le fichier manquant est : {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\ZstdNet.1.4.5\build\ZstdNet.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ZstdNet.1.4.5\build\ZstdNet.targets'))" />
<Error Condition="!Exists('..\packages\Serilog.4.3.1\build\Serilog.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Serilog.4.3.1\build\Serilog.targets'))" />
</Target>
<Import Project="..\packages\Serilog.4.3.1\build\Serilog.targets" Condition="Exists('..\packages\Serilog.4.3.1\build\Serilog.targets')" />
</Project> </Project>

View file

@ -15,7 +15,6 @@ namespace MediaTekDocuments
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new FrmAuth());
FrmAuth auth = new FrmAuth(); FrmAuth auth = new FrmAuth();
if (auth.ShowDialog() == DialogResult.OK) if (auth.ShowDialog() == DialogResult.OK)

View file

@ -5,15 +5,30 @@ using System;
namespace MediaTekDocuments.controller namespace MediaTekDocuments.controller
{ {
/// <summary>
/// Contrôleur pour la fenêtre d'authentification
/// </summary>
class FrmAuthController class FrmAuthController
{ {
/// <summary>
/// Objet d'accès aux données
/// </summary>
private readonly Access access; private readonly Access access;
/// <summary>
/// Constructeur : récupère l'instance unique d'accès aux données
/// </summary>
public FrmAuthController() public FrmAuthController()
{ {
access = Access.GetInstance(); access = Access.GetInstance();
} }
/// <summary>
/// Vérifie les identifiants de connexion
/// </summary>
/// <param name="login">Identifiant de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connexion réussie, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd) public Utilisateur GetConnection(string login, string pwd)
{ {
return access.GetConnection(login, pwd); return access.GetConnection(login, pwd);

View file

@ -98,46 +98,90 @@ namespace MediaTekDocuments.controller
return access.CreerExemplaire(exemplaire); return access.CreerExemplaire(exemplaire);
} }
/// <summary>
/// Récupère les commandes d'un document
/// </summary>
/// <param name="idDocument">Identifiant du document</param>
/// <returns>Liste des commandes du document</returns>
public List<CommandeDocument> GetCommandesDocument(string idDocument) public List<CommandeDocument> GetCommandesDocument(string idDocument)
{ {
return Access.GetInstance().GetCommandesDocument(idDocument); return Access.GetInstance().GetCommandesDocument(idDocument);
} }
/// <summary>
/// Supprime une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerCommandeDocument(CommandeDocument commande) public bool SupprimerCommandeDocument(CommandeDocument commande)
{ {
return Access.GetInstance().DeleteCommande(commande.Id); return Access.GetInstance().DeleteCommande(commande.Id);
} }
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste d'objets Categorie (suivi)</returns>
public List<Categorie> GetAllSuivis() public List<Categorie> GetAllSuivis()
{ {
return Access.GetInstance().GetAllSuivis(); return Access.GetInstance().GetAllSuivis();
} }
/// <summary>
/// Crée une nouvelle commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool createCommande(CommandeDocument commande) public bool createCommande(CommandeDocument commande)
{ {
return access.CreerCommande(commande); return access.CreerCommande(commande);
} }
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Identifiant de commande formaté</returns>
public string GetNextCommandeId() public string GetNextCommandeId()
{ {
return access.GetNextCommandeId(); return access.GetNextCommandeId();
} }
/// <summary>
/// Met à jour l'état de suivi d'une commande
/// </summary>
/// <param name="idCommande">Identifiant de la commande</param>
/// <param name="idSuivi">Identifiant du nouvel état de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi) public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{ {
return access.UpdateSuiviCommande(idCommande, idSuivi); return access.UpdateSuiviCommande(idCommande, idSuivi);
} }
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">Identifiant de la revue</param>
/// <returns>Liste des abonnements de la revue</returns>
public List<Abonnement> GetAbonnements(string idRevue) public List<Abonnement> GetAbonnements(string idRevue)
{ {
return access.GetAbonnements(idRevue); return access.GetAbonnements(idRevue);
} }
/// <summary>
/// Crée un nouvel abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement) public bool CreerAbonnement(Abonnement abonnement)
{ {
return access.CreerAbonnement(abonnement); return access.CreerAbonnement(abonnement);
} }
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(Abonnement abonnement) public bool SupprimerAbonnement(Abonnement abonnement)
{ {
return access.SupprimerAbonnement(abonnement.Id); return access.SupprimerAbonnement(abonnement.Id);

View file

@ -7,6 +7,7 @@ using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using System.Configuration; using System.Configuration;
using System.Linq; using System.Linq;
using Serilog;
namespace MediaTekDocuments.dal namespace MediaTekDocuments.dal
{ {
@ -15,10 +16,6 @@ namespace MediaTekDocuments.dal
/// </summary> /// </summary>
public class Access public class Access
{ {
/// <summary>
/// adresse de l'API
/// </summary>
private static readonly string uriApi = "http://localhost/rest_mediatekdocuments/";
/// <summary> /// <summary>
/// instance unique de la classe /// instance unique de la classe
/// </summary> /// </summary>
@ -37,7 +34,8 @@ namespace MediaTekDocuments.dal
private const string POST = "POST"; private const string POST = "POST";
/// <summary> /// <summary>
/// méthode HTTP pour update /// méthode HTTP pour update
/// /// </summary>
private const string PUT = "PUT";
/// <summary> /// <summary>
/// méthode HTTP pour delete /// méthode HTTP pour delete
@ -48,17 +46,25 @@ namespace MediaTekDocuments.dal
/// Méthode privée pour créer un singleton /// Méthode privée pour créer un singleton
/// initialise l'accès à l'API /// initialise l'accès à l'API
/// </summary> /// </summary>
// Le constructeur redevient sans paramètre pour le Singleton
private Access() private Access()
{ {
String authenticationString; string authenticationString;
string uriApi;
Log.Logger = new LoggerConfiguration().MinimumLevel.Debug().WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day).CreateLogger();
try try
{ {
authenticationString = "admin:adminpwd"; uriApi = ConfigurationManager.AppSettings["ApiUri"];
authenticationString = ConfigurationManager.AppSettings["ApiAuthentication"];
api = ApiRest.GetInstance(uriApi, authenticationString); api = ApiRest.GetInstance(uriApi, authenticationString);
Log.Information("Log de : {NomMethode} : {Message}", nameof(Access), "Api instanciée");
} }
catch (Exception e) catch (Exception e)
{ {
Console.WriteLine(e.Message); Log.Fatal(e, "Erreur fatale lors de l'initialisation de l'accès API");
Environment.Exit(0); Environment.Exit(0);
} }
} }
@ -69,8 +75,9 @@ namespace MediaTekDocuments.dal
/// <returns>instance unique de la classe</returns> /// <returns>instance unique de la classe</returns>
public static Access GetInstance() public static Access GetInstance()
{ {
if(instance == null) if (instance == null)
{ {
// On appelle le constructeur sans argument
instance = new Access(); instance = new Access();
} }
return instance; return instance;
@ -165,6 +172,7 @@ namespace MediaTekDocuments.dal
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(CreerExemplaire), ex.Message);
} }
return false; return false;
} }
@ -188,21 +196,21 @@ namespace MediaTekDocuments.dal
String code = (String)retour["code"]; String code = (String)retour["code"];
if (code.Equals("200")) if (code.Equals("200"))
{ {
// dans le cas du GET (select), récupération de la liste d'objets
if (methode.Equals(GET)) if (methode.Equals(GET))
{ {
String resultString = JsonConvert.SerializeObject(retour["result"]); String resultString = JsonConvert.SerializeObject(retour["result"]);
// construction de la liste d'objets à partir du retour de l'api
liste = JsonConvert.DeserializeObject<List<T>>(resultString, new CustomBooleanJsonConverter()); liste = JsonConvert.DeserializeObject<List<T>>(resultString, new CustomBooleanJsonConverter());
} }
} }
else else
{ {
Console.WriteLine("code erreur = " + code + " message = " + (String)retour["message"]); Console.WriteLine("code erreur = " + code + " message = " + (String)retour["message"]);
Log.Warning("API Retourne une erreur - Code: {Code}, Message: {Message}", code, (string)retour["message"]);
} }
}catch(Exception e) }catch(Exception e)
{ {
Console.WriteLine("Erreur lors de l'accès à l'API : "+e.Message); Console.WriteLine("Erreur lors de l'accès à l'API : "+e.Message);
Log.Error(e, "Erreur lors de l'accès à l'API via TraitementRecup");
Environment.Exit(0); Environment.Exit(0);
} }
return liste; return liste;
@ -263,6 +271,11 @@ namespace MediaTekDocuments.dal
return lesCommandes; return lesCommandes;
} }
/// <summary>
/// Supprime une commande
/// </summary>
/// <param name="idCommande">ID de la commande à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool DeleteCommande(string idCommande) public bool DeleteCommande(string idCommande)
{ {
@ -274,17 +287,26 @@ namespace MediaTekDocuments.dal
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Erreur lors de la suppression : " + ex.Message); Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(DeleteCommande), ex.Message);
return false; return false;
} }
} }
/// <summary>
/// Récupère la liste des suivis
/// </summary>
/// <returns>Liste des suivis</returns>
public List<Categorie> GetAllSuivis() public List<Categorie> GetAllSuivis()
{ {
IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null); IEnumerable<Categorie> lesSuivis = TraitementRecup<Categorie>(GET, "suivi", null);
return new List<Categorie>(lesSuivis); return new List<Categorie>(lesSuivis);
} }
/// <summary>
/// Crée une commande de document
/// </summary>
/// <param name="commande">Objet CommandeDocument à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerCommande(CommandeDocument commande) public bool CreerCommande(CommandeDocument commande)
{ {
String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter()); String jsonExemplaire = JsonConvert.SerializeObject(commande, new CustomDateTimeConverter());
@ -295,23 +317,40 @@ namespace MediaTekDocuments.dal
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine(ex.Message); Log.Error(ex, "Erreur lors de la création de commande");
} }
return false; return false;
} }
/// <summary>
/// Récupère le prochain identifiant de commande
/// </summary>
/// <returns>Prochain ID de commande au format string</returns>
public string GetNextCommandeId() public string GetNextCommandeId()
{ {
List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null); List<dynamic> result = TraitementRecup<dynamic>(GET, "maxcommande", null);
if (result != null && result.Count > 0)
if (result != null && result.Count > 0 && result[0].maxId != null)
{ {
string lastId = result[0].maxId.ToString(); var firstResult = result[0];
int nextIdVal = int.Parse(lastId.Substring(1)) + 1; if (firstResult != null && firstResult.maxId != null)
return "" + nextIdVal.ToString("D4"); {
string lastId = firstResult.maxId.ToString();
if (lastId.Length > 1)
{
int nextIdVal = int.Parse(lastId.Substring(1)) + 1;
return nextIdVal.ToString("D4");
}
}
} }
return "0001"; return "0001";
} }
/// <summary>
/// Met à jour le suivi d'une commande
/// </summary>
/// <param name="idCommande">ID de la commande</param>
/// <param name="idSuivi">Nouvel ID de suivi</param>
/// <returns>True si la mise à jour a pu se faire</returns>
public bool UpdateSuiviCommande(string idCommande, string idSuivi) public bool UpdateSuiviCommande(string idCommande, string idSuivi)
{ {
String jsonSuivi = convertToJson("idSuivi", idSuivi); String jsonSuivi = convertToJson("idSuivi", idSuivi);
@ -323,17 +362,27 @@ namespace MediaTekDocuments.dal
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Erreur mise à jour suivi : " + ex.Message); Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(UpdateSuiviCommande), ex.Message);
return false; return false;
} }
} }
/// <summary>
/// Récupère les abonnements d'une revue
/// </summary>
/// <param name="idRevue">ID de la revue</param>
/// <returns>Liste des abonnements</returns>
public List<Abonnement> GetAbonnements(string idRevue) public List<Abonnement> GetAbonnements(string idRevue)
{ {
string jsonIdRevue = convertToJson("id", idRevue); string jsonIdRevue = convertToJson("id", idRevue);
return TraitementRecup<Abonnement>(GET, "commanderevue/" + jsonIdRevue, null); return TraitementRecup<Abonnement>(GET, "commanderevue/" + jsonIdRevue, null);
} }
/// <summary>
/// Crée un abonnement
/// </summary>
/// <param name="abonnement">Objet Abonnement à créer</param>
/// <returns>True si la création a pu se faire</returns>
public bool CreerAbonnement(Abonnement abonnement) public bool CreerAbonnement(Abonnement abonnement)
{ {
string jsonAbonnement = JsonConvert.SerializeObject(abonnement, new CustomDateTimeConverter()); string jsonAbonnement = JsonConvert.SerializeObject(abonnement, new CustomDateTimeConverter());
@ -345,11 +394,16 @@ namespace MediaTekDocuments.dal
} }
catch (Exception ex) catch (Exception ex)
{ {
Console.WriteLine("Erreur lors de l'accès à l'API : " + ex.Message); Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(GetAbonnements), ex.Message);
return false; return false;
} }
} }
/// <summary>
/// Supprime un abonnement
/// </summary>
/// <param name="idAbonnement">ID de l'abonnement à supprimer</param>
/// <returns>True si la suppression a pu se faire</returns>
public bool SupprimerAbonnement(string idAbonnement) public bool SupprimerAbonnement(string idAbonnement)
{ {
string jsonId = convertToJson("id", idAbonnement); string jsonId = convertToJson("id", idAbonnement);
@ -358,9 +412,18 @@ namespace MediaTekDocuments.dal
JObject retour = api.RecupDistant(DELETE, "abonnement/" + jsonId, null); JObject retour = api.RecupDistant(DELETE, "abonnement/" + jsonId, null);
return retour["code"].ToString().Equals("200"); return retour["code"].ToString().Equals("200");
} }
catch { return false; } catch(Exception ex) {
Log.Error(ex, "Erreur dans {NomMethode} : {Message}", nameof(SupprimerAbonnement), ex.Message);
return false;
}
} }
/// <summary>
/// Tente de connecter un utilisateur
/// </summary>
/// <param name="login">Login de l'utilisateur</param>
/// <param name="pwd">Mot de passe de l'utilisateur</param>
/// <returns>Objet Utilisateur si connecté, null sinon</returns>
public Utilisateur GetConnection(string login, string pwd) public Utilisateur GetConnection(string login, string pwd)
{ {
Dictionary<string, string> loginInfo = new Dictionary<string, string> Dictionary<string, string> loginInfo = new Dictionary<string, string>
@ -376,6 +439,7 @@ namespace MediaTekDocuments.dal
{ {
return lesUtilisateurs[0]; return lesUtilisateurs[0];
} }
Log.Warning("Tentative de connexion échouée pour le login : {Login}", login);
return null; return null;
} }
} }

View file

@ -43,7 +43,7 @@ namespace MediaTekDocuments.manager
/// </summary> /// </summary>
/// <param name="uriApi">adresse de l'api</param> /// <param name="uriApi">adresse de l'api</param>
/// <param name="authenticationString">chaîne d'authentificatio (login:pwd)</param> /// <param name="authenticationString">chaîne d'authentificatio (login:pwd)</param>
/// <returns></returns> /// <returns>Instance unique de la classe ApiRest</returns>
public static ApiRest GetInstance(String uriApi, String authenticationString) public static ApiRest GetInstance(String uriApi, String authenticationString)
{ {
if(instance == null) if(instance == null)

View file

@ -1,15 +1,41 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary>
/// Classe métier Abonnement (contient les informations sur un abonnement à une revue)
/// </summary>
public class Abonnement public class Abonnement
{ {
/// <summary>
/// Obtient ou définit l'identifiant de l'abonnement
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; } public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de l'abonnement
/// </summary>
public double Montant { get; set; } public double Montant { get; set; }
/// <summary>
/// Obtient ou définit la date de fin de l'abonnement
/// </summary>
public DateTime DateFinAbonnement { get; set; } public DateTime DateFinAbonnement { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de la revue associée
/// </summary>
public string IdRevue { get; set; } public string IdRevue { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Abonnement"/>
/// </summary>
/// <param name="id">Identifiant de l'abonnement</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de l'abonnement</param>
/// <param name="dateFinAbonnement">Date de fin de l'abonnement</param>
/// <param name="idRevue">Identifiant de la revue associée</param>
public Abonnement(string id, DateTime dateCommande, double montant, DateTime dateFinAbonnement, string idRevue) public Abonnement(string id, DateTime dateCommande, double montant, DateTime dateFinAbonnement, string idRevue)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Categorie public class Categorie
{ {
/// <summary>
/// Obtient l'identifiant de la catégorie
/// </summary>
public string Id { get; } public string Id { get; }
/// <summary>
/// Obtient le libellé de la catégorie
/// </summary>
public string Libelle { get; } public string Libelle { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Categorie"/>
/// </summary>
/// <param name="id">Identifiant de la catégorie</param>
/// <param name="libelle">Libellé de la catégorie</param>
public Categorie(string id, string libelle) public Categorie(string id, string libelle)
{ {
this.Id = id; this.Id = id;
@ -18,7 +29,7 @@ namespace MediaTekDocuments.model
/// <summary> /// <summary>
/// Récupération du libellé pour l'affichage dans les combos /// Récupération du libellé pour l'affichage dans les combos
/// </summary> /// </summary>
/// <returns>Libelle</returns> /// <returns>Le libellé de la catégorie</returns>
public override string ToString() public override string ToString()
{ {
return this.Libelle; return this.Libelle;

View file

@ -1,17 +1,51 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary>
/// Classe métier CommandeDocument (contient les informations sur une commande de livres ou de DVD)
/// </summary>
public class CommandeDocument public class CommandeDocument
{ {
/// <summary>
/// Obtient ou définit l'identifiant de la commande
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit la date de la commande
/// </summary>
public DateTime DateCommande { get; set; } public DateTime DateCommande { get; set; }
/// <summary>
/// Obtient ou définit le montant de la commande
/// </summary>
public double Montant { get; set; } public double Montant { get; set; }
/// <summary>
/// Obtient ou définit le nombre d'exemplaires commandés
/// </summary>
public int NbExemplaire { get; set; } public int NbExemplaire { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du livre ou DVD associé
/// </summary>
public string IdLivreDvd { get; set; } public string IdLivreDvd { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de suivi de la commande
/// </summary>
public int IdSuivi { get; set; } public int IdSuivi { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état de suivi
/// </summary>
public string LibelleSuivi { get; set; } public string LibelleSuivi { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="CommandeDocument"/>
/// </summary>
/// <param name="id">Identifiant de la commande</param>
/// <param name="dateCommande">Date de la commande</param>
/// <param name="montant">Montant de la commande</param>
/// <param name="nbExemplaire">Nombre d'exemplaires</param>
/// <param name="idLivreDvd">Identifiant du document (livre ou dvd)</param>
/// <param name="idSuivi">Identifiant du suivi</param>
/// <param name="libelleSuivi">Libellé du suivi</param>
public CommandeDocument(string id, DateTime dateCommande, double montant, int nbExemplaire, string idLivreDvd, int idSuivi, string libelleSuivi) public CommandeDocument(string id, DateTime dateCommande, double montant, int nbExemplaire, string idLivreDvd, int idSuivi, string libelleSuivi)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,16 +6,55 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Document public class Document
{ {
/// <summary>
/// Obtient l'identifiant du document
/// </summary>
public string Id { get; } public string Id { get; }
/// <summary>
/// Obtient le titre du document
/// </summary>
public string Titre { get; } public string Titre { get; }
/// <summary>
/// Obtient l'URL de l'image du document
/// </summary>
public string Image { get; } public string Image { get; }
/// <summary>
/// Obtient l'identifiant du genre du document
/// </summary>
public string IdGenre { get; } public string IdGenre { get; }
/// <summary>
/// Obtient le libellé du genre du document
/// </summary>
public string Genre { get; } public string Genre { get; }
/// <summary>
/// Obtient l'identifiant du public du document
/// </summary>
public string IdPublic { get; } public string IdPublic { get; }
/// <summary>
/// Obtient le libellé du public du document
/// </summary>
public string Public { get; } public string Public { get; }
/// <summary>
/// Obtient l'identifiant du rayon du document
/// </summary>
public string IdRayon { get; } public string IdRayon { get; }
/// <summary>
/// Obtient le libellé du rayon du document
/// </summary>
public string Rayon { get; } public string Rayon { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Document"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Document(string id, string titre, string image, string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) public Document(string id, string titre, string image, string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
{ {
Id = id; Id = id;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Dvd : LivreDvd public class Dvd : LivreDvd
{ {
/// <summary>
/// Obtient la durée du DVD
/// </summary>
public int Duree { get; } public int Duree { get; }
/// <summary>
/// Obtient le réalisateur du DVD
/// </summary>
public string Realisateur { get; } public string Realisateur { get; }
/// <summary>
/// Obtient le synopsis du DVD
/// </summary>
public string Synopsis { get; } public string Synopsis { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Dvd"/>
/// </summary>
/// <param name="id">Identifiant du DVD</param>
/// <param name="titre">Titre du DVD</param>
/// <param name="image">URL de l'image du DVD</param>
/// <param name="duree">Durée du DVD</param>
/// <param name="realisateur">Réalisateur du DVD</param>
/// <param name="synopsis">Synopsis du DVD</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Dvd(string id, string titre, string image, int duree, string realisateur, string synopsis, public Dvd(string id, string titre, string image, int duree, string realisateur, string synopsis,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,20 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Etat public class Etat
{ {
/// <summary>
/// Obtient ou définit l'identifiant de l'état
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit le libellé de l'état
/// </summary>
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Etat"/>
/// </summary>
/// <param name="id">Identifiant de l'état</param>
/// <param name="libelle">Libellé de l'état</param>
public Etat(string id, string libelle) public Etat(string id, string libelle)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,4 @@
using System; using System;
namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
@ -7,12 +7,35 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Exemplaire public class Exemplaire
{ {
/// <summary>
/// Obtient ou définit le numéro de l'exemplaire
/// </summary>
public int Numero { get; set; } public int Numero { get; set; }
/// <summary>
/// Obtient ou définit l'URL de la photo de l'exemplaire
/// </summary>
public string Photo { get; set; } public string Photo { get; set; }
/// <summary>
/// Obtient ou définit la date d'achat de l'exemplaire
/// </summary>
public DateTime DateAchat { get; set; } public DateTime DateAchat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de l'état de l'exemplaire
/// </summary>
public string IdEtat { get; set; } public string IdEtat { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du document associé
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Exemplaire"/>
/// </summary>
/// <param name="numero">Numéro de l'exemplaire</param>
/// <param name="dateAchat">Date d'achat</param>
/// <param name="photo">URL de la photo</param>
/// <param name="idEtat">Identifiant de l'état</param>
/// <param name="idDocument">Identifiant du document</param>
public Exemplaire(int numero, DateTime dateAchat, string photo, string idEtat, string idDocument) public Exemplaire(int numero, DateTime dateAchat, string photo, string idEtat, string idDocument)
{ {
this.Numero = numero; this.Numero = numero;

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Genre : Categorie public class Genre : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Genre"/>
/// </summary>
/// <param name="id">Identifiant du genre</param>
/// <param name="libelle">Libellé du genre</param>
public Genre(string id, string libelle) : base(id, libelle) public Genre(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,10 +6,34 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Livre : LivreDvd public class Livre : LivreDvd
{ {
/// <summary>
/// Obtient l'ISBN du livre
/// </summary>
public string Isbn { get; } public string Isbn { get; }
/// <summary>
/// Obtient l'auteur du livre
/// </summary>
public string Auteur { get; } public string Auteur { get; }
/// <summary>
/// Obtient la collection du livre
/// </summary>
public string Collection { get; } public string Collection { get; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Livre"/>
/// </summary>
/// <param name="id">Identifiant du livre</param>
/// <param name="titre">Titre du livre</param>
/// <param name="image">URL de l'image du livre</param>
/// <param name="isbn">ISBN du livre</param>
/// <param name="auteur">Auteur du livre</param>
/// <param name="collection">Collection du livre</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
public Livre(string id, string titre, string image, string isbn, string auteur, string collection, public Livre(string id, string titre, string image, string isbn, string auteur, string collection,
string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon) string idGenre, string genre, string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,18 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public abstract class LivreDvd : Document public abstract class LivreDvd : Document
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="LivreDvd"/>
/// </summary>
/// <param name="id">Identifiant du document</param>
/// <param name="titre">Titre du document</param>
/// <param name="image">URL de l'image du document</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
protected LivreDvd(string id, string titre, string image, string idGenre, string genre, protected LivreDvd(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon) string idPublic, string lePublic, string idRayon, string rayon)
: base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon) : base(id, titre, image, idGenre, genre, idPublic, lePublic, idRayon, rayon)

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Public : Categorie public class Public : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Public"/>
/// </summary>
/// <param name="id">Identifiant du public</param>
/// <param name="libelle">Libellé du public</param>
public Public(string id, string libelle) : base(id, libelle) public Public(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,6 +6,11 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Rayon : Categorie public class Rayon : Categorie
{ {
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Rayon"/>
/// </summary>
/// <param name="id">Identifiant du rayon</param>
/// <param name="libelle">Libellé du rayon</param>
public Rayon(string id, string libelle) : base(id, libelle) public Rayon(string id, string libelle) : base(id, libelle)
{ {
} }

View file

@ -1,4 +1,4 @@

namespace MediaTekDocuments.model namespace MediaTekDocuments.model
{ {
/// <summary> /// <summary>
@ -6,9 +6,29 @@ namespace MediaTekDocuments.model
/// </summary> /// </summary>
public class Revue : Document public class Revue : Document
{ {
/// <summary>
/// Obtient ou définit la périodicité de la revue
/// </summary>
public string Periodicite { get; set; } public string Periodicite { get; set; }
/// <summary>
/// Obtient ou définit le délai de mise à disposition de la revue
/// </summary>
public int DelaiMiseADispo { get; set; } public int DelaiMiseADispo { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Revue"/>
/// </summary>
/// <param name="id">Identifiant de la revue</param>
/// <param name="titre">Titre de la revue</param>
/// <param name="image">URL de l'image de la revue</param>
/// <param name="idGenre">Identifiant du genre</param>
/// <param name="genre">Libellé du genre</param>
/// <param name="idPublic">Identifiant du public</param>
/// <param name="lePublic">Libellé du public</param>
/// <param name="idRayon">Identifiant du rayon</param>
/// <param name="rayon">Libellé du rayon</param>
/// <param name="periodicite">Périodicité</param>
/// <param name="delaiMiseADispo">Délai de mise à disposition</param>
public Revue(string id, string titre, string image, string idGenre, string genre, public Revue(string id, string titre, string image, string idGenre, string genre,
string idPublic, string lePublic, string idRayon, string rayon, string idPublic, string lePublic, string idRayon, string rayon,
string periodicite, int delaiMiseADispo) string periodicite, int delaiMiseADispo)

View file

@ -1,12 +1,42 @@
public class Utilisateur /// <summary>
/// Classe métier Utilisateur (représente un utilisateur de l'application)
/// </summary>
public class Utilisateur
{ {
/// <summary>
/// Obtient ou définit l'identifiant technique de l'utilisateur
/// </summary>
public string Id { get; set; } public string Id { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant de connexion de l'utilisateur
/// </summary>
public string Identifiant { get; set; } public string Identifiant { get; set; }
/// <summary>
/// Obtient ou définit le nom de l'utilisateur
/// </summary>
public string Nom { get; set; } public string Nom { get; set; }
/// <summary>
/// Obtient ou définit le prénom de l'utilisateur
/// </summary>
public string Prenom { get; set; } public string Prenom { get; set; }
/// <summary>
/// Obtient ou définit l'identifiant du service de l'utilisateur
/// </summary>
public int IdService { get; set; } public int IdService { get; set; }
/// <summary>
/// Obtient ou définit le libellé du service de l'utilisateur
/// </summary>
public string LibelleService { get; set; } public string LibelleService { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Utilisateur"/>
/// </summary>
/// <param name="id">Identifiant technique</param>
/// <param name="identifiant">Identifiant de connexion</param>
/// <param name="nom">Nom</param>
/// <param name="prenom">Prénom</param>
/// <param name="idService">Identifiant du service</param>
/// <param name="libelleService">Libellé du service</param>
public Utilisateur(string id, string identifiant, string nom, string prenom, int idService, string libelleService) public Utilisateur(string id, string identifiant, string nom, string prenom, int idService, string libelleService)
{ {
this.Id = id; this.Id = id;

View file

@ -1,4 +1,27 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="BouncyCastle" version="1.8.5" targetFramework="net472" />
<package id="BouncyCastle.Cryptography" version="2.6.2" targetFramework="net472" />
<package id="Google.Protobuf" version="3.34.1" targetFramework="net472" />
<package id="K4os.Compression.LZ4" version="1.3.8" targetFramework="net472" />
<package id="K4os.Compression.LZ4.Streams" version="1.3.8" targetFramework="net472" />
<package id="K4os.Hash.xxHash" version="1.0.8" targetFramework="net472" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="5.0.0" targetFramework="net472" />
<package id="MySql.Data" version="8.0.29" targetFramework="net472" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" /> <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
<package id="Serilog" version="4.3.1" targetFramework="net472" />
<package id="Serilog.Sinks.File" version="7.0.0" targetFramework="net472" />
<package id="System.Buffers" version="4.5.1" targetFramework="net472" />
<package id="System.Configuration.ConfigurationManager" version="8.0.0" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="8.0.1" targetFramework="net472" />
<package id="System.IO.Pipelines" version="5.0.2" targetFramework="net472" />
<package id="System.Memory" version="4.5.5" targetFramework="net472" />
<package id="System.Net.Http" version="2.0.20126.16343" targetFramework="net472" />
<package id="System.Net.Http.Formatting.Extension" version="5.2.3.0" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
<package id="System.Threading.Channels" version="8.0.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
<package id="ZstdNet" version="1.4.5" targetFramework="net472" />
<package id="ZstdSharp.Port" version="0.8.6" targetFramework="net472" />
</packages> </packages>

View file

@ -1,41 +1,66 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System;
using System.Windows.Forms; using System.Windows.Forms;
using MediaTekDocuments.model; using MediaTekDocuments.model;
using MediaTekDocuments.controller; using MediaTekDocuments.controller;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
namespace MediaTekDocuments.view namespace MediaTekDocuments.view
{ {
/// <summary>
/// Fenêtre d'authentification de l'application.
/// Permet à l'utilisateur de se connecter en saisissant ses identifiants.
/// </summary>
public partial class FrmAuth : Form public partial class FrmAuth : Form
{ {
/// <summary>
/// Instance du contrôleur pour la gestion de l'authentification.
/// </summary>
private readonly FrmAuthController controller; private readonly FrmAuthController controller;
/// <summary>
/// Obtient l'utilisateur authentifié.
/// </summary>
public Utilisateur user { get; private set; } public Utilisateur user { get; private set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="FrmAuth"/>.
/// Configure le contrôleur d'authentification.
/// </summary>
public FrmAuth() public FrmAuth()
{ {
InitializeComponent(); InitializeComponent();
this.controller = new FrmAuthController(); this.controller = new FrmAuthController();
} }
/// <summary>
/// Gère l'événement de chargement du formulaire.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void FrmAuth_Load(object sender, EventArgs e) private void FrmAuth_Load(object sender, EventArgs e)
{ {
// // Méthode laissée vide intentionnellement.
// Aucun traitement spécifique n'est requis au chargement du formulaire d'authentification.
} }
/// <summary>
/// Gère le clic sur le bouton de connexion.
/// Vérifie les identifiants et le service de l'utilisateur pour autoriser l'accès.
/// </summary>
/// <param name="sender">La source de l'événement.</param>
/// <param name="e">Les données de l'événement.</param>
private void btnLogin_Click(object sender, EventArgs e) private void btnLogin_Click(object sender, EventArgs e)
{ {
string identifiant = txtIdentifiant.Text; string identifiant = txtIdentifiant.Text;
string password = txtPassword.Text; string password = txtPassword.Text;
Utilisateur user = controller.GetConnection(identifiant, password); Utilisateur utilisateur = controller.GetConnection(identifiant, password);
if(user == null) if(utilisateur == null)
{ {
txtIdentifiant.Text = ""; txtIdentifiant.Text = "";
txtPassword.Text = ""; txtPassword.Text = "";
@ -43,14 +68,15 @@ namespace MediaTekDocuments.view
return; return;
} }
if(user.LibelleService == "Culture") if(utilisateur.LibelleService == "Culture")
{ {
MessageBox.Show("Vous n'êtes pas autorisé à accéder à cette application !", "Accès refusé", MessageBoxButtons.OK, MessageBoxIcon.Warning); MessageBox.Show("Vous n'êtes pas autorisé à accéder à cette application !", "Accès refusé", MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.DialogResult = DialogResult.Abort; this.DialogResult = DialogResult.Abort;
this.Close(); this.Close();
return;
} }
this.user = user; this.user = utilisateur;
this.DialogResult = DialogResult.OK; this.DialogResult = DialogResult.OK;
this.Close(); this.Close();
} }

File diff suppressed because it is too large Load diff

View file

@ -50,10 +50,12 @@
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="documentTest.cs" />
<Compile Include="UnitTest1.cs" /> <Compile Include="UnitTest1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" />
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -11,24 +11,26 @@ namespace Mediatek.Tests
[TestMethod] [TestMethod]
public void TestParutionDansAbonnement_ValidationDates() public void TestParutionDansAbonnement_ValidationDates()
{ {
FrmMediatek frm = new FrmMediatek(); Utilisateur user = new Utilisateur("1", "admin", "philippe", "erwann", 1, "administration");
FrmMediatek frm = new FrmMediatek(user);
DateTime debut = new DateTime(2024, 01, 01); // Ajout de DateTimeKind.Local à chaque création d'objet DateTime
DateTime fin = new DateTime(2024, 12, 31); DateTime debut = new DateTime(2024, 01, 01, 0, 0, 0, DateTimeKind.Local);
DateTime fin = new DateTime(2024, 12, 31, 0, 0, 0, DateTimeKind.Local);
DateTime parutionDebut = new DateTime(2024, 01, 01); DateTime parutionDebut = new DateTime(2024, 01, 01, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionDebut), "La date de début devrait être incluse."); Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionDebut), "La date de début devrait être incluse.");
DateTime parutionFin = new DateTime(2024, 12, 31); DateTime parutionFin = new DateTime(2024, 12, 31, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionFin), "La date de fin devrait être incluse."); Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionFin), "La date de fin devrait être incluse.");
DateTime parutionMilieu = new DateTime(2024, 06, 15); DateTime parutionMilieu = new DateTime(2024, 06, 15, 0, 0, 0, DateTimeKind.Local);
Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionMilieu), "Une date en milieu d'abonnement doit être vraie."); Assert.IsTrue(frm.ParutionDansAbonnement(debut, fin, parutionMilieu), "Une date en milieu d'abonnement doit être vraie.");
DateTime parutionAvant = new DateTime(2023, 12, 31); DateTime parutionAvant = new DateTime(2023, 12, 31, 0, 0, 0, DateTimeKind.Local);
Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionAvant), "Une date avant le début doit être fausse."); Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionAvant), "Une date avant le début doit être fausse.");
DateTime parutionApres = new DateTime(2025, 01, 01); DateTime parutionApres = new DateTime(2025, 01, 01, 0, 0, 0, DateTimeKind.Local);
Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionApres), "Une date après la fin doit être fausse."); Assert.IsFalse(frm.ParutionDansAbonnement(debut, fin, parutionApres), "Une date après la fin doit être fausse.");
} }
} }

31
Mediatek.Tests/app.config Normal file
View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Google.Protobuf" publicKeyToken="a7d26565bac4d604" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.34.1.0" newVersion="3.34.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="K4os.Compression.LZ4.Streams" publicKeyToken="2186fa9121ef231d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.3.8.0" newVersion="1.3.8.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Serilog" publicKeyToken="24c2f752a8e58a10" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -0,0 +1,104 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MediaTekDocuments.model;
using System;
namespace Mediatek.Tests
{
[TestClass]
public class ModelTests
{
[TestMethod]
public void TestLivre_Initialization()
{
// Données de test
string id = "001";
string titre = "Le Seigneur des Anneaux";
string image = "image.jpg";
string isbn = "123456";
string auteur = "J.R.R. Tolkien";
string collection = "Pocket";
string idGenre = "G01";
string genre = "Fantastique";
string idPublic = "P01";
string lePublic = "Adulte";
string idRayon = "R01";
string rayon = "Rayon 1";
// Instanciation
Livre livre = new Livre(id, titre, image, isbn, auteur, collection, idGenre, genre, idPublic, lePublic, idRayon, rayon);
// Assertions
Assert.AreEqual(id, livre.Id);
Assert.AreEqual(titre, livre.Titre);
Assert.AreEqual(auteur, livre.Auteur);
Assert.AreEqual(isbn, livre.Isbn);
Assert.AreEqual(genre, livre.Genre);
}
[TestMethod]
public void TestRevue_Initialization()
{
Revue revue = new Revue("003", "Science et Vie", "img.jpg", "G03", "Science", "P01", "Adulte", "R03", "Rayon 3", "Mensuel", 15);
Assert.AreEqual("003", revue.Id);
Assert.AreEqual("Science et Vie", revue.Titre);
Assert.AreEqual("Mensuel", revue.Periodicite);
Assert.AreEqual(15, revue.DelaiMiseADispo);
}
}
[TestClass]
public class CommandeModelTests
{
[TestMethod]
public void TestAbonnement_Initialization()
{
string id = "A001";
DateTime dateCommande = new DateTime(2023, 10, 01, 0, 0, 0, DateTimeKind.Local);
double montant = 50.5;
DateTime dateFin = new DateTime(2024, 10, 01, 0, 0, 0, DateTimeKind.Local);
string idRevue = "R001";
Abonnement abo = new Abonnement(id, dateCommande, montant, dateFin, idRevue);
Assert.AreEqual(id, abo.Id);
Assert.AreEqual(montant, abo.Montant);
Assert.AreEqual(dateFin, abo.DateFinAbonnement);
Assert.AreEqual(idRevue, abo.IdRevue);
}
[TestMethod]
public void TestCommandeDocument_Initialization()
{
CommandeDocument cmd = new CommandeDocument("C001", DateTime.Now, 25.0, 5, "L001", 1, "En cours");
Assert.AreEqual(5, cmd.NbExemplaire);
Assert.AreEqual("L001", cmd.IdLivreDvd);
Assert.AreEqual("En cours", cmd.LibelleSuivi);
}
}
[TestClass]
public class SystemModelTests
{
[TestMethod]
public void TestUtilisateur_Initialization()
{
Utilisateur user = new Utilisateur("1", "jdupont", "dupont", "Jean", 2, "Prêts");
Assert.AreEqual("jdupont", user.Identifiant);
Assert.AreEqual("Jean", user.Prenom);
Assert.AreEqual("Prêts", user.LibelleService);
}
[TestMethod]
public void TestEtat_Initialization()
{
Etat etat = new Etat("00001", "Neuf");
Assert.AreEqual("00001", etat.Id);
Assert.AreEqual("Neuf", etat.Libelle);
}
}
}

157
docs/index.html Normal file
View file

@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documentation Technique - MediaTekDocuments</title>
<style>
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; margin: 0; display: flex; }
nav { width: 300px; background: #f4f4f4; border-right: 1px solid #ddd; height: 100vh; overflow-y: auto; position: fixed; padding: 20px; }
main { margin-left: 340px; padding: 40px; max-width: 1000px; }
h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; }
h2 { color: #2980b9; margin-top: 40px; border-bottom: 1px solid #eee; }
h3 { color: #16a085; background: #f9f9f9; padding: 5px 10px; border-left: 4px solid #16a085; }
.namespace { font-weight: bold; color: #7f8c8d; text-transform: uppercase; font-size: 0.9em; }
table { width: 100%; border-collapse: collapse; margin: 20px 0; }
th, td { text-align: left; padding: 12px; border: 1px solid #ddd; }
th { background: #f2f2f2; }
code { background: #f8f8f8; padding: 2px 5px; border-radius: 3px; font-family: Consolas, Monaco, 'Andale Mono', monospace; }
.summary { font-style: italic; color: #555; margin-bottom: 15px; }
ul { list-style-type: none; padding: 0; }
nav ul li { margin-bottom: 8px; }
nav a { text-decoration: none; color: #34495e; font-size: 0.95em; }
nav a:hover { color: #3498db; }
</style>
</head>
<body>
<nav>
<h3>Sommaire</h3>
<ul>
<li><strong>Contrôleurs</strong>
<ul>
<li><a href="#FrmAuthController">FrmAuthController</a></li>
<li><a href="#FrmMediatekController">FrmMediatekController</a></li>
</ul>
</li>
<li><strong>Data Access</strong>
<ul>
<li><a href="#Access">Access (DAL)</a></li>
<li><a href="#ApiRest">ApiRest (Manager)</a></li>
</ul>
</li>
<li><strong>Modèles</strong>
<ul>
<li><a href="#Livre">Livre</a></li>
<li><a href="#Dvd">Dvd</a></li>
<li><a href="#Revue">Revue</a></li>
<li><a href="#Abonnement">Abonnement</a></li>
<li><a href="#CommandeDocument">CommandeDocument</a></li>
</ul>
</li>
</ul>
</nav>
<main>
<h1>Documentation Technique MediaTekDocuments</h1>
<p>Cette documentation détaille les classes, méthodes et structures de données de l'application de gestion MediaTekDocuments.</p>
<section id="controllers">
<h2>Espace de noms : MediaTekDocuments.controller</h2>
<h3 id="FrmAuthController">Classe FrmAuthController</h3>
<p class="summary">Contrôleur gérant l'authentification des utilisateurs.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr>
<td><code>GetConnection(login, pwd)</code></td>
<td>Vérifie les identifiants. Retourne un objet <code>Utilisateur</code> ou <code>null</code>.</td>
</tr>
</table>
<h3 id="FrmMediatekController">Classe FrmMediatekController</h3>
<p class="summary">Contrôleur principal servant d'interface entre la vue et la couche d'accès aux données.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>GetAllLivres() / GetAllDvd() / GetAllRevues()</code></td><td>Récupère l'intégralité des documents par type.</td></tr>
<tr><td><code>GetExemplairesRevue(idDocument)</code></td><td>Récupère la liste des exemplaires pour une revue donnée.</td></tr>
<tr><td><code>GetCommandesDocument(idDocument)</code></td><td>Récupère les commandes (Livres/DVD) associées à un document.</td></tr>
<tr><td><code>UpdateSuiviCommande(idCommande, idSuivi)</code></td><td>Met à jour l'état d'avancement d'une commande.</td></tr>
<tr><td><code>CreerAbonnement(abonnement)</code></td><td>Enregistre un nouvel abonnement en base de données.</td></tr>
</table>
</section>
<section id="dal">
<h2>Espace de noms : MediaTekDocuments.dal & manager</h2>
<h3 id="Access">Classe Access</h3>
<p class="summary">Implémentation du pattern Singleton pour l'accès centralisé aux données via l'API.</p>
<table>
<tr><th>Membre</th><th>Description</th></tr>
<tr><td><code>GetInstance()</code></td><td>Retourne l'instance unique de la classe Access.</td></tr>
<tr><td><code>convertToJson(nom, valeur)</code></td><td>Sérialise un couple clé/valeur pour les envois à l'API.</td></tr>
<tr><td><code>GetNextCommandeId()</code></td><td>Récupère le futur identifiant de commande disponible.</td></tr>
</table>
<h3 id="ApiRest">Classe ApiRest</h3>
<p class="summary">Gère les appels HTTP bas niveau vers l'API Rest.</p>
<ul>
<li><strong>RecupDistant(methode, message, parametres) :</strong> Point d'entrée unique pour GET, POST, PUT, DELETE.</li>
</ul>
</section>
<section id="models">
<h2>Espace de noms : MediaTekDocuments.model</h2>
<p>Les classes modèles représentent les entités métier du domaine.</p>
<h3 id="Livre">Classe Livre (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Isbn</code></td><td>string</td><td>Code ISBN unique du livre.</td></tr>
<tr><td><code>Auteur</code></td><td>string</td><td>Nom de l'auteur.</td></tr>
<tr><td><code>Collection</code></td><td>string</td><td>Collection éditoriale.</td></tr>
</table>
<h3 id="Dvd">Classe Dvd (hérite de LivreDvd)</h3>
<table>
<tr><th>Propriété</th><th>Type</th><th>Description</th></tr>
<tr><td><code>Duree</code></td><td>int</td><td>Durée en minutes.</td></tr>
<tr><td><code>Realisateur</code></td><td>string</td><td>Nom du réalisateur.</td></tr>
<tr><td><code>Synopsis</code></td><td>string</td><td>Résumé du film.</td></tr>
</table>
<h3 id="Abonnement">Classe Abonnement</h3>
<p class="summary">Gère les informations liées aux contrats de revues.</p>
<ul>
<li><code>DateFinAbonnement</code> : Détermine la période de validité du contrat.</li>
<li><code>Montant</code> : Coût de l'abonnement.</li>
</ul>
<h3 id="CommandeDocument">Classe CommandeDocument</h3>
<p class="summary">Représente l'achat d'un exemplaire de livre ou de DVD.</p>
<ul>
<li><code>NbExemplaire</code> : Quantité commandée.</li>
<li><code>IdSuivi / LibelleSuivi</code> : État actuel (en cours, reçu, etc.).</li>
</ul>
</section>
<section id="views">
<h2>Espace de noms : MediaTekDocuments.view</h2>
<h3 id="FrmMediatek">Classe FrmMediatek</h3>
<p class="summary">Interface principale de l'application. Elle contient la logique de filtrage et d'affichage.</p>
<table>
<tr><th>Méthode</th><th>Description</th></tr>
<tr><td><code>AlerteAbonnementsExpirants()</code></td><td>Vérifie au démarrage les abonnements finissant sous 30 jours.</td></tr>
<tr><td><code>PeutSupprimerAbonnement()</code></td><td>Contrôle métier : interdit la suppression si des exemplaires ont été reçus.</td></tr>
<tr><td><code>RemplirComboCategorie()</code></td><td>Méthode générique pour peupler les listes déroulantes (Genre, Public, Rayon).</td></tr>
</table>
</section>
<hr>
<footer>
<p>Généré le : 30 mars 2026 - Documentation technique MediaTekDocuments</p>
</footer>
</main>
</body>
</html>