210 lines
4.4 KiB
Go
210 lines
4.4 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// Now returns the current Unix timestamp
|
|
func Now() int64 {
|
|
return time.Now().Unix()
|
|
}
|
|
|
|
// TimeFromUnix converts Unix timestamp to time.Time
|
|
func TimeFromUnix(unix int64) time.Time {
|
|
return time.Unix(unix, 0)
|
|
}
|
|
|
|
type Organization struct {
|
|
ID string
|
|
Name string
|
|
Slug string
|
|
OrgType string // bank, pe_vc, company
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
type Profile struct {
|
|
ID string
|
|
Email string
|
|
FullName string
|
|
AvatarURL string
|
|
OrganizationID string
|
|
Role string // owner, admin, member, viewer
|
|
PasswordHash string
|
|
CreatedAt time.Time
|
|
LastLogin *time.Time
|
|
BuyerGroup string
|
|
ViewAsBuyer bool // Not persisted, set per-request from cookie
|
|
}
|
|
|
|
type Deal struct {
|
|
ID string
|
|
OrganizationID string
|
|
Name string
|
|
Description string
|
|
TargetCompany string
|
|
Stage string // pipeline, loi, initial_review, due_diligence, final_negotiation, closed, dead
|
|
DealSize float64
|
|
Currency string
|
|
IOIDate string
|
|
LOIDate string
|
|
ExclusivityEnd string
|
|
ExpectedCloseDate string
|
|
CloseProbability int
|
|
Industry string
|
|
BuyerCanComment bool
|
|
SellerCanComment bool
|
|
IsArchived bool
|
|
CreatedBy string
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
// Computed
|
|
FileCount int
|
|
}
|
|
|
|
type Folder struct {
|
|
ID string
|
|
DealID string
|
|
ParentID string
|
|
Name string
|
|
Description string
|
|
SortOrder int
|
|
CreatedBy string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
type File struct {
|
|
ID string
|
|
DealID string
|
|
FolderID string
|
|
Name string
|
|
FileSize int64
|
|
MimeType string
|
|
Status string // uploaded, processing, reviewed, flagged, archived
|
|
StoragePath string
|
|
ResponseID string
|
|
UploadedBy string
|
|
CreatedAt time.Time
|
|
ExtractionStatus string // computed from responses table
|
|
}
|
|
|
|
type DiligenceRequest struct {
|
|
ID string
|
|
DealID string
|
|
ItemNumber string
|
|
Section string
|
|
Description string
|
|
Priority string // high, medium, low
|
|
AtlasStatus string // fulfilled, partial, missing, not_applicable
|
|
AtlasNote string
|
|
Confidence int
|
|
BuyerComment string
|
|
SellerComment string
|
|
BuyerGroup string
|
|
LinkedFileIDs string
|
|
IsBuyerSpecific bool
|
|
VisibleToBuyerGroup string
|
|
AssigneeID string
|
|
Status string // open, in_progress, answered, not_applicable
|
|
CreatedBy string
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
// Computed
|
|
AssigneeName string
|
|
PendingMatches int
|
|
ConfirmedLinks int
|
|
}
|
|
|
|
type Contact struct {
|
|
ID string
|
|
OrganizationID string
|
|
FullName string
|
|
Email string
|
|
Phone string
|
|
Company string
|
|
Title string
|
|
ContactType string // buyer, internal, advisor
|
|
Tags string
|
|
Notes string
|
|
LastActivityAt *time.Time
|
|
CreatedAt time.Time
|
|
// Computed
|
|
DealNames []string
|
|
}
|
|
|
|
type DealActivity struct {
|
|
ID string
|
|
OrganizationID string
|
|
DealID string
|
|
UserID string
|
|
ActivityType string
|
|
ResourceType string
|
|
ResourceName string
|
|
ResourceID string
|
|
Details string
|
|
BuyerGroup string
|
|
TimeSpentSeconds int
|
|
CreatedAt time.Time
|
|
// Computed
|
|
UserName string
|
|
DealName string
|
|
}
|
|
|
|
type Session struct {
|
|
Token string
|
|
UserID string
|
|
ExpiresAt time.Time
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
type FileComment struct {
|
|
ID string
|
|
FileID string
|
|
DealID string
|
|
UserID string
|
|
Content string
|
|
CreatedAt time.Time
|
|
UserName string // computed
|
|
}
|
|
|
|
type Invite struct {
|
|
Token string
|
|
OrgID string
|
|
Email string
|
|
Role string
|
|
InvitedBy string
|
|
ExpiresAt time.Time
|
|
UsedAt *time.Time
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// StageName returns human-readable stage name
|
|
func StageName(stage string) string {
|
|
switch stage {
|
|
case "prospect":
|
|
return "Prospect"
|
|
case "internal":
|
|
return "Internal"
|
|
case "initial_marketing":
|
|
return "Initial Marketing"
|
|
case "ioi":
|
|
return "IOI"
|
|
case "loi":
|
|
return "LOI"
|
|
case "closed":
|
|
return "Closed"
|
|
// Legacy stages (backward compat)
|
|
case "pipeline":
|
|
return "Prospect"
|
|
case "initial_review":
|
|
return "Initial Marketing"
|
|
case "due_diligence":
|
|
return "IOI"
|
|
case "final_negotiation":
|
|
return "LOI"
|
|
case "dead":
|
|
return "Dead"
|
|
default:
|
|
return stage
|
|
}
|
|
}
|