@prodoctors/contracts 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/gen/analytics.ts CHANGED
@@ -79,6 +79,136 @@ export interface TopProductsResponse {
79
79
  items: TopProduct[];
80
80
  }
81
81
 
82
+ export interface AnalyticsRangeRequest {
83
+ /** today | 7days | 30days | 12months */
84
+ range?: string | undefined;
85
+ }
86
+
87
+ export interface AnalyticsSummary {
88
+ revenue: number;
89
+ orders: number;
90
+ avgCheck: number;
91
+ /** sotuvi bo'lgan filiallar soni */
92
+ pharmacies: number;
93
+ revenueGrowth: number;
94
+ ordersGrowth: number;
95
+ }
96
+
97
+ export interface AnalyticsSeriesPoint {
98
+ /** YYYY-MM-DD yoki YYYY-MM */
99
+ period: string;
100
+ revenue: number;
101
+ orders: number;
102
+ }
103
+
104
+ export interface CityBreakdownItem {
105
+ id: string;
106
+ city: string;
107
+ orders: number;
108
+ revenue: number;
109
+ }
110
+
111
+ export interface ProductBreakdownItem {
112
+ id: string;
113
+ name: string;
114
+ category: string;
115
+ /** sotilgan birlik soni */
116
+ orders: number;
117
+ revenue: number;
118
+ stock: number;
119
+ }
120
+
121
+ export interface PharmacyBreakdownItem {
122
+ id: string;
123
+ name: string;
124
+ city: string;
125
+ orders: number;
126
+ revenue: number;
127
+ /** % oldingi davrga nisbatan */
128
+ growth: number;
129
+ }
130
+
131
+ export interface AnalyticsOverviewResponse {
132
+ summary: AnalyticsSummary | undefined;
133
+ series: AnalyticsSeriesPoint[];
134
+ cities: CityBreakdownItem[];
135
+ topProducts: ProductBreakdownItem[];
136
+ topPharmacies: PharmacyBreakdownItem[];
137
+ }
138
+
139
+ export interface SalesAnalyticsResponse {
140
+ summary: AnalyticsSummary | undefined;
141
+ series: AnalyticsSeriesPoint[];
142
+ }
143
+
144
+ export interface ProductsAnalyticsSummary {
145
+ productsSold: number;
146
+ revenue: number;
147
+ lowStock: number;
148
+ categories: number;
149
+ }
150
+
151
+ export interface ProductsAnalyticsResponse {
152
+ summary: ProductsAnalyticsSummary | undefined;
153
+ products: ProductBreakdownItem[];
154
+ }
155
+
156
+ export interface PharmaciesAnalyticsResponse {
157
+ summary: AnalyticsSummary | undefined;
158
+ cities: CityBreakdownItem[];
159
+ pharmacies: PharmacyBreakdownItem[];
160
+ }
161
+
162
+ export interface SalesReportResponse {
163
+ summary: AnalyticsSummary | undefined;
164
+ series: AnalyticsSeriesPoint[];
165
+ topPharmacies: PharmacyBreakdownItem[];
166
+ }
167
+
168
+ export interface OrderStatusCount {
169
+ /** SaleStatus */
170
+ status: string;
171
+ count: number;
172
+ }
173
+
174
+ export interface OrdersReportResponse {
175
+ total: number;
176
+ /** DRAFT */
177
+ processing: number;
178
+ /** COMPLETED */
179
+ completed: number;
180
+ /** CANCELLED + REFUNDED */
181
+ cancelled: number;
182
+ statuses: OrderStatusCount[];
183
+ recent: RecentOrder[];
184
+ }
185
+
186
+ export interface InventoryCategoryCount {
187
+ id: string;
188
+ name: string;
189
+ count: number;
190
+ }
191
+
192
+ export interface InventoryRiskItem {
193
+ id: string;
194
+ nameRu: string;
195
+ nameUz: string;
196
+ /** LOW_STOCK | EXPIRING */
197
+ risk: string;
198
+ }
199
+
200
+ export interface InventoryReportResponse {
201
+ totalItems: number;
202
+ lowStock: number;
203
+ expiring: number;
204
+ branches: number;
205
+ categories: InventoryCategoryCount[];
206
+ risks: InventoryRiskItem[];
207
+ }
208
+
209
+ export interface EmptyRequest {
210
+ }
211
+
82
212
  export const ANALYTICS_V1_PACKAGE_NAME = "analytics.v1";
83
213
 
