Skip to content

Commit 1500006

Browse files
authored
Merge pull request #26 from design-sparx/feat/5-invoices
feat/5-invoices
2 parents 991fcb1 + de4103a commit 1500006

25 files changed

+1824
-2
lines changed

Constants/Permissions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public static class Orders
5151
public const string Edit = "Permissions.Orders.Edit";
5252
public const string Delete = "Permissions.Orders.Delete";
5353
}
54+
55+
public static class Invoices
56+
{
57+
public const string View = "Permissions.Invoices.View";
58+
public const string Create = "Permissions.Invoices.Create";
59+
public const string Edit = "Permissions.Invoices.Edit";
60+
public const string Delete = "Permissions.Invoices.Delete";
61+
}
5462

5563
// Helper method to get all permissions
5664
public static IEnumerable<string> GetAllPermissions()

Controllers/InvoiceController.cs

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using AdminHubApi.Constants;
2+
using AdminHubApi.Dtos.Invoice;
3+
using AdminHubApi.Entities.Invoice;
4+
using AdminHubApi.Security;
5+
using AdminHubApi.Services;
6+
using Microsoft.AspNetCore.Mvc;
7+
8+
namespace AdminHubApi.Controllers;
9+
10+
[ApiController]
11+
[Route("/api/invoices")]
12+
[PermissionAuthorize(Permissions.Products.View)]
13+
public class InvoicesController : ControllerBase
14+
{
15+
private readonly InvoiceService _invoiceService;
16+
private readonly ILogger<InvoicesController> _logger;
17+
18+
public InvoicesController(InvoiceService invoiceService, ILogger<InvoicesController> logger)
19+
{
20+
_invoiceService = invoiceService;
21+
_logger = logger;
22+
}
23+
24+
[HttpGet]
25+
public async Task<ActionResult> GetAllInvoices()
26+
{
27+
var invoices = await _invoiceService.GetAllAsync();
28+
29+
return Ok(invoices);
30+
}
31+
32+
[HttpGet("{id}")]
33+
public async Task<ActionResult> GetInvoiceById(Guid id)
34+
{
35+
var invoice = await _invoiceService.GetByIdAsync(id);
36+
37+
return Ok(invoice);
38+
}
39+
40+
[HttpGet("user/{userId}")]
41+
public async Task<ActionResult> GetInvoicesByUserId(string userId)
42+
{
43+
var invoices = await _invoiceService.GetByUserIdAsync(userId);
44+
45+
return Ok(invoices);
46+
}
47+
48+
[HttpGet("order/{orderId}")]
49+
public async Task<ActionResult> GetInvoicesByOrderId(string orderId)
50+
{
51+
var invoices = await _invoiceService.GetByOrderIdAsync(orderId);
52+
53+
return Ok(invoices);
54+
}
55+
56+
[HttpPost]
57+
[PermissionAuthorize(Permissions.Products.Create)]
58+
public async Task<ActionResult> CreateInvoice(CreateInvoiceDto createInvoiceDto)
59+
{
60+
var invoice = new Invoice
61+
{
62+
Id = Guid.NewGuid(),
63+
InvoiceNumber = createInvoiceDto.InvoiceNumber,
64+
IssueDate = createInvoiceDto.IssueDate,
65+
DueDate = createInvoiceDto.DueDate,
66+
Notes = createInvoiceDto.Notes,
67+
OrderId = createInvoiceDto.OrderId,
68+
UserId = createInvoiceDto.UserId,
69+
Status = createInvoiceDto.Status,
70+
PaidAmount = createInvoiceDto.PaidAmount,
71+
Created = DateTime.UtcNow,
72+
Modified = DateTime.UtcNow,
73+
CreatedById = createInvoiceDto.CreatedById,
74+
ModifiedById = createInvoiceDto.CreatedById
75+
};
76+
77+
var result = await _invoiceService.CreateAsync(invoice);
78+
79+
if (!result.Succeeded)
80+
{
81+
return BadRequest(result);
82+
}
83+
84+
return CreatedAtAction(nameof(GetInvoiceById), new { id = invoice.Id }, result);
85+
}
86+
87+
[HttpPut("{id}")]
88+
[PermissionAuthorize(Permissions.Products.Edit)]
89+
public async Task<IActionResult> UpdateInvoice(Guid id, UpdateInvoiceDto updateInvoiceDto)
90+
{
91+
var invoiceResponse = await _invoiceService.GetByIdAsync(id);
92+
93+
if (!invoiceResponse.Succeeded)
94+
{
95+
return NotFound(invoiceResponse);
96+
}
97+
98+
var existingInvoice = invoiceResponse.Data;
99+
existingInvoice.InvoiceNumber = updateInvoiceDto.InvoiceNumber;
100+
existingInvoice.IssueDate = updateInvoiceDto.IssueDate;
101+
existingInvoice.DueDate = updateInvoiceDto.DueDate;
102+
existingInvoice.PaidAmount = updateInvoiceDto.PaidAmount;
103+
existingInvoice.Notes = updateInvoiceDto.Notes;
104+
existingInvoice.Status = updateInvoiceDto.Status;
105+
existingInvoice.ModifiedById = updateInvoiceDto.ModifiedById;
106+
existingInvoice.Modified = DateTime.UtcNow;
107+
108+
var result = await _invoiceService.UpdateAsync(existingInvoice);
109+
110+
if (!result.Succeeded)
111+
{
112+
return BadRequest(result);
113+
}
114+
115+
return Ok(result);
116+
}
117+
118+
[HttpDelete("{id}")]
119+
[PermissionAuthorize(Permissions.Products.Delete)]
120+
public async Task<IActionResult> DeleteInvoice(Guid id)
121+
{
122+
var invoiceResponse = await _invoiceService.GetByIdAsync(id);
123+
124+
if (!invoiceResponse.Succeeded)
125+
{
126+
return NotFound(invoiceResponse);
127+
}
128+
129+
var result = await _invoiceService.DeleteAsync(id);
130+
131+
if (!result.Succeeded)
132+
{
133+
return BadRequest(result);
134+
}
135+
136+
return Ok(result);
137+
}
138+
}

