Skip to content

Commit 462e554

Browse files
committed
Add budgets
1 parent 2c5ec41 commit 462e554

File tree

7 files changed

+1029
-5
lines changed

7 files changed

+1029
-5
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ website/node_modules
2525
*.iml
2626
*.test
2727
*.iml
28+
.nix/
29+
shell.nix
30+
*.bk
2831

2932

3033
website/vendor

docs/resources/budget.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
---
2+
# generated by https://github.com/hashicorp/terraform-plugin-docs
3+
page_title: "doit_budget Resource - terraform-provider-doit"
4+
subcategory: ""
5+
description: |-
6+
7+
---
8+
9+
# doit_budget (Resource)
10+
11+
12+
13+
14+
15+
<!-- schema generated by tfplugindocs -->
16+
## Schema
17+
18+
### Required
19+
20+
- `collaborators` (Attributes List) (see [below for nested schema](#nestedatt--collaborators))
21+
- `currency` (String) Budget currency can be one of: ["USD","ILS","EUR","GBP","AUD","CAD","DKK","NOK","SEK","BRL","SGD","MXN","CHF","MYR","TWD","EGP","ZAR"]
22+
- `name` (String) Name Budget Name
23+
- `recipients` (List of String) List of emails to notify when reaching alert threshold
24+
- `scope` (List of String) List of budges that defines that budget scope
25+
- `type` (String) Budget type can be one of: ["fixed", "recurring"]
26+
27+
### Optional
28+
29+
- `alerts` (Attributes List) (see [below for nested schema](#nestedatt--alerts))
30+
- `amount` (Number) Budget period required: true(if usePrevSpend is false)
31+
- `description` (String)
32+
- `end_period` (Number) Fixed budget end date required: true(if budget type is fixed)
33+
- `growth_per_period` (Number) Periodical growth percentage in recurring budget
34+
- `metric` (String) Budget metric - currently fixed to "cost"
35+
- `public` (String) Public
36+
- `recipients_slack_channels` (Attributes List) (see [below for nested schema](#nestedatt--recipients_slack_channels))
37+
- `start_period` (Number) Budget start Date
38+
- `time_interval` (String) Recurring budget interval can be on of:["day", "week", "month", "quarter","year]"
39+
- `use_prev_spend` (Boolean) Use the last period's spend as the target amount for recurring budgets
40+
41+
### Read-Only
42+
43+
- `id` (String) Numeric identifier of the budget
44+
- `last_updated` (String) Timestamp of the last Terraform update ofthe budget group.
45+
46+
<a id="nestedatt--collaborators"></a>
47+
### Nested Schema for `collaborators`
48+
49+
Required:
50+
51+
- `email` (String) Collaborator email
52+
- `role` (String) Collaborator role
53+
54+
55+
<a id="nestedatt--alerts"></a>
56+
### Nested Schema for `alerts`
57+
58+
Optional:
59+
60+
- `forecasted_date` (Number)
61+
- `percentage` (Number)
62+
- `triggered` (Boolean)
63+
64+
65+
<a id="nestedatt--recipients_slack_channels"></a>
66+
### Nested Schema for `recipients_slack_channels`
67+
68+
Optional:
69+
70+
- `customer_id` (String)
71+
- `id` (String) Slack channel ID
72+
- `name` (String) Slack channel name
73+
- `shared` (Boolean) Slack channel shared
74+
- `type` (String) Slack channel type
75+
- `workspace` (String) Slack channel workspace

examples/main.tf

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,49 @@ terraform {
22
required_providers {
33
doit = {
44
source = "doitintl/doit"
5-
version = "0.10.0"
5+
version = "0.14.0"
66
}
77
}
88
}
9+
10+
11+
12+
resource "doit_budget" "my_budget" {
13+
name = "test budget terraform"
14+
description = "hellogo test2"
15+
alerts = [
16+
{
17+
percentage = 50
18+
triggered = false
19+
},
20+
{
21+
"percentage" = 85,
22+
"triggered" = false
23+
},
24+
{
25+
"percentage" = 100,
26+
"triggered" = false
27+
}
28+
]
29+
recipients = [
30+
31+
]
32+
collaborators = [
33+
{
34+
"email" : "[email protected]",
35+
"role" : "owner"
36+
},
37+
]
38+
scope = [
39+
"Evct3J0DYcyXIVuAXORd"
40+
]
41+
amount = 200
42+
currency = "AUD"
43+
growth_per_period = 10
44+
time_interval = "month"
45+
type = "recurring"
46+
}
47+
948
resource "doit_attribution" "attri" {
1049
name = "attritestnewname"
1150
description = "attritestdesc"
@@ -88,7 +127,4 @@ resource "doit_report" "my-report_january" {
88127
}
89128
]
90129
}
91-
}
92-
93-
provider "doit" {
94-
}
130+
}

internal/provider/budget.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package provider
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"log"
7+
"net/http"
8+
"strings"
9+
)
10+
11+
// CreateBudget - Create new budget
12+
func (c *ClientTest) CreateBudget(budget Budget) (*Budget, error) {
13+
rb, err := json.Marshal(budget)
14+
if err != nil {
15+
return nil, err
16+
}
17+
18+
req, err := http.NewRequest("POST", fmt.Sprintf("%s/analytics/v1/budgets/?customerContext=%s", c.HostURL, c.Auth.CustomerContext), strings.NewReader(string(rb)))
19+
log.Println("URL----------------")
20+
log.Println(req.URL)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
body, err := c.doRequest(req)
26+
if err != nil {
27+
log.Println("ERROR REQUEST----------------")
28+
log.Println(err)
29+
return nil, err
30+
}
31+
32+
budgetResponse := Budget{}
33+
err = json.Unmarshal(body, &budgetResponse)
34+
if err != nil {
35+
log.Println("ERROR UNMARSHALL----------------")
36+
log.Println(err)
37+
return nil, err
38+
}
39+
log.Println("Budget response----------------")
40+
log.Println(budgetResponse)
41+
return &budgetResponse, nil
42+
}
43+
44+
// UpdateBudget - Updates an budget
45+
func (c *ClientTest) UpdateBudget(budgetID string, budget Budget) (*Budget, error) {
46+
rb, err := json.Marshal(budget)
47+
if err != nil {
48+
return nil, err
49+
}
50+
req, err := http.NewRequest("PATCH", fmt.Sprintf("%s/analytics/v1/budgets/%s/?customerContext=%s", c.HostURL, budgetID, c.Auth.CustomerContext), strings.NewReader(string(rb)))
51+
if err != nil {
52+
return nil, err
53+
}
54+
log.Println("Update BODY----------------")
55+
log.Println(string(rb))
56+
log.Println("Update URL----------------")
57+
log.Println(req.URL)
58+
body, err := c.doRequest(req)
59+
if err != nil {
60+
return nil, err
61+
}
62+
log.Println("Update BODY----------------")
63+
log.Println(string(body))
64+
budgetResponse := Budget{}
65+
err = json.Unmarshal(body, &budgetResponse)
66+
if err != nil {
67+
return nil, err
68+
}
69+
log.Println("Budget response----------------")
70+
log.Println(budgetResponse)
71+
return &budgetResponse, nil
72+
}
73+
74+
func (c *ClientTest) DeleteBudget(budgetID string) error {
75+
req, err := http.NewRequest("DELETE", fmt.Sprintf("%s/analytics/v1/budgets/%s/?customerContext=%s", c.HostURL, budgetID, c.Auth.CustomerContext), nil)
76+
if err != nil {
77+
return err
78+
}
79+
80+
_, err = c.doRequest(req)
81+
if err != nil {
82+
return err
83+
}
84+
85+
return nil
86+
}
87+
88+
// GetBudget - Returns a specifc budget
89+
func (c *ClientTest) GetBudget(orderID string) (*Budget, error) {
90+
req, err := http.NewRequest("GET", fmt.Sprintf("%s/analytics/v1/budgets/%s/?customerContext=%s", c.HostURL, orderID, c.Auth.CustomerContext), nil)
91+
if err != nil {
92+
return nil, err
93+
}
94+
95+
body, err := c.doRequest(req)
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
budget := Budget{}
101+
err = json.Unmarshal(body, &budget)
102+
if err != nil {
103+
return nil, err
104+
}
105+
106+
return &budget, nil
107+
}

0 commit comments

Comments
 (0)