From b7df13b125e151c418c3e4e635a388d734fce360 Mon Sep 17 00:00:00 2001 From: Dave Walker Date: Wed, 15 Nov 2023 18:38:58 +0000 Subject: [PATCH 1/3] Added the monthly spend report to the entities, logic and API --- docker/api/Dockerfile | 4 +- docker/ui/Dockerfile | 4 +- .../Controllers/ReportsController.cs | 22 ++ .../MusicCatalogue.Api.csproj | 6 +- ...31115182723_MonthlySpendReport.Designer.cs | 316 ++++++++++++++++++ .../20231115182723_MonthlySpendReport.cs | 35 ++ .../MusicCatalogueDbContextModelSnapshot.cs | 21 +- .../MusicCatalogue.Data.csproj | 4 +- .../MusicCatalogueDbContext.cs | 1 + .../Interfaces/IMusicCatalogueFactory.cs | 1 + .../MusicCatalogue.Entities.csproj | 4 +- .../Reporting/MonthlySpend.cs | 20 ++ .../Factory/MusicCatalogueFactory.cs | 5 + .../MusicCatalogue.Logic.csproj | 6 +- src/MusicCatalogue.Logic/Sql/MonthlySpend.sql | 8 + .../MusicCatalogue.LookupTool.csproj | 6 +- 16 files changed, 441 insertions(+), 22 deletions(-) create mode 100644 src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.Designer.cs create mode 100644 src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.cs create mode 100644 src/MusicCatalogue.Entities/Reporting/MonthlySpend.cs create mode 100644 src/MusicCatalogue.Logic/Sql/MonthlySpend.sql diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 4794fd7..e5b8d27 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -1,4 +1,4 @@ FROM mcr.microsoft.com/dotnet/core/aspnet:latest -COPY musiccatalogue.api-1.15.0.0 /opt/musiccatalogue.api-1.15.0.0 -WORKDIR /opt/musiccatalogue.api-1.15.0.0/bin +COPY musiccatalogue.api-1.16.0.0 /opt/musiccatalogue.api-1.16.0.0 +WORKDIR /opt/musiccatalogue.api-1.16.0.0/bin ENTRYPOINT [ "./MusicCatalogue.Api" ] diff --git a/docker/ui/Dockerfile b/docker/ui/Dockerfile index 2694576..1b1911e 100644 --- a/docker/ui/Dockerfile +++ b/docker/ui/Dockerfile @@ -1,6 +1,6 @@ FROM node:20-alpine -COPY musiccatalogue.ui-1.15.0.0 /opt/musiccatalogue.ui-1.15.0.0 -WORKDIR /opt/musiccatalogue.ui-1.15.0.0 +COPY musiccatalogue.ui-1.16.0.0 /opt/musiccatalogue.ui-1.16.0.0 +WORKDIR /opt/musiccatalogue.ui-1.16.0.0 RUN npm install RUN npm run build ENTRYPOINT [ "npm", "start" ] diff --git a/src/MusicCatalogue.Api/Controllers/ReportsController.cs b/src/MusicCatalogue.Api/Controllers/ReportsController.cs index 36a31a9..5bb0af1 100644 --- a/src/MusicCatalogue.Api/Controllers/ReportsController.cs +++ b/src/MusicCatalogue.Api/Controllers/ReportsController.cs @@ -94,5 +94,27 @@ public async Task>> GetArtistStatisticsRepor // Convert to a list and return the results return results.ToList(); } + + /// + /// Generate the monthly spending report + /// + /// + /// + /// + [HttpGet] + [Route("spend/{wishlist}")] + public async Task>> GetMonthlySpendingReportAsync(bool wishlist) + { + // Get the report content + var results = await _factory.MonthlySpend.GenerateReportAsync(wishlist, 1, int.MaxValue); + + if (!results.Any()) + { + return NoContent(); + } + + // Convert to a list and return the results + return results.ToList(); + } } } diff --git a/src/MusicCatalogue.Api/MusicCatalogue.Api.csproj b/src/MusicCatalogue.Api/MusicCatalogue.Api.csproj index 7259367..844cbd0 100644 --- a/src/MusicCatalogue.Api/MusicCatalogue.Api.csproj +++ b/src/MusicCatalogue.Api/MusicCatalogue.Api.csproj @@ -2,9 +2,9 @@ net7.0 - 1.15.0.0 - 1.15.0.0 - 1.15.0 + 1.16.0.0 + 1.16.0.0 + 1.16.0 enable enable diff --git a/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.Designer.cs b/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.Designer.cs new file mode 100644 index 0000000..a6c74d4 --- /dev/null +++ b/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.Designer.cs @@ -0,0 +1,316 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MusicCatalogue.Data; + +#nullable disable + +namespace MusicCatalogue.Data.Migrations +{ + [DbContext(typeof(MusicCatalogueDbContext))] + [Migration("20231115182723_MonthlySpendReport")] + partial class MonthlySpendReport + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "7.0.11"); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("Id"); + + b.Property("ArtistId") + .HasColumnType("INTEGER") + .HasColumnName("ArtistId"); + + b.Property("CoverUrl") + .HasColumnType("TEXT") + .HasColumnName("CoverUrl"); + + b.Property("GenreId") + .HasColumnType("INTEGER") + .HasColumnName("GenreId"); + + b.Property("IsWishListItem") + .HasColumnType("INTEGER"); + + b.Property("Price") + .HasColumnType("TEXT") + .HasColumnName("Price"); + + b.Property("Purchased") + .HasColumnType("TEXT") + .HasColumnName("Purchased"); + + b.Property("Released") + .HasColumnType("INTEGER") + .HasColumnName("Released"); + + b.Property("RetailerId") + .HasColumnType("INTEGER") + .HasColumnName("RetailerId"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Title"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.HasIndex("GenreId"); + + b.HasIndex("RetailerId"); + + b.ToTable("ALBUMS", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Artist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("Id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Name"); + + b.Property("SearchableName") + .HasColumnType("TEXT") + .HasColumnName("SearchableName"); + + b.HasKey("Id"); + + b.ToTable("ARTISTS", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Genre", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("Id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Name"); + + b.HasKey("Id"); + + b.ToTable("GENRES", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.JobStatus", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property("End") + .HasColumnType("DATETIME") + .HasColumnName("end"); + + b.Property("Error") + .HasColumnType("TEXT") + .HasColumnName("error"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.Property("Parameters") + .HasColumnType("TEXT") + .HasColumnName("parameters"); + + b.Property("Start") + .HasColumnType("DATETIME") + .HasColumnName("start"); + + b.HasKey("Id"); + + b.ToTable("JOB_STATUS", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Retailer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("Id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Name"); + + b.HasKey("Id"); + + b.ToTable("RETAILERS", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Track", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("Id"); + + b.Property("AlbumId") + .HasColumnType("INTEGER") + .HasColumnName("AlbumId"); + + b.Property("Duration") + .HasColumnType("INTEGER") + .HasColumnName("Duration"); + + b.Property("Number") + .HasColumnType("INTEGER") + .HasColumnName("Number"); + + b.Property("Purchased") + .HasColumnType("TEXT"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Title"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.ToTable("TRACKS", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("id"); + + b.Property("Password") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("Password"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("UserName"); + + b.HasKey("Id"); + + b.ToTable("USER", (string)null); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Reporting.ArtistStatistics", b => + { + b.Property("Albums") + .HasColumnType("INTEGER"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Spend") + .HasColumnType("TEXT"); + + b.Property("Tracks") + .HasColumnType("INTEGER"); + + b.ToTable("ArtistStatistics"); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Reporting.GenreStatistics", b => + { + b.Property("Albums") + .HasColumnType("INTEGER"); + + b.Property("Artists") + .HasColumnType("INTEGER"); + + b.Property("Genre") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Spend") + .HasColumnType("TEXT"); + + b.Property("Tracks") + .HasColumnType("INTEGER"); + + b.ToTable("GenreStatistics"); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Reporting.MonthlySpend", b => + { + b.Property("Month") + .HasColumnType("INTEGER"); + + b.Property("Spend") + .HasColumnType("TEXT"); + + b.Property("Year") + .HasColumnType("INTEGER"); + + b.ToTable("MonthlySpend"); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Album", b => + { + b.HasOne("MusicCatalogue.Entities.Database.Artist", null) + .WithMany("Albums") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MusicCatalogue.Entities.Database.Genre", "Genre") + .WithMany() + .HasForeignKey("GenreId"); + + b.HasOne("MusicCatalogue.Entities.Database.Retailer", "Retailer") + .WithMany() + .HasForeignKey("RetailerId"); + + b.Navigation("Genre"); + + b.Navigation("Retailer"); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Track", b => + { + b.HasOne("MusicCatalogue.Entities.Database.Album", null) + .WithMany("Tracks") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Album", b => + { + b.Navigation("Tracks"); + }); + + modelBuilder.Entity("MusicCatalogue.Entities.Database.Artist", b => + { + b.Navigation("Albums"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.cs b/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.cs new file mode 100644 index 0000000..0457e69 --- /dev/null +++ b/src/MusicCatalogue.Data/Migrations/20231115182723_MonthlySpendReport.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using System.Diagnostics.CodeAnalysis; + +#nullable disable + +namespace MusicCatalogue.Data.Migrations +{ + [ExcludeFromCodeCoverage] + /// + public partial class MonthlySpendReport : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "MonthlySpend", + columns: table => new + { + Year = table.Column(type: "INTEGER", nullable: true), + Month = table.Column(type: "INTEGER", nullable: true), + Spend = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + }); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "MonthlySpend"); + } + } +} diff --git a/src/MusicCatalogue.Data/Migrations/MusicCatalogueDbContextModelSnapshot.cs b/src/MusicCatalogue.Data/Migrations/MusicCatalogueDbContextModelSnapshot.cs index 3cef278..cbeab9b 100644 --- a/src/MusicCatalogue.Data/Migrations/MusicCatalogueDbContextModelSnapshot.cs +++ b/src/MusicCatalogue.Data/Migrations/MusicCatalogueDbContextModelSnapshot.cs @@ -256,6 +256,20 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("GenreStatistics"); }); + modelBuilder.Entity("MusicCatalogue.Entities.Reporting.MonthlySpend", b => + { + b.Property("Month") + .HasColumnType("INTEGER"); + + b.Property("Spend") + .HasColumnType("TEXT"); + + b.Property("Year") + .HasColumnType("INTEGER"); + + b.ToTable("MonthlySpend"); + }); + modelBuilder.Entity("MusicCatalogue.Entities.Database.Album", b => { b.HasOne("MusicCatalogue.Entities.Database.Artist", null) @@ -265,7 +279,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired(); b.HasOne("MusicCatalogue.Entities.Database.Genre", "Genre") - .WithMany("Albums") + .WithMany() .HasForeignKey("GenreId"); b.HasOne("MusicCatalogue.Entities.Database.Retailer", "Retailer") @@ -295,11 +309,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Navigation("Albums"); }); - - modelBuilder.Entity("MusicCatalogue.Entities.Database.Genre", b => - { - b.Navigation("Albums"); - }); #pragma warning restore 612, 618 } } diff --git a/src/MusicCatalogue.Data/MusicCatalogue.Data.csproj b/src/MusicCatalogue.Data/MusicCatalogue.Data.csproj index 15b0d6c..0c457cc 100644 --- a/src/MusicCatalogue.Data/MusicCatalogue.Data.csproj +++ b/src/MusicCatalogue.Data/MusicCatalogue.Data.csproj @@ -5,7 +5,7 @@ enable enable MusicCatalogue.Data - 1.14.0.0 + 1.15.0.0 Dave Walker Copyright (c) Dave Walker 2023 Dave Walker @@ -17,7 +17,7 @@ https://github.com/davewalker5/MusicCatalogue MIT false - 1.14.0.0 + 1.15.0.0 diff --git a/src/MusicCatalogue.Data/MusicCatalogueDbContext.cs b/src/MusicCatalogue.Data/MusicCatalogueDbContext.cs index a9628e6..56f22ef 100644 --- a/src/MusicCatalogue.Data/MusicCatalogueDbContext.cs +++ b/src/MusicCatalogue.Data/MusicCatalogueDbContext.cs @@ -17,6 +17,7 @@ public class MusicCatalogueDbContext : DbContext public virtual DbSet JobStatuses { get; set; } public virtual DbSet GenreStatistics { get; set; } public virtual DbSet ArtistStatistics { get; set; } + public virtual DbSet MonthlySpend { get; set; } public MusicCatalogueDbContext(DbContextOptions options) : base(options) { diff --git a/src/MusicCatalogue.Entities/Interfaces/IMusicCatalogueFactory.cs b/src/MusicCatalogue.Entities/Interfaces/IMusicCatalogueFactory.cs index 76269bd..52ce966 100644 --- a/src/MusicCatalogue.Entities/Interfaces/IMusicCatalogueFactory.cs +++ b/src/MusicCatalogue.Entities/Interfaces/IMusicCatalogueFactory.cs @@ -18,5 +18,6 @@ public interface IMusicCatalogueFactory IJobStatusManager JobStatuses { get; } IWishListBasedReport GenreStatistics { get; } IWishListBasedReport ArtistStatistics { get; } + IWishListBasedReport MonthlySpend { get; } } } \ No newline at end of file diff --git a/src/MusicCatalogue.Entities/MusicCatalogue.Entities.csproj b/src/MusicCatalogue.Entities/MusicCatalogue.Entities.csproj index b153947..8f009c8 100644 --- a/src/MusicCatalogue.Entities/MusicCatalogue.Entities.csproj +++ b/src/MusicCatalogue.Entities/MusicCatalogue.Entities.csproj @@ -5,7 +5,7 @@ enable enable MusicCatalogue.Entities - 1.14.0.0 + 1.15.0.0 Dave Walker Copyright (c) Dave Walker 2023 Dave Walker @@ -17,7 +17,7 @@ https://github.com/davewalker5/MusicCatalogue MIT false - 1.14.0.0 + 1.15.0.0 diff --git a/src/MusicCatalogue.Entities/Reporting/MonthlySpend.cs b/src/MusicCatalogue.Entities/Reporting/MonthlySpend.cs new file mode 100644 index 0000000..a615860 --- /dev/null +++ b/src/MusicCatalogue.Entities/Reporting/MonthlySpend.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore; +using MusicCatalogue.Entities.Attributes; +using System.Diagnostics.CodeAnalysis; + +namespace MusicCatalogue.Entities.Reporting +{ + [Keyless] + [ExcludeFromCodeCoverage] + public class MonthlySpend + { + [Export("Year", 1)] + public int? Year { get; set; } + + [Export("Month", 2)] + public int? Month { get; set; } + + [Export("Spend", 2)] + public decimal Spend { get; set; } + } +} diff --git a/src/MusicCatalogue.Logic/Factory/MusicCatalogueFactory.cs b/src/MusicCatalogue.Logic/Factory/MusicCatalogueFactory.cs index 0d7d50f..9ef1c90 100644 --- a/src/MusicCatalogue.Logic/Factory/MusicCatalogueFactory.cs +++ b/src/MusicCatalogue.Logic/Factory/MusicCatalogueFactory.cs @@ -23,6 +23,7 @@ public class MusicCatalogueFactory : IMusicCatalogueFactory private readonly Lazy _jobStatuses; private readonly Lazy> _genreStatistics; private readonly Lazy> _artistStatistics; + private readonly Lazy> _monthlySpend; public DbContext Context { get; private set; } public IGenreManager Genres { get { return _genres.Value; } } @@ -42,6 +43,9 @@ public class MusicCatalogueFactory : IMusicCatalogueFactory [ExcludeFromCodeCoverage] public IWishListBasedReport ArtistStatistics { get { return _artistStatistics.Value; } } + [ExcludeFromCodeCoverage] + public IWishListBasedReport MonthlySpend { get { return _monthlySpend.Value; } } + public MusicCatalogueFactory(MusicCatalogueDbContext context) { Context = context; @@ -57,6 +61,7 @@ public MusicCatalogueFactory(MusicCatalogueDbContext context) _xlsxExporter = new Lazy(() => new XlsxExporter(this)); _genreStatistics = new Lazy>(() => new WishListBasedReport(context)); _artistStatistics = new Lazy>(() => new WishListBasedReport(context)); + _monthlySpend = new Lazy>(() => new WishListBasedReport(context)); } } } \ No newline at end of file diff --git a/src/MusicCatalogue.Logic/MusicCatalogue.Logic.csproj b/src/MusicCatalogue.Logic/MusicCatalogue.Logic.csproj index 96ab279..4f330a9 100644 --- a/src/MusicCatalogue.Logic/MusicCatalogue.Logic.csproj +++ b/src/MusicCatalogue.Logic/MusicCatalogue.Logic.csproj @@ -5,7 +5,7 @@ enable enable MusicCatalogue.Logic - 1.14.0.0 + 1.15.0.0 Dave Walker Copyright (c) Dave Walker 2023 Dave Walker @@ -17,17 +17,19 @@ https://github.com/davewalker5/MusicCatalogue MIT false - 1.14.0.0 + 1.15.0.0 + + diff --git a/src/MusicCatalogue.Logic/Sql/MonthlySpend.sql b/src/MusicCatalogue.Logic/Sql/MonthlySpend.sql new file mode 100644 index 0000000..fd4297a --- /dev/null +++ b/src/MusicCatalogue.Logic/Sql/MonthlySpend.sql @@ -0,0 +1,8 @@ +SELECT STRFTIME( '%Y', al.Purchased ) AS "Year", + STRFTIME( '%m', al.Purchased ) AS "Month", + SUM( al.Price ) AS "Spend" +FROM ALBUMS al +WHERE IFNULL( al.IsWishListItem, 0 ) = $wishlist +AND al.Price IS NOT NULL +GROUP BY STRFTIME( '%Y', al.Purchased ), + STRFTIME( '%m', al.Purchased ); diff --git a/src/MusicCatalogue.LookupTool/MusicCatalogue.LookupTool.csproj b/src/MusicCatalogue.LookupTool/MusicCatalogue.LookupTool.csproj index 8b24100..bad4846 100644 --- a/src/MusicCatalogue.LookupTool/MusicCatalogue.LookupTool.csproj +++ b/src/MusicCatalogue.LookupTool/MusicCatalogue.LookupTool.csproj @@ -3,9 +3,9 @@ Exe net7.0 - 1.14.0.0 - 1.14.0.0 - 1.14.0 + 1.15.0.0 + 1.15.0.0 + 1.15.0 enable enable false From 59d61dbb032ba3e92950b6af616ef14926f80c3b Mon Sep 17 00:00:00 2001 From: Dave Walker Date: Wed, 15 Nov 2023 19:01:16 +0000 Subject: [PATCH 2/3] Add the monthly spending report to the UI --- .../components/componentPicker.js | 3 ++ src/music-catalogue-ui/components/menuBar.js | 7 ++++ .../components/monthlySpendReport.js | 37 +++++++++++++++++++ .../components/monthlySpendReportRow.js | 20 ++++++++++ src/music-catalogue-ui/helpers/apiReports.js | 20 ++++++++++ src/music-catalogue-ui/helpers/navigation.js | 1 + .../hooks/useMonthlySpend.js | 29 +++++++++++++++ 7 files changed, 117 insertions(+) create mode 100644 src/music-catalogue-ui/components/monthlySpendReport.js create mode 100644 src/music-catalogue-ui/components/monthlySpendReportRow.js create mode 100644 src/music-catalogue-ui/hooks/useMonthlySpend.js diff --git a/src/music-catalogue-ui/components/componentPicker.js b/src/music-catalogue-ui/components/componentPicker.js index 45ec5ce..d9b6a74 100644 --- a/src/music-catalogue-ui/components/componentPicker.js +++ b/src/music-catalogue-ui/components/componentPicker.js @@ -8,6 +8,7 @@ import GenreStatusReport from "./genreStatisticsReport"; import JobStatusReport from "./jobStatusReport"; import AlbumPurchaseDetails from "./albumPurchaseDetails"; import ArtistStatisticsReport from "./artistStatisticsReport"; +import MonthlySpendReport from "./monthlySpendReport"; /** * Component using the current page name to render the components required @@ -57,6 +58,8 @@ const ComponentPicker = ({ context, navigate, logout }) => { return ; case pages.jobStatusReport: return ; + case pages.monthlySpendReport: + return ; case pages.albumPurchaseDetails: return ( { > Job Status + + navigate(pages.monthlySpendReport, null, null, false) + } + > + Monthly Spend + navigate(pages.export, null, null, false)}>Export diff --git a/src/music-catalogue-ui/components/monthlySpendReport.js b/src/music-catalogue-ui/components/monthlySpendReport.js new file mode 100644 index 0000000..2796e46 --- /dev/null +++ b/src/music-catalogue-ui/components/monthlySpendReport.js @@ -0,0 +1,37 @@ +import useMonthlySpend from "@/hooks/useMonthlySpend"; +import MonthlySpendReportRow from "./monthlySpendReportRow"; + +/** + * Component to display the monthly spending report page and its results + * @param {*} logout + * @returns + */ +const MonthlySpendReport = ({ logout }) => { + const { records, setRecords } = useMonthlySpend(logout); + + return ( + <> +
+
Monthly Spending Report
+
+ + + + + + + + + {records != null && ( + + {records.map((r) => ( + + ))} + + )} +
YearMonthTotal Spend
+ + ); +}; + +export default MonthlySpendReport; diff --git a/src/music-catalogue-ui/components/monthlySpendReportRow.js b/src/music-catalogue-ui/components/monthlySpendReportRow.js new file mode 100644 index 0000000..3b606f8 --- /dev/null +++ b/src/music-catalogue-ui/components/monthlySpendReportRow.js @@ -0,0 +1,20 @@ +import CurrencyFormatter from "./currencyFormatter"; + +/** + * Component to render a row containing the details for a single monthly spending record + * @param {*} record + * @returns + */ +const MonthlySpendReportRow = ({ record }) => { + return ( + + {record.year} + {record.month} + + + + + ); +}; + +export default MonthlySpendReportRow; diff --git a/src/music-catalogue-ui/helpers/apiReports.js b/src/music-catalogue-ui/helpers/apiReports.js index 1701b38..3e9c14e 100644 --- a/src/music-catalogue-ui/helpers/apiReports.js +++ b/src/music-catalogue-ui/helpers/apiReports.js @@ -86,8 +86,28 @@ const apiArtistStatisticsReport = async (wishlist, logout) => { return records; }; +/** + * Call the API to retrieve the monthly spending report + * @param {*} logout + * @returns + */ +const apiMonthlySpendReport = async (logout) => { + // Construct the route + const url = `${config.api.baseUrl}/reports/spend/false`; + + // Call the API to get content for the report + const response = await fetch(url, { + method: "GET", + headers: apiGetHeaders(), + }); + + const records = await apiReadResponseData(response, logout); + return records; +}; + export { apiJobStatusReport, apiGenreStatisticsReport, apiArtistStatisticsReport, + apiMonthlySpendReport, }; diff --git a/src/music-catalogue-ui/helpers/navigation.js b/src/music-catalogue-ui/helpers/navigation.js index e2dae51..9dfc460 100644 --- a/src/music-catalogue-ui/helpers/navigation.js +++ b/src/music-catalogue-ui/helpers/navigation.js @@ -9,6 +9,7 @@ const pages = { artistStatisticsReport: "ArtistStatisticsReport", genreStatisticsReport: "GenreStatisticsReport", jobStatusReport: "JobStatusReport", + monthlySpendReport: "MonthlySpendReport", albumPurchaseDetails: "AlbumPurchaseDetails", }; diff --git a/src/music-catalogue-ui/hooks/useMonthlySpend.js b/src/music-catalogue-ui/hooks/useMonthlySpend.js new file mode 100644 index 0000000..72f6b25 --- /dev/null +++ b/src/music-catalogue-ui/hooks/useMonthlySpend.js @@ -0,0 +1,29 @@ +import { useState, useEffect } from "react"; +import { apiMonthlySpendReport } from "@/helpers/apiReports"; + +/** + * Hook that uses the API helpers to retrieve a list of artists from the + * Music Catalogue REST API + * @param {*} logout + * @returns + */ +const useMonthlySpend = (logout) => { + // Current list of artists and the method to change it + const [records, setRecords] = useState([]); + + useEffect(() => { + const fetchReport = async () => { + try { + // Get a list of records via the service, store it in state + var fetchedRecords = await apiMonthlySpendReport(logout); + setRecords(fetchedRecords); + } catch {} + }; + + fetchReport(); + }, [logout]); + + return { records, setRecords }; +}; + +export default useMonthlySpend; From 9f09e2330be31de547e57398e76607ac4106cc64 Mon Sep 17 00:00:00 2001 From: Dave Walker Date: Wed, 15 Nov 2023 19:13:35 +0000 Subject: [PATCH 3/3] Updated the README to cover the monthly spend report --- README.md | 6 ++++++ diagrams/reports-monthly-spend.png | Bin 0 -> 78662 bytes 2 files changed, 6 insertions(+) create mode 100644 diagrams/reports-monthly-spend.png diff --git a/README.md b/README.md index 91822b4..9976677 100644 --- a/README.md +++ b/README.md @@ -262,6 +262,12 @@ MusicCatalogue.LookupTool --lookup "John Coltrane" "Blue Train" catalogue - Click on the "Search" button to view the results - Records are included from 00:00 on the start date up to and including 23:59 on the end date +#### Monthly Spend Report + +- To view a report on spending by year and month, click on the "Reports > Monthly Spend" menu bar item: + +Monthly Spend Report + [^ top](#musiccatalogue) ## Web Service diff --git a/diagrams/reports-monthly-spend.png b/diagrams/reports-monthly-spend.png new file mode 100644 index 0000000000000000000000000000000000000000..0a93f3048197d3765a8c9ca147ae32180f780ba8 GIT binary patch literal 78662 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%0A%! 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

^M*a)7t(|jmsxvSI9F8mSc0eG0yOM< zFj-5JOBAjL$IH*-LF$∓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 literal 0 HcmV?d00001