Data/ApplicationDbContext.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using AdminHubApi.Entities;
2+
using AdminHubApi.Entities.Invoice;
23
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
34
using Microsoft.EntityFrameworkCore;
45

@@ -15,6 +16,8 @@ public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : ba
1516
public DbSet<ProductCategory> ProductCategories { get; set; }
1617
public DbSet<Order> Orders { get; set; }
1718
public DbSet<OrderItem> OrderItems { get; set; }
19+
public DbSet<Invoice> Invoices { get; set; }
20+
public DbSet<InvoiceItem> InvoiceItems { get; set; }
1821

1922
protected override void OnModelCreating(ModelBuilder builder)
2023
{

Data/Seeders/AdminUserSeeder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ public static async Task SeedAdminUserAsync(IServiceProvider serviceProvider)
7575
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
7676
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
7777
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Delete),
78+
79+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
80+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
81+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
82+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Delete),
7883
};
7984

8085
await userManager.AddClaimsAsync(adminUser, adminPermissions);

Data/Seeders/ManagerUserSeeder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public static async Task SeedManagerUserAsync(IServiceProvider serviceProvider)
6868
new Claim(CustomClaimTypes.Permission, Permissions.Orders.View),
6969
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
7070
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
71+
72+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
73+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
74+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
7175
};
7276

7377
await userManager.AddClaimsAsync(managerUser, userPermissions);

Data/Seeders/NormalUserSeeder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ public static async Task SeedNormalUserAsync(IServiceProvider serviceProvider)
6464
new Claim(CustomClaimTypes.Permission, Permissions.Orders.View),
6565
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
6666
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
67+
68+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
69+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
70+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
6771
};
6872

6973
await userManager.AddClaimsAsync(demoUser, userPermissions);

