488d43380b
- 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.
186 lines
7.1 KiB
Go
186 lines
7.1 KiB
Go
package tender_approval
|
|
|
|
import (
|
|
"time"
|
|
"tm/pkg/mongo"
|
|
)
|
|
|
|
// ApprovalStatus represents the approval status of a tender by a company
|
|
type ApprovalStatus string
|
|
|
|
const (
|
|
ApprovalStatusApproved ApprovalStatus = "approved" // Company approved the tender
|
|
ApprovalStatusRejected ApprovalStatus = "rejected" // Company rejected the tender
|
|
)
|
|
|
|
// SubmissionMode represents the submission mode of a tender by a company
|
|
type SubmissionMode string
|
|
|
|
const (
|
|
SubmissionModeSelfApply SubmissionMode = "self-apply" // Company applies for the tender on their own
|
|
SubmissionModePartnership SubmissionMode = "partnership" // Company applies for the tender with a partner
|
|
)
|
|
|
|
// TenderApproval represents a company's approval decision for a specific tender
|
|
type TenderApproval struct {
|
|
mongo.Model `bson:",inline"`
|
|
|
|
// Core relationships
|
|
TenderID string `bson:"tender_id" json:"tender_id"` // Reference to the tender
|
|
CompanyID string `bson:"company_id" json:"company_id"` // Reference to the company
|
|
|
|
// Approval decision
|
|
SubmissionMode SubmissionMode `bson:"submission_mode" json:"submission_mode"`
|
|
Status ApprovalStatus `bson:"status" json:"status"` // Current approval status
|
|
}
|
|
|
|
// TenderApprovalRequest represents a request to create or update a tender approval
|
|
type TenderApprovalRequest struct {
|
|
TenderID string `json:"tender_id" validate:"required"`
|
|
CompanyID string `json:"company_id" validate:"required"`
|
|
SubmissionMode SubmissionMode `json:"submission_mode" validate:"required"`
|
|
Status ApprovalStatus `json:"status,omitempty"`
|
|
}
|
|
|
|
// TenderApprovalResponse represents the response data for tender approval
|
|
type TenderApprovalResponse struct {
|
|
ID string `json:"id"`
|
|
TenderID string `json:"tender_id"`
|
|
CompanyID string `json:"company_id"`
|
|
SubmissionMode string `json:"submission_mode"`
|
|
Status string `json:"status"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
}
|
|
|
|
// TenderApprovalWithTenderResponse represents the response data for tender approval with tender details
|
|
type TenderApprovalWithTenderResponse struct {
|
|
ID string `json:"id"`
|
|
TenderID string `json:"tender_id"`
|
|
CompanyID string `json:"company_id"`
|
|
SubmissionMode string `json:"submission_mode"`
|
|
Status string `json:"status"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
Tender *TenderDetails `json:"tender,omitempty"`
|
|
}
|
|
|
|
// TenderDetails represents essential tender information for the response
|
|
type (
|
|
TenderDetails struct {
|
|
ID string `json:"id"`
|
|
NoticePublicationID string `json:"notice_publication_id"`
|
|
PublicationDate int64 `json:"publication_date"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
ProcurementTypeCode string `json:"procurement_type_code"`
|
|
ProcedureCode string `json:"procedure_code"`
|
|
EstimatedValue float64 `json:"estimated_value"`
|
|
Currency string `json:"currency"`
|
|
Duration string `json:"duration"`
|
|
DurationUnit string `json:"duration_unit"`
|
|
TenderDeadline int64 `json:"tender_deadline"`
|
|
SubmissionDeadline int64 `json:"submission_deadline"`
|
|
CountryCode string `json:"country_code"`
|
|
BuyerOrganization *OrganizationResponse `json:"buyer_organization"`
|
|
Status string `json:"status"`
|
|
}
|
|
OrganizationResponse struct {
|
|
Name string `json:"name"`
|
|
}
|
|
)
|
|
|
|
// TenderApprovalSearchCriteria represents search criteria for tender approvals
|
|
type TenderApprovalSearchCriteria struct {
|
|
TenderID *string `json:"tender_id,omitempty"`
|
|
CompanyID *string `json:"company_id,omitempty"`
|
|
Status []ApprovalStatus `json:"status,omitempty"`
|
|
SubmissionMode []SubmissionMode `json:"submission_mode,omitempty"`
|
|
CreatedAtFrom *int64 `json:"created_at_from,omitempty"`
|
|
CreatedAtTo *int64 `json:"created_at_to,omitempty"`
|
|
Limit int `json:"limit,omitempty"`
|
|
Offset int `json:"offset,omitempty"`
|
|
}
|
|
|
|
// TenderApprovalListResponseWithTender represents a paginated list of tender approvals with tender details
|
|
type TenderApprovalListResponseWithTender struct {
|
|
TenderApprovals []*TenderApprovalWithTenderResponse `json:"tender_approvals"`
|
|
Total int64 `json:"total"`
|
|
Limit int `json:"limit"`
|
|
Offset int `json:"offset"`
|
|
Page int `json:"page"`
|
|
Pages int `json:"pages"`
|
|
}
|
|
|
|
// TenderApprovalStatistics represents statistics for tender approvals
|
|
type TenderApprovalStatistics struct {
|
|
TotalApprovals int64 `json:"total_approvals"`
|
|
LastUpdated int64 `json:"last_updated"`
|
|
}
|
|
|
|
// GetID returns the tender approval ID
|
|
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
|
|
}
|
|
|
|
// IsRejected returns true if the tender was rejected
|
|
func (ta *TenderApproval) IsRejected() bool {
|
|
return ta.Status == ApprovalStatusRejected
|
|
}
|
|
|
|
// HasDecision returns true if a decision has been made
|
|
func (ta *TenderApproval) HasDecision() bool {
|
|
return ta.Status == ApprovalStatusApproved || ta.Status == ApprovalStatusRejected
|
|
}
|
|
|
|
// Approve approves the tender with optional notes
|
|
func (ta *TenderApproval) Approve() {
|
|
ta.Status = ApprovalStatusApproved
|
|
ta.CreatedAt = time.Now().Unix()
|
|
}
|
|
|
|
// Reject rejects the tender with a reason
|
|
func (ta *TenderApproval) Reject() {
|
|
ta.Status = ApprovalStatusRejected
|
|
ta.SubmissionMode = ""
|
|
ta.CreatedAt = time.Now().Unix()
|
|
}
|
|
|
|
// SetCreatedAt sets the created timestamp (implements Timestampable interface)
|
|
func (ta *TenderApproval) SetCreatedAt(timestamp int64) {
|
|
ta.CreatedAt = timestamp
|
|
}
|
|
|
|
// SetUpdatedAt sets the updated timestamp (implements Timestampable interface)
|
|
func (ta *TenderApproval) SetUpdatedAt(timestamp int64) {
|
|
ta.UpdatedAt = timestamp
|
|
}
|
|
|
|
// ToResponse converts TenderApproval to TenderApprovalResponse
|
|
func (ta *TenderApproval) ToResponse() *TenderApprovalResponse {
|
|
return &TenderApprovalResponse{
|
|
ID: ta.ID.Hex(),
|
|
TenderID: ta.TenderID,
|
|
CompanyID: ta.CompanyID,
|
|
SubmissionMode: string(ta.SubmissionMode),
|
|
Status: string(ta.Status),
|
|
CreatedAt: ta.CreatedAt,
|
|
}
|
|
}
|
|
|
|
// ToResponseWithTender converts TenderApproval to TenderApprovalWithTenderResponse
|
|
func (ta *TenderApproval) ToResponseWithTender(tenderDetails *TenderDetails) *TenderApprovalWithTenderResponse {
|
|
return &TenderApprovalWithTenderResponse{
|
|
ID: ta.ID.Hex(),
|
|
TenderID: ta.TenderID,
|
|
CompanyID: ta.CompanyID,
|
|
SubmissionMode: string(ta.SubmissionMode),
|
|
Status: string(ta.Status),
|
|
CreatedAt: ta.CreatedAt,
|
|
Tender: tenderDetails,
|
|
}
|
|
}
|