84
214
  export interface AnalyticsServiceClient {
@@ -89,6 +219,20 @@ export interface AnalyticsServiceClient {
89
219
  getRecentOrders(request: RecentOrdersRequest): Observable<RecentOrdersResponse>;
90
220
 
91
221
  getTopProducts(request: TopProductsRequest): Observable<TopProductsResponse>;
222
+
223
+ getAnalyticsOverview(request: AnalyticsRangeRequest): Observable<AnalyticsOverviewResponse>;
224
+
225
+ getSalesAnalytics(request: AnalyticsRangeRequest): Observable<SalesAnalyticsResponse>;
226
+
227
+ getProductsAnalytics(request: AnalyticsRangeRequest): Observable<ProductsAnalyticsResponse>;
228
+
229
+ getPharmaciesAnalytics(request: AnalyticsRangeRequest): Observable<PharmaciesAnalyticsResponse>;
230
+
231
+ getSalesReport(request: AnalyticsRangeRequest): Observable<SalesReportResponse>;
232
+
233
+ getOrdersReport(request: AnalyticsRangeRequest): Observable<OrdersReportResponse>;
234
+
235
+ getInventoryReport(request: EmptyRequest): Observable<InventoryReportResponse>;
92
236
  }
93
237
 
94
238
  export interface AnalyticsServiceController {
@@ -107,11 +251,51 @@ export interface AnalyticsServiceController {
107
251
  getTopProducts(
108
252
  request: TopProductsRequest,
109
253
  ): Promise<TopProductsResponse> | Observable<TopProductsResponse> | TopProductsResponse;
254
+
255
+ getAnalyticsOverview(
256
+ request: AnalyticsRangeRequest,
257
+ ): Promise<AnalyticsOverviewResponse> | Observable<AnalyticsOverviewResponse> | AnalyticsOverviewResponse;
258
+
259
+ getSalesAnalytics(
260
+ request: AnalyticsRangeRequest,
261
+ ): Promise<SalesAnalyticsResponse> | Observable<SalesAnalyticsResponse> | SalesAnalyticsResponse;
262
+
263
+ getProductsAnalytics(
264
+ request: AnalyticsRangeRequest,
265
+ ): Promise<ProductsAnalyticsResponse> | Observable<ProductsAnalyticsResponse> | ProductsAnalyticsResponse;
266
+
267
+ getPharmaciesAnalytics(
268
+ request: AnalyticsRangeRequest,
269
+ ): Promise<PharmaciesAnalyticsResponse> | Observable<PharmaciesAnalyticsResponse> | PharmaciesAnalyticsResponse;
270
+
271
+ getSalesReport(
272
+ request: AnalyticsRangeRequest,
273
+ ): Promise<SalesReportResponse> | Observable<SalesReportResponse> | SalesReportResponse;
274
+
275
+ getOrdersReport(
276
+ request: AnalyticsRangeRequest,
277
+ ): Promise<OrdersReportResponse> | Observable<OrdersReportResponse> | OrdersReportResponse;
278
+
279
+ getInventoryReport(
280
+ request: EmptyRequest,
281
+ ): Promise<InventoryReportResponse> | Observable<InventoryReportResponse> | InventoryReportResponse;
110
282
  }
111
283
 
112
284
  export function AnalyticsServiceControllerMethods() {
113
285
  return function (constructor: Function) {
114
- const grpcMethods: string[] = ["getDashboardStats", "getSalesTrend", "getRecentOrders", "getTopProducts"];
286
+ const grpcMethods: string[] = [
287
+ "getDashboardStats",
288
+ "getSalesTrend",
289
+ "getRecentOrders",
290
+ "getTopProducts",
291
+ "getAnalyticsOverview",
292
+ "getSalesAnalytics",
293
+ "getProductsAnalytics",
294
+ "getPharmaciesAnalytics",
295
+ "getSalesReport",
296
+ "getOrdersReport",
297
+ "getInventoryReport",
298
+ ];
115
299
  for (const method of grpcMethods) {
116
300
  const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
117
301
  GrpcMethod("AnalyticsService", method)(constructor.prototype[method], method, descriptor);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prodoctors/contracts",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Protobuf definitions and generated Typescript types for ProDoctors",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -69,9 +69,139 @@ message TopProductsResponse {
69
69
  repeated TopProduct items = 1;
70
70
  }
71
71
 
72
+ // ---------------- Analytics sahifalari ----------------
73
+
74
+ message AnalyticsRangeRequest {
75
+ optional string range = 1; // today | 7days | 30days | 12months
76
+ }
77
+
78
+ message AnalyticsSummary {
79
+ double revenue = 1;
80
+ int32 orders = 2;
81
+ double avg_check = 3;
82
+ int32 pharmacies = 4; // sotuvi bo'lgan filiallar soni
83
+ double revenue_growth = 5;
84
+ double orders_growth = 6;
85
+ }
86
+
87
+ message AnalyticsSeriesPoint {
88
+ string period = 1; // YYYY-MM-DD yoki YYYY-MM
89
+ double revenue = 2;
90
+ int32 orders = 3;
91
+ }
92
+
93
+ message CityBreakdownItem {
94
+ string id = 1;
95
+ string city = 2;
96
+ int32 orders = 3;
97
+ double revenue = 4;
98
+ }
99
+
100
+ message ProductBreakdownItem {
101
+ string id = 1;
102
+ string name = 2;
103
+ string category = 3;
104
+ int32 orders = 4; // sotilgan birlik soni
105
+ double revenue = 5;
106
+ int32 stock = 6;
107
+ }
108
+
109
+ message PharmacyBreakdownItem {
110
+ string id = 1;
111
+ string name = 2;
112
+ string city = 3;
113
+ int32 orders = 4;
114
+ double revenue = 5;
115
+ double growth = 6; // % oldingi davrga nisbatan
116
+ }
117
+
118
+ message AnalyticsOverviewResponse {
119
+ AnalyticsSummary summary = 1;
120
+ repeated AnalyticsSeriesPoint series = 2;
121
+ repeated CityBreakdownItem cities = 3;
122
+ repeated ProductBreakdownItem top_products = 4;
123
+ repeated PharmacyBreakdownItem top_pharmacies = 5;
124
+ }
125
+
126
+ message SalesAnalyticsResponse {
127
+ AnalyticsSummary summary = 1;
128
+ repeated AnalyticsSeriesPoint series = 2;
129
+ }
130
+
131
+ message ProductsAnalyticsSummary {
132
+ int32 products_sold = 1;
133
+ double revenue = 2;
134
+ int32 low_stock = 3;
135
+ int32 categories = 4;
136
+ }
137
+
138
+ message ProductsAnalyticsResponse {
139
+ ProductsAnalyticsSummary summary = 1;
140
+ repeated ProductBreakdownItem products = 2;
141
+ }
142
+
143
+ message PharmaciesAnalyticsResponse {
144
+ AnalyticsSummary summary = 1;
145
+ repeated CityBreakdownItem cities = 2;
146
+ repeated PharmacyBreakdownItem pharmacies = 3;
147
+ }
148
+
149
+ // ---------------- Reports (hisobotlar) ----------------
150
+
151
+ message SalesReportResponse {
152
+ AnalyticsSummary summary = 1;
153
+ repeated AnalyticsSeriesPoint series = 2;
154
+ repeated PharmacyBreakdownItem top_pharmacies = 3;
155
+ }
156
+
157
+ message OrderStatusCount {
158
+ string status = 1; // SaleStatus
159
+ int32 count = 2;
160
+ }
161
+
162
+ message OrdersReportResponse {
163
+ int32 total = 1;
164
+ int32 processing = 2; // DRAFT
165
+ int32 completed = 3; // COMPLETED
166
+ int32 cancelled = 4; // CANCELLED + REFUNDED
167
+ repeated OrderStatusCount statuses = 5;
168
+ repeated RecentOrder recent = 6;
169
+ }
170
+
171
+ message InventoryCategoryCount {
172
+ string id = 1;
173
+ string name = 2;
174
+ int32 count = 3;
175
+ }
176
+
177
+ message InventoryRiskItem {
178
+ string id = 1;
179
+ string name_ru = 2;
180
+ string name_uz = 3;
181
+ string risk = 4; // LOW_STOCK | EXPIRING
182
+ }
183
+
184
+ message InventoryReportResponse {
185
+ int32 total_items = 1;
186
+ int32 low_stock = 2;
187
+ int32 expiring = 3;
188
+ int32 branches = 4;
189
+ repeated InventoryCategoryCount categories = 5;
190
+ repeated InventoryRiskItem risks = 6;
191
+ }
192
+
193
+ message EmptyRequest {}
194
+
72
195
  service AnalyticsService {
73
196
  rpc GetDashboardStats(DashboardStatsRequest) returns (DashboardStatsResponse);
74
197
  rpc GetSalesTrend(SalesTrendRequest) returns (SalesTrendResponse);
75
198
  rpc GetRecentOrders(RecentOrdersRequest) returns (RecentOrdersResponse);
76
199
  rpc GetTopProducts(TopProductsRequest) returns (TopProductsResponse);
200
+ rpc GetAnalyticsOverview(AnalyticsRangeRequest) returns (AnalyticsOverviewResponse);
201
+ rpc GetSalesAnalytics(AnalyticsRangeRequest) returns (SalesAnalyticsResponse);
202
+ rpc GetProductsAnalytics(AnalyticsRangeRequest) returns (ProductsAnalyticsResponse);
203
+ rpc GetPharmaciesAnalytics(AnalyticsRangeRequest) returns (PharmaciesAnalyticsResponse);
204
+ rpc GetSalesReport(AnalyticsRangeRequest) returns (SalesReportResponse);
205
+ rpc GetOrdersReport(AnalyticsRangeRequest) returns (OrdersReportResponse);
206
+ rpc GetInventoryReport(EmptyRequest) returns (InventoryReportResponse);
77
207
  }