Refactor Tender Approval Logic and Update Statistics Structure

- Modified the Reject method in the TenderApproval entity to reset the SubmissionMode field upon rejection, ensuring proper state management.
- Simplified the TenderApprovalStatsResponse and CompanyTenderApprovalStatsResponse structures by removing unnecessary fields related to submission modes, streamlining the data model for tender approval statistics.
- Updated the GetTenderApprovalStats and GetCompanyTenderApprovalStats methods in the repository to reflect the changes in the statistics structure, enhancing clarity and maintainability.
- These adjustments improve the overall functionality and data handling of the tender management system.
This commit is contained in:
n.nakhostin
2025-08-25 13:39:28 +03:30
parent 531f8e2baf
commit 488d43380b
4 changed files with 31 additions and 62 deletions
+1
View File
@@ -145,6 +145,7 @@ func (ta *TenderApproval) Approve() {
// Reject rejects the tender with a reason // Reject rejects the tender with a reason
func (ta *TenderApproval) Reject() { func (ta *TenderApproval) Reject() {
ta.Status = ApprovalStatusRejected ta.Status = ApprovalStatusRejected
ta.SubmissionMode = ""
ta.CreatedAt = time.Now().Unix() ta.CreatedAt = time.Now().Unix()
} }
+11 -15
View File
@@ -61,25 +61,21 @@ type TenderApprovalSearchForm struct {
// TenderApproval statistics DTOs // TenderApproval statistics DTOs
type TenderApprovalStatsResponse struct { type TenderApprovalStatsResponse struct {
TotalApprovals int64 `json:"total_approvals"` TotalApprovals int64 `json:"total_approvals"`
ApprovedTenders int64 `json:"approved_tenders"` ApprovedTenders int64 `json:"approved_tenders"`
RejectedTenders int64 `json:"rejected_tenders"` RejectedTenders int64 `json:"rejected_tenders"`
ApprovalsByStatus map[string]int64 `json:"approvals_by_status"` LastUpdated int64 `json:"last_updated"`
ApprovalsBySubmission map[string]int64 `json:"approvals_by_submission"`
LastUpdated int64 `json:"last_updated"`
} }
// CompanyTenderApprovalStatsResponse represents company-specific tender approval statistics // CompanyTenderApprovalStatsResponse represents company-specific tender approval statistics
type CompanyTenderApprovalStatsResponse struct { type CompanyTenderApprovalStatsResponse struct {
CompanyID string `json:"company_id"` CompanyID string `json:"company_id"`
TotalApprovals int64 `json:"total_approvals"` TotalApprovals int64 `json:"total_approvals"`
ApprovedTenders int64 `json:"approved_tenders"` ApprovedTenders int64 `json:"approved_tenders"`
RejectedTenders int64 `json:"rejected_tenders"` RejectedTenders int64 `json:"rejected_tenders"`
SelfApplyCount int64 `json:"self_apply_count"` SelfApplyCount int64 `json:"self_apply_count"`
PartnershipCount int64 `json:"partnership_count"` PartnershipCount int64 `json:"partnership_count"`
ApprovalsByStatus map[string]int64 `json:"approvals_by_status"` LastUpdated int64 `json:"last_updated"`
ApprovalsBySubmission map[string]int64 `json:"approvals_by_submission"`
LastUpdated int64 `json:"last_updated"`
} }
// ToggleTenderApprovalForm represents the form for toggling a tender approval // ToggleTenderApprovalForm represents the form for toggling a tender approval
+13 -37
View File
@@ -478,27 +478,13 @@ func (r *tenderApprovalRepository) GetTenderApprovalStats(ctx context.Context) (
approvedTenders, _ := r.CountByStatus(ctx, ApprovalStatusApproved) approvedTenders, _ := r.CountByStatus(ctx, ApprovalStatusApproved)
rejectedTenders, _ := r.CountByStatus(ctx, ApprovalStatusRejected) rejectedTenders, _ := r.CountByStatus(ctx, ApprovalStatusRejected)
// For this implementation, we'll return basic stats
// In a real implementation, you'd use MongoDB aggregation pipelines
stats := &TenderApprovalStatsResponse{ stats := &TenderApprovalStatsResponse{
TotalApprovals: totalApprovals, TotalApprovals: totalApprovals,
ApprovedTenders: approvedTenders, ApprovedTenders: approvedTenders,
RejectedTenders: rejectedTenders, RejectedTenders: rejectedTenders,
ApprovalsByStatus: make(map[string]int64), LastUpdated: time.Now().Unix(),
ApprovalsBySubmission: make(map[string]int64),
LastUpdated: time.Now().Unix(),
} }
// Add status breakdown
stats.ApprovalsByStatus["approved"] = approvedTenders
stats.ApprovalsByStatus["rejected"] = rejectedTenders
// Add submission mode breakdown
selfApplyCount, _ := r.CountBySubmissionMode(ctx, SubmissionModeSelfApply)
partnershipCount, _ := r.CountBySubmissionMode(ctx, SubmissionModePartnership)
stats.ApprovalsBySubmission["self-apply"] = selfApplyCount
stats.ApprovalsBySubmission["partnership"] = partnershipCount
return stats, nil return stats, nil
} }
@@ -515,32 +501,22 @@ func (r *tenderApprovalRepository) GetCompanyTenderApprovalStats(ctx context.Con
rejectedTenders, _ := r.ormRepo.Count(ctx, rejectedFilter) rejectedTenders, _ := r.ormRepo.Count(ctx, rejectedFilter)
// Count by submission mode for this company // Count by submission mode for this company
selfApplyFilter := bson.M{"company_id": companyID, "submission_mode": string(SubmissionModeSelfApply)} selfApplyFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusApproved), "submission_mode": string(SubmissionModeSelfApply)}
selfApplyCount, _ := r.ormRepo.Count(ctx, selfApplyFilter) selfApplyCount, _ := r.ormRepo.Count(ctx, selfApplyFilter)
partnershipFilter := bson.M{"company_id": companyID, "submission_mode": string(SubmissionModePartnership)} partnershipFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusApproved), "submission_mode": string(SubmissionModePartnership)}
partnershipCount, _ := r.ormRepo.Count(ctx, partnershipFilter) partnershipCount, _ := r.ormRepo.Count(ctx, partnershipFilter)
stats := &CompanyTenderApprovalStatsResponse{ stats := &CompanyTenderApprovalStatsResponse{
CompanyID: companyID, CompanyID: companyID,
TotalApprovals: totalApprovals, TotalApprovals: totalApprovals,
ApprovedTenders: approvedTenders, ApprovedTenders: approvedTenders,
RejectedTenders: rejectedTenders, RejectedTenders: rejectedTenders,
SelfApplyCount: selfApplyCount, SelfApplyCount: selfApplyCount,
PartnershipCount: partnershipCount, PartnershipCount: partnershipCount,
ApprovalsByStatus: make(map[string]int64), LastUpdated: time.Now().Unix(),
ApprovalsBySubmission: make(map[string]int64),
LastUpdated: time.Now().Unix(),
} }
// Add status breakdown
stats.ApprovalsByStatus["approved"] = approvedTenders
stats.ApprovalsByStatus["rejected"] = rejectedTenders
// Add submission mode breakdown
stats.ApprovalsBySubmission["self-apply"] = selfApplyCount
stats.ApprovalsBySubmission["partnership"] = partnershipCount
return stats, nil return stats, nil
} }
+6 -10
View File
@@ -694,16 +694,12 @@ func (s *tenderApprovalService) GetAggregatedCompanyStats(ctx context.Context) (
// In a real implementation, you might want to get stats for all companies // In a real implementation, you might want to get stats for all companies
// and aggregate them properly // and aggregate them properly
stats := &AggregatedCompanyStatsResponse{ stats := &AggregatedCompanyStatsResponse{
TotalCompanies: 1, // This should be calculated from actual company data TotalCompanies: 1, // This should be calculated from actual company data
TotalApprovals: generalStats.TotalApprovals, TotalApprovals: generalStats.TotalApprovals,
TotalApprovedTenders: generalStats.ApprovedTenders, TotalApprovedTenders: generalStats.ApprovedTenders,
TotalRejectedTenders: generalStats.RejectedTenders, TotalRejectedTenders: generalStats.RejectedTenders,
TotalSelfApplyCount: generalStats.ApprovalsBySubmission["self-apply"], CompanyStats: []*CompanyTenderApprovalStatsResponse{}, // Empty for now
TotalPartnershipCount: generalStats.ApprovalsBySubmission["partnership"], LastUpdated: time.Now().Unix(),
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{}{ s.logger.Info("Aggregated company stats retrieved successfully", map[string]interface{}{