243 lines
12 KiB
Go
243 lines
12 KiB
Go
package models
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/mayswind/ezbookkeeping/pkg/utils"
|
|
)
|
|
|
|
// TransactionTemplateType represents transaction template type in database
|
|
type TransactionTemplateType byte
|
|
|
|
// Transaction template types
|
|
const (
|
|
TRANSACTION_TEMPLATE_TYPE_NORMAL TransactionTemplateType = 1
|
|
TRANSACTION_TEMPLATE_TYPE_SCHEDULE TransactionTemplateType = 2
|
|
)
|
|
|
|
// TransactionScheduleFrequencyType represents transaction template schedule frequency type
|
|
type TransactionScheduleFrequencyType byte
|
|
|
|
// Transaction template schedule frequency types
|
|
const (
|
|
TRANSACTION_SCHEDULE_FREQUENCY_TYPE_DISABLED TransactionScheduleFrequencyType = 0
|
|
TRANSACTION_SCHEDULE_FREQUENCY_TYPE_WEEKLY TransactionScheduleFrequencyType = 1
|
|
TRANSACTION_SCHEDULE_FREQUENCY_TYPE_MONTHLY TransactionScheduleFrequencyType = 2
|
|
)
|
|
|
|
// TransactionTemplate represents transaction template stored in database
|
|
type TransactionTemplate struct {
|
|
TemplateId int64 `xorm:"PK"`
|
|
Uid int64 `xorm:"INDEX(IDX_transaction_template_uid_deleted_template_type_order) NOT NULL"`
|
|
Deleted bool `xorm:"INDEX(IDX_transaction_template_uid_deleted_template_type_order) INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time) NOT NULL"`
|
|
TemplateType TransactionTemplateType `xorm:"INDEX(IDX_transaction_template_uid_deleted_template_type_order) INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time) NOT NULL"`
|
|
Name string `xorm:"VARCHAR(64) NOT NULL"`
|
|
Type TransactionType `xorm:"NOT NULL"`
|
|
CategoryId int64 `xorm:"NOT NULL"`
|
|
AccountId int64 `xorm:"NOT NULL"`
|
|
ScheduledFrequencyType TransactionScheduleFrequencyType `xorm:"INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time)"`
|
|
ScheduledFrequency string `xorm:"VARCHAR(100)"`
|
|
ScheduledStartTime *int64 `xorm:"INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time)"`
|
|
ScheduledEndTime *int64 `xorm:"INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time)"`
|
|
ScheduledAt int16 `xorm:"INDEX(IDX_transaction_template_deleted_type_freqtype_scheduled_time)"`
|
|
ScheduledTimezoneUtcOffset int16
|
|
TagIds string `xorm:"VARCHAR(255) NOT NULL"`
|
|
Amount int64 `xorm:"NOT NULL"`
|
|
RelatedAccountId int64 `xorm:"NOT NULL"`
|
|
RelatedAccountAmount int64 `xorm:"NOT NULL"`
|
|
HideAmount bool `xorm:"NOT NULL"`
|
|
Comment string `xorm:"VARCHAR(255) NOT NULL"`
|
|
DisplayOrder int32 `xorm:"INDEX(IDX_transaction_template_uid_deleted_template_type_order) NOT NULL"`
|
|
Hidden bool `xorm:"NOT NULL"`
|
|
CreatedUnixTime int64
|
|
UpdatedUnixTime int64
|
|
DeletedUnixTime int64
|
|
}
|
|
|
|
// TransactionTemplateListRequest represents all parameters of transaction template list request
|
|
type TransactionTemplateListRequest struct {
|
|
TemplateType TransactionTemplateType `form:"templateType"`
|
|
}
|
|
|
|
// TransactionTemplateGetRequest represents all parameters of transaction template getting request
|
|
type TransactionTemplateGetRequest struct {
|
|
Id int64 `form:"id,string" binding:"required,min=1"`
|
|
}
|
|
|
|
// TransactionTemplateCreateRequest represents all parameters of transaction template creation request
|
|
type TransactionTemplateCreateRequest struct {
|
|
TemplateType TransactionTemplateType `json:"templateType"`
|
|
Name string `json:"name" binding:"required,notBlank,max=64"`
|
|
Type TransactionType `json:"type" binding:"required"`
|
|
CategoryId int64 `json:"categoryId,string" binding:"required,min=1"`
|
|
SourceAccountId int64 `json:"sourceAccountId,string" binding:"required,min=1"`
|
|
DestinationAccountId int64 `json:"destinationAccountId,string" binding:"min=0"`
|
|
SourceAmount int64 `json:"sourceAmount" binding:"min=-99999999999,max=99999999999"`
|
|
DestinationAmount int64 `json:"destinationAmount" binding:"min=-99999999999,max=99999999999"`
|
|
HideAmount bool `json:"hideAmount"`
|
|
TagIds []string `json:"tagIds"`
|
|
Comment string `json:"comment" binding:"max=255"`
|
|
ScheduledFrequencyType *TransactionScheduleFrequencyType `json:"scheduledFrequencyType" binding:"omitempty"`
|
|
ScheduledFrequency *string `json:"scheduledFrequency" binding:"omitempty"`
|
|
ScheduledStartDate *string `json:"scheduledStartDate" binding:"omitempty"`
|
|
ScheduledEndDate *string `json:"scheduledEndDate" binding:"omitempty"`
|
|
ScheduledTimezoneUtcOffset *int16 `json:"utcOffset" binding:"omitempty,min=-720,max=840"`
|
|
ClientSessionId string `json:"clientSessionId"`
|
|
}
|
|
|
|
// TransactionTemplateModifyNameRequest represents all parameters of transaction template name modification request
|
|
type TransactionTemplateModifyNameRequest struct {
|
|
Id int64 `json:"id,string" binding:"required,min=1"`
|
|
Name string `json:"name" binding:"required,notBlank,max=64"`
|
|
}
|
|
|
|
// TransactionTemplateModifyRequest represents all parameters of transaction template modification request
|
|
type TransactionTemplateModifyRequest struct {
|
|
Id int64 `json:"id,string" binding:"required,min=1"`
|
|
Name string `json:"name" binding:"required,notBlank,max=64"`
|
|
Type TransactionType `json:"type" binding:"required"`
|
|
CategoryId int64 `json:"categoryId,string" binding:"required,min=1"`
|
|
SourceAccountId int64 `json:"sourceAccountId,string" binding:"required,min=1"`
|
|
DestinationAccountId int64 `json:"destinationAccountId,string" binding:"min=0"`
|
|
SourceAmount int64 `json:"sourceAmount" binding:"min=-99999999999,max=99999999999"`
|
|
DestinationAmount int64 `json:"destinationAmount" binding:"min=-99999999999,max=99999999999"`
|
|
HideAmount bool `json:"hideAmount"`
|
|
TagIds []string `json:"tagIds"`
|
|
Comment string `json:"comment" binding:"max=255"`
|
|
ScheduledFrequencyType *TransactionScheduleFrequencyType `json:"scheduledFrequencyType" binding:"omitempty"`
|
|
ScheduledFrequency *string `json:"scheduledFrequency" binding:"omitempty"`
|
|
ScheduledStartDate *string `json:"scheduledStartDate" binding:"omitempty"`
|
|
ScheduledEndDate *string `json:"scheduledEndDate" binding:"omitempty"`
|
|
ScheduledTimezoneUtcOffset *int16 `json:"utcOffset" binding:"omitempty,min=-720,max=840"`
|
|
}
|
|
|
|
// TransactionTemplateHideRequest represents all parameters of transaction template hiding request
|
|
type TransactionTemplateHideRequest struct {
|
|
Id int64 `json:"id,string" binding:"required,min=1"`
|
|
Hidden bool `json:"hidden"`
|
|
}
|
|
|
|
// TransactionTemplateMoveRequest represents all parameters of transaction template moving request
|
|
type TransactionTemplateMoveRequest struct {
|
|
NewDisplayOrders []*TransactionTemplateNewDisplayOrderRequest `json:"newDisplayOrders" binding:"required,min=1"`
|
|
}
|
|
|
|
// TransactionTemplateNewDisplayOrderRequest represents a data pair of id and display order
|
|
type TransactionTemplateNewDisplayOrderRequest struct {
|
|
Id int64 `json:"id,string" binding:"required,min=1"`
|
|
DisplayOrder int32 `json:"displayOrder"`
|
|
}
|
|
|
|
// TransactionTemplateDeleteRequest represents all parameters of transaction template deleting request
|
|
type TransactionTemplateDeleteRequest struct {
|
|
Id int64 `json:"id,string" binding:"required,min=1"`
|
|
}
|
|
|
|
type TransactionTemplateInfoResponse struct {
|
|
*TransactionInfoResponse
|
|
TemplateType TransactionTemplateType `json:"templateType"`
|
|
Name string `json:"name"`
|
|
ScheduledFrequencyType *TransactionScheduleFrequencyType `json:"scheduledFrequencyType,omitempty"`
|
|
ScheduledFrequency *string `json:"scheduledFrequency,omitempty"`
|
|
ScheduledStartDate *string `json:"scheduledStartDate" binding:"omitempty"`
|
|
ScheduledEndDate *string `json:"scheduledEndDate" binding:"omitempty"`
|
|
ScheduledAt *int16 `json:"scheduledAt,omitempty"`
|
|
DisplayOrder int32 `json:"displayOrder"`
|
|
Hidden bool `json:"hidden"`
|
|
}
|
|
|
|
// GetTagIds returns all tag ids of the transaction template
|
|
func (t *TransactionTemplate) GetTagIds() []int64 {
|
|
tagIds := make([]string, 0)
|
|
|
|
if t.TagIds != "" {
|
|
tagIds = strings.Split(t.TagIds, ",")
|
|
}
|
|
|
|
result, _ := utils.StringArrayToInt64Array(tagIds)
|
|
|
|
return result
|
|
}
|
|
|
|
// ToTransactionTemplateInfoResponse returns a view-object according to database model
|
|
func (t *TransactionTemplate) ToTransactionTemplateInfoResponse(serverUtcOffset int16) *TransactionTemplateInfoResponse {
|
|
utcOffset := serverUtcOffset
|
|
|
|
if t.TemplateType == TRANSACTION_TEMPLATE_TYPE_SCHEDULE {
|
|
utcOffset = t.ScheduledTimezoneUtcOffset
|
|
}
|
|
|
|
response := &TransactionTemplateInfoResponse{
|
|
TransactionInfoResponse: t.toTransactionInfoResponse(utcOffset),
|
|
TemplateType: t.TemplateType,
|
|
Name: t.Name,
|
|
DisplayOrder: t.DisplayOrder,
|
|
Hidden: t.Hidden,
|
|
}
|
|
|
|
if t.TemplateType == TRANSACTION_TEMPLATE_TYPE_SCHEDULE {
|
|
response.ScheduledFrequencyType = &t.ScheduledFrequencyType
|
|
response.ScheduledFrequency = &t.ScheduledFrequency
|
|
response.ScheduledAt = &t.ScheduledAt
|
|
|
|
templateTimeZone := time.FixedZone("Template Timezone", int(t.ScheduledTimezoneUtcOffset)*60)
|
|
|
|
if t.ScheduledStartTime != nil {
|
|
startDate := utils.FormatUnixTimeToLongDate(*t.ScheduledStartTime, templateTimeZone)
|
|
response.ScheduledStartDate = &startDate
|
|
}
|
|
|
|
if t.ScheduledEndTime != nil {
|
|
endDate := utils.FormatUnixTimeToLongDate(*t.ScheduledEndTime, templateTimeZone)
|
|
response.ScheduledEndDate = &endDate
|
|
}
|
|
}
|
|
|
|
return response
|
|
}
|
|
|
|
func (t *TransactionTemplate) toTransactionInfoResponse(utcOffset int16) *TransactionInfoResponse {
|
|
tagIds := make([]string, 0, 0)
|
|
|
|
if t.TagIds != "" {
|
|
tagIds = strings.Split(t.TagIds, ",")
|
|
}
|
|
|
|
return &TransactionInfoResponse{
|
|
Id: t.TemplateId,
|
|
TimeSequenceId: utils.GetMinTransactionTimeFromUnixTime(t.CreatedUnixTime),
|
|
Type: t.Type,
|
|
CategoryId: t.CategoryId,
|
|
Time: 0,
|
|
UtcOffset: utcOffset,
|
|
SourceAccountId: t.AccountId,
|
|
DestinationAccountId: t.RelatedAccountId,
|
|
SourceAmount: t.Amount,
|
|
DestinationAmount: t.RelatedAccountAmount,
|
|
HideAmount: t.HideAmount,
|
|
TagIds: tagIds,
|
|
Comment: t.Comment,
|
|
GeoLocation: nil,
|
|
Editable: true,
|
|
}
|
|
}
|
|
|
|
// TransactionTemplateInfoResponseSlice represents the slice data structure of TransactionTemplateInfoResponse
|
|
type TransactionTemplateInfoResponseSlice []*TransactionTemplateInfoResponse
|
|
|
|
// Len returns the count of items
|
|
func (s TransactionTemplateInfoResponseSlice) Len() int {
|
|
return len(s)
|
|
}
|
|
|
|
// Swap swaps two items
|
|
func (s TransactionTemplateInfoResponseSlice) Swap(i, j int) {
|
|
s[i], s[j] = s[j], s[i]
|
|
}
|
|
|
|
// Less reports whether the first item is less than the second one
|
|
func (s TransactionTemplateInfoResponseSlice) Less(i, j int) bool {
|
|
return s[i].DisplayOrder < s[j].DisplayOrder
|
|
}
|