This is an automated email from the ASF dual-hosted git repository.

abeizn pushed a commit to branch fix#6801
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/fix#6801 by this push:
     new 6fa3aa3e9 fix: make some plugin time filed default null
6fa3aa3e9 is described below

commit 6fa3aa3e936436c4990321c2dfe99310435ca82f
Author: abeizn <[email protected]>
AuthorDate: Mon Jan 15 15:55:45 2024 +0800

    fix: make some plugin time filed default null
---
 backend/core/models/domainlayer/ticket/issue.go    | 14 ++---
 ...0240115_modify_issue_leadtimeminutes_to_uint.go | 68 ++++++++++++++++++++++
 ...leds_sort.go => 20240116_modify_fileds_sort.go} |  6 +-
 backend/core/models/migrationscripts/register.go   |  1 +
 backend/plugins/bitbucket/models/issue.go          |  5 +-
 backend/plugins/bitbucket/tasks/issue_convertor.go |  7 ++-
 backend/plugins/gitee/models/issue.go              |  5 +-
 backend/plugins/gitee/tasks/issue_convertor.go     |  2 +-
 backend/plugins/gitee/tasks/issue_extractor.go     |  3 +-
 backend/plugins/github/models/issue.go             |  2 +-
 backend/plugins/github/tasks/issue_convertor.go    |  2 +-
 backend/plugins/github/tasks/issue_extractor.go    |  3 +-
 .../github_graphql/tasks/issue_extractor.go        |  3 +-
 backend/plugins/gitlab/models/issue.go             |  9 +--
 backend/plugins/gitlab/tasks/issue_convertor.go    |  2 +-
 backend/plugins/gitlab/tasks/issue_extractor.go    |  7 ++-
 backend/plugins/jira/models/issue.go               |  8 +--
 backend/plugins/jira/tasks/apiv2models/issue.go    |  8 ++-
 backend/plugins/jira/tasks/issue_convertor.go      |  2 +-
 backend/plugins/jira/tasks/issue_extractor.go      |  9 ++-
 .../plugins/opsgenie/tasks/incidents_converter.go  |  7 ++-
 .../plugins/pagerduty/tasks/incidents_converter.go |  7 ++-
 backend/plugins/tapd/tasks/bug_converter.go        | 10 ++--
 backend/plugins/tapd/tasks/story_converter.go      |  9 ++-
 backend/plugins/tapd/tasks/task_converter.go       | 10 ++--
 backend/plugins/teambition/tasks/task_converter.go | 18 +++---
 backend/plugins/webhook/api/incident.go            | 10 ++--
 backend/plugins/zentao/tasks/bug_convertor.go      |  3 +-
 backend/plugins/zentao/tasks/story_convertor.go    |  9 +--
 backend/plugins/zentao/tasks/task_convertor.go     | 12 ++--
 30 files changed, 182 insertions(+), 79 deletions(-)

