Files
zeekay ce753666c2 feat: add voting, communications, disclosure packages
Merged from luxfi/transfer into captable for single-library TA engine:

- pkg/voting: Proxy voting proposals, vote casting, quorum tracking,
  results aggregation (board elections, mergers, amendments)

- pkg/comms: Investor communications — notices (proxy, dividend,
  regulatory, K-1), recipient tracking, delivery/read status

- pkg/disclosure: Investor disclosures — PPM, subscription agreements,
  supplements, annual reports. Delivery + acknowledgment tracking.

All follow captable's repository pattern (types.go + repository.go + service.go).
2025-12-15 10:30:00 -08:00

47 lines
1.7 KiB
Go

package voting
import "time"
// Proposal is a shareholder voting proposal (board election, merger, amendment, etc.).
type Proposal struct {
ID string `json:"id"`
CompanyID string `json:"company_id"`
Title string `json:"title"`
Description string `json:"description"`
Type string `json:"type"` // board_election, amendment, merger, general
ShareClassIDs []string `json:"share_class_ids"`
RecordDate time.Time `json:"record_date"`
Deadline time.Time `json:"deadline"`
QuorumPercent float64 `json:"quorum_percent"`
Status string `json:"status"` // draft, open, closed, certified
CreatedAt time.Time `json:"created_at"`
}
// Vote is a single shareholder's vote on a proposal.
type Vote struct {
ID string `json:"id"`
ProposalID string `json:"proposal_id"`
StakeholderID string `json:"stakeholder_id"`
Choice string `json:"choice"` // for, against, abstain
SharesVoted int64 `json:"shares_voted"`
CastAt time.Time `json:"cast_at"`
}
// Results is the aggregated voting outcome for a proposal.
type Results struct {
ProposalID string `json:"proposal_id"`
TotalEligibleShares int64 `json:"total_eligible_shares"`
TotalVotedShares int64 `json:"total_voted_shares"`
QuorumMet bool `json:"quorum_met"`
For int64 `json:"for"`
Against int64 `json:"against"`
Abstain int64 `json:"abstain"`
Status string `json:"status"`
}
// ProposalFilter for listing proposals.
type ProposalFilter struct {
CompanyID string `json:"company_id,omitempty"`
Status string `json:"status,omitempty"`
}