Add Company Tender Approval Statistics Endpoint and Update API Documentation
- Introduced a new API endpoint to retrieve company-specific tender approval statistics, enhancing the analytics capabilities of the tender management system. - Implemented the `GetCompanyTenderApprovalStats` method in the service layer to fetch detailed statistics, including total approvals, approved and rejected tenders, and submission counts. - Updated Swagger documentation to accurately reflect the new endpoint, including detailed descriptions, parameters, and response formats for the `CompanyTenderApprovalStatsResponse`. - Enhanced the router to include the new statistics route, ensuring adherence to Clean Architecture principles and maintaining a clear separation of concerns in the handler layer. - Added necessary request and response forms to support the new functionality, improving the overall API structure and usability.
This commit is contained in:
@@ -35,6 +35,9 @@ type Service interface {
|
||||
|
||||
// Statistics and analytics
|
||||
GetTenderApprovalStats(ctx context.Context) (*TenderApprovalStatsResponse, error)
|
||||
GetCompanyTenderApprovalStats(ctx context.Context, companyID string) (*CompanyTenderApprovalStatsResponse, error)
|
||||
GetMultipleCompanyTenderApprovalStats(ctx context.Context, companyIDs []string) ([]*CompanyTenderApprovalStatsResponse, error)
|
||||
GetAggregatedCompanyStats(ctx context.Context) (*AggregatedCompanyStatsResponse, error)
|
||||
|
||||
// Search and filtering helpers
|
||||
GetTenderApprovalsByStatus(ctx context.Context, status ApprovalStatus, limit, offset int) ([]*TenderApproval, int64, error)
|
||||
@@ -648,6 +651,69 @@ func (s *tenderApprovalService) GetTenderApprovalStats(ctx context.Context) (*Te
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
// GetMultipleCompanyTenderApprovalStats returns tender approval statistics for multiple companies
|
||||
func (s *tenderApprovalService) GetMultipleCompanyTenderApprovalStats(ctx context.Context, companyIDs []string) ([]*CompanyTenderApprovalStatsResponse, error) {
|
||||
if len(companyIDs) == 0 {
|
||||
return []*CompanyTenderApprovalStatsResponse{}, nil
|
||||
}
|
||||
|
||||
var allStats []*CompanyTenderApprovalStatsResponse
|
||||
for _, companyID := range companyIDs {
|
||||
stats, err := s.GetCompanyTenderApprovalStats(ctx, companyID)
|
||||
if err != nil {
|
||||
s.logger.Warn("Failed to get stats for company", map[string]interface{}{
|
||||
"company_id": companyID,
|
||||
"error": err.Error(),
|
||||
})
|
||||
// Continue with other companies rather than failing completely
|
||||
continue
|
||||
}
|
||||
allStats = append(allStats, stats)
|
||||
}
|
||||
|
||||
s.logger.Info("Multiple company tender approval stats retrieved successfully", map[string]interface{}{
|
||||
"requested_count": len(companyIDs),
|
||||
"retrieved_count": len(allStats),
|
||||
})
|
||||
|
||||
return allStats, nil
|
||||
}
|
||||
|
||||
// GetAggregatedCompanyStats returns aggregated statistics across all companies
|
||||
func (s *tenderApprovalService) GetAggregatedCompanyStats(ctx context.Context) (*AggregatedCompanyStatsResponse, error) {
|
||||
// Get general stats first
|
||||
generalStats, err := s.GetTenderApprovalStats(ctx)
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to get general tender approval stats", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return nil, errors.New("failed to get general tender approval statistics")
|
||||
}
|
||||
|
||||
// For now, we'll return basic aggregated stats
|
||||
// In a real implementation, you might want to get stats for all companies
|
||||
// and aggregate them properly
|
||||
stats := &AggregatedCompanyStatsResponse{
|
||||
TotalCompanies: 1, // This should be calculated from actual company data
|
||||
TotalApprovals: generalStats.TotalApprovals,
|
||||
TotalApprovedTenders: generalStats.ApprovedTenders,
|
||||
TotalRejectedTenders: generalStats.RejectedTenders,
|
||||
TotalSelfApplyCount: generalStats.ApprovalsBySubmission["self-apply"],
|
||||
TotalPartnershipCount: generalStats.ApprovalsBySubmission["partnership"],
|
||||
ApprovalsByStatus: generalStats.ApprovalsByStatus,
|
||||
ApprovalsBySubmission: generalStats.ApprovalsBySubmission,
|
||||
CompanyStats: []*CompanyTenderApprovalStatsResponse{}, // Empty for now
|
||||
LastUpdated: time.Now().Unix(),
|
||||
}
|
||||
|
||||
s.logger.Info("Aggregated company stats retrieved successfully", map[string]interface{}{
|
||||
"total_approvals": stats.TotalApprovals,
|
||||
"total_companies": stats.TotalCompanies,
|
||||
})
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
// GetTenderApprovalsByStatus retrieves tender approvals by status with pagination
|
||||
func (s *tenderApprovalService) GetTenderApprovalsByStatus(ctx context.Context, status ApprovalStatus, limit, offset int) ([]*TenderApproval, int64, error) {
|
||||
// Use search method with status filter
|
||||
@@ -972,3 +1038,26 @@ func (s *tenderApprovalService) ToggleTenderApproval(ctx context.Context, req *T
|
||||
|
||||
return existing.ToResponseWithTender(nil), nil
|
||||
}
|
||||
|
||||
// GetCompanyTenderApprovalStats returns company-specific tender approval statistics
|
||||
func (s *tenderApprovalService) GetCompanyTenderApprovalStats(ctx context.Context, companyID string) (*CompanyTenderApprovalStatsResponse, error) {
|
||||
stats, err := s.repository.GetCompanyTenderApprovalStats(ctx, companyID)
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to get company tender approval stats", map[string]interface{}{
|
||||
"error": err.Error(),
|
||||
"company_id": companyID,
|
||||
})
|
||||
return nil, errors.New("failed to get company tender approval statistics")
|
||||
}
|
||||
|
||||
s.logger.Info("Company tender approval stats retrieved successfully", map[string]interface{}{
|
||||
"company_id": companyID,
|
||||
"total_approvals": stats.TotalApprovals,
|
||||
"approved_tenders": stats.ApprovedTenders,
|
||||
"rejected_tenders": stats.RejectedTenders,
|
||||
"self_apply_count": stats.SelfApplyCount,
|
||||
"partnership_count": stats.PartnershipCount,
|
||||
})
|
||||
|
||||
return stats, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user