diff --git a/backend/core/models/domainlayer/ticket/issue.go 
b/backend/core/models/domainlayer/ticket/issue.go
index 1ef02d4a6..8c8a9c067 100644
--- a/backend/core/models/domainlayer/ticket/issue.go
+++ b/backend/core/models/domainlayer/ticket/issue.go
@@ -35,20 +35,20 @@ type Issue struct {
        OriginalType            string `gorm:"type:varchar(500)"`
        Status                  string `gorm:"type:varchar(100)"`
        OriginalStatus          string `gorm:"type:varchar(100)"`
-       StoryPoint              float64
+       StoryPoint              *float64
        ResolutionDate          *time.Time
        CreatedDate             *time.Time
        UpdatedDate             *time.Time
-       LeadTimeMinutes         int64
-       ParentIssueId           string `gorm:"type:varchar(255)"`
-       Priority                string `gorm:"type:varchar(255)"`
-       OriginalEstimateMinutes int64
-       TimeSpentMinutes        int64
-       TimeRemainingMinutes    int64
+       LeadTimeMinutes         *uint
+       OriginalEstimateMinutes *int64
+       TimeSpentMinutes        *int64
+       TimeRemainingMinutes    *int64
        CreatorId               string `gorm:"type:varchar(255)"`
        CreatorName             string `gorm:"type:varchar(255)"`
        AssigneeId              string `gorm:"type:varchar(255)"`
        AssigneeName            string `gorm:"type:varchar(255)"`
+       ParentIssueId           string `gorm:"type:varchar(255)"`
+       Priority                string `gorm:"type:varchar(255)"`
        Severity                string `gorm:"type:varchar(255)"`
        Component               string `gorm:"type:varchar(255)"`
        OriginalProject         string `gorm:"type:varchar(255)"`
diff --git 
a/backend/core/models/migrationscripts/20240115_modify_issue_leadtimeminutes_to_uint.go
 
b/backend/core/models/migrationscripts/20240115_modify_issue_leadtimeminutes_to_uint.go
new file mode 100644
index 000000000..77c02d193
--- /dev/null
+++ 
b/backend/core/models/migrationscripts/20240115_modify_issue_leadtimeminutes_to_uint.go
@@ -0,0 +1,68 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package migrationscripts
+
+import (
+       "github.com/apache/incubator-devlake/core/context"
+       "github.com/apache/incubator-devlake/core/dal"
+       "github.com/apache/incubator-devlake/core/errors"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/helpers/migrationhelper"
+)
+
+var _ plugin.MigrationScript = (*modifyIssueLeadTimeMinutesToUint)(nil)
+
+type issue20240115 struct {
+       LeadTimeMinutes *uint
+}
+
+func (issue20240115) TableName() string {
+       return "issues"
+}
+
+type modifyIssueLeadTimeMinutesToUint struct{}
+
+func (u *modifyIssueLeadTimeMinutesToUint) Up(basicRes context.BasicRes) 
errors.Error {
+       db := basicRes.GetDal()
+       if err := migrationhelper.ChangeColumnsType[issue20240115](
+               basicRes,
+               u,
+               issue20240115{}.TableName(),
+               []string{"lead_time_minutes"},
+               func(tmpColumnParams []interface{}) errors.Error {
+                       return db.UpdateColumn(
+                               &issue20240115{},
+                               "lead_time_minutes",
+                               dal.DalClause{Expr: " ? ", Params: 
tmpColumnParams},
+                               dal.Where("? != 0", tmpColumnParams...),
+                       )
+               },
+       ); err != nil {
+               return err
+       }
+
+       return nil
+}
+
+func (*modifyIssueLeadTimeMinutesToUint) Version() uint64 {
+       return 20240115170000
+}
+
+func (*modifyIssueLeadTimeMinutesToUint) Name() string {
+       return "modify issues lead_time_minutes to *uint"
+}
diff --git 
a/backend/core/models/migrationscripts/20240108_modify_fileds_sort.go 
b/backend/core/models/migrationscripts/20240116_modify_fileds_sort.go
similarity index 97%
rename from backend/core/models/migrationscripts/20240108_modify_fileds_sort.go
rename to backend/core/models/migrationscripts/20240116_modify_fileds_sort.go
index 27f16a2cf..c2359f891 100644
--- a/backend/core/models/migrationscripts/20240108_modify_fileds_sort.go
+++ b/backend/core/models/migrationscripts/20240116_modify_fileds_sort.go
@@ -46,6 +46,10 @@ func (*modfiyFieldsSort) Up(baseRes context.BasicRes) 
errors.Error {
                if err != nil {
                        return err
                }
+               err = db.Exec("alter table issues modify lead_time_minutes 
bigint after updated_date;")
+               if err != nil {
+                       return err
+               }
                // pull_requests
                err = db.Exec("alter table pull_requests modify base_ref 
varchar(255) after base_repo_id;")
                if err != nil {
@@ -180,7 +184,7 @@ func (*modfiyFieldsSort) Up(baseRes context.BasicRes) 
errors.Error {
 }
 
 func (*modfiyFieldsSort) Version() uint64 {
-       return 20240108000008
+       return 20240116000011
 }
 
 func (*modfiyFieldsSort) Name() string {
diff --git a/backend/core/models/migrationscripts/register.go 
b/backend/core/models/migrationscripts/register.go
index 13a9192ff..74377d7d0 100644
--- a/backend/core/models/migrationscripts/register.go
+++ b/backend/core/models/migrationscripts/register.go
@@ -104,5 +104,6 @@ func All() []plugin.MigrationScript {
                new(modifyIssueOriginalTypeLength),
                new(addCommitMsgtoPipelineCommit),
                new(modfiyFieldsSort),
+               new(modifyIssueLeadTimeMinutesToUint),
        }
 }
diff --git a/backend/plugins/bitbucket/models/issue.go 
b/backend/plugins/bitbucket/models/issue.go
index 4032d3505..c4f0d20fb 100644
--- a/backend/plugins/bitbucket/models/issue.go
+++ b/backend/plugins/bitbucket/models/issue.go
@@ -18,8 +18,9 @@ limitations under the License.
 package models
 
 import (
-       "github.com/apache/incubator-devlake/core/models/common"
        "time"
+
+       "github.com/apache/incubator-devlake/core/models/common"
 )
 
 type BitbucketIssue struct {
@@ -38,7 +39,7 @@ type BitbucketIssue struct {
        AssigneeId         string `gorm:"type:varchar(255)"`
        AssigneeName       string `gorm:"type:varchar(255)"`
        MilestoneId        int    `gorm:"index"`
-       LeadTimeMinutes    uint
+       LeadTimeMinutes    *uint
        Url                string `gorm:"type:varchar(255)"`
        ClosedAt           *time.Time
        BitbucketCreatedAt time.Time
diff --git a/backend/plugins/bitbucket/tasks/issue_convertor.go 
b/backend/plugins/bitbucket/tasks/issue_convertor.go
index 04c4f599b..3c3455fbb 100644
--- a/backend/plugins/bitbucket/tasks/issue_convertor.go
+++ b/backend/plugins/bitbucket/tasks/issue_convertor.go
@@ -18,6 +18,9 @@ limitations under the License.
 package tasks
 
 import (
+       "reflect"
+       "strconv"
+
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
@@ -26,8 +29,6 @@ import (
        plugin "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/bitbucket/models"
-       "reflect"
-       "strconv"
 )
 
 var ConvertIssuesMeta = plugin.SubTaskMeta{
@@ -72,8 +73,8 @@ func ConvertIssues(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Type:            issue.Type,
                                Status:          issue.StdState,
                                OriginalStatus:  issue.State,
-                               LeadTimeMinutes: int64(issue.LeadTimeMinutes),
                                Url:             issue.Url,
+                               LeadTimeMinutes: issue.LeadTimeMinutes,
                                CreatedDate:     &issue.BitbucketCreatedAt,
                                UpdatedDate:     &issue.BitbucketUpdatedAt,
                                ResolutionDate:  issue.ClosedAt,
diff --git a/backend/plugins/gitee/models/issue.go 
b/backend/plugins/gitee/models/issue.go
index 3be7ab84b..0753f46f1 100644
--- a/backend/plugins/gitee/models/issue.go
+++ b/backend/plugins/gitee/models/issue.go
@@ -18,8 +18,9 @@ limitations under the License.
 package models
 
 import (
-       "github.com/apache/incubator-devlake/core/models/common"
        "time"
+
+       "github.com/apache/incubator-devlake/core/models/common"
 )
 
 type GiteeIssue struct {
@@ -37,7 +38,7 @@ type GiteeIssue struct {
        AuthorName      string `gorm:"type:varchar(255)"`
        AssigneeId      int
        AssigneeName    string `gorm:"type:varchar(255)"`
-       LeadTimeMinutes uint
+       LeadTimeMinutes *uint
        Url             string `gorm:"type:varchar(255)"`
        ClosedAt        *time.Time
        GiteeCreatedAt  time.Time
diff --git a/backend/plugins/gitee/tasks/issue_convertor.go 
b/backend/plugins/gitee/tasks/issue_convertor.go
index 8cf0f86d3..0662c3e97 100644
--- a/backend/plugins/gitee/tasks/issue_convertor.go
+++ b/backend/plugins/gitee/tasks/issue_convertor.go
@@ -73,7 +73,7 @@ func ConvertIssues(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Type:            issue.Type,
                                AssigneeName:    issue.AssigneeName,
                                CreatorName:     issue.AuthorName,
-                               LeadTimeMinutes: int64(issue.LeadTimeMinutes),
+                               LeadTimeMinutes: issue.LeadTimeMinutes,
                                Url:             issue.Url,
                                CreatedDate:     &issue.GiteeCreatedAt,
                                UpdatedDate:     &issue.GiteeUpdatedAt,
diff --git a/backend/plugins/gitee/tasks/issue_extractor.go 
b/backend/plugins/gitee/tasks/issue_extractor.go
index 5f20ec8fa..93ee490b3 100644
--- a/backend/plugins/gitee/tasks/issue_extractor.go
+++ b/backend/plugins/gitee/tasks/issue_extractor.go
@@ -231,7 +231,8 @@ func convertGiteeIssue(issue *IssuesResponse, connectionId 
uint64, repositoryId
                giteeIssue.AuthorName = issue.User.Login
        }
        if issue.FinishAt != nil {
-               giteeIssue.LeadTimeMinutes = 
uint(issue.FinishAt.ToTime().Sub(issue.GiteeCreatedAt.ToTime()).Minutes())
+               temp := 
uint(issue.FinishAt.ToTime().Sub(issue.GiteeCreatedAt.ToTime()).Minutes())
+               giteeIssue.LeadTimeMinutes = &temp
        }
 
        return giteeIssue, nil
diff --git a/backend/plugins/github/models/issue.go 
b/backend/plugins/github/models/issue.go
index 34be4d42f..80e071cc5 100644
--- a/backend/plugins/github/models/issue.go
+++ b/backend/plugins/github/models/issue.go
@@ -39,7 +39,7 @@ type GithubIssue struct {
        AssigneeId      int
        AssigneeName    string `gorm:"type:varchar(255)"`
        MilestoneId     int    `gorm:"index"`
-       LeadTimeMinutes uint
+       LeadTimeMinutes *uint
        Url             string `gorm:"type:varchar(255)"`
        ClosedAt        *time.Time
        GithubCreatedAt time.Time
diff --git a/backend/plugins/github/tasks/issue_convertor.go 
b/backend/plugins/github/tasks/issue_convertor.go
index 165f21835..a1c5f9188 100644
--- a/backend/plugins/github/tasks/issue_convertor.go
+++ b/backend/plugins/github/tasks/issue_convertor.go
@@ -95,7 +95,7 @@ func ConvertIssues(taskCtx plugin.SubTaskContext) 
errors.Error {
                                OriginalStatus:  issue.State,
                                AssigneeName:    issue.AssigneeName,
                                CreatorName:     issue.AuthorName,
-                               LeadTimeMinutes: int64(issue.LeadTimeMinutes),
+                               LeadTimeMinutes: issue.LeadTimeMinutes,
                                Url:             issue.Url,
                                CreatedDate:     &issue.GithubCreatedAt,
                                UpdatedDate:     &issue.GithubUpdatedAt,
diff --git a/backend/plugins/github/tasks/issue_extractor.go 
b/backend/plugins/github/tasks/issue_extractor.go
index 974ad397d..4dbce5bee 100644
--- a/backend/plugins/github/tasks/issue_extractor.go
+++ b/backend/plugins/github/tasks/issue_extractor.go
@@ -193,7 +193,8 @@ func convertGithubIssue(issue *IssuesResponse, connectionId 
uint64, repositoryId
                githubIssue.AuthorName = issue.User.Login
        }
        if issue.ClosedAt != nil {
-               githubIssue.LeadTimeMinutes = 
uint(issue.ClosedAt.ToTime().Sub(issue.GithubCreatedAt.ToTime()).Minutes())
+               temp := 
uint(issue.ClosedAt.ToTime().Sub(issue.GithubCreatedAt.ToTime()).Minutes())
+               githubIssue.LeadTimeMinutes = &temp
        }
        if issue.Milestone != nil {
                githubIssue.MilestoneId = issue.Milestone.Id
diff --git a/backend/plugins/github_graphql/tasks/issue_extractor.go 
b/backend/plugins/github_graphql/tasks/issue_extractor.go
index 355343e0c..ca95e1dd8 100644
--- a/backend/plugins/github_graphql/tasks/issue_extractor.go
+++ b/backend/plugins/github_graphql/tasks/issue_extractor.go
@@ -152,7 +152,8 @@ func convertGithubIssue(milestoneMap map[int]int, issue 
GraphqlQueryIssue, conne
                githubIssue.AuthorName = issue.Author.Login
        }
        if issue.ClosedAt != nil {
-               githubIssue.LeadTimeMinutes = 
uint(issue.ClosedAt.Sub(issue.CreatedAt).Minutes())
+               temp := uint(issue.ClosedAt.Sub(issue.CreatedAt).Minutes())
+               githubIssue.LeadTimeMinutes = &temp
        }
        if issue.Milestone != nil {
                if milestoneId, ok := milestoneMap[issue.Milestone.Number]; ok {
diff --git a/backend/plugins/gitlab/models/issue.go 
b/backend/plugins/gitlab/models/issue.go
index 749ae62b8..5d57d6806 100644
--- a/backend/plugins/gitlab/models/issue.go
+++ b/backend/plugins/gitlab/models/issue.go
@@ -18,8 +18,9 @@ limitations under the License.
 package models
 
 import (
-       "github.com/apache/incubator-devlake/core/models/common"
        "time"
+
+       "github.com/apache/incubator-devlake/core/models/common"
 )
 
 type GitlabIssue struct {
@@ -38,15 +39,15 @@ type GitlabIssue struct {
        CreatorName     string `gorm:"type:varchar(255)"`
        AssigneeId      int
        AssigneeName    string `gorm:"type:varchar(255)"`
-       LeadTimeMinutes uint
+       LeadTimeMinutes *uint
        Url             string `gorm:"type:varchar(255)"`
        ClosedAt        *time.Time
        GitlabCreatedAt time.Time
        GitlabUpdatedAt time.Time `gorm:"index"`
        Severity        string    `gorm:"type:varchar(255)"`
        Component       string    `gorm:"type:varchar(255)"`
-       TimeEstimate    int64
-       TotalTimeSpent  int64
+       TimeEstimate    *int64
+       TotalTimeSpent  *int64
        common.NoPKModel
 }
 
diff --git a/backend/plugins/gitlab/tasks/issue_convertor.go 
b/backend/plugins/gitlab/tasks/issue_convertor.go
index 879c0df0a..8a09bd7d2 100644
--- a/backend/plugins/gitlab/tasks/issue_convertor.go
+++ b/backend/plugins/gitlab/tasks/issue_convertor.go
@@ -78,7 +78,7 @@ func ConvertIssues(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Description:             issue.Body,
                                Priority:                issue.Priority,
                                OriginalType:            issue.Type,
-                               LeadTimeMinutes:         
int64(issue.LeadTimeMinutes),
+                               LeadTimeMinutes:         issue.LeadTimeMinutes,
                                Url:                     issue.Url,
                                CreatedDate:             &issue.GitlabCreatedAt,
                                UpdatedDate:             &issue.GitlabUpdatedAt,
diff --git a/backend/plugins/gitlab/tasks/issue_extractor.go 
b/backend/plugins/gitlab/tasks/issue_extractor.go
index 88943459a..860834e99 100644
--- a/backend/plugins/gitlab/tasks/issue_extractor.go
+++ b/backend/plugins/gitlab/tasks/issue_extractor.go
@@ -110,8 +110,8 @@ type IssuesResponse struct {
                Full     string
        }
        TimeStats struct {
-               TimeEstimate        int64
-               TotalTimeSpent      int64
+               TimeEstimate        *int64
+               TotalTimeSpent      *int64
                HumanTimeEstimate   string
                HumanTotalTimeSpent string
        }
@@ -308,7 +308,8 @@ func convertGitlabIssue(issue *IssuesResponse, projectId 
int) (*models.GitlabIss
                gitlabIssue.CreatorName = issue.Author.Username
        }
        if issue.GitlabClosedAt != nil {
-               gitlabIssue.LeadTimeMinutes = 
uint(issue.GitlabClosedAt.ToTime().Sub(issue.GitlabCreatedAt.ToTime()).Minutes())
+               temp := 
uint(issue.GitlabClosedAt.ToTime().Sub(issue.GitlabCreatedAt.ToTime()).Minutes())
+               gitlabIssue.LeadTimeMinutes = &temp
        }
 
        return gitlabIssue, nil
diff --git a/backend/plugins/jira/models/issue.go 
b/backend/plugins/jira/models/issue.go
index f2c0f9f83..489118831 100644
--- a/backend/plugins/jira/models/issue.go
+++ b/backend/plugins/jira/models/issue.go
@@ -38,8 +38,8 @@ type JiraIssue struct {
        EpicKey                  string `gorm:"type:varchar(255)"`
        StatusName               string `gorm:"type:varchar(255)"`
        StatusKey                string `gorm:"type:varchar(255)"`
-       StoryPoint               float64
-       OriginalEstimateMinutes  int64  // user input?
+       StoryPoint               *float64
+       OriginalEstimateMinutes  *int64 // user input?
        AggregateEstimateMinutes int64  // sum up of all subtasks?
        RemainingEstimateMinutes int64  // could it be negative value?
        CreatorAccountId         string `gorm:"type:varchar(255)"`
@@ -57,9 +57,9 @@ type JiraIssue struct {
        ResolutionDate           *time.Time
        Created                  time.Time
        Updated                  time.Time `gorm:"index"`
-       SpentMinutes             int64
+       SpentMinutes             *int64
        CommentTotal             int64
-       LeadTimeMinutes          uint
+       LeadTimeMinutes          *uint
        StdType                  string `gorm:"type:varchar(255)"`
        StdStatus                string `gorm:"type:varchar(255)"`
        Components               string `gorm:"type:varchar(255)"`
diff --git a/backend/plugins/jira/tasks/apiv2models/issue.go 
b/backend/plugins/jira/tasks/apiv2models/issue.go
index 732783940..2ebace7c4 100644
--- a/backend/plugins/jira/tasks/apiv2models/issue.go
+++ b/backend/plugins/jira/tasks/apiv2models/issue.go
@@ -227,7 +227,7 @@ func (i Issue) toToolLayer(connectionId uint64) 
*models.JiraIssue {
                Self:               i.Self,
                IconURL:            i.Fields.Issuetype.IconURL,
                IssueKey:           i.Key,
-               StoryPoint:         workload,
+               StoryPoint:         &workload,
                Summary:            i.Fields.Summary,
                Description:        i.Fields.Description,
                Type:               i.Fields.Issuetype.ID,
@@ -254,7 +254,8 @@ func (i Issue) toToolLayer(connectionId uint64) 
*models.JiraIssue {
                result.PriorityName = i.Fields.Priority.Name
        }
        if i.Fields.Timeoriginalestimate != nil {
-               result.OriginalEstimateMinutes = *i.Fields.Timeoriginalestimate 
/ 60
+               temp := *i.Fields.Timeoriginalestimate / 60
+               result.OriginalEstimateMinutes = &temp
        }
        if i.Fields.Aggregatetimeestimate != nil {
                result.AggregateEstimateMinutes = 
*i.Fields.Aggregatetimeestimate / 60
@@ -271,7 +272,8 @@ func (i Issue) toToolLayer(connectionId uint64) 
*models.JiraIssue {
                result.SprintName = i.Fields.Sprint.Name
        }
        if i.Fields.Timespent != nil {
-               result.SpentMinutes = *i.Fields.Timespent / 60
+               temp := *i.Fields.Timespent / 60
+               result.SpentMinutes = &temp
        }
        return result
 }
diff --git a/backend/plugins/jira/tasks/issue_convertor.go 
b/backend/plugins/jira/tasks/issue_convertor.go
index bdb24444e..e82ae3995 100644
--- a/backend/plugins/jira/tasks/issue_convertor.go
+++ b/backend/plugins/jira/tasks/issue_convertor.go
@@ -103,7 +103,7 @@ func ConvertIssues(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Priority:                jiraIssue.PriorityName,
                                CreatedDate:             &jiraIssue.Created,
                                UpdatedDate:             &jiraIssue.Updated,
-                               LeadTimeMinutes:         
int64(jiraIssue.LeadTimeMinutes),
+                               LeadTimeMinutes:         
jiraIssue.LeadTimeMinutes,
                                TimeSpentMinutes:        jiraIssue.SpentMinutes,
                                OriginalProject:         jiraIssue.ProjectName,
                                Component:               jiraIssue.Components,
diff --git a/backend/plugins/jira/tasks/issue_extractor.go 
b/backend/plugins/jira/tasks/issue_extractor.go
index c2346bcb2..d2230bd74 100644
--- a/backend/plugins/jira/tasks/issue_extractor.go
+++ b/backend/plugins/jira/tasks/issue_extractor.go
@@ -111,18 +111,21 @@ func extractIssues(data *JiraTaskData, mappings 
*typeMappings, row *api.RawData)
                results = append(results, sprintIssue)
        }
        if issue.ResolutionDate != nil {
-               issue.LeadTimeMinutes = 
uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) / 60
+               temp := uint(issue.ResolutionDate.Unix()-issue.Created.Unix()) 
/ 60
+               issue.LeadTimeMinutes = &temp
        }
        if data.Options.ScopeConfig != nil && 
data.Options.ScopeConfig.StoryPointField != "" {
                unknownStoryPoint := 
apiIssue.Fields.AllFields[data.Options.ScopeConfig.StoryPointField]
                switch sp := unknownStoryPoint.(type) {
                case string:
                        // string, try to parse
-                       issue.StoryPoint, _ = strconv.ParseFloat(sp, 32)
+                       temp, _ := strconv.ParseFloat(sp, 32)
+                       issue.StoryPoint = &temp
                case nil:
                default:
                        // not string, convert to float64, ignore it if failed
-                       issue.StoryPoint, _ = unknownStoryPoint.(float64)
+                       temp, _ := unknownStoryPoint.(float64)
+                       issue.StoryPoint = &temp
                }
 
        }
diff --git a/backend/plugins/opsgenie/tasks/incidents_converter.go 
b/backend/plugins/opsgenie/tasks/incidents_converter.go
index 82d5406d2..7ff88624d 100644
--- a/backend/plugins/opsgenie/tasks/incidents_converter.go
+++ b/backend/plugins/opsgenie/tasks/incidents_converter.go
@@ -157,12 +157,13 @@ func getStatus(incident *models.Incident) string {
        panic("unknown incident status encountered")
 }
 
-func getTimes(incident *models.Incident) (int64, *time.Time) {
-       var leadTime int64
+func getTimes(incident *models.Incident) (*uint, *time.Time) {
+       var leadTime *uint
        var resolutionDate *time.Time
        if incident.Status == models.IncidentStatusResolved {
                resolutionDate = &incident.UpdatedDate
-               leadTime = 
int64(resolutionDate.Sub(incident.CreatedDate).Minutes())
+               temp := uint(resolutionDate.Sub(incident.CreatedDate).Minutes())
+               leadTime = &temp
        }
        return leadTime, resolutionDate
 }
diff --git a/backend/plugins/pagerduty/tasks/incidents_converter.go 
b/backend/plugins/pagerduty/tasks/incidents_converter.go
index 902fdb9ba..c10f286b5 100644
--- a/backend/plugins/pagerduty/tasks/incidents_converter.go
+++ b/backend/plugins/pagerduty/tasks/incidents_converter.go
@@ -144,12 +144,13 @@ func getStatus(incident *models.Incident) string {
        panic("unknown incident status encountered")
 }
 
-func getTimes(incident *models.Incident) (int64, *time.Time) {
-       var leadTime int64
+func getTimes(incident *models.Incident) (*uint, *time.Time) {
+       var leadTime *uint
        var resolutionDate *time.Time
        if incident.Status == models.IncidentStatusResolved {
                resolutionDate = &incident.UpdatedDate
-               leadTime = 
int64(resolutionDate.Sub(incident.CreatedDate).Minutes())
+               temp := uint(resolutionDate.Sub(incident.CreatedDate).Minutes())
+               leadTime = &temp
        }
        return leadTime, resolutionDate
 }
diff --git a/backend/plugins/tapd/tasks/bug_converter.go 
b/backend/plugins/tapd/tasks/bug_converter.go
index aa32acb2d..635b153dc 100644
--- a/backend/plugins/tapd/tasks/bug_converter.go
+++ b/backend/plugins/tapd/tasks/bug_converter.go
@@ -18,6 +18,10 @@ limitations under the License.
 package tasks
 
 import (
+       "reflect"
+       "strconv"
+       "time"
+
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
@@ -26,9 +30,6 @@ import (
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/tapd/models"
-       "reflect"
-       "strconv"
-       "time"
 )
 
 func ConvertBug(taskCtx plugin.SubTaskContext) errors.Error {
@@ -87,7 +88,8 @@ func ConvertBug(taskCtx plugin.SubTaskContext) errors.Error {
                                results = append(results, issueAssignee)
                        }
                        if domainL.ResolutionDate != nil && domainL.CreatedDate 
!= nil {
-                               domainL.LeadTimeMinutes = 
int64(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               temp := 
uint(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               domainL.LeadTimeMinutes = &temp
                        }
                        boardIssue := &ticket.BoardIssue{
                                BoardId: 
getWorkspaceIdGen().Generate(toolL.ConnectionId, toolL.WorkspaceId),
diff --git a/backend/plugins/tapd/tasks/story_converter.go 
b/backend/plugins/tapd/tasks/story_converter.go
index 7fccbf781..c02e41c5e 100644
--- a/backend/plugins/tapd/tasks/story_converter.go
+++ b/backend/plugins/tapd/tasks/story_converter.go
@@ -55,6 +55,8 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error 
{
                Input:              cursor,
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        toolL := inputRow.(*models.TapdStory)
+                       timeRemainingMinutes := int64(toolL.Remain)
+                       storyPoint := float64(toolL.Size)
                        domainL := &ticket.Issue{
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: 
storyIdGen.Generate(toolL.ConnectionId, toolL.Id),
@@ -65,14 +67,14 @@ func ConvertStory(taskCtx plugin.SubTaskContext) 
errors.Error {
                                Type:                 toolL.StdType,
                                OriginalType:         toolL.Type,
                                Status:               toolL.StdStatus,
-                               StoryPoint:           float64(toolL.Size),
+                               StoryPoint:           &storyPoint,
                                OriginalStatus:       toolL.Status,
                                ResolutionDate:       
(*time.Time)(toolL.Completed),
                                CreatedDate:          
(*time.Time)(toolL.Created),
                                UpdatedDate:          
(*time.Time)(toolL.Modified),
                                ParentIssueId:        
storyIdGen.Generate(toolL.ConnectionId, toolL.ParentId),
                                Priority:             toolL.Priority,
-                               TimeRemainingMinutes: int64(toolL.Remain),
+                               TimeRemainingMinutes: &timeRemainingMinutes,
                                CreatorId:            
getAccountIdGen().Generate(data.Options.ConnectionId, toolL.Creator),
                                CreatorName:          toolL.Creator,
                                AssigneeName:         toolL.Owner,
@@ -90,7 +92,8 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error 
{
                                results = append(results, issueAssignee)
                        }
                        if domainL.ResolutionDate != nil && domainL.CreatedDate 
!= nil {
-                               domainL.LeadTimeMinutes = 
int64(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               temp := 
uint(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               domainL.LeadTimeMinutes = &temp
                        }
                        boardIssue := &ticket.BoardIssue{
                                BoardId: 
getWorkspaceIdGen().Generate(toolL.ConnectionId, toolL.WorkspaceId),
diff --git a/backend/plugins/tapd/tasks/task_converter.go 
b/backend/plugins/tapd/tasks/task_converter.go
index 014acb0ad..c7e3f5157 100644
--- a/backend/plugins/tapd/tasks/task_converter.go
+++ b/backend/plugins/tapd/tasks/task_converter.go
@@ -18,6 +18,10 @@ limitations under the License.
 package tasks
 
 import (
+       "reflect"
+       "strconv"
+       "time"
+
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
@@ -26,9 +30,6 @@ import (
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/tapd/models"
-       "reflect"
-       "strconv"
-       "time"
 )
 
 func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
@@ -87,7 +88,8 @@ func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
                                results = append(results, issueAssignee)
                        }
                        if domainL.ResolutionDate != nil && domainL.CreatedDate 
!= nil {
-                               domainL.LeadTimeMinutes = 
int64(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               temp := 
uint(domainL.ResolutionDate.Sub(*domainL.CreatedDate).Minutes())
+                               domainL.LeadTimeMinutes = &temp
                        }
                        boardIssue := &ticket.BoardIssue{
                                BoardId: 
getWorkspaceIdGen().Generate(toolL.ConnectionId, toolL.WorkspaceId),
diff --git a/backend/plugins/teambition/tasks/task_converter.go 
b/backend/plugins/teambition/tasks/task_converter.go
index aadf8cc33..fd212d379 100644
--- a/backend/plugins/teambition/tasks/task_converter.go
+++ b/backend/plugins/teambition/tasks/task_converter.go
@@ -19,6 +19,10 @@ package tasks
 
 import (
        "fmt"
+       "reflect"
+       "strconv"
+       "time"
+
        "github.com/apache/incubator-devlake/core/dal"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/models/domainlayer"
@@ -26,9 +30,6 @@ import (
        "github.com/apache/incubator-devlake/core/plugin"
        helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/teambition/models"
-       "reflect"
-       "strconv"
-       "time"
 )
 
 var ConvertTasksMeta = plugin.SubTaskMeta{
@@ -61,6 +62,7 @@ func ConvertTasks(taskCtx plugin.SubTaskContext) errors.Error 
{
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        userTool := inputRow.(*models.TeambitionTask)
                        originalEstimateMinutes, timeSpentMinutes, 
timeRemainingMinutes := calcEstimateTimeMinutes(userTool)
+                       leadTimeMinutes := uint(calcLeadTimeMinutes(userTool))
                        issue := &ticket.Issue{
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: 
getTaskIdGen().Generate(data.Options.ConnectionId, userTool.Id),
@@ -74,16 +76,16 @@ func ConvertTasks(taskCtx plugin.SubTaskContext) 
errors.Error {
                                OriginalProject:         
getProjectIdGen().Generate(data.Options.ConnectionId, data.Options.ProjectId),
                                AssigneeId:              userTool.ExecutorId,
                                Url:                     
fmt.Sprintf("https://www.teambition.com/task/%s";, userTool.Id),
-                               LeadTimeMinutes:         
calcLeadTimeMinutes(userTool),
-                               OriginalEstimateMinutes: 
originalEstimateMinutes,
-                               TimeSpentMinutes:        timeSpentMinutes,
-                               TimeRemainingMinutes:    timeRemainingMinutes,
+                               LeadTimeMinutes:         &leadTimeMinutes,
+                               OriginalEstimateMinutes: 
&originalEstimateMinutes,
+                               TimeSpentMinutes:        &timeSpentMinutes,
+                               TimeRemainingMinutes:    &timeRemainingMinutes,
                                ResolutionDate:          
userTool.AccomplishTime.ToNullableTime(),
                                CreatedDate:             
userTool.Created.ToNullableTime(),
                                UpdatedDate:             
userTool.Updated.ToNullableTime(),
                        }
                        if storyPoint, ok := 
strconv.ParseFloat(userTool.StoryPoint, 64); ok == nil {
-                               issue.StoryPoint = storyPoint
+                               issue.StoryPoint = &storyPoint
                        }
                        if a, err := FindAccountById(db, userTool.CreatorId); 
err == nil {
                                issue.CreatorName = a.Name
diff --git a/backend/plugins/webhook/api/incident.go 
b/backend/plugins/webhook/api/incident.go
index dfcabe56c..456c899a5 100644
--- a/backend/plugins/webhook/api/incident.go
+++ b/backend/plugins/webhook/api/incident.go
@@ -102,15 +102,15 @@ func PostIssue(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, error
                Type:                    request.Type,
                Status:                  request.Status,
                OriginalStatus:          request.OriginalStatus,
-               StoryPoint:              request.StoryPoint,
+               StoryPoint:              &request.StoryPoint,
                ResolutionDate:          request.ResolutionDate,
                CreatedDate:             request.CreatedDate,
                UpdatedDate:             request.UpdatedDate,
-               LeadTimeMinutes:         int64(request.LeadTimeMinutes),
+               LeadTimeMinutes:         &request.LeadTimeMinutes,
                Priority:                request.Priority,
-               OriginalEstimateMinutes: request.OriginalEstimateMinutes,
-               TimeSpentMinutes:        request.TimeSpentMinutes,
-               TimeRemainingMinutes:    request.TimeRemainingMinutes,
+               OriginalEstimateMinutes: &request.OriginalEstimateMinutes,
+               TimeSpentMinutes:        &request.TimeSpentMinutes,
+               TimeRemainingMinutes:    &request.TimeRemainingMinutes,
                CreatorName:             request.CreatorName,
                AssigneeName:            request.AssigneeName,
                Severity:                request.Severity,
diff --git a/backend/plugins/zentao/tasks/bug_convertor.go 
b/backend/plugins/zentao/tasks/bug_convertor.go
index 5b91b0347..5c926cee6 100644
--- a/backend/plugins/zentao/tasks/bug_convertor.go
+++ b/backend/plugins/zentao/tasks/bug_convertor.go
@@ -106,7 +106,8 @@ func ConvertBug(taskCtx plugin.SubTaskContext) errors.Error 
{
                                domainEntity.AssigneeId = 
accountIdGen.Generate(data.Options.ConnectionId, toolEntity.AssignedToId)
                        }
                        if toolEntity.ClosedDate != nil {
-                               domainEntity.LeadTimeMinutes = 
int64(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               temp := 
uint(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               domainEntity.LeadTimeMinutes = &temp
                        }
                        var results []interface{}
                        if domainEntity.AssigneeId != "" {
diff --git a/backend/plugins/zentao/tasks/story_convertor.go 
b/backend/plugins/zentao/tasks/story_convertor.go
index d0d67e64e..f9aea6aaa 100644
--- a/backend/plugins/zentao/tasks/story_convertor.go
+++ b/backend/plugins/zentao/tasks/story_convertor.go
@@ -70,7 +70,7 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error 
{
                },
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        toolEntity := inputRow.(*models.ZentaoStory)
-
+                       originalEstimateMinutes := int64(toolEntity.Estimate) * 
60
                        domainEntity := &ticket.Issue{
                                DomainEntity: domainlayer.DomainEntity{
                                        Id: 
storyIdGen.Generate(toolEntity.ConnectionId, toolEntity.ID),
@@ -89,8 +89,8 @@ func ConvertStory(taskCtx plugin.SubTaskContext) errors.Error 
{
                                Url:                     
convertIssueURL(toolEntity.Url, "story", toolEntity.ID),
                                OriginalProject:         
getOriginalProject(data),
                                Status:                  toolEntity.StdStatus,
-                               OriginalEstimateMinutes: 
int64(toolEntity.Estimate) * 60,
-                               StoryPoint:              toolEntity.Estimate,
+                               OriginalEstimateMinutes: 
&originalEstimateMinutes,
+                               StoryPoint:              &toolEntity.Estimate,
                        }
                        if mappingType, ok := 
stdTypeMappings[domainEntity.OriginalType]; ok && mappingType != "" {
                                domainEntity.Type = mappingType
@@ -118,7 +118,8 @@ func ConvertStory(taskCtx plugin.SubTaskContext) 
errors.Error {
                        }
 
                        if toolEntity.ClosedDate != nil {
-                               domainEntity.LeadTimeMinutes = 
int64(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               temp := 
uint(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               domainEntity.LeadTimeMinutes = &temp
                        }
 
                        domainBoardIssue := &ticket.BoardIssue{
diff --git a/backend/plugins/zentao/tasks/task_convertor.go 
b/backend/plugins/zentao/tasks/task_convertor.go
index caac592b2..3489b6c29 100644
--- a/backend/plugins/zentao/tasks/task_convertor.go
+++ b/backend/plugins/zentao/tasks/task_convertor.go
@@ -69,6 +69,9 @@ func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
                },
                Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
                        toolEntity := inputRow.(*models.ZentaoTask)
+                       originalEstimateMinutes := int64(toolEntity.Estimate * 
60)
+                       timeSpentMinutes := int64(toolEntity.Consumed * 60)
+                       timeRemainingMinutes := int64(toolEntity.Left * 60)
 
                        domainEntity := &ticket.Issue{
                                DomainEntity: domainlayer.DomainEntity{
@@ -89,9 +92,9 @@ func ConvertTask(taskCtx plugin.SubTaskContext) errors.Error {
                                Url:                     
convertIssueURL(toolEntity.Url, "task", toolEntity.ID),
                                OriginalProject:         
getOriginalProject(data),
                                Status:                  toolEntity.StdStatus,
-                               OriginalEstimateMinutes: 
int64(toolEntity.Estimate * 60),
-                               TimeSpentMinutes:        
int64(toolEntity.Consumed * 60),
-                               TimeRemainingMinutes:    int64(toolEntity.Left 
* 60),
+                               OriginalEstimateMinutes: 
&originalEstimateMinutes,
+                               TimeSpentMinutes:        &timeSpentMinutes,
+                               TimeRemainingMinutes:    &timeRemainingMinutes,
                        }
                        if mappingType, ok := 
stdTypeMappings[domainEntity.OriginalType]; ok && mappingType != "" {
                                domainEntity.Type = mappingType
@@ -106,7 +109,8 @@ func ConvertTask(taskCtx plugin.SubTaskContext) 
errors.Error {
                                domainEntity.AssigneeId = 
accountIdGen.Generate(data.Options.ConnectionId, toolEntity.AssignedToId)
                        }
                        if toolEntity.ClosedDate != nil {
-                               domainEntity.LeadTimeMinutes = 
int64(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               temp := 
uint(toolEntity.ClosedDate.ToNullableTime().Sub(toolEntity.OpenedDate.ToTime()).Minutes())
+                               domainEntity.LeadTimeMinutes = &temp
                        }
                        var results []interface{}
                        if domainEntity.AssigneeId != "" {


Reply via email to