Skip to content
Snippets Groups Projects
Verified Commit d6146e9c authored by Volker Schukai's avatar Volker Schukai :alien:
Browse files

chore: commit save point

parent 46f8f1f4
No related branches found
No related tags found
No related merge requests found
Showing
with 423 additions and 166 deletions
......@@ -3,7 +3,7 @@
<module name="requirements-manager" />
<working_directory value="$PROJECT_DIR$/application/source" />
<go_parameters value="-ldflags &quot;-X main.version=1.0.15 -X main.build=20220616123315&quot;" />
<parameters value="tasks gitlab -p $PROJECT_DIR$/development/examples/example1" />
<parameters value="gitlab sync -p $PROJECT_DIR$/development/examples/example1" />
<kind value="DIRECTORY" />
<package value="gitlab.schukai.com/oss/utilities/requirements-manager" />
<directory value="$PROJECT_DIR$/application/source" />
......
......@@ -2,7 +2,7 @@
<configuration default="false" name="reqman requirement report" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="requirements-manager" />
<working_directory value="$PROJECT_DIR$/application/source" />
<parameters value="requirements report --gitlab --grouped-by Estimation -p $PROJECT_DIR$/development/examples/example1/req1/1/test1.md" />
<parameters value="requirements report --remote --grouped-by Estimation -p $PROJECT_DIR$/development/examples/example1/req1/1/test1.md" />
<kind value="DIRECTORY" />
<package value="gitlab.schukai.com/oss/utilities/requirements-manager" />
<directory value="$PROJECT_DIR$/application/source" />
......
......@@ -8,12 +8,13 @@ import (
type logs []string
func buildChangelog(config *Configuration, pageMap map[string]requirement) (error, string, bool) {
func buildChangelog(config *Configuration, pageMap map[string]*requirement) (error, string, bool) {
changelog := make(map[string]logs)
datemap := make(map[string]string)
for _, p := range pageMap {
for _, q := range pageMap {
p := *q
e := strings.Trim(p.Title+" ("+p.ID+")", " ")
......
......@@ -9,63 +9,6 @@ import (
"github.com/jessevdk/go-flags"
)
type commandLineOptions struct {
Config string `short:"c" long:"config" description:"file with configuration values"`
Path string `short:"p" long:"path" description:"define the path where the specifications are located" default:"."`
DateFormat string `long:"date-format" description:"date format" default:"2006-01-02"`
Requirements struct {
Print struct {
Columns []string `short:"c" long:"column" description:"defines the columns used"`
} `command:"print"`
Add struct {
ID string `long:"id" required:"true" description:"new requirement id"`
} `command:"add"`
Report struct {
GroupedBy string `long:"grouped-by" required:"false" description:"grouped by"`
Gitlab bool `long:"gitlab" description:"get data from gitlab"`
} `command:"report"`
} `command:"requirements"`
Tasks struct {
Print struct {
} `command:"print"`
Gitlab struct {
ProjectID string `long:"project-id" required:"false" description:"gitlab project id"`
Token string `long:"token" required:"false" description:"gitlab token"`
} `command:"gitlab"`
} `command:"tasks"`
Issues struct {
Print struct {
} `command:"print"`
Gitlab struct {
ProjectID string `long:"project-id" required:"false" description:"gitlab project id"`
Token string `long:"token" required:"false" description:"gitlab token"`
} `command:"gitlab"`
} `command:"issues"`
Items struct {
Print struct {
} `command:"print"`
} `command:"items"`
Changelog struct {
Print struct {
} `command:"print"`
} `command:"changelog"`
Privacy struct {
Print struct {
} `command:"print"`
} `command:"privacy"`
Overview struct {
Print struct {
Columns []string `short:"c" long:"column" description:"defines the columns used"`
TemplatePath string `short:"t" long:"template" description:"file name of the template of the overview page"`
Output string `short:"o" long:"output" description:"redirect output to a file"`
Format string `short:"f" long:"format" description:"the desired output format" choice:"pdf" choice:"md"`
LatexTemplatePath string `short:"l" long:"latex-template-path" description:"latex template"`
} `command:"print"`
} `command:"overview"`
Version struct {
} `command:"version"`
}
func executeCommand() {
arguments := new(commandLineOptions)
......@@ -178,13 +121,15 @@ func executeCommand() {
subcommand := activeCommand.Active
switch subcommand.Name {
case "print":
err := printIssueTable(config)
if arguments.Issues.Print.GitlabToken != "" {
config.Gitlab.Token = arguments.Issues.Print.GitlabToken
}
err := printIssueTable(config, arguments)
if err != nil {
printErrorAndExit(2, err.Error())
}
case "gitlab":
syncTasksWithGitlab(config)
}
case "items":
subcommand := activeCommand.Active
......@@ -197,6 +142,20 @@ func executeCommand() {
}
}
case "gitlab":
subcommand := activeCommand.Active
switch subcommand.Name {
case "sync":
if arguments.Gitlab.GitlabToken != "" {
config.Gitlab.Token = arguments.Gitlab.GitlabToken
}
syncTasksWithGitlab(config)
}
}
}
func readTemplate(argPath string) string {
......
package main
type commandLineOptions struct {
Config string `short:"c" long:"config" description:"file with configuration values"`
Path string `short:"p" long:"path" description:"define the path where the specifications are located" default:"."`
DateFormat string `long:"date-format" description:"date format" default:"2006-01-02"`
Requirements struct {
Print struct {
Columns []string `short:"c" long:"column" description:"defines the columns used"`
} `command:"print"`
Add struct {
ID string `long:"id" required:"true" description:"new requirement id"`
} `command:"add"`
Report struct {
GroupedBy string `long:"grouped-by" required:"false" description:"grouped by"`
Remote bool `long:"remote" description:"get data from remote"`
} `command:"report"`
} `command:"requirements"`
Tasks struct {
Print struct {
} `command:"print"`
//Sync struct {
// //ProjectID string `long:"project-id" required:"false" description:"gitlab project id"`
// //Token string `long:"token" required:"false" description:"gitlab token"`
//} `command:"sync"`
} `command:"tasks"`
Issues struct {
Print struct {
GitlabToken string `long:"gitlab-token" required:"false" description:"gitlab token"`
Remote bool `long:"remote" required:"false" description:"get data from remote"`
} `command:"print"`
} `command:"issues"`
Items struct {
Print struct {
} `command:"print"`
} `command:"items"`
Changelog struct {
Print struct {
} `command:"print"`
} `command:"changelog"`
Privacy struct {
Print struct {
} `command:"print"`
} `command:"privacy"`
Overview struct {
Print struct {
Columns []string `short:"c" long:"column" description:"defines the columns used"`
TemplatePath string `short:"t" long:"template" description:"file name of the template of the overview page"`
Output string `short:"o" long:"output" description:"redirect output to a file"`
Format string `short:"f" long:"format" description:"the desired output format" choice:"pdf" choice:"md"`
LatexTemplatePath string `short:"l" long:"latex-template-path" description:"latex template"`
} `command:"print"`
} `command:"overview"`
Version struct {
} `command:"version"`
Gitlab struct {
Sync struct {
} `command:"sync"`
// ProjectID string `long:"project-id" required:"false" description:"gitlab project id"`
GitlabToken string `long:"gitlab-token" required:"false" description:"gitlab token"`
} `command:"gitlab"`
}
......@@ -29,9 +29,9 @@ type Configuration struct {
DateFormat string `yaml:"DateFormat"`
} `yaml:"Locale"`
GitLab struct {
Gitlab struct {
Token string `yaml:"Token"`
} `yaml:"GitLab"`
} `yaml:"Gitlab"`
Overview struct {
Template struct {
......
......@@ -104,9 +104,23 @@ Created: %%CREATED%%
Last Update: null
# The issues that are associated with this requirement
# You can add an issue by adding a new line to the list with the following format:
# - Gitlab:
# ID: <issue-id>
#
# if the issue is not yet in the project, you can add it by using the following format:
# Only the Title is required.
# - Gitlab:
# Title: <issue-title>
# Description: <issue-description>
# Priority: <issue-priority>
# Status: <issue-status>
# Assignee: <issue-assignee>
# Milestone: <issue-milestone>
# Labels: <issue-labels>
#
Issues:
- Title: null
URL: null
# the individual items as a list
Items:
......
......@@ -8,11 +8,11 @@ import (
)
//
func collectStructureFromFiles(directory string) (error, map[string]requirement) {
func collectStructureFromFiles(directory string) (error, map[string]*requirement) {
cleanedDirectory := path.Clean(directory)
pageMap := make(map[string]requirement)
pageMap := make(map[string]*requirement)
//pageMap := []requirement{}
......@@ -53,10 +53,11 @@ func collectStructureFromFiles(directory string) (error, map[string]requirement)
p.data.File = "." + bs
p.data.Absolute = cleanedPath
p.data.ToDos = findTask(content)
p.data.Yaml = p.node
k := cleanedPath
pageMap[k] = p.data
pageMap[k] = &p.data
return nil
})
......
......@@ -76,8 +76,8 @@ func getGitlabContext(config *Configuration) *gitlabContext {
options := gitlab.WithBaseURL(context.apiUrl.String())
context.token = config.GitLab.Token
c, err := gitlab.NewClient(config.GitLab.Token, options)
context.token = config.Gitlab.Token
c, err := gitlab.NewClient(config.Gitlab.Token, options)
if err != nil {
printErrorAndExit(2, "Failed to create client", err.Error())
}
......@@ -116,26 +116,29 @@ func searchProject(context *gitlabContext) {
}
func enrichIssuesWithGitlab(pageMap *map[string]requirement, config *Configuration) error {
func enrichIssuesWithGitlab(pageMap map[string]*requirement, config *Configuration) error {
context := getGitlabContext(config)
searchProject(context)
for _, requirement := range *pageMap {
for _, requirement := range pageMap {
for k, issue := range requirement.Issues {
if issue.GitlabID == 0 {
if issue.GitlabIntern == nil {
continue
}
if issue.GitlabIntern.ID == 0 {
continue
}
i, err := loadIssuesFromGitlab(context, issue.GitlabID)
i, err := loadIssuesFromGitlab(context, issue.GitlabIntern.ID)
if err != nil {
return err
}
// requirement is a copy of the original requirement
// this works because issue is a pointer
requirement.Issues[k].Gitlab = i
requirement.Issues[k].GitlabRemote = i
}
}
......
......@@ -6,24 +6,26 @@ import (
"strings"
"time"
"github.com/xanzy/go-gitlab"
"gopkg.in/yaml.v3"
"github.com/olekukonko/tablewriter"
"github.com/xanzy/go-gitlab"
)
type GitlabInternalIssueStruct struct {
ID int `yaml:"ID"`
Title string `yaml:"Title"`
Description string `yaml:"Description"`
Priority string `yaml:"Priority"`
Status string `yaml:"Status"`
Assignee string `yaml:"Assignee"`
Milestone string `yaml:"Milestone"`
Labels []string `yaml:"Labels"`
}
type Issue struct {
GitlabID int `yaml:"Gitlab-ID"`
Gitlab *gitlab.Issue
//Title string `yaml:"Title"`
//URL string `yaml:"URL"`
//ID string `yaml:"ID"`
//Name string `yaml:"Name"`
//Type string `yaml:"Type"`
//Group string `yaml:"group"`
//Description string `yaml:"Description"`
//DeliveryUntil time.Time `yaml:"Delivery until"`
//ProvidedOn time.Time `yaml:"Provided on"`
//ProvidedBy string `yaml:"Provided by"`
GitlabIntern *GitlabInternalIssueStruct `yaml:"Gitlab"`
GitlabRemote *gitlab.Issue
}
func loadIssuesFromGitlab(context *gitlabContext, issueID int) (*gitlab.Issue, error) {
......@@ -40,7 +42,7 @@ func loadIssuesFromGitlab(context *gitlabContext, issueID int) (*gitlab.Issue, e
//err, pageData := collectStructureFromFiles(config.Path)
}
func buildIssueOverviewTable(config *Configuration, pageMap map[string]requirement, extended bool) (error, string, bool) {
func buildIssueOverviewTable(config *Configuration, pageMap map[string]*requirement, extended bool) (error, string, bool) {
buf := new(bytes.Buffer)
has := false
......@@ -71,12 +73,16 @@ func buildIssueOverviewTable(config *Configuration, pageMap map[string]requireme
for _, requirement := range pageMap {
for _, issue := range requirement.Issues {
gitlab := issue.Gitlab
gitlabIntern := issue.GitlabIntern
if gitlabIntern == nil {
continue
}
var col []string
dueDate := "—"
id := printer.Sprintf("%d", issue.GitlabID)
id := "—"
labels := "—"
estimate := "—"
spent := "—"
......@@ -84,20 +90,29 @@ func buildIssueOverviewTable(config *Configuration, pageMap map[string]requireme
title := "—"
assignees := "—"
if gitlab != nil {
if gitlab.DueDate != nil {
d := (time.Time)(*gitlab.DueDate)
id = printer.Sprintf("%d", gitlabIntern.ID)
if gitlabIntern.Labels != nil {
labels = strings.Join(gitlabIntern.Labels, ", ")
}
if gitlabIntern.Title != "" {
title = gitlabIntern.Title
}
gitlabRemote := issue.GitlabRemote
if gitlabRemote != nil {
if gitlabRemote.DueDate != nil {
d := (time.Time)(*gitlabRemote.DueDate)
dueDate = d.Format(config.Locale.DateFormat)
}
labels = printer.Sprintf("%s", strings.Join(gitlab.Labels, ", "))
estimate = printer.Sprintf("%s", gitlab.TimeStats.HumanTimeEstimate)
spent = printer.Sprintf("%s", gitlab.TimeStats.HumanTotalTimeSpent)
state = printer.Sprintf(gitlab.State)
title = printer.Sprintf("%s", gitlab.Title)
labels = printer.Sprintf("%s", strings.Join(gitlabRemote.Labels, ", "))
estimate = printer.Sprintf("%s", gitlabRemote.TimeStats.HumanTimeEstimate)
spent = printer.Sprintf("%s", gitlabRemote.TimeStats.HumanTotalTimeSpent)
state = printer.Sprintf(gitlabRemote.State)
title = printer.Sprintf("%s", gitlabRemote.Title)
a := []string{}
for _, assignee := range gitlab.Assignees {
for _, assignee := range gitlabRemote.Assignees {
a = append(a, assignee.Name)
}
......@@ -125,12 +140,15 @@ func buildIssueOverviewTable(config *Configuration, pageMap map[string]requireme
return nil, buf.String(), has
}
func printIssueTable(config *Configuration) error {
func printIssueTable(config *Configuration, arguments *commandLineOptions) error {
err, pageMap := collectStructureFromFiles(config.Path)
enrichIssuesWithGitlab(&pageMap, config)
if arguments.Issues.Print.Remote {
enrichIssuesWithGitlab(pageMap, config)
if err != nil {
return err
}
}
err, table, _ := buildIssueOverviewTable(config, pageMap, true)
fmt.Println(table)
......@@ -156,17 +174,35 @@ func syncTasksWithGitlab(config *Configuration) error {
context := getGitlabContext(config)
searchProject(context)
client := context.client
//client := context.client
//issues, response, err := client.Issues.ListProjectIssues(context.project.ID, &gitlab.ListProjectIssuesOptions{})
//if err != nil {
// printErrorAndExit(0, "Failed to get issues %s", err.Error())
//}
//for _, issue := range issues {
// fmt.Println(issue.Title)
//}
//fmt.Println(response.StatusCode)
for file, pd := range pageData {
fmt.Println(file)
//fmt.Println(pd)
issues, response, err := client.Issues.ListProjectIssues(context.project.ID, &gitlab.ListProjectIssuesOptions{})
buf := new(bytes.Buffer)
//pd.Yaml.Encode(buf)
var encoder = yaml.NewEncoder(buf)
err := encoder.Encode(pd.Yaml)
if err != nil {
printErrorAndExit(0, "Failed to get issues %s", err.Error())
return err
}
encoder.Close()
fmt.Println(string(buf.Bytes()))
for _, issue := range issues {
fmt.Println(issue.Title)
}
fmt.Println(response.StatusCode)
return nil
}
......@@ -19,7 +19,7 @@ type Item struct {
ProvidedBy string `yaml:"Provided by"`
}
func buildItemOverviewTable(config *Configuration, pageMap map[string]requirement, extended bool) (error, string, bool) {
func buildItemOverviewTable(config *Configuration, pageMap map[string]*requirement, extended bool) (error, string, bool) {
buf := new(bytes.Buffer)
has := false
......
......@@ -19,7 +19,7 @@ type Privacy struct {
TOM string `yaml:"TOM"`
}
func buildPrivacy(config *Configuration, pageMap map[string]requirement) (error, string, bool) {
func buildPrivacy(config *Configuration, pageMap map[string]*requirement) (error, string, bool) {
hasPrivacy := false
text := ""
......
......@@ -11,6 +11,8 @@ import (
"strings"
"time"
"gopkg.in/yaml.v3"
"github.com/olekukonko/tablewriter"
)
......@@ -22,6 +24,9 @@ type requirement struct {
Privacy []Privacy `yaml:"Privacy"`
Issues []Issue `yaml:"Issues"`
// remember the node structure of yaml
Yaml *yaml.Node
ID string `yaml:"ID"`
References []string `yaml:"References"`
Type string `yaml:"Type"` // Display, Functional, Performance, Printing, Report, Testing and Validate
......@@ -66,7 +71,7 @@ func addRequirement(config *Configuration, arguments *commandLineOptions) error
return nil
}
func buildRequirements(config *Configuration, pageMap map[string]requirement) (error, string, bool) {
func buildRequirements(config *Configuration, pageMap map[string]*requirement) (error, string, bool) {
hasRequirements := false
......@@ -162,45 +167,26 @@ func printRequirements(config *Configuration) error {
return err
}
func integrateGitlabTimeSpent(pageMap *map[string]requirement) {
func integrateGitlabTimeSpent(pageMap map[string]*requirement) {
for k, requirement := range *pageMap {
for _, requirement := range pageMap {
for _, i := range requirement.Issues {
if i.Gitlab == nil {
if i.GitlabRemote == nil {
continue
}
//d := time.Duration(i.Gitlab.TimeStats.TotalTimeSpent) * time.Second
//fmt.Println(fn, d)
//ref[fn].TimeSpent += d
requirement.TimeSpent = 99999999
requirement.Status = "done"
// fmt.Println(i.Gitlab.TimeStats.TotalTimeSpent)
d := time.Duration(i.GitlabRemote.TimeStats.TotalTimeSpent) * time.Second
requirement.TimeSpent += d
}
pageMap[k] = requirement
//if &pd.Issues == nil || &pd.Issues. == nil {
// continue
//}
//
//for _, issue := range pd.Issues.Gitlab {
// if issue == nil {
// continue
// }
// pd.TimeSpent += *issue.TimeSpent
//}
}
fmt.Println("integrateGitlabTimeSpent")
}
func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageMap *map[string]requirement) (error, string, string, bool) {
func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageMap map[string]*requirement) (error, string, string, bool) {
if arguments.Requirements.Report.Gitlab {
if arguments.Requirements.Report.Remote {
err := enrichIssuesWithGitlab(pageMap, config)
if err != nil {
return err, "", "", false
......@@ -218,7 +204,8 @@ func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageM
hasReport := false
found := false
for _, p := range *pageMap {
for _, q := range pageMap {
p := *q
fields := reflect.VisibleFields(reflect.TypeOf(p))
for _, field := range fields {
......@@ -243,13 +230,13 @@ func buildTimeReport(config *Configuration, arguments *commandLineOptions, pageM
return nil, t1, t2, hasReport
}
func buildTable1(groupedByKey string, pageMap *map[string]requirement) string {
func buildTable1(groupedByKey string, pageMap map[string]*requirement) string {
estimated := map[string]float64{}
timeSpent := map[string]float64{}
for _, d := range *pageMap {
for _, q := range pageMap {
d := *q
r := reflect.ValueOf(d)
f := r.FieldByName(groupedByKey)
k := ""
......@@ -328,12 +315,12 @@ type mathData struct {
time timeStruct
}
func buildTable2(pageMap *map[string]requirement) string {
func buildTable2(pageMap map[string]*requirement) string {
est := map[int]mathData{}
// inti struct
for _, d := range *pageMap {
for _, d := range pageMap {
k := d.Estimation
m := mathData{}
......@@ -349,7 +336,7 @@ func buildTable2(pageMap *map[string]requirement) string {
}
// calc sum
for _, d := range *pageMap {
for _, d := range pageMap {
k := d.Estimation
s := est[k]
......@@ -427,7 +414,7 @@ func printRequirementReport(config *Configuration, arguments *commandLineOptions
return err
}
err, table1, table2, _ := buildTimeReport(config, arguments, &pageData)
err, table1, table2, _ := buildTimeReport(config, arguments, pageData)
if err != nil {
return err
}
......
......@@ -72,7 +72,7 @@ func findTask(content []byte) []task {
return toDos
}
func buildTasksTable(config *Configuration, pageMap map[string]requirement, extended bool) (error, string, bool) {
func buildTasksTable(config *Configuration, pageMap map[string]*requirement, extended bool) (error, string, bool) {
buf := new(bytes.Buffer)
......
......@@ -14,6 +14,7 @@ import (
type contentRequirement struct {
content string
data requirement
node *yaml.Node
}
func splitYamlParts(content []byte) (error, contentRequirement) {
......@@ -71,13 +72,15 @@ func splitYamlParts(content []byte) (error, contentRequirement) {
return err, contentRequirement{}
}
data := requirement{}
err = yaml.Unmarshal([]byte(meta), &data)
var node yaml.Node
err = yaml.Unmarshal([]byte(meta), &node)
if err != nil {
printError("YAML parse error", err.Error())
return err, contentRequirement{}
}
data := requirement{}
node.Decode(&data)
tempItem := []Item{}
for i, _ := range data.Items {
......@@ -107,6 +110,8 @@ func splitYamlParts(content []byte) (error, contentRequirement) {
req := contentRequirement{}
req.data = data
req.node = &node
var buffer bytes.Buffer
err = t.Execute(&buffer, data)
if err != nil {
......
---
ID: 144444
Title: null
# Reference to other requirements
References: null
# Display, Functional, Performance, Printing, Report, Testing or Validation
Type: null
Alias: null
Keywords:
- Requirement
# First and last name of the authors as a list
Author:
- null
# Proposed (The requirement has been requested by an authorized source.),
# In Progress (A business analyst is actively working on crafting the requirement.),
# Drafted (The initial version of the requirement has been written.),
# Approved (The requirement has been analyzed, its impact on the project has been estimated, and it has been allocated to the baseline for a specific release. ),
# Implemented (The code that implements the requirement has been designed, written, and unit tested. The requirement has been traced to the pertinent design and code elements. It’s now ready for review or other verification.),
# Verified (The requirement has satisfied its acceptance criteria, meaning that the correct functioning of the implemented requirement has been confirmed.),
# Deferred (An approved requirement is now planned for implementation in a later release.),
# Deleted (An approved requirement has been removed from the baseline.) or
# Rejected (The requirement was proposed but was never approved and is not planned for implementation in any upcoming release.)
Status: "Proposed"
# Low, Medium, Hi
Complexity: null
# Low, Medium, Hi
Difficulty: null
# Nice to have, Low, Medium, Hi or Blocker
Priority: null
Version: 0.0.1
Milestone: null
# 0 (means that a task has already been completed), 1 (is a very small task), 2, 3, 5 (are rather smaller tasks),
# 8, 13, 20, 40, 100
Estimation:
# The time required for this requirement
# Valid time units are “ns”, “us” (or “µs”), “ms”, “s”, “m”, “h”.
Time Spent:
# who is the source of the demand
Source: null
Created: 2022-06-19
Last Update: null
# The issues that are associated with this requirement
# You can add an issue by adding a new line to the list with the following format:
# - ID: <issue-id>
#
# if the issue is not yet in the project, you can add it by using the following format:
# Only the Title is required.
# - GitlabIntern:
# - Title: <issue-title>
# - Description: <issue-description>
# - Priority: <issue-priority>
# - Status: <issue-status>
# - Assignee: <issue-assignee>
# - Milestone: <issue-milestone>
# - Labels: <issue-labels>
#
# Issues:
# - GitlabIntern:
# - ID: <issue-id>
# the individual items as a list
Items:
- ID: null
Name: null
# what is it, a image, font, legal information, access data, texts, decisions, etc.
Type: null
# does this belong to a group
group: null
Description: null
Delivery until: null
# when was the project items delivered and by whom?
Provided on: null
Provided by: null
# https://gdpr-info.eu/art-30-gdpr/
Privacy:
- ID: null
# Purpose of the data processing,
# for example, shipping an order and handing it over to a shipping service provider.
Purposes: null
# More detailed description of the reason and process of data processing.
Description: null
# Who is responsible for data protection
Contact: null
# But working with these categories might end up being a bad idea since doing so might
# mean packing different things into one. This leads to either oversimplifications or
# a lot of specifications within a category. It might be advisable to split some of them
# up or to add additional ones to make them fit your business reality.
# Examples: Employees, Suppliers, Customers, Job applicants, Consultants, Visitors, Prospects, Contractors, Trainees
Affected Groups: null
#
Category:
# Example: 5 years from the payment of the salary
Data Retention Period: null
# On what legal basis is the data collected
# Special legal regulation outside the GDPR
# Consent of the data subject (Art. 6 para. 1 a) DSG-VO) use Consent field
# Collective agreement (e.g. company agreement, collective agreement)
# Establishment, performance or termination of an employment relationship (nationally regulated in the BDSG)
# Contract or initiation of a contract with the data subject (Art. 6 para. 1 b) DSG-VO.)
# Balancing of interests (Art. 6 para. 1 f) DSG-VO): Please name the overriding interests
Legal Basis: null
# “Consent” of the data subject refers to any freely given specific, informed and unambiguous indication of his or
# her wishes in the form of a statement or other unambiguous affirmative act by which the data subject signifies
# his or her agreement to personal data relating to him or her being processed.
Consent: null
# Where applicable, transfers of personal data to a third country or an international organisation, including
# the identification of that third country or international organisation and, in the case of transfers referred
# to in the second subparagraph of Article 49(1), the documentation of suitable safeguards;
Transfers:
# Where possible, a general description of the technical and organisational
# security measures referred to in Article 32(1).
TOM: null
...
### {{ .Title }} - {{ .ID }}
#### Subheading
- [ ] task 1
- [ ] task 2
{{ if .Items }}
#### Items
| ID | Name | Delivery until | Provided on |
|--------------------|--------------|----------------------:|-----------------------------------------:|
{{ range .Items
}}| {{ .ID }} | {{ .Name }} | {{ .DeliveryUntil.Format "02.Jan" }} | {{ .ProvidedOn.Format "02.Jan" }} |
{{ end }}
{{ end }}
{{ if .Privacy }}
#### Privacy
{{ range .Privacy }}
{{ if .Purposes }}**{{ .Purposes }}** {{ end }}**({{ .ID }})**
{{ if .Description }} {{ .Description }}
{{ end }}
| | |
|-----------------------|----------------------------|
| Category | {{ .Category }} |
| Data Retention Period | {{ .DataRetentionPeriod }} |
| Legal Basis | {{ .LegalBasis }} |
| Transfers | {{ .Transfers }} |
{{ end }}
{{ end }}
File deleted
......@@ -44,7 +44,7 @@ Estimation: 13
# The time required for this requirement
# Valid time units are “ns”, “us” (or “µs”), “ms”, “s”, “m”, “h”.
Time Spent: 1h
Time Spent: 2h
# who is the source of the demand
Source: null
......@@ -52,7 +52,16 @@ Created: 2022-05-03
Last Update: null
Issues:
- Gitlab-ID: 1
- Gitlab:
ID: 1
- Gitlab:
Title: Test 1
Status: offen
Labels:
- a
- b
# the individual items as a list
Items:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment