Implement Inventory Management Service with CRUD operations for warehouses and inventory items, stock operations, and bulk processing capabilities.
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 1m48s
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 1m48s
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>0.0.164</Version>
|
||||
<Version>0.0.165</Version>
|
||||
<DebugType>None</DebugType>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<GeneratePackageOnBuild>False</GeneratePackageOnBuild>
|
||||
@@ -59,6 +59,8 @@
|
||||
<Protobuf Include="Protos\city.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
||||
<!-- App Version Tracking System -->
|
||||
<Protobuf Include="Protos\appversion.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
||||
<!-- Inventory Management System -->
|
||||
<Protobuf Include="Protos\inventory.proto" ProtoRoot="Protos\" GrpcServices="Both" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="PushToFoursatNuget" AfterTargets="Pack">
|
||||
|
||||
@@ -0,0 +1,529 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package inventory;
|
||||
|
||||
import "google/protobuf/empty.proto";
|
||||
import "google/protobuf/wrappers.proto";
|
||||
import "google/protobuf/timestamp.proto";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
option csharp_namespace = "CMSMicroservice.Protobuf.Protos.Inventory";
|
||||
|
||||
// =============================================
|
||||
// 📦 Inventory Management Service
|
||||
// =============================================
|
||||
|
||||
service InventoryContract {
|
||||
// ========== Warehouse Management ==========
|
||||
rpc CreateWarehouse(CreateWarehouseRequest) returns (CreateWarehouseResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/warehouses"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc UpdateWarehouse(UpdateWarehouseRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
put: "/api/inventory/warehouses/{id}"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc DeleteWarehouse(DeleteWarehouseRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
delete: "/api/inventory/warehouses/{id}"
|
||||
};
|
||||
};
|
||||
rpc GetWarehouse(GetWarehouseRequest) returns (GetWarehouseResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/warehouses/{id}"
|
||||
};
|
||||
};
|
||||
rpc GetAllWarehouses(GetAllWarehousesRequest) returns (GetAllWarehousesResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/warehouses"
|
||||
};
|
||||
};
|
||||
rpc SetDefaultWarehouse(SetDefaultWarehouseRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/warehouses/{id}/set-default"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
|
||||
// ========== Inventory Item Management ==========
|
||||
rpc GetInventoryItem(GetInventoryItemRequest) returns (GetInventoryItemResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/items/{id}"
|
||||
};
|
||||
};
|
||||
rpc GetInventoryByProduct(GetInventoryByProductRequest) returns (GetInventoryByProductResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/by-product/{product_id}"
|
||||
};
|
||||
};
|
||||
rpc GetAllInventoryItems(GetAllInventoryItemsRequest) returns (GetAllInventoryItemsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/items"
|
||||
};
|
||||
};
|
||||
rpc GetLowStockItems(GetLowStockItemsRequest) returns (GetLowStockItemsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/low-stock"
|
||||
};
|
||||
};
|
||||
rpc UpdateInventorySettings(UpdateInventorySettingsRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
put: "/api/inventory/items/{id}/settings"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
|
||||
// ========== Stock Operations ==========
|
||||
rpc AddStock(AddStockRequest) returns (AddStockResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/add"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc AdjustStock(AdjustStockRequest) returns (AdjustStockResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/adjust"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc ReserveStock(ReserveStockRequest) returns (ReserveStockResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/reserve"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc ReleaseReservation(ReleaseReservationRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/release"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc ConfirmSale(ConfirmSaleRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/confirm-sale"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc ProcessReturn(ProcessReturnRequest) returns (ProcessReturnResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/return"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc RecordLoss(RecordLossRequest) returns (google.protobuf.Empty) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/loss"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
|
||||
// ========== Bulk Operations ==========
|
||||
rpc BulkAddStock(BulkAddStockRequest) returns (BulkAddStockResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/bulk-add"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
rpc BulkAdjustStock(BulkAdjustStockRequest) returns (BulkAdjustStockResponse) {
|
||||
option (google.api.http) = {
|
||||
post: "/api/inventory/stock/bulk-adjust"
|
||||
body: "*"
|
||||
};
|
||||
};
|
||||
|
||||
// ========== Stock Movements ==========
|
||||
rpc GetStockMovements(GetStockMovementsRequest) returns (GetStockMovementsResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/movements"
|
||||
};
|
||||
};
|
||||
rpc GetStockMovementsByInventoryItem(GetStockMovementsByInventoryItemRequest) returns (GetStockMovementsByInventoryItemResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/items/{inventory_item_id}/movements"
|
||||
};
|
||||
};
|
||||
|
||||
// ========== Reports ==========
|
||||
rpc GetInventorySummary(GetInventorySummaryRequest) returns (GetInventorySummaryResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/summary"
|
||||
};
|
||||
};
|
||||
rpc GetStockValueReport(GetStockValueReportRequest) returns (GetStockValueReportResponse) {
|
||||
option (google.api.http) = {
|
||||
get: "/api/inventory/reports/stock-value"
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Enums
|
||||
// =============================================
|
||||
|
||||
enum ProductType {
|
||||
PRODUCT_TYPE_UNSPECIFIED = 0;
|
||||
REGULAR_PRODUCT = 1;
|
||||
DISCOUNT_PRODUCT = 2;
|
||||
}
|
||||
|
||||
enum StockMovementType {
|
||||
MOVEMENT_TYPE_UNSPECIFIED = 0;
|
||||
INITIAL_STOCK = 1;
|
||||
RESTOCK = 2;
|
||||
RETURN = 3;
|
||||
SALE = 10;
|
||||
ADJUSTMENT_INCREASE = 20;
|
||||
ADJUSTMENT_DECREASE = 21;
|
||||
RESERVED = 30;
|
||||
RELEASED = 31;
|
||||
LOSS = 40;
|
||||
DAMAGED = 41;
|
||||
EXPIRED = 42;
|
||||
TRANSFER_OUT = 50;
|
||||
TRANSFER_IN = 51;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Warehouse Messages
|
||||
// =============================================
|
||||
|
||||
message WarehouseDto {
|
||||
int64 id = 1;
|
||||
string name = 2;
|
||||
string code = 3;
|
||||
string address = 4;
|
||||
bool is_default = 5;
|
||||
bool is_active = 6;
|
||||
google.protobuf.Timestamp created = 7;
|
||||
google.protobuf.Timestamp last_modified = 8;
|
||||
}
|
||||
|
||||
message CreateWarehouseRequest {
|
||||
string name = 1;
|
||||
string code = 2;
|
||||
string address = 3;
|
||||
bool is_default = 4;
|
||||
}
|
||||
|
||||
message CreateWarehouseResponse {
|
||||
int64 id = 1;
|
||||
}
|
||||
|
||||
message UpdateWarehouseRequest {
|
||||
int64 id = 1;
|
||||
string name = 2;
|
||||
string code = 3;
|
||||
string address = 4;
|
||||
bool is_active = 5;
|
||||
}
|
||||
|
||||
message DeleteWarehouseRequest {
|
||||
int64 id = 1;
|
||||
}
|
||||
|
||||
message GetWarehouseRequest {
|
||||
int64 id = 1;
|
||||
}
|
||||
|
||||
message GetWarehouseResponse {
|
||||
WarehouseDto warehouse = 1;
|
||||
}
|
||||
|
||||
message GetAllWarehousesRequest {
|
||||
google.protobuf.BoolValue is_active = 1;
|
||||
int32 page = 2;
|
||||
int32 page_size = 3;
|
||||
}
|
||||
|
||||
message GetAllWarehousesResponse {
|
||||
repeated WarehouseDto warehouses = 1;
|
||||
int32 total_count = 2;
|
||||
}
|
||||
|
||||
message SetDefaultWarehouseRequest {
|
||||
int64 id = 1;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Inventory Item Messages
|
||||
// =============================================
|
||||
|
||||
message InventoryItemDto {
|
||||
int64 id = 1;
|
||||
google.protobuf.Int64Value product_id = 2;
|
||||
google.protobuf.Int64Value discount_product_id = 3;
|
||||
ProductType product_type = 4;
|
||||
int32 quantity = 5;
|
||||
int32 reserved_quantity = 6;
|
||||
int32 available_quantity = 7;
|
||||
int32 low_stock_threshold = 8;
|
||||
int32 reorder_point = 9;
|
||||
int32 max_stock_level = 10;
|
||||
google.protobuf.Timestamp last_restocked_at = 11;
|
||||
google.protobuf.Timestamp last_sold_at = 12;
|
||||
int64 warehouse_id = 13;
|
||||
string warehouse_name = 14;
|
||||
string product_title = 15;
|
||||
int64 product_price = 16;
|
||||
google.protobuf.Timestamp created = 17;
|
||||
}
|
||||
|
||||
message GetInventoryItemRequest {
|
||||
int64 id = 1;
|
||||
}
|
||||
|
||||
message GetInventoryItemResponse {
|
||||
InventoryItemDto item = 1;
|
||||
}
|
||||
|
||||
message GetInventoryByProductRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
}
|
||||
|
||||
message GetInventoryByProductResponse {
|
||||
InventoryItemDto item = 1;
|
||||
}
|
||||
|
||||
message GetAllInventoryItemsRequest {
|
||||
google.protobuf.Int64Value warehouse_id = 1;
|
||||
ProductType product_type = 2;
|
||||
string search = 3;
|
||||
int32 page = 4;
|
||||
int32 page_size = 5;
|
||||
string sort_by = 6;
|
||||
bool sort_desc = 7;
|
||||
}
|
||||
|
||||
message GetAllInventoryItemsResponse {
|
||||
repeated InventoryItemDto items = 1;
|
||||
int32 total_count = 2;
|
||||
}
|
||||
|
||||
message GetLowStockItemsRequest {
|
||||
google.protobuf.Int64Value warehouse_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 page = 3;
|
||||
int32 page_size = 4;
|
||||
}
|
||||
|
||||
message GetLowStockItemsResponse {
|
||||
repeated InventoryItemDto items = 1;
|
||||
int32 total_count = 2;
|
||||
}
|
||||
|
||||
message UpdateInventorySettingsRequest {
|
||||
int64 id = 1;
|
||||
int32 low_stock_threshold = 2;
|
||||
int32 reorder_point = 3;
|
||||
int32 max_stock_level = 4;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Stock Operation Messages
|
||||
// =============================================
|
||||
|
||||
message AddStockRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
string reference_number = 4;
|
||||
string note = 5;
|
||||
google.protobuf.Int64Value warehouse_id = 6;
|
||||
}
|
||||
|
||||
message AddStockResponse {
|
||||
int64 inventory_item_id = 1;
|
||||
int32 new_quantity = 2;
|
||||
}
|
||||
|
||||
message AdjustStockRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 new_quantity = 3;
|
||||
string reason = 4;
|
||||
string reference_number = 5;
|
||||
}
|
||||
|
||||
message AdjustStockResponse {
|
||||
int32 previous_quantity = 1;
|
||||
int32 new_quantity = 2;
|
||||
int32 difference = 3;
|
||||
}
|
||||
|
||||
message ReserveStockRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
google.protobuf.Int64Value order_id = 4;
|
||||
google.protobuf.Int64Value discount_order_id = 5;
|
||||
}
|
||||
|
||||
message ReserveStockResponse {
|
||||
bool success = 1;
|
||||
string message = 2;
|
||||
int32 available_quantity = 3;
|
||||
}
|
||||
|
||||
message ReleaseReservationRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
google.protobuf.Int64Value order_id = 4;
|
||||
google.protobuf.Int64Value discount_order_id = 5;
|
||||
}
|
||||
|
||||
message ConfirmSaleRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
google.protobuf.Int64Value order_id = 4;
|
||||
google.protobuf.Int64Value discount_order_id = 5;
|
||||
bool from_reservation = 6;
|
||||
}
|
||||
|
||||
message ProcessReturnRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
google.protobuf.Int64Value order_id = 4;
|
||||
google.protobuf.Int64Value discount_order_id = 5;
|
||||
string reason = 6;
|
||||
}
|
||||
|
||||
message ProcessReturnResponse {
|
||||
int32 new_quantity = 1;
|
||||
}
|
||||
|
||||
message RecordLossRequest {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
StockMovementType loss_type = 4; // LOSS, DAMAGED, or EXPIRED
|
||||
string reason = 5;
|
||||
string reference_number = 6;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Bulk Operation Messages
|
||||
// =============================================
|
||||
|
||||
message BulkStockItem {
|
||||
int64 product_id = 1;
|
||||
ProductType product_type = 2;
|
||||
int32 quantity = 3;
|
||||
}
|
||||
|
||||
message BulkAddStockRequest {
|
||||
repeated BulkStockItem items = 1;
|
||||
string reference_number = 2;
|
||||
string note = 3;
|
||||
google.protobuf.Int64Value warehouse_id = 4;
|
||||
}
|
||||
|
||||
message BulkAddStockResponse {
|
||||
int32 success_count = 1;
|
||||
int32 failed_count = 2;
|
||||
repeated string errors = 3;
|
||||
}
|
||||
|
||||
message BulkAdjustStockRequest {
|
||||
repeated BulkStockItem items = 1;
|
||||
string reason = 2;
|
||||
string reference_number = 3;
|
||||
}
|
||||
|
||||
message BulkAdjustStockResponse {
|
||||
int32 success_count = 1;
|
||||
int32 failed_count = 2;
|
||||
repeated string errors = 3;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Stock Movement Messages
|
||||
// =============================================
|
||||
|
||||
message StockMovementDto {
|
||||
int64 id = 1;
|
||||
int64 inventory_item_id = 2;
|
||||
StockMovementType movement_type = 3;
|
||||
int32 quantity = 4;
|
||||
int32 quantity_before = 5;
|
||||
int32 quantity_after = 6;
|
||||
google.protobuf.Int64Value order_id = 7;
|
||||
google.protobuf.Int64Value discount_order_id = 8;
|
||||
string reference_number = 9;
|
||||
string note = 10;
|
||||
google.protobuf.Int64Value performed_by_user_id = 11;
|
||||
google.protobuf.Timestamp created = 12;
|
||||
string product_title = 13;
|
||||
}
|
||||
|
||||
message GetStockMovementsRequest {
|
||||
google.protobuf.Int64Value inventory_item_id = 1;
|
||||
google.protobuf.Int64Value product_id = 2;
|
||||
ProductType product_type = 3;
|
||||
StockMovementType movement_type = 4;
|
||||
google.protobuf.Timestamp from_date = 5;
|
||||
google.protobuf.Timestamp to_date = 6;
|
||||
int32 page = 7;
|
||||
int32 page_size = 8;
|
||||
}
|
||||
|
||||
message GetStockMovementsResponse {
|
||||
repeated StockMovementDto movements = 1;
|
||||
int32 total_count = 2;
|
||||
}
|
||||
|
||||
message GetStockMovementsByInventoryItemRequest {
|
||||
int64 inventory_item_id = 1;
|
||||
int32 page = 2;
|
||||
int32 page_size = 3;
|
||||
}
|
||||
|
||||
message GetStockMovementsByInventoryItemResponse {
|
||||
repeated StockMovementDto movements = 1;
|
||||
int32 total_count = 2;
|
||||
}
|
||||
|
||||
// =============================================
|
||||
// Report Messages
|
||||
// =============================================
|
||||
|
||||
message GetInventorySummaryRequest {
|
||||
google.protobuf.Int64Value warehouse_id = 1;
|
||||
}
|
||||
|
||||
message GetInventorySummaryResponse {
|
||||
int32 total_products = 1;
|
||||
int32 total_discount_products = 2;
|
||||
int32 total_quantity = 3;
|
||||
int32 total_reserved = 4;
|
||||
int32 low_stock_count = 5;
|
||||
int32 out_of_stock_count = 6;
|
||||
int64 total_stock_value = 7;
|
||||
}
|
||||
|
||||
message GetStockValueReportRequest {
|
||||
google.protobuf.Int64Value warehouse_id = 1;
|
||||
ProductType product_type = 2;
|
||||
}
|
||||
|
||||
message StockValueItem {
|
||||
int64 product_id = 1;
|
||||
string product_title = 2;
|
||||
ProductType product_type = 3;
|
||||
int32 quantity = 4;
|
||||
int64 unit_price = 5;
|
||||
int64 total_value = 6;
|
||||
}
|
||||
|
||||
message GetStockValueReportResponse {
|
||||
repeated StockValueItem items = 1;
|
||||
int64 total_value = 2;
|
||||
int32 total_items = 3;
|
||||
}
|
||||
@@ -76,6 +76,7 @@ message CreateManualPaymentRequest
|
||||
ManualPaymentType type = 3;
|
||||
string description = 4;
|
||||
google.protobuf.StringValue reference_number = 5;
|
||||
google.protobuf.StringValue image_path = 6;
|
||||
}
|
||||
|
||||
message CreateManualPaymentResponse
|
||||
@@ -133,6 +134,7 @@ message ManualPaymentModel
|
||||
google.protobuf.StringValue rejection_reason = 17;
|
||||
google.protobuf.Int64Value transaction_id = 18;
|
||||
google.protobuf.Timestamp created = 19;
|
||||
google.protobuf.StringValue image_path = 20;
|
||||
}
|
||||
|
||||
message ProcessManualMembershipPaymentRequest
|
||||
|
||||
Reference in New Issue
Block a user