diff --git a/RMuseum/RMuseum.xml b/RMuseum/RMuseum.xml
index 20e90d52..d447f83a 100644
--- a/RMuseum/RMuseum.xml
+++ b/RMuseum/RMuseum.xml
@@ -9866,6 +9866,68 @@
+
+
+ numbering service
+
+
+
+
+ add numbering
+
+
+
+
+
+
+ update an existing numbering (only name)
+
+
+
+
+
+
+ delete numbering
+
+
+
+
+
+
+ get numbering by id
+
+
+
+
+
+
+ get all numberings
+
+
+
+
+
+ get numberings for a cat
+
+
+
+
+
+ get numberings for direct subcats of parent cat
+
+
+
+
+
+ Database Context
+
+
+
+
+ constructor
+
+
+
IGanjoorService implementation
diff --git a/RMuseum/Services/Implementation/GanjoorNumberingService.cs b/RMuseum/Services/Implementation/GanjoorNumberingService.cs
new file mode 100644
index 00000000..4469bd3a
--- /dev/null
+++ b/RMuseum/Services/Implementation/GanjoorNumberingService.cs
@@ -0,0 +1,170 @@
+using Microsoft.EntityFrameworkCore;
+using RMuseum.DbContext;
+using RMuseum.Models.Ganjoor;
+using RSecurityBackend.Models.Generic;
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace RMuseum.Services.Implementation
+{
+ ///
+ /// numbering service
+ ///
+ public class GanjoorNumberingService
+ {
+ ///
+ /// add numbering
+ ///
+ ///
+ ///
+ public async Task> AddNumberingAsync(GanjoorNumbering numbering)
+ {
+ numbering.Name = numbering.Name == null ? numbering.Name : numbering.Name.Trim();
+ if (string.IsNullOrEmpty(numbering.Name))
+ return new RServiceResult(null, "ورود نام طرح شمارهگذاری اجباری است.");
+ var existing = await _context.GanjoorNumberings.Where(l => l.Name == numbering.Name).FirstOrDefaultAsync();
+ if (existing != null)
+ return new RServiceResult(null, "اطلاعات تکراری است.");
+ try
+ {
+ _context.GanjoorNumberings.Add(numbering);
+ await _context.SaveChangesAsync();
+ return new RServiceResult(numbering);
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// update an existing numbering (only name)
+ ///
+ ///
+ ///
+ public async Task> UpdateNumberingAsync(GanjoorNumbering updated)
+ {
+ try
+ {
+ var numbering = await _context.GanjoorNumberings.Where(l => l.Id == updated.Id).SingleOrDefaultAsync();
+ if (numbering == null)
+ return new RServiceResult(false, "اطلاعات طرح شماره گذاری یافت نشد.");
+
+ numbering.Name = updated.Name;
+ _context.Update(numbering);
+
+ await _context.SaveChangesAsync();
+ return new RServiceResult(true);
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(false, exp.ToString());
+ }
+ }
+
+ ///
+ /// delete numbering
+ ///
+ ///
+ ///
+ public async Task> DeleteNumberingAsync(int id)
+ {
+ try
+ {
+ var numbering = await _context.GanjoorNumberings.Where(l => l.Id == id).SingleOrDefaultAsync();
+ if (numbering == null)
+ return new RServiceResult(false, "اطلاعات طرح شماره گذاری یافت نشد.");
+
+ _context.Remove(numbering);
+
+ await _context.SaveChangesAsync();
+ return new RServiceResult(true);
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(false, exp.ToString());
+ }
+ }
+
+ ///
+ /// get numbering by id
+ ///
+ ///
+ ///
+ public async Task> GetNumberingAsync(int id)
+ {
+ try
+ {
+ return new RServiceResult(await _context.GanjoorNumberings.Where(l => l.Id == id).SingleOrDefaultAsync());
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// get all numberings
+ ///
+ ///
+ public async Task> GetNumberingsAsync()
+ {
+ try
+ {
+ return new RServiceResult(await _context.GanjoorNumberings.OrderBy(l => l.Id).ToArrayAsync());
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// get numberings for a cat
+ ///
+ ///
+ public async Task> GetNumberingsForCatAsync(int catId)
+ {
+ try
+ {
+ return new RServiceResult(await _context.GanjoorNumberings.Where(n => n.StartCatId == catId).OrderBy(l => l.Id).ToArrayAsync());
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// get numberings for direct subcats of parent cat
+ ///
+ ///
+ public async Task> GetNumberingsForDirectSubCatsAsync(int parentCatId)
+ {
+ try
+ {
+ var subcatIds = await _context.GanjoorCategories.Where(c => c.ParentId == parentCatId).Select(c => c.Id).ToListAsync();
+ return new RServiceResult(await _context.GanjoorNumberings.Where(n => subcatIds.Contains(n.StartCatId)).OrderBy(l => l.Id).ToArrayAsync());
+ }
+ catch (Exception exp)
+ {
+ return new RServiceResult(null, exp.ToString());
+ }
+ }
+
+ ///
+ /// Database Context
+ ///
+ protected readonly RMuseumDbContext _context;
+
+ ///
+ /// constructor
+ ///
+ ///
+ public GanjoorNumberingService(RMuseumDbContext context)
+ {
+ _context = context;
+ }
+ }
+}