-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathvalue-objects.go
More file actions
106 lines (88 loc) · 2.24 KB
/
value-objects.go
File metadata and controls
106 lines (88 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// SPDX-FileCopyrightText: 2022 Adriano Prado <dev@dude333.com>
//
// SPDX-License-Identifier: MIT
package rapina
import (
"errors"
"time"
"golang.org/x/text/language"
"golang.org/x/text/message"
)
// Empresa ------------------------------------------------
type Empresa struct {
CNPJ string `json:"cnpj"`
Nome string `json:"nome"`
}
func (e Empresa) String() string {
return e.CNPJ + " - " + e.Nome
}
// Dinheiro -----------------------------------------------
type Dinheiro struct {
Moeda string
Valor float64
Escala int
}
func NovoDinheiro(moeda string, valor float64, escala int) Dinheiro {
return Dinheiro{
Moeda: moeda,
Valor: valor,
Escala: escala,
}
}
func (d Dinheiro) String() string {
p := message.NewPrinter(language.BrazilianPortuguese)
e := float64(d.Escala)
if e == 0 {
e = 1
}
return p.Sprintf(`%s %.2f`, d.Moeda, e*d.Valor)
}
func (d Dinheiro) Total() float64 {
e := float64(d.Escala)
if e == 0 {
e = 1
}
return d.Valor * e
}
// Data ---------------------------------------------------
type Data time.Time
const layoutISO = "2006-01-02"
var ErrDataInválida = errors.New("data inválida")
func (d Data) String() string { return time.Time(d).Format(layoutISO) }
// NovaData converte uma string no formato "AAAA-MM-DD" em Data.
func NovaData(s string) (Data, error) {
// Verificar se a string está no formato AAAA-MM-DD
if len(s) != len("AAAA-MM-DD") || s[4] != '-' || s[7] != '-' {
return Data(time.Time{}), ErrDataInválida
}
t, err := time.Parse(layoutISO, s)
return Data(t), err
}
// DiaÚtil retorna true para dias úteis.
func DiaÚtil(d Data) bool {
return time.Time(d).Weekday() != time.Saturday && time.Time(d).Weekday() != time.Sunday
}
// Hoje retorna o dia de hoje ou o dia útil passado mais próximo.
func Hoje() Data {
p := time.Time(time.Now())
for !DiaÚtil(Data(p)) {
p = p.AddDate(0, 0, -1)
}
return Data(p)
}
// ProxDiaUtil retorna o próximo dia útil.
func ProxDiaUtil(d Data) Data {
p := time.Time(d).AddDate(0, 0, 1)
for !DiaÚtil(Data(p)) {
p = p.AddDate(0, 0, 1)
}
return Data(p)
}
// DiaUtilAnterior retorna o dia útil anterior.
func DiaUtilAnterior(d Data) Data {
p := time.Time(d).AddDate(0, 0, -1)
for !DiaÚtil(Data(p)) {
p = p.AddDate(0, 0, -1)
}
return Data(p)
}