diff --git a/cmd/web/docs/docs.go b/cmd/web/docs/docs.go index 4333463..20e9565 100644 --- a/cmd/web/docs/docs.go +++ b/cmd/web/docs/docs.go @@ -4080,7 +4080,7 @@ const docTemplate = `{ "BearerAuth": [] } ], - "description": "Retrieve tender approvals filtered by their status (approved, rejected)", + "description": "Retrieve tender approvals filtered by their status (submitted, rejected)", "consumes": [ "application/json" ], @@ -4094,7 +4094,7 @@ const docTemplate = `{ "parameters": [ { "enum": [ - "approved", + "submitted", "rejected" ], "type": "string", @@ -6018,11 +6018,11 @@ const docTemplate = `{ }, { "enum": [ - "approved", + "submitted", "rejected" ], "type": "string", - "description": "Filter by status Enums(approved, rejected)", + "description": "Filter by status Enums(submitted, rejected)", "name": "status", "in": "query" } @@ -7989,28 +7989,25 @@ const docTemplate = `{ "tender_approval.ApprovalStatus": { "type": "string", "enum": [ - "approved", + "submitted", "rejected" ], "x-enum-comments": { - "ApprovalStatusApproved": "Company approved the tender", - "ApprovalStatusRejected": "Company rejected the tender" + "ApprovalStatusRejected": "Company rejected the tender", + "ApprovalStatusSubmitted": "Company submitted the tender" }, "x-enum-descriptions": [ - "Company approved the tender", + "Company submitted the tender", "Company rejected the tender" ], "x-enum-varnames": [ - "ApprovalStatusApproved", + "ApprovalStatusSubmitted", "ApprovalStatusRejected" ] }, "tender_approval.CompanyTenderApprovalStatsResponse": { "type": "object", "properties": { - "approved_tenders": { - "type": "integer" - }, "company_id": { "type": "string" }, @@ -8026,6 +8023,9 @@ const docTemplate = `{ "self_apply_count": { "type": "integer" }, + "submitted_tenders": { + "type": "integer" + }, "total_approvals": { "type": "integer" } @@ -8121,15 +8121,15 @@ const docTemplate = `{ "tender_approval.TenderApprovalStatsResponse": { "type": "object", "properties": { - "approved_tenders": { - "type": "integer" - }, "last_updated": { "type": "integer" }, "rejected_tenders": { "type": "integer" }, + "submitted_tenders": { + "type": "integer" + }, "total_approvals": { "type": "integer" } diff --git a/cmd/web/docs/swagger.json b/cmd/web/docs/swagger.json index 4c332b5..514cfe3 100644 --- a/cmd/web/docs/swagger.json +++ b/cmd/web/docs/swagger.json @@ -4074,7 +4074,7 @@ "BearerAuth": [] } ], - "description": "Retrieve tender approvals filtered by their status (approved, rejected)", + "description": "Retrieve tender approvals filtered by their status (submitted, rejected)", "consumes": [ "application/json" ], @@ -4088,7 +4088,7 @@ "parameters": [ { "enum": [ - "approved", + "submitted", "rejected" ], "type": "string", @@ -6012,11 +6012,11 @@ }, { "enum": [ - "approved", + "submitted", "rejected" ], "type": "string", - "description": "Filter by status Enums(approved, rejected)", + "description": "Filter by status Enums(submitted, rejected)", "name": "status", "in": "query" } @@ -7983,28 +7983,25 @@ "tender_approval.ApprovalStatus": { "type": "string", "enum": [ - "approved", + "submitted", "rejected" ], "x-enum-comments": { - "ApprovalStatusApproved": "Company approved the tender", - "ApprovalStatusRejected": "Company rejected the tender" + "ApprovalStatusRejected": "Company rejected the tender", + "ApprovalStatusSubmitted": "Company submitted the tender" }, "x-enum-descriptions": [ - "Company approved the tender", + "Company submitted the tender", "Company rejected the tender" ], "x-enum-varnames": [ - "ApprovalStatusApproved", + "ApprovalStatusSubmitted", "ApprovalStatusRejected" ] }, "tender_approval.CompanyTenderApprovalStatsResponse": { "type": "object", "properties": { - "approved_tenders": { - "type": "integer" - }, "company_id": { "type": "string" }, @@ -8020,6 +8017,9 @@ "self_apply_count": { "type": "integer" }, + "submitted_tenders": { + "type": "integer" + }, "total_approvals": { "type": "integer" } @@ -8115,15 +8115,15 @@ "tender_approval.TenderApprovalStatsResponse": { "type": "object", "properties": { - "approved_tenders": { - "type": "integer" - }, "last_updated": { "type": "integer" }, "rejected_tenders": { "type": "integer" }, + "submitted_tenders": { + "type": "integer" + }, "total_approvals": { "type": "integer" } diff --git a/cmd/web/docs/swagger.yaml b/cmd/web/docs/swagger.yaml index 356a62b..fe03e5c 100644 --- a/cmd/web/docs/swagger.yaml +++ b/cmd/web/docs/swagger.yaml @@ -947,22 +947,20 @@ definitions: type: object tender_approval.ApprovalStatus: enum: - - approved + - submitted - rejected type: string x-enum-comments: - ApprovalStatusApproved: Company approved the tender ApprovalStatusRejected: Company rejected the tender + ApprovalStatusSubmitted: Company submitted the tender x-enum-descriptions: - - Company approved the tender + - Company submitted the tender - Company rejected the tender x-enum-varnames: - - ApprovalStatusApproved + - ApprovalStatusSubmitted - ApprovalStatusRejected tender_approval.CompanyTenderApprovalStatsResponse: properties: - approved_tenders: - type: integer company_id: type: string last_updated: @@ -973,6 +971,8 @@ definitions: type: integer self_apply_count: type: integer + submitted_tenders: + type: integer total_approvals: type: integer type: object @@ -1036,12 +1036,12 @@ definitions: type: object tender_approval.TenderApprovalStatsResponse: properties: - approved_tenders: - type: integer last_updated: type: integer rejected_tenders: type: integer + submitted_tenders: + type: integer total_approvals: type: integer type: object @@ -3933,11 +3933,12 @@ paths: get: consumes: - application/json - description: Retrieve tender approvals filtered by their status (approved, rejected) + description: Retrieve tender approvals filtered by their status (submitted, + rejected) parameters: - description: Tender approval status enum: - - approved + - submitted - rejected in: path name: status @@ -5067,9 +5068,9 @@ paths: in: query name: submission_mode type: string - - description: Filter by status Enums(approved, rejected) + - description: Filter by status Enums(submitted, rejected) enum: - - approved + - submitted - rejected in: query name: status diff --git a/internal/tender_approval/entity.go b/internal/tender_approval/entity.go index c43d3b8..03ba7c4 100644 --- a/internal/tender_approval/entity.go +++ b/internal/tender_approval/entity.go @@ -9,8 +9,8 @@ import ( type ApprovalStatus string const ( - ApprovalStatusApproved ApprovalStatus = "approved" // Company approved the tender - ApprovalStatusRejected ApprovalStatus = "rejected" // Company rejected the tender + ApprovalStatusSubmitted ApprovalStatus = "submitted" // Company submitted the tender + ApprovalStatusRejected ApprovalStatus = "rejected" // Company rejected the tender ) // SubmissionMode represents the submission mode of a tender by a company @@ -121,9 +121,9 @@ func (ta *TenderApproval) GetID() string { return ta.ID.Hex() } -// IsApproved returns true if the tender was approved -func (ta *TenderApproval) IsApproved() bool { - return ta.Status == ApprovalStatusApproved +// IsSubmitted returns true if the tender was submitted +func (ta *TenderApproval) IsSubmitted() bool { + return ta.Status == ApprovalStatusSubmitted } // IsRejected returns true if the tender was rejected @@ -133,12 +133,12 @@ func (ta *TenderApproval) IsRejected() bool { // HasDecision returns true if a decision has been made func (ta *TenderApproval) HasDecision() bool { - return ta.Status == ApprovalStatusApproved || ta.Status == ApprovalStatusRejected + return ta.Status == ApprovalStatusSubmitted || ta.Status == ApprovalStatusRejected } // Approve approves the tender with optional notes -func (ta *TenderApproval) Approve() { - ta.Status = ApprovalStatusApproved +func (ta *TenderApproval) Submit() { + ta.Status = ApprovalStatusSubmitted ta.CreatedAt = time.Now().Unix() } diff --git a/internal/tender_approval/form.go b/internal/tender_approval/form.go index 5fef335..31beaf4 100644 --- a/internal/tender_approval/form.go +++ b/internal/tender_approval/form.go @@ -4,13 +4,13 @@ package tender_approval type CreateTenderApprovalForm struct { TenderID string `json:"tender_id" valid:"required"` SubmissionMode SubmissionMode `json:"submission_mode" valid:"required,in(self-apply|partnership)"` - Status ApprovalStatus `json:"status,omitempty" valid:"optional,in(approved|rejected)"` + Status ApprovalStatus `json:"status,omitempty" valid:"optional,in(submitted|rejected)"` } // UpdateTenderApprovalForm represents the form for updating a tender approval type UpdateTenderApprovalForm struct { SubmissionMode *string `json:"submission_mode,omitempty" valid:"optional,in(self-apply|partnership)"` - Status *string `json:"status,omitempty" valid:"optional,in(approved|rejected)"` + Status *string `json:"status,omitempty" valid:"optional,in(submitted|rejected)"` } // ListTenderApprovalsForm represents the form for listing tender approvals with filters @@ -61,17 +61,17 @@ type TenderApprovalSearchForm struct { // TenderApproval statistics DTOs type TenderApprovalStatsResponse struct { - TotalApprovals int64 `json:"total_approvals"` - ApprovedTenders int64 `json:"approved_tenders"` - RejectedTenders int64 `json:"rejected_tenders"` - LastUpdated int64 `json:"last_updated"` + TotalApprovals int64 `json:"total_approvals"` + SubmittedTenders int64 `json:"submitted_tenders"` + RejectedTenders int64 `json:"rejected_tenders"` + LastUpdated int64 `json:"last_updated"` } // CompanyTenderApprovalStatsResponse represents company-specific tender approval statistics type CompanyTenderApprovalStatsResponse struct { CompanyID string `json:"company_id"` TotalApprovals int64 `json:"total_approvals"` - ApprovedTenders int64 `json:"approved_tenders"` + SubmittedTenders int64 `json:"submitted_tenders"` RejectedTenders int64 `json:"rejected_tenders"` SelfApplyCount int64 `json:"self_apply_count"` PartnershipCount int64 `json:"partnership_count"` @@ -81,7 +81,7 @@ type CompanyTenderApprovalStatsResponse struct { // ToggleTenderApprovalForm represents the form for toggling a tender approval type ToggleTenderApprovalForm struct { TenderID string `json:"tender_id" valid:"required"` - Status ApprovalStatus `json:"status" valid:"required,in(approved|rejected)"` + Status ApprovalStatus `json:"status" valid:"required,in(submitted|rejected)"` SubmissionMode SubmissionMode `json:"submission_mode" valid:"required,in(self-apply|partnership)"` } @@ -95,7 +95,7 @@ type CompanyTenderApprovalStatsRequest struct { type AggregatedCompanyStatsResponse struct { TotalCompanies int64 `json:"total_companies"` TotalApprovals int64 `json:"total_approvals"` - TotalApprovedTenders int64 `json:"total_approved_tenders"` + TotalSubmittedTenders int64 `json:"total_submitted_tenders"` TotalRejectedTenders int64 `json:"total_rejected_tenders"` TotalSelfApplyCount int64 `json:"total_self_apply_count"` TotalPartnershipCount int64 `json:"total_partnership_count"` diff --git a/internal/tender_approval/handler.go b/internal/tender_approval/handler.go index 7e77736..c3aa340 100644 --- a/internal/tender_approval/handler.go +++ b/internal/tender_approval/handler.go @@ -130,7 +130,7 @@ func (h *Handler) GetTenderApprovalByTenderAndCompany(c echo.Context) error { // @Accept json // @Produce json // @Param submission_mode query string false "Filter by submission mode Enums(self-apply, partnership)" -// @Param status query string false "Filter by status Enums(approved, rejected)" +// @Param status query string false "Filter by status Enums(submitted, rejected)" // @Success 200 {object} response.APIResponse{data=[]TenderApprovalWithTenderResponse} "Tender approvals retrieved successfully" // @Failure 400 {object} response.APIResponse "Bad request - Invalid company ID" // @Failure 500 {object} response.APIResponse "Internal server error" @@ -160,8 +160,8 @@ func (h *Handler) PublicGetTenderApprovals(c echo.Context) error { var status *ApprovalStatus if statusStr != "" { statusVal := ApprovalStatus(statusStr) - if statusVal != ApprovalStatusApproved && statusVal != ApprovalStatusRejected { - return response.BadRequest(c, "Invalid status value", "Must be 'approved' or 'rejected'") + if statusVal != ApprovalStatusSubmitted && statusVal != ApprovalStatusRejected { + return response.BadRequest(c, "Invalid status value", "Must be 'submitted' or 'rejected'") } status = &statusVal } @@ -258,11 +258,11 @@ func (h *Handler) GetCompanyTenderApprovalStats(c echo.Context) error { // GetTenderApprovalsByStatus retrieves tender approvals by status // @Summary Get tender approvals by status -// @Description Retrieve tender approvals filtered by their status (approved, rejected) +// @Description Retrieve tender approvals filtered by their status (submitted, rejected) // @Tags Admin-TenderApprovals // @Accept json // @Produce json -// @Param status path string true "Tender approval status" Enums(approved, rejected) +// @Param status path string true "Tender approval status" Enums(submitted, rejected) // @Param limit query integer false "Number of approvals per page (1-100)" minimum(1) maximum(100) default(20) // @Param offset query integer false "Number of approvals to skip for pagination" minimum(0) default(0) // @Success 200 {object} response.APIResponse{data=[]TenderApprovalResponse,meta=response.Meta} "Tender approvals retrieved successfully" @@ -275,8 +275,8 @@ func (h *Handler) GetTenderApprovalsByStatus(c echo.Context) error { status := ApprovalStatus(statusStr) // Validate status - if status != ApprovalStatusApproved && status != ApprovalStatusRejected { - return response.BadRequest(c, "Invalid tender approval status", "Must be approved or rejected") + if status != ApprovalStatusSubmitted && status != ApprovalStatusRejected { + return response.BadRequest(c, "Invalid tender approval status", "Must be submitted or rejected") } limit := 20 diff --git a/internal/tender_approval/repository.go b/internal/tender_approval/repository.go index afa09e1..38062ff 100644 --- a/internal/tender_approval/repository.go +++ b/internal/tender_approval/repository.go @@ -475,14 +475,14 @@ func (r *tenderApprovalRepository) CountByCompanyID(ctx context.Context, company func (r *tenderApprovalRepository) GetTenderApprovalStats(ctx context.Context) (*TenderApprovalStatsResponse, error) { // Get basic counts totalApprovals, _ := r.Count(ctx) - approvedTenders, _ := r.CountByStatus(ctx, ApprovalStatusApproved) + submittedTenders, _ := r.CountByStatus(ctx, ApprovalStatusSubmitted) rejectedTenders, _ := r.CountByStatus(ctx, ApprovalStatusRejected) stats := &TenderApprovalStatsResponse{ - TotalApprovals: totalApprovals, - ApprovedTenders: approvedTenders, - RejectedTenders: rejectedTenders, - LastUpdated: time.Now().Unix(), + TotalApprovals: totalApprovals, + SubmittedTenders: submittedTenders, + RejectedTenders: rejectedTenders, + LastUpdated: time.Now().Unix(), } return stats, nil @@ -494,23 +494,23 @@ func (r *tenderApprovalRepository) GetCompanyTenderApprovalStats(ctx context.Con totalApprovals, _ := r.CountByCompanyID(ctx, companyID) // Count by status for this company - approvedFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusApproved)} - approvedTenders, _ := r.ormRepo.Count(ctx, approvedFilter) + submittedFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusSubmitted)} + submittedTenders, _ := r.ormRepo.Count(ctx, submittedFilter) rejectedFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusRejected)} rejectedTenders, _ := r.ormRepo.Count(ctx, rejectedFilter) // Count by submission mode for this company - selfApplyFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusApproved), "submission_mode": string(SubmissionModeSelfApply)} + selfApplyFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusSubmitted), "submission_mode": string(SubmissionModeSelfApply)} selfApplyCount, _ := r.ormRepo.Count(ctx, selfApplyFilter) - partnershipFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusApproved), "submission_mode": string(SubmissionModePartnership)} + partnershipFilter := bson.M{"company_id": companyID, "status": string(ApprovalStatusSubmitted), "submission_mode": string(SubmissionModePartnership)} partnershipCount, _ := r.ormRepo.Count(ctx, partnershipFilter) stats := &CompanyTenderApprovalStatsResponse{ CompanyID: companyID, TotalApprovals: totalApprovals, - ApprovedTenders: approvedTenders, + SubmittedTenders: submittedTenders, RejectedTenders: rejectedTenders, SelfApplyCount: selfApplyCount, PartnershipCount: partnershipCount, diff --git a/internal/tender_approval/service.go b/internal/tender_approval/service.go index cf31d25..62bc3b2 100644 --- a/internal/tender_approval/service.go +++ b/internal/tender_approval/service.go @@ -694,12 +694,12 @@ func (s *tenderApprovalService) GetAggregatedCompanyStats(ctx context.Context) ( // 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, - CompanyStats: []*CompanyTenderApprovalStatsResponse{}, // Empty for now - LastUpdated: time.Now().Unix(), + TotalCompanies: 1, // This should be calculated from actual company data + TotalApprovals: generalStats.TotalApprovals, + TotalSubmittedTenders: generalStats.SubmittedTenders, + TotalRejectedTenders: generalStats.RejectedTenders, + CompanyStats: []*CompanyTenderApprovalStatsResponse{}, // Empty for now + LastUpdated: time.Now().Unix(), } s.logger.Info("Aggregated company stats retrieved successfully", map[string]interface{}{ @@ -1004,8 +1004,8 @@ func (s *tenderApprovalService) ToggleTenderApproval(ctx context.Context, req *T return nil, err } - if req.Status == ApprovalStatusApproved { - existing.Status = "unapproved" + if req.Status == ApprovalStatusSubmitted { + existing.Status = "unsubmitted" } else { existing.Status = "unrejected" } @@ -1024,10 +1024,10 @@ func (s *tenderApprovalService) ToggleTenderApproval(ctx context.Context, req *T return existing.ToResponseWithTender(nil), nil } - if existing.Status == ApprovalStatusApproved { + if existing.Status == ApprovalStatusSubmitted { existing.Reject() } else { - existing.Approve() + existing.Submit() } err = s.repository.Update(ctx, existing) @@ -1055,7 +1055,7 @@ func (s *tenderApprovalService) GetCompanyTenderApprovalStats(ctx context.Contex s.logger.Info("Company tender approval stats retrieved successfully", map[string]interface{}{ "company_id": companyID, "total_approvals": stats.TotalApprovals, - "approved_tenders": stats.ApprovedTenders, + "submitted_tenders": stats.SubmittedTenders, "rejected_tenders": stats.RejectedTenders, "self_apply_count": stats.SelfApplyCount, "partnership_count": stats.PartnershipCount, diff --git a/internal/tender_approval/validation.go b/internal/tender_approval/validation.go index f7fb7be..defa9ce 100644 --- a/internal/tender_approval/validation.go +++ b/internal/tender_approval/validation.go @@ -48,7 +48,7 @@ func IsValidSubmissionMode(mode string) bool { // IsValidStatus validates if the approval status is valid func IsValidStatus(status string) bool { validStatuses := []string{ - string(ApprovalStatusApproved), + string(ApprovalStatusSubmitted), string(ApprovalStatusRejected), }