3e4831c2e7
- Updated README.md to include comprehensive Swagger documentation details, highlighting new features and endpoint categories. - Introduced a new router structure to streamline route registration for admin and public endpoints, enhancing maintainability. - Updated health check endpoint documentation to reflect comprehensive server status information. - Enhanced customer and company management routes with improved descriptions and examples in Swagger. - Refactored customer and user handlers to remove obsolete route registrations, aligning with the new router structure. - Improved response handling in customer and user services to utilize string IDs consistently. - Updated validation rules and forms for customer management to support multiple company assignments. - Enhanced logging practices across services to ensure better traceability and error handling.
219 lines
8.3 KiB
Go
219 lines
8.3 KiB
Go
package customer
|
|
|
|
import (
|
|
"tm/pkg/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
// CustomerStatus represents customer account status
|
|
type CustomerStatus string
|
|
|
|
const (
|
|
CustomerStatusActive CustomerStatus = "active"
|
|
CustomerStatusInactive CustomerStatus = "inactive"
|
|
CustomerStatusSuspended CustomerStatus = "suspended"
|
|
CustomerStatusPending CustomerStatus = "pending"
|
|
)
|
|
|
|
// CustomerType represents the type of customer
|
|
type CustomerType string
|
|
|
|
const (
|
|
CustomerTypeIndividual CustomerType = "individual"
|
|
CustomerTypeCompany CustomerType = "company"
|
|
CustomerTypeGovernment CustomerType = "government"
|
|
)
|
|
|
|
// Customer represents a customer in the tender management system
|
|
// A customer can have an associated company for login purposes
|
|
type Customer struct {
|
|
mongo.Model `bson:",inline"`
|
|
Type CustomerType `bson:"type" json:"type"`
|
|
Status CustomerStatus `bson:"status" json:"status"`
|
|
|
|
// Individual customer fields
|
|
FirstName *string `bson:"first_name,omitempty" json:"first_name,omitempty"`
|
|
LastName *string `bson:"last_name,omitempty" json:"last_name,omitempty"`
|
|
FullName *string `bson:"full_name,omitempty" json:"full_name,omitempty"`
|
|
Username string `bson:"username" json:"username"` // Username for authentication
|
|
Email string `bson:"email" json:"email"`
|
|
Password string `bson:"password" json:"-"` // Hashed password for authentication
|
|
Phone *string `bson:"phone,omitempty" json:"phone,omitempty"`
|
|
Mobile *string `bson:"mobile,omitempty" json:"mobile,omitempty"`
|
|
|
|
// Company relationships - each customer can be assigned to multiple companies
|
|
CompanyIDs []string `bson:"company_ids,omitempty" json:"company_ids,omitempty"`
|
|
|
|
// Company customer fields
|
|
RegistrationNumber *string `bson:"registration_number,omitempty" json:"registration_number,omitempty"`
|
|
TaxID *string `bson:"tax_id,omitempty" json:"tax_id,omitempty"`
|
|
Industry *string `bson:"industry,omitempty" json:"industry,omitempty"`
|
|
|
|
// Address information
|
|
Address *Address `bson:"address,omitempty" json:"address,omitempty"`
|
|
|
|
// Business information
|
|
BusinessType *string `bson:"business_type,omitempty" json:"business_type,omitempty"`
|
|
EmployeeCount *int `bson:"employee_count,omitempty" json:"employee_count,omitempty"`
|
|
AnnualRevenue *float64 `bson:"annual_revenue,omitempty" json:"annual_revenue,omitempty"`
|
|
FoundedYear *int `bson:"founded_year,omitempty" json:"founded_year,omitempty"`
|
|
|
|
// Contact person (for company customers)
|
|
ContactPerson *ContactPerson `bson:"contact_person,omitempty" json:"contact_person,omitempty"`
|
|
|
|
// Verification and compliance
|
|
IsVerified bool `bson:"is_verified" json:"is_verified"`
|
|
IsCompliant bool `bson:"is_compliant" json:"is_compliant"`
|
|
ComplianceNotes *string `bson:"compliance_notes,omitempty" json:"compliance_notes,omitempty"`
|
|
|
|
// Settings
|
|
Language string `bson:"language" json:"language"` // Default: "en"
|
|
Currency string `bson:"currency" json:"currency"` // Default: "USD"
|
|
Timezone string `bson:"timezone" json:"timezone"` // Default: "UTC"
|
|
|
|
// Audit fields
|
|
CreatedBy *string `bson:"created_by,omitempty" json:"created_by,omitempty"`
|
|
UpdatedBy *string `bson:"updated_by,omitempty" json:"updated_by,omitempty"`
|
|
}
|
|
|
|
// SetID sets the customer ID (implements IDSetter interface)
|
|
func (c *Customer) SetID(id string) {
|
|
c.ID, _ = primitive.ObjectIDFromHex(id)
|
|
}
|
|
|
|
// GetID returns the customer ID (implements IDGetter interface)
|
|
func (c *Customer) GetID() string {
|
|
return c.ID.Hex()
|
|
}
|
|
|
|
// SetCreatedAt sets the created timestamp (implements Timestampable interface)
|
|
func (c *Customer) SetCreatedAt(timestamp int64) {
|
|
c.CreatedAt = timestamp
|
|
}
|
|
|
|
// SetUpdatedAt sets the updated timestamp (implements Timestampable interface)
|
|
func (c *Customer) SetUpdatedAt(timestamp int64) {
|
|
c.UpdatedAt = timestamp
|
|
}
|
|
|
|
// GetCreatedAt returns the created timestamp (implements Timestampable interface)
|
|
func (c *Customer) GetCreatedAt() int64 {
|
|
return c.CreatedAt
|
|
}
|
|
|
|
// GetUpdatedAt returns the updated timestamp (implements Timestampable interface)
|
|
func (c *Customer) GetUpdatedAt() int64 {
|
|
return c.UpdatedAt
|
|
}
|
|
|
|
// Address represents a customer's address
|
|
type Address struct {
|
|
Street string `bson:"street" json:"street"`
|
|
City string `bson:"city" json:"city"`
|
|
State string `bson:"state" json:"state"`
|
|
PostalCode string `bson:"postal_code" json:"postal_code"`
|
|
Country string `bson:"country" json:"country"`
|
|
AddressType string `bson:"address_type" json:"address_type"` // billing, shipping, etc.
|
|
IsDefault bool `bson:"is_default" json:"is_default"`
|
|
}
|
|
|
|
// ContactPerson represents a contact person for company customers
|
|
type ContactPerson struct {
|
|
FirstName string `bson:"first_name" json:"first_name"`
|
|
LastName string `bson:"last_name" json:"last_name"`
|
|
FullName string `bson:"full_name" json:"full_name"`
|
|
Position string `bson:"position" json:"position"`
|
|
Email string `bson:"email" json:"email"`
|
|
Phone string `bson:"phone" json:"phone"`
|
|
Mobile *string `bson:"mobile,omitempty" json:"mobile,omitempty"`
|
|
IsPrimary bool `bson:"is_primary" json:"is_primary"`
|
|
}
|
|
|
|
// CompanySummary represents company summary data for customer responses
|
|
type CompanySummary struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// CustomerResponse represents the customer data sent in API responses
|
|
type CustomerResponse struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Status string `json:"status"`
|
|
FirstName *string `json:"first_name,omitempty"`
|
|
LastName *string `json:"last_name,omitempty"`
|
|
FullName *string `json:"full_name,omitempty"`
|
|
Email string `json:"email"`
|
|
Phone *string `json:"phone,omitempty"`
|
|
Mobile *string `json:"mobile,omitempty"`
|
|
|
|
// Company relationships
|
|
Companies []*CompanySummary `json:"companies,omitempty"`
|
|
|
|
// Company customer fields
|
|
RegistrationNumber *string `json:"registration_number,omitempty"`
|
|
TaxID *string `json:"tax_id"`
|
|
Industry *string `json:"industry"`
|
|
Address *Address `json:"address"`
|
|
BusinessType *string `json:"business_type"`
|
|
EmployeeCount *int `json:"employee_count"`
|
|
AnnualRevenue *float64 `json:"annual_revenue"`
|
|
FoundedYear *int `json:"founded_year"`
|
|
ContactPerson *ContactPerson `json:"contact_person"`
|
|
IsVerified bool `json:"is_verified"`
|
|
IsCompliant bool `json:"is_compliant"`
|
|
ComplianceNotes *string `json:"compliance_notes"`
|
|
Language string `json:"language"`
|
|
Username string `json:"username"`
|
|
Currency string `json:"currency"`
|
|
Timezone string `json:"timezone"`
|
|
CreatedAt int64 `json:"created_at"`
|
|
UpdatedAt int64 `json:"updated_at"`
|
|
CreatedBy *string `json:"created_by"`
|
|
UpdatedBy *string `json:"updated_by"`
|
|
}
|
|
|
|
// ToResponse converts Customer to CustomerResponse
|
|
func (c *Customer) ToResponse() *CustomerResponse {
|
|
return &CustomerResponse{
|
|
ID: c.ID.Hex(),
|
|
Type: string(c.Type),
|
|
Status: string(c.Status),
|
|
FirstName: c.FirstName,
|
|
LastName: c.LastName,
|
|
FullName: c.FullName,
|
|
Username: c.Username,
|
|
Email: c.Email,
|
|
Phone: c.Phone,
|
|
Mobile: c.Mobile,
|
|
Companies: nil, // Will be populated by service layer
|
|
RegistrationNumber: c.RegistrationNumber,
|
|
TaxID: c.TaxID,
|
|
Industry: c.Industry,
|
|
Address: c.Address,
|
|
BusinessType: c.BusinessType,
|
|
EmployeeCount: c.EmployeeCount,
|
|
AnnualRevenue: c.AnnualRevenue,
|
|
FoundedYear: c.FoundedYear,
|
|
ContactPerson: c.ContactPerson,
|
|
IsVerified: c.IsVerified,
|
|
IsCompliant: c.IsCompliant,
|
|
ComplianceNotes: c.ComplianceNotes,
|
|
Language: c.Language,
|
|
Currency: c.Currency,
|
|
Timezone: c.Timezone,
|
|
CreatedAt: c.CreatedAt,
|
|
UpdatedAt: c.UpdatedAt,
|
|
CreatedBy: c.CreatedBy,
|
|
UpdatedBy: c.UpdatedBy,
|
|
}
|
|
}
|
|
|
|
// ToResponseWithCompanies converts Customer to CustomerResponse with company information
|
|
func (c *Customer) ToResponseWithCompanies(companies []*CompanySummary) *CustomerResponse {
|
|
response := c.ToResponse()
|
|
response.Companies = companies
|
|
return response
|
|
}
|