Data/Seeders/PermissionUpdateSeeder.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public static async Task UpdateRolePermissionsAsync(IServiceProvider serviceProv
4848
Permissions.Orders.Create,
4949
Permissions.Orders.Edit,
5050
Permissions.Orders.Delete,
51+
52+
Permissions.Invoices.View,
53+
Permissions.Invoices.Create,
54+
Permissions.Invoices.Edit,
55+
Permissions.Invoices.Delete,
5156
]
5257
},
5358
{
@@ -74,6 +79,10 @@ public static async Task UpdateRolePermissionsAsync(IServiceProvider serviceProv
7479
Permissions.Orders.View,
7580
Permissions.Orders.Create,
7681
Permissions.Orders.Edit,
82+
83+
Permissions.Invoices.View,
84+
Permissions.Invoices.Create,
85+
Permissions.Invoices.Edit,
7786
]
7887
},
7988
{
@@ -96,6 +105,10 @@ public static async Task UpdateRolePermissionsAsync(IServiceProvider serviceProv
96105
Permissions.Orders.View,
97106
Permissions.Orders.Create,
98107
Permissions.Orders.Edit,
108+
109+
Permissions.Invoices.View,
110+
Permissions.Invoices.Create,
111+
Permissions.Invoices.Edit,
99112
]
100113
}
101114
};

Data/Seeders/RoleSeeder.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public static class RoleSeeder
5353
Permissions.Orders.Create,
5454
Permissions.Orders.Edit,
5555
Permissions.Orders.Delete,
56+
57+
Permissions.Invoices.View,
58+
Permissions.Invoices.Create,
59+
Permissions.Invoices.Edit,
60+
Permissions.Invoices.Delete,
5661
]
5762
},
5863
{
@@ -79,6 +84,10 @@ public static class RoleSeeder
7984
Permissions.Orders.View,
8085
Permissions.Orders.Create,
8186
Permissions.Orders.Edit,
87+
88+
Permissions.Invoices.View,
89+
Permissions.Invoices.Create,
90+
Permissions.Invoices.Edit,
8291
]
8392
},
8493
{
@@ -101,6 +110,10 @@ public static class RoleSeeder
101110
Permissions.Orders.View,
102111
Permissions.Orders.Create,
103112
Permissions.Orders.Edit,
113+
114+
Permissions.Invoices.View,
115+
Permissions.Invoices.Create,
116+
Permissions.Invoices.Edit,
104117
]
105118
}
106119
};

Data/Seeders/UserPermissionUpdateSeeder.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ public static async Task UpdateUserPermissionsAsync(IServiceProvider serviceProv
5151
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
5252
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
5353
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Delete),
54+
55+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
56+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
57+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
58+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Delete),
5459
};
5560

5661
await UpdateUserClaimsAsync(userManager, adminUser, adminPermissions, logger);
@@ -85,6 +90,10 @@ public static async Task UpdateUserPermissionsAsync(IServiceProvider serviceProv
8590
new Claim(CustomClaimTypes.Permission, Permissions.Orders.View),
8691
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
8792
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
93+
94+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
95+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
96+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
8897
};
8998

9099
await UpdateUserClaimsAsync(userManager, managerUser, managerPermissions, logger);
@@ -117,6 +126,10 @@ public static async Task UpdateUserPermissionsAsync(IServiceProvider serviceProv
117126
new Claim(CustomClaimTypes.Permission, Permissions.Orders.View),
118127
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Create),
119128
new Claim(CustomClaimTypes.Permission, Permissions.Orders.Edit),
129+
130+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.View),
131+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Create),
132+
new Claim(CustomClaimTypes.Permission, Permissions.Invoices.Edit),
120133
};
121134

122135
await UpdateUserClaimsAsync(userManager, normalUser, normalUserPermissions, logger);

Dtos/Invoice/CreateInvoiceDto.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using AdminHubApi.Dtos.InvoiceItem;
2+
using AdminHubApi.Entities.Invoice;
3+
4+
namespace AdminHubApi.Dtos.Invoice;
5+
6+
public class CreateInvoiceDto
7+
{
8+
public string InvoiceNumber { get; set; }
9+
public DateTime IssueDate { get; set; }
10+
public DateTime DueDate { get; set; }
11+
public string Notes { get; set; }
12+
public Guid OrderId { get; set; } = Guid.Empty;
13+
public string UserId { get; set; }
14+
public decimal PaidAmount { get; set; }
15+
public InvoiceStatus Status { get; set; }
16+
public string CreatedById { get; set; }
17+
public List<CreateInvoiceItemDto> Items { get; set; } = new List<CreateInvoiceItemDto>();
18+
}

0 commit comments

Comments
 (0)