-
Notifications
You must be signed in to change notification settings - Fork 4
/
template.go
197 lines (163 loc) · 6.39 KB
/
template.go
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package moysklad
import (
"bytes"
"github.com/google/uuid"
"io"
"os"
"path/filepath"
"strings"
)
// Template Общие поля для шаблонов.
// Документация МойСклад: https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-shablon-pechatnoj-formy
type Template struct {
Content *string `json:"content,omitempty"` // Ссылка на скачивание
ID *uuid.UUID `json:"id,omitempty"` // ID сущности
Meta *Meta `json:"meta,omitempty"` // Метаданные Стандартного шаблона
Name *string `json:"name,omitempty"` // Наименование шаблона
Type TemplateType `json:"type,omitempty"` // Тип шаблона (entity - документ, mxtemplate - новый тип шаблона для ценников и этикеток)
}
func (t Template) String() string {
return Stringify(t)
}
func (t Template) GetType() TemplateType {
return t.Type
}
func (t Template) GetMeta() *Meta {
return t.Meta
}
// CustomTemplate Пользовательский Шаблон.
// Ключевое слово: customtemplate
// Документация МойСклад: https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-shablon-pechatnoj-formy-atributy-suschnosti
type CustomTemplate struct {
Template
}
func (c CustomTemplate) String() string {
return Stringify(c)
}
func (c CustomTemplate) MetaType() MetaType {
return MetaTypeCustomTemplate
}
// EmbeddedTemplate Стандартный шаблон
// Ключевое слово: embeddedtemplate
// Документация МойСклад: https://dev.moysklad.ru/doc/api/remap/1.2/dictionaries/#suschnosti-shablon-pechatnoj-formy-atributy-suschnosti
type EmbeddedTemplate struct {
Template
}
func (e EmbeddedTemplate) String() string {
return Stringify(e)
}
func (e EmbeddedTemplate) MetaType() MetaType {
return MetaTypeEmbeddedTemplate
}
type Templater interface {
HasMeta
GetType() TemplateType
}
type TemplateType string
const (
TemplateTypeEntity TemplateType = "entity" // Документ
TemplateTypePriceType TemplateType = "pricetype" // Ценник/этикетка
TemplateTypeMXTemplate TemplateType = "mxtemplate" // Ценник/этикетка нового формата
)
type Extension string
const (
ExtensionXLS Extension = "xls"
ExtensionPDF Extension = "pdf"
ExtensionHTML Extension = "html"
ExtensionODS Extension = "ods"
)
// Документы
type PrintDocumentArg struct {
Template *MetaWrapper `json:"template,omitempty"`
Templates *Slice[PrintDocArgManyElement] `json:"templates,omitempty"`
Extension Extension `json:"extension,omitempty"`
}
type PrintDocArgManyElement struct {
Template *MetaWrapper `json:"template,omitempty"`
Count int `json:"count,omitempty"`
}
// NewPrintDocArgOne создаёт и возвращает заполненный объект для запроса печати документов.
// Применяется только для запроса 1 документа.
// Возможные расширения:
// – ExtensionXLS для документа с расширением .xls
// – ExtensionPDF для документа с расширением .pdf
// – ExtensionHTML для документа с расширением .html
// – ExtensionODS для документа с расширением .ods
func NewPrintDocArgOne(template Templater, ext Extension) *PrintDocumentArg {
return &PrintDocumentArg{
Template: &MetaWrapper{Meta: Deref(template.GetMeta())},
Extension: ext,
}
}
// NewPrintDocArgManyElement создаёт и возвращает *PrintDocArgManyElement,
// который служит аргументом для метода NewPrintDocArgMany
func NewPrintDocArgManyElement(template Templater, count int) *PrintDocArgManyElement {
return &PrintDocArgManyElement{
Template: &MetaWrapper{Deref(template.GetMeta())},
Count: count,
}
}
// NewPrintDocArgMany создаёт и возвращает заполненный объект для запроса печати документов.
// Применяется для запроса комплекта документов.
// Каждый аргумент создаётся с помощью метода NewPrintDocArgManyElement
func NewPrintDocArgMany(templates ...*PrintDocArgManyElement) *PrintDocumentArg {
return &PrintDocumentArg{
Templates: (new(Slice[PrintDocArgManyElement])).Push(templates...),
}
}
// Ценники
type PrintLabelArg struct {
Organization MetaWrapper `json:"organization,omitempty"`
SalePrice PrintLabelArgSalePrice `json:"salePrice,omitempty"`
Template MetaWrapper `json:"template,omitempty"`
Count int `json:"count,omitempty"`
}
type PrintLabelArgSalePrice struct {
PriceType MetaWrapper `json:"priceType,omitempty"` // Метаданные типа цены
}
// NewPrintLabelArg создаёт и возвращает заполненный объект для запроса печати ценников.
// Аргументы: организация, тип цен, шаблон и кол-во ценников
func NewPrintLabelArg(organization *Organization, priceType *PriceType, template Templater, count int) *PrintLabelArg {
return &PrintLabelArg{
Organization: MetaWrapper{Meta: Deref(organization.Meta)},
SalePrice: PrintLabelArgSalePrice{PriceType: MetaWrapper{Meta: Deref(priceType.Meta)}},
Template: MetaWrapper{Meta: Deref(template.GetMeta())},
Count: count,
}
}
type PrintFile struct {
*bytes.Buffer
FileName string
}
// Save сохраняет полученный файл в указанную папку.
// Аргументом является директория, в которую необходимо сохранить файл.
func (f *PrintFile) Save(path string) error {
if !strings.HasSuffix(path, "/") {
path += "/"
}
if err := os.MkdirAll(filepath.Dir(path), 0770); err != nil {
return err
}
filename := path + f.FileName
fo, err := os.Create(filename)
if err != nil {
return err
}
defer func(fo *os.File) {
_ = fo.Close()
}(fo)
buf := make([]byte, 1024)
for {
n, err := f.Read(buf)
if err != nil && err != io.EOF {
return err
}
if n == 0 {
break
}
if _, err = fo.Write(buf[:n]); err != nil {
return err
}
}
return nil
}