sk_api_schema 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/json/v1.0/address.json +5 -13
- data/json/v1.0/attachment.json +4 -9
- data/json/v1.0/client.json +2 -32
- data/json/v1.0/credit_note.json +3 -23
- data/json/v1.0/invoice.json +76 -25
- data/json/v1.0/line_item.json +10 -16
- data/json/v1.0/product.json +49 -0
- data/json/v1.0/user.json +17 -37
- data/lib/sk_api_schema.rb +9 -7
- data/sk_api_schema.gemspec +3 -2
- data/spec/sk_api_schema_spec.rb +5 -6
- metadata +5 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/json/v1.0/address.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
{"type":"object",
|
1
|
+
{ "type":"object",
|
2
2
|
"title": "address",
|
3
|
-
"description":"An address",
|
3
|
+
"description":"An address in SK must always be related to an object.",
|
4
4
|
"properties": {
|
5
5
|
"id": {
|
6
6
|
"description": "uuid of the adress.",
|
@@ -10,40 +10,35 @@
|
|
10
10
|
},
|
11
11
|
"city": {
|
12
12
|
"description": "City for the address. Must at least be present for an address.",
|
13
|
+
"required":true,
|
13
14
|
"type":"string"
|
14
15
|
},
|
15
16
|
"address1": {
|
16
17
|
"description": "Should contain the street or otherwise primary address information.",
|
17
|
-
"optional":true,
|
18
18
|
"type":"string"
|
19
19
|
},
|
20
20
|
"address2": {
|
21
21
|
"description": "Additional address information, like floor number",
|
22
|
-
"optional":true,
|
23
22
|
"type":"string"
|
24
23
|
},
|
25
24
|
"pobox": {
|
26
25
|
"description": "Post office box number",
|
27
|
-
"optional":true,
|
28
26
|
"type":"string"
|
29
27
|
},
|
30
28
|
"zip": {
|
31
29
|
"description": "Zip number of the city. Length must be between 4..10",
|
32
|
-
"optional":true,
|
33
30
|
"type":"string"
|
34
31
|
},
|
35
32
|
"state": {
|
36
33
|
"description": "Country state of address",
|
37
|
-
"optional":true,
|
38
34
|
"type":"string"
|
39
35
|
},
|
40
36
|
"country": {
|
41
37
|
"description": "Country of the address.",
|
42
|
-
"optional":true,
|
43
38
|
"type":"string"
|
44
39
|
},
|
45
40
|
"created_at": {
|
46
|
-
"description": "Date the object was created in SK. Never changes
|
41
|
+
"description": "Date the object was created in SK. Never changes afterwards",
|
47
42
|
"format":"date-time",
|
48
43
|
"readonly":true, "type":"string"
|
49
44
|
},
|
@@ -56,17 +51,14 @@
|
|
56
51
|
"address_type": {
|
57
52
|
"description": "Type of the address, as seen by vCard definition.",
|
58
53
|
"enum":["work","home"],
|
59
|
-
"optional":true,
|
60
54
|
"type":"string"
|
61
55
|
},
|
62
56
|
"lat": {
|
63
|
-
"description": "Geolocation latitude",
|
64
|
-
"optional":true,
|
57
|
+
"description": "Geolocation latitude",
|
65
58
|
"type":"string"
|
66
59
|
},
|
67
60
|
"long": {
|
68
61
|
"description": "Geolocation longitude",
|
69
|
-
"optional":true,
|
70
62
|
"type":"string"
|
71
63
|
}
|
72
64
|
}
|
data/json/v1.0/attachment.json
CHANGED
@@ -10,43 +10,38 @@
|
|
10
10
|
},
|
11
11
|
"filename": {
|
12
12
|
"description": "The filename as set when uploaded",
|
13
|
-
"optional":true,
|
14
13
|
"readonly":true,
|
15
14
|
"type":"string"
|
16
15
|
},
|
17
16
|
"disk_filename": {
|
18
|
-
"description": "
|
19
|
-
"optional":true,
|
17
|
+
"description": "Unique filename set by SK",
|
20
18
|
"readonly":true,
|
21
19
|
"type":"string"
|
22
20
|
},
|
23
21
|
"url": {
|
24
22
|
"description": "File download url. Unique and valid for 15 minutes, public accessible.",
|
25
|
-
"optional":true,
|
26
23
|
"readonly":true,
|
27
24
|
"type":"string"
|
28
25
|
},
|
29
26
|
"content_type": {
|
30
27
|
"description": "Auto detected on upload. Might not always reflect the real content type",
|
31
|
-
"optional":true,
|
32
28
|
"readonly":true,
|
33
29
|
"type":"string"
|
34
30
|
},
|
35
31
|
"size": {
|
36
32
|
"description": "Filesize in kb. Auto detected on upload.",
|
37
|
-
"optional":true,
|
38
33
|
"readonly":true,
|
39
34
|
"type":"integer"
|
40
35
|
},
|
41
36
|
"is_signed": {
|
42
37
|
"description": "True if the file(pdf) has been digitally signed.",
|
43
|
-
"optional":true,
|
44
38
|
"type":"boolean"
|
45
39
|
},
|
46
40
|
"created_at": {
|
47
|
-
"description": "Date the object was created in SK. Never changes
|
41
|
+
"description": "Date the object was created in SK. Never changes afterwards",
|
48
42
|
"format":"date-time",
|
49
|
-
"readonly":true,
|
43
|
+
"readonly":true,
|
44
|
+
"type":"string"
|
50
45
|
},
|
51
46
|
"updated_at": {
|
52
47
|
"description": "Date the object was edited in SK.",
|
data/json/v1.0/client.json
CHANGED
@@ -4,164 +4,134 @@
|
|
4
4
|
"properties": {
|
5
5
|
"id": {
|
6
6
|
"identity":true,
|
7
|
-
"optional":true,
|
8
7
|
"readonly":true,
|
9
8
|
"type":"string"
|
10
9
|
},
|
11
10
|
"number": {
|
12
|
-
"description": "Unique number,
|
13
|
-
"optional":true,
|
11
|
+
"description": "Unique number, auto-created by SK for new client without number.",
|
14
12
|
"type":"string"
|
15
13
|
},
|
16
14
|
"organisation": {
|
17
15
|
"description": "Name of a company. At least this or the lastname field must be filled for new records",
|
16
|
+
"required" : true,
|
18
17
|
"type":"string"
|
19
18
|
},
|
20
19
|
"last_name": {
|
21
20
|
"description": "Last name of a person. At least this or the organisation field must be filled for new records",
|
22
|
-
"optional":true,
|
23
21
|
"type":"string"
|
24
22
|
},
|
25
23
|
"first_name": {
|
26
24
|
"description": "First name of a person.",
|
27
|
-
"optional":true,
|
28
25
|
"type":"string"
|
29
26
|
},
|
30
27
|
"gender": {
|
31
28
|
"description": "Can be empty for a company. Is used in salutation",
|
32
|
-
"optional":true,
|
33
29
|
"enum":["male", "female"],
|
34
30
|
"type":"string"
|
35
31
|
},
|
36
32
|
"position": {
|
37
33
|
"description": "Position of a person in a company.",
|
38
|
-
"optional":true,
|
39
34
|
"type":"string"
|
40
35
|
},
|
41
36
|
"title": {
|
42
37
|
"description": "Academical title of a person e.g. Dr., Prof",
|
43
|
-
"optional":true,
|
44
38
|
"type":"string"
|
45
39
|
},
|
46
40
|
"tax_number": {
|
47
41
|
"description": "Tax number, normaly applies to a private person",
|
48
|
-
"optional":true,
|
49
42
|
"type":"string"
|
50
43
|
},
|
51
44
|
"vat_number": {
|
52
45
|
"description": "VAT number, for a company or person paying value added taxes.",
|
53
|
-
"optional":true,
|
54
46
|
"type":"string"
|
55
47
|
},
|
56
48
|
"email": {
|
57
49
|
"description": "Email address of the contact.",
|
58
|
-
"optional":true,
|
59
50
|
"type":"string"
|
60
51
|
},
|
61
52
|
"url": {
|
62
53
|
"description": "An url associated with the person, e.g its company website.",
|
63
|
-
"optional":true,
|
64
54
|
"type":"string"
|
65
55
|
},
|
66
56
|
"birthday": {
|
67
57
|
"format":"date",
|
68
|
-
"optional":true,
|
69
58
|
"type":"string"
|
70
59
|
},
|
71
60
|
"tag_list": {
|
72
61
|
"description": "Space seperated list of tags.",
|
73
|
-
"optional":true,
|
74
62
|
"type":"string"
|
75
63
|
},
|
76
64
|
"created_at": {
|
77
65
|
"description": "Date the record was created in SK. Never changes afterwards.",
|
78
66
|
"format":"date-time",
|
79
|
-
"optional":true,
|
80
67
|
"readonly":true,
|
81
68
|
"type":"string"
|
82
69
|
},
|
83
70
|
"updated_at": {
|
84
71
|
"description": "Last date when the record was edited.",
|
85
72
|
"format":"date-time",
|
86
|
-
"optional":true,
|
87
73
|
"readonly":true,
|
88
74
|
"type":"string"
|
89
75
|
},
|
90
76
|
"bank_number": {
|
91
77
|
"description": "Number of the bank",
|
92
|
-
"optional":true,
|
93
78
|
"type":"string"
|
94
79
|
},
|
95
80
|
"bank_name": {
|
96
81
|
"description": "Name of the bank.",
|
97
|
-
"optional":true,
|
98
82
|
"type":"string"
|
99
83
|
},
|
100
84
|
"bank_account_number": {
|
101
85
|
"description": "Number of the bank account.",
|
102
|
-
"optional":true,
|
103
86
|
"type":"string"
|
104
87
|
},
|
105
88
|
"bank_iban": {
|
106
89
|
"description": "IBAN Number of the bank account. Is validated",
|
107
|
-
"optional":true,
|
108
90
|
"type":"string"
|
109
91
|
},
|
110
92
|
"bank_swift": {
|
111
93
|
"description": "SWIFT BIC- Bank Identifier Code",
|
112
|
-
"optional":true,
|
113
94
|
"type":"string"
|
114
95
|
},
|
115
96
|
"bank_owner": {
|
116
97
|
"description": "Owner of the bank account.",
|
117
|
-
"optional":true,
|
118
98
|
"type":"string"
|
119
99
|
},
|
120
100
|
"phone_fax": {
|
121
101
|
"description": "Fax number",
|
122
|
-
"optional":true,
|
123
102
|
"type":"string"
|
124
103
|
},
|
125
104
|
"phone_office": {
|
126
105
|
"description": "Office phone number",
|
127
|
-
"optional":true,
|
128
106
|
"type":"string"
|
129
107
|
},
|
130
108
|
"phone_home": {
|
131
109
|
"description": "Private phone number.",
|
132
|
-
"optional":true,
|
133
110
|
"type":"string"
|
134
111
|
},
|
135
112
|
"phone_mobile": {
|
136
113
|
"description": "Mobile phone number",
|
137
|
-
"optional":true,
|
138
114
|
"type":"string"
|
139
115
|
},
|
140
116
|
"lock_version": {
|
141
117
|
"description": "Increased on every edit, so SK can detect/prevent a concurrent edit by another user. First save wins.",
|
142
|
-
"optional":true,
|
143
|
-
"readonly":true,
|
144
118
|
"type":"integer"
|
145
119
|
},
|
146
120
|
"cash_discount": {
|
147
121
|
"description": "Default cash discount for new invoices.",
|
148
|
-
"optional":true,
|
149
122
|
"type":"number"
|
150
123
|
},
|
151
124
|
"due_days": {
|
152
125
|
"description": "Default due days for new invoices.",
|
153
|
-
"optional":true,
|
154
126
|
"type":"integer"
|
155
127
|
},
|
156
128
|
"address_field": {
|
157
129
|
"description": "Returns the address field used on new docs. Consist of Organisation name and default(first) address",
|
158
|
-
"optional":true,
|
159
130
|
"readonly":true,
|
160
131
|
"type":"string"
|
161
132
|
},
|
162
133
|
"addresses": {
|
163
134
|
"description": "A client can have many addresses, sorted by date descending(new first). Default address is the most recent one.",
|
164
|
-
"optional":true,
|
165
135
|
"type":"array",
|
166
136
|
"properties" : {"$ref":"./addresses.json#properties"}
|
167
137
|
}
|
data/json/v1.0/credit_note.json
CHANGED
@@ -1,77 +1,64 @@
|
|
1
1
|
{ "type":"object",
|
2
|
-
"title": "
|
2
|
+
"title": "credit_note",
|
3
3
|
"description": "A credit note",
|
4
4
|
"properties":{
|
5
5
|
"id":{
|
6
6
|
"description": "UUID assigned by SK",
|
7
7
|
"identity":true,
|
8
|
-
"optional":true,
|
9
8
|
"readonly":true,
|
10
9
|
"type":"string"
|
11
10
|
},
|
12
11
|
"number":{
|
13
12
|
"description": "Unique number assigned by SK credit note number schema. Auto-assigned when document is opened. Required unless doc status is draft.",
|
14
|
-
"optional":true,
|
15
13
|
"type":"string"
|
16
14
|
},
|
17
15
|
"address_field":{
|
18
16
|
"description": "Address field with the receiver. Shown in envelope window.",
|
19
|
-
"optional":true,
|
20
17
|
"type":"string"
|
21
18
|
},
|
22
19
|
"date":{
|
23
20
|
"description": "Date the credit note is issued. Automatically set when document is opened. Required unless doc status is draft.",
|
24
21
|
"format":"date",
|
25
|
-
"optional":true,
|
26
22
|
"type":"string"
|
27
23
|
},
|
28
24
|
"due_days":{
|
29
25
|
"description": "Used to calculate the due date of the credit note. Useless if date and due date are present.",
|
30
|
-
"optional":true,
|
31
26
|
"type":"integer"
|
32
27
|
},
|
33
28
|
"due_date":{
|
34
29
|
"description": "Auto-calculated from date + due days if empty and the document is opened.",
|
35
30
|
"format":"date",
|
36
|
-
"optional":true,
|
37
31
|
"type":"string"
|
38
32
|
},
|
39
33
|
"status":{
|
40
|
-
"description": "
|
41
|
-
"optional":true,
|
34
|
+
"description": "Defaults to draft for new documents, unless otherwise stated. For new documents with status 'open', following fields are set if empty: number(next in number schema), date(today), due date(due_days must be given). Only draft invoices can be deleted.",
|
42
35
|
"default":"draft",
|
43
36
|
"enum":["draft","open","closed"],
|
44
37
|
"type":"string"
|
45
38
|
},
|
46
39
|
"payment_method":{
|
47
40
|
"description": "How the document is beeing payed. Used in new payments.",
|
48
|
-
"optional":true,
|
49
41
|
"enum":["cash","bank_transfer","credit_card","paypal","direct_debit","cheque"],
|
50
42
|
"type":"string"
|
51
43
|
},
|
52
44
|
"title":{
|
53
45
|
"description": "The headline of a document. Use SK placeholders to prevent exessive typing e.g. 'Your credit note [number]'",
|
54
|
-
"optional":true,
|
55
46
|
"type":"string"
|
56
47
|
},
|
57
48
|
"notes_before":{
|
58
49
|
"description": "Notes shown before the line items. Normaly contains salutation and other introductional information. SK placeholders can be used.",
|
59
|
-
"optional":true,
|
60
50
|
"type":"string"
|
61
51
|
},
|
62
52
|
"notes_after":{
|
63
53
|
"description": "Notes shown after the line items. Can contain information about payments, bank account or a thank-you message. SK placeholders can be used.",
|
64
|
-
"optional":true,
|
65
54
|
"type":"string"
|
66
55
|
},
|
67
56
|
"tag_list": {
|
68
57
|
"description": "Space seperated list of tags.",
|
69
|
-
"optional":true,
|
70
58
|
"type":"string"
|
71
59
|
},
|
72
60
|
"client":{
|
73
61
|
"description": "The client for the document. New documents cannot create a client, use client_id field to set it.",
|
74
|
-
"optional":true,
|
75
62
|
"readonly":true,
|
76
63
|
"type":"object",
|
77
64
|
"properties":{"$ref":"./client.json#properties"}
|
@@ -82,39 +69,32 @@
|
|
82
69
|
},
|
83
70
|
"line_items":{
|
84
71
|
"description": "Line items for the document",
|
85
|
-
"optional":true,
|
86
72
|
"type":"array",
|
87
73
|
"properties":{"$ref":"./address.json#properties"}
|
88
74
|
},
|
89
75
|
"created_at":{
|
90
|
-
"description": "Date the object was created in SK. Never changes
|
76
|
+
"description": "Date the object was created in SK. Never changes afterwards.",
|
91
77
|
"format":"date-time",
|
92
|
-
"optional":true,
|
93
78
|
"readonly":true,
|
94
79
|
"type":"string"
|
95
80
|
},
|
96
81
|
"updated_at":{
|
97
82
|
"description": "Date the object was edited in SK.",
|
98
83
|
"format":"date-time",
|
99
|
-
"optional":true,
|
100
84
|
"readonly":true,
|
101
85
|
"type":"string"
|
102
86
|
},
|
103
87
|
"lock_version":{
|
104
88
|
"description": "Auto-incremented by SK to prevent concurrent updateing. First save wins.",
|
105
|
-
"optional":true,
|
106
|
-
"readonly":true,
|
107
89
|
"type":"integer"
|
108
90
|
},
|
109
91
|
"price_total":{
|
110
92
|
"description": "Net total sum of all line items, 6 decimals places",
|
111
|
-
"optional":true,
|
112
93
|
"readonly":true,
|
113
94
|
"type":"number"
|
114
95
|
},
|
115
96
|
"price_tax":{
|
116
97
|
"description": "Summed up tax total of all line items, 2 decimals places",
|
117
|
-
"optional":true,
|
118
98
|
"readonly":true,
|
119
99
|
"type":"number"
|
120
100
|
}
|
data/json/v1.0/invoice.json
CHANGED
@@ -1,129 +1,180 @@
|
|
1
1
|
{ "type":"object",
|
2
2
|
"title": "invoice",
|
3
3
|
"description": "An invoice",
|
4
|
+
|
4
5
|
"properties":{
|
5
6
|
"id":{
|
6
7
|
"description": "UUID assigned by SK",
|
7
8
|
"identity":true,
|
8
|
-
"optional":true,
|
9
9
|
"readonly":true,
|
10
10
|
"type":"string"
|
11
11
|
},
|
12
12
|
"number":{
|
13
13
|
"description": "Unique number assigned by SK invoice number schema. Auto-assigned when invoice is opened. Required unless doc status is draft.",
|
14
|
-
"optional":true,
|
15
14
|
"type":"string"
|
16
15
|
},
|
17
16
|
"address_field":{
|
18
17
|
"description": "Address field with the receiver. Shown in envelope window.",
|
19
|
-
"optional":true,
|
20
18
|
"type":"string"
|
21
19
|
},
|
22
20
|
"date":{
|
23
|
-
"description": "Date the invoice is issued. Automatically set when invoice is opened. Required
|
21
|
+
"description": "Date the invoice is issued. Automatically set when invoice is opened. Required for non-draft documents.",
|
24
22
|
"format":"date",
|
25
|
-
"optional":true,
|
26
23
|
"type":"string"
|
27
24
|
},
|
28
25
|
"due_days":{
|
29
26
|
"description": "Used to calculate the due date of the invoice. Useless if date and due date are present.",
|
30
|
-
"optional":true,
|
31
27
|
"type":"integer"
|
32
28
|
},
|
33
29
|
"due_date":{
|
34
30
|
"description": "Auto-calculated from date + due days if empty and the invoice is opened.",
|
35
31
|
"format":"date",
|
36
|
-
"optional":true,
|
37
32
|
"type":"string"
|
38
33
|
},
|
39
34
|
"status":{
|
40
|
-
"description": "
|
41
|
-
"optional":true,
|
35
|
+
"description": "Defaults to draft for new documents, if empty. For new documents with status 'open',the following fields are set if empty: number(next in number schema), date(today), due date(today unless due_days given). Only draft invoices can be deleted.",
|
42
36
|
"default":"draft",
|
43
37
|
"enum":["draft","open","closed"],
|
44
38
|
"type":"string"
|
45
39
|
},
|
46
40
|
"payment_method":{
|
47
41
|
"description": "How the invoce is beeing payed. Used in new payments.",
|
48
|
-
"optional":true,
|
49
42
|
"enum":["cash","bank_transfer","credit_card","paypal","direct_debit","cheque"],
|
50
43
|
"type":"string"
|
51
44
|
},
|
52
45
|
"title":{
|
53
46
|
"description": "The headline of a document. Use SK placeholders to prevent exessive typing e.g. 'Your invoice [number]'",
|
54
|
-
"optional":true,
|
55
47
|
"type":"string"
|
56
48
|
},
|
57
49
|
"notes_before":{
|
58
50
|
"description": "Notes shown before the line items. Normaly contains salutation and other introductional information. SK placeholders can be used.",
|
59
|
-
"optional":true,
|
60
51
|
"type":"string"
|
61
52
|
},
|
62
53
|
"notes_after":{
|
63
54
|
"description": "Notes shown after the line items. Can contain information about payments, bank account or a thank-you message. SK placeholders can be used.",
|
64
|
-
"optional":true,
|
65
55
|
"type":"string"
|
66
56
|
},
|
67
57
|
"tag_list": {
|
68
58
|
"description": "Space seperated list of tags.",
|
69
|
-
"optional":true,
|
70
59
|
"type":"string"
|
71
60
|
},
|
72
61
|
"client":{
|
73
62
|
"description": "The client for the document. New documents cannot create a client, use client_id field to set it.",
|
74
|
-
"optional":true,
|
75
63
|
"readonly":true,
|
76
64
|
"type":"object",
|
77
65
|
"properties":{"$ref":"./client.json#properties"}
|
78
66
|
},
|
79
67
|
"archived_pdf":{
|
80
68
|
"description": "Archived PDF version of the document. Is created when an document is printed and archived. A document can have multiple archived versions. This only returns the most recent one. ",
|
81
|
-
"optional":true,
|
82
69
|
"readonly":true,
|
83
70
|
"type":"object",
|
84
71
|
"properties":{"$ref":"./attachment.json#properties"}
|
85
72
|
},
|
86
73
|
"client_id":{
|
87
74
|
"description": "The clients uuid, must be set for a new document. New invoices take the clients address field, due days and cash discount if those fields are not set.",
|
88
|
-
"type":"string"
|
75
|
+
"type":"string",
|
76
|
+
"required":true
|
89
77
|
},
|
90
78
|
"line_items":{
|
91
79
|
"description": "Line items for the document",
|
92
|
-
"optional":true,
|
93
80
|
"type":"array",
|
94
81
|
"properties":{"$ref":"./address.json#properties"}
|
95
82
|
},
|
96
83
|
"created_at":{
|
97
|
-
"description": "Date the object was created in SK. Never changes
|
84
|
+
"description": "Date the object was created in SK. Never changes afterwards.",
|
98
85
|
"format":"date-time",
|
99
|
-
"optional":true,
|
100
86
|
"readonly":true,
|
101
87
|
"type":"string"
|
102
88
|
},
|
103
89
|
"updated_at":{
|
104
90
|
"description": "Date the object was edited in SK.",
|
105
91
|
"format":"date-time",
|
106
|
-
"optional":true,
|
107
92
|
"readonly":true,
|
108
93
|
"type":"string"
|
109
94
|
},
|
110
95
|
"lock_version":{
|
111
96
|
"description": "Auto-incremented by SK to prevent concurrent updateing. First save wins.",
|
112
97
|
"optional":true,
|
113
|
-
"readonly":true,
|
114
98
|
"type":"integer"
|
115
99
|
},
|
116
100
|
"price_total":{
|
117
101
|
"description": "Net total sum of all line items, 6 decimals places",
|
118
|
-
"optional":true,
|
119
102
|
"readonly":true,
|
120
103
|
"type":"number"
|
121
104
|
},
|
122
105
|
"price_tax":{
|
123
106
|
"description": "Summed up tax total of all line items, 2 decimals places",
|
124
|
-
"optional":true,
|
125
107
|
"readonly":true,
|
126
108
|
"type":"number"
|
127
109
|
}
|
128
|
-
}
|
110
|
+
},
|
111
|
+
"links":[
|
112
|
+
{ "rel": "self",
|
113
|
+
"href": "invoices/{id}"
|
114
|
+
},
|
115
|
+
{ "rel": "instances",
|
116
|
+
"href": "invoices",
|
117
|
+
// Params /invoices?page=1&sort_by
|
118
|
+
"properties" : {
|
119
|
+
"q":{
|
120
|
+
"title" : "Search",
|
121
|
+
"description": "Search parameter."
|
122
|
+
},
|
123
|
+
"page":{
|
124
|
+
"title" : "Page",
|
125
|
+
"description": "In paginated results set the page to look for"
|
126
|
+
},
|
127
|
+
"filter[tags]":{
|
128
|
+
"title" : "Tags",
|
129
|
+
"description": "Filter by a space delimited list of tags"
|
130
|
+
},
|
131
|
+
"filter[from]":{
|
132
|
+
"title" : "From date",
|
133
|
+
"description": "All objects with a date after the date"
|
134
|
+
},
|
135
|
+
"filter[to]":{
|
136
|
+
"title" : "To date",
|
137
|
+
"description": "All objects with date before the date"
|
138
|
+
},
|
139
|
+
"sort_by":{
|
140
|
+
"title" : "Sort by",
|
141
|
+
"description": "Sort the results by the given field => invoice.number"
|
142
|
+
},
|
143
|
+
"sort":{
|
144
|
+
"title" : "Sort",
|
145
|
+
"description": "Sort the results in ASC or DESC"
|
146
|
+
}
|
147
|
+
}
|
148
|
+
},
|
149
|
+
{ "rel": "destroy",
|
150
|
+
"href": "invoices/{id}",
|
151
|
+
"method": "DELETE"
|
152
|
+
},
|
153
|
+
{ "rel": "update",
|
154
|
+
"href": "invoices/{id}",
|
155
|
+
"method": "PUT",
|
156
|
+
"properties" : {
|
157
|
+
"invoice" : {"$ref":"./invoice.json#properties"}
|
158
|
+
}
|
159
|
+
},
|
160
|
+
{ "rel": "create",
|
161
|
+
"href": "invoices",
|
162
|
+
"method": "POST"
|
163
|
+
},
|
164
|
+
{ "rel": "print",
|
165
|
+
"href": "invoices/{id}/print",
|
166
|
+
"method": "POST",
|
167
|
+
"properties" : {
|
168
|
+
"template_id" : {
|
169
|
+
"title" : "PDF template used for printing",
|
170
|
+
"description": "UUID of a pdf template used to print the document. MUST be present",
|
171
|
+
"required":true
|
172
|
+
},
|
173
|
+
"base64" : {
|
174
|
+
"title" : "Return the created pdf base64 encoded",
|
175
|
+
"description": "If set the new pdf is returned inside the attachment JSON within 'base64' key. Leave empty to save traffic."
|
176
|
+
}
|
177
|
+
}
|
178
|
+
}
|
179
|
+
]
|
129
180
|
}
|
data/json/v1.0/line_item.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
{ "type":"object",
|
2
|
-
"title": "
|
2
|
+
"title": "line_item",
|
3
3
|
"description": "A line item for a document",
|
4
4
|
"properties":{
|
5
5
|
"id":{
|
@@ -10,16 +10,15 @@
|
|
10
10
|
},
|
11
11
|
"position":{
|
12
12
|
"description": "Required since items are sorted by position.",
|
13
|
-
"type":"integer"
|
13
|
+
"type":"integer",
|
14
|
+
"required":true
|
14
15
|
},
|
15
16
|
"name":{
|
16
17
|
"description": "The name of an item",
|
17
|
-
"optional":true,
|
18
18
|
"type":"string"
|
19
19
|
},
|
20
20
|
"description":{
|
21
21
|
"description": "Item description",
|
22
|
-
"optional":true,
|
23
22
|
"type":"string"
|
24
23
|
},
|
25
24
|
"price_single":{
|
@@ -28,44 +27,39 @@
|
|
28
27
|
},
|
29
28
|
"tax":{
|
30
29
|
"description": "Tax percent for a single item.",
|
31
|
-
"optional":true,
|
32
30
|
"type":"number"
|
33
31
|
},
|
34
32
|
"discount":{
|
35
33
|
"description": "Discount in percent applied to the items net total",
|
36
|
-
"optional":true,
|
37
34
|
"type":"number"
|
38
35
|
},
|
39
36
|
"quantity_unit":{
|
40
|
-
"description": "
|
41
|
-
"optional":true,
|
37
|
+
"description": "Quantity unit: kg, days, month.",
|
42
38
|
"type":"string"
|
43
39
|
},
|
44
40
|
"quantity":{
|
45
|
-
"description": "Quantity of the item.",
|
46
|
-
"type":"number"
|
41
|
+
"description": "Quantity of the item. Must be > 0",
|
42
|
+
"type":"number",
|
43
|
+
"exclusiveMinimum":0,
|
44
|
+
"required":true
|
47
45
|
},
|
48
46
|
"product_id":{
|
49
47
|
"description": "An item can reference a product by its uuid. See use_product",
|
50
|
-
"optional":true,
|
51
48
|
"type":"string"
|
52
49
|
},
|
53
50
|
"use_product":{
|
54
51
|
"description": "If set and product_id is present, the products name, description, quantity, unit, price are copied if the according item fields are missing.",
|
55
|
-
"
|
56
|
-
"type":"integer"
|
52
|
+
"type":"boolean"
|
57
53
|
},
|
58
54
|
"created_at":{
|
59
|
-
"description": "Date the object was created in SK. Never changes
|
55
|
+
"description": "Date the object was created in SK. Never changes afterwards",
|
60
56
|
"format":"date-time",
|
61
|
-
"optional":true,
|
62
57
|
"readonly":true,
|
63
58
|
"type":"string"
|
64
59
|
},
|
65
60
|
"updated_at":{
|
66
61
|
"description": "Date the object was edited in SK.",
|
67
62
|
"format":"date-time",
|
68
|
-
"optional":true,
|
69
63
|
"readonly":true,
|
70
64
|
"type":"string"
|
71
65
|
}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
{ "type":"object",
|
2
|
+
"title": "product",
|
3
|
+
"description": "A product in SK",
|
4
|
+
"properties":{
|
5
|
+
"id":{
|
6
|
+
"description": "uuid of the product.",
|
7
|
+
"identity":true,
|
8
|
+
"readonly":true,
|
9
|
+
"type":"string"
|
10
|
+
},
|
11
|
+
"number":{
|
12
|
+
"description": "Unique number assigned by you or if emtpy SK product number schema.",
|
13
|
+
"type":"string"
|
14
|
+
},
|
15
|
+
"name":{
|
16
|
+
"description": "The name of the product",
|
17
|
+
"type":"string",
|
18
|
+
"required":true
|
19
|
+
},
|
20
|
+
"description":{
|
21
|
+
"description": "Product description",
|
22
|
+
"type":"string"
|
23
|
+
},
|
24
|
+
"price":{
|
25
|
+
"description": "Net price of a single product",
|
26
|
+
"type":"number"
|
27
|
+
},
|
28
|
+
"tax":{
|
29
|
+
"description": "Tax percentage for this product.",
|
30
|
+
"type":"number"
|
31
|
+
},
|
32
|
+
"quantity_unit":{
|
33
|
+
"description": "Unit like kg, days, month.",
|
34
|
+
"type":"string"
|
35
|
+
},
|
36
|
+
"created_at":{
|
37
|
+
"description": "Date the object was created in SK. Never changes afterwards",
|
38
|
+
"format":"date-time",
|
39
|
+
"readonly":true,
|
40
|
+
"type":"string"
|
41
|
+
},
|
42
|
+
"updated_at":{
|
43
|
+
"description": "Date the object was edited in SK.",
|
44
|
+
"format":"date-time",
|
45
|
+
"readonly":true,
|
46
|
+
"type":"string"
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
data/json/v1.0/user.json
CHANGED
@@ -4,34 +4,28 @@
|
|
4
4
|
"properties": {
|
5
5
|
"id": {
|
6
6
|
"identity":true,
|
7
|
-
"optional":true,
|
8
7
|
"readonly":true,
|
9
8
|
"type":"string"
|
10
9
|
},
|
11
10
|
"last_name": {
|
12
11
|
"description": "Last name of a person. At least this or the organisation field must be filled for new records",
|
13
|
-
"optional":true,
|
14
12
|
"type":"string"
|
15
13
|
},
|
16
14
|
"first_name": {
|
17
|
-
|
18
|
-
"optional":true,
|
15
|
+
"description": "First name of a person.",
|
19
16
|
"type":"string"
|
20
17
|
},
|
21
18
|
"gender": {
|
22
19
|
"description": "Can be empty for a company. Is used in salutation",
|
23
|
-
"optional":true,
|
24
20
|
"enum":["male", "female"],
|
25
21
|
"type":"string"
|
26
22
|
},
|
27
23
|
"position": {
|
28
24
|
"description": "Position of a person in a company.",
|
29
|
-
"optional":true,
|
30
25
|
"type":"string"
|
31
26
|
},
|
32
27
|
"title": {
|
33
28
|
"description": "Academical title of a person e.g. Dr., Prof",
|
34
|
-
"optional":true,
|
35
29
|
"type":"string"
|
36
30
|
},
|
37
31
|
"language": {
|
@@ -41,42 +35,23 @@
|
|
41
35
|
},
|
42
36
|
"time_zone": {
|
43
37
|
"description": "the users time zone inside SK",
|
44
|
-
"optional":true,
|
45
38
|
"type":"string"
|
46
39
|
},
|
47
40
|
"email": {
|
48
|
-
"description": "Email address of the
|
49
|
-
"
|
41
|
+
"description": "Email address of the user. Unique in SK",
|
42
|
+
"required":true,
|
50
43
|
"type":"string"
|
51
44
|
},
|
52
45
|
"url": {
|
53
46
|
"description": "An url associated with the person, e.g its company website.",
|
54
|
-
"optional":true,
|
55
47
|
"type":"string"
|
56
48
|
},
|
57
49
|
"birthday": {
|
58
50
|
"format":"date",
|
59
|
-
"optional":true,
|
60
51
|
"type":"string"
|
61
52
|
},
|
62
|
-
"created_at": {
|
63
|
-
"description": "Date the record was created in SK. Never changes afterwards.",
|
64
|
-
"format":"date-time",
|
65
|
-
"optional":true,
|
66
|
-
"readonly":true,
|
67
|
-
"type":"string"
|
68
|
-
},
|
69
|
-
"updated_at": {
|
70
|
-
"description": "Last date when the record was edited.",
|
71
|
-
"format":"date-time",
|
72
|
-
"optional":true,
|
73
|
-
"readonly":true,
|
74
|
-
"type":"string"
|
75
|
-
},
|
76
|
-
|
77
53
|
"phone_fax": {
|
78
54
|
"description": "Fax number",
|
79
|
-
"optional":true,
|
80
55
|
"type":"string"
|
81
56
|
},
|
82
57
|
"phone_office": {
|
@@ -94,18 +69,23 @@
|
|
94
69
|
"optional":true,
|
95
70
|
"type":"string"
|
96
71
|
},
|
97
|
-
"
|
98
|
-
"description": "
|
99
|
-
"
|
72
|
+
"created_at": {
|
73
|
+
"description": "Date the record was created in SK. Never changes afterwards.",
|
74
|
+
"format":"date-time",
|
100
75
|
"readonly":true,
|
101
|
-
"type":"
|
102
|
-
},
|
103
|
-
"
|
104
|
-
"description": "
|
105
|
-
"
|
76
|
+
"type":"string"
|
77
|
+
},
|
78
|
+
"updated_at": {
|
79
|
+
"description": "Last date when the record was edited.",
|
80
|
+
"format":"date-time",
|
106
81
|
"readonly":true,
|
107
82
|
"type":"string"
|
108
83
|
}
|
84
|
+
},
|
109
85
|
|
110
|
-
|
86
|
+
"links":[
|
87
|
+
{ "rel": "self",
|
88
|
+
"href": "users/current"
|
89
|
+
}
|
90
|
+
]
|
111
91
|
}
|
data/lib/sk_api_schema.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/hash/indifferent_access'
|
3
3
|
module SK
|
4
4
|
module Api
|
5
5
|
class Schema
|
@@ -9,10 +9,12 @@ module SK
|
|
9
9
|
# === Parameter
|
10
10
|
# schema<String|Symbol>::name of the schema, available ones are in json directory
|
11
11
|
# version<String>:: version to read, this is the folder name where the schema is in.
|
12
|
+
# === Return
|
13
|
+
# <HashWithIndifferentAccess>:: schema as hash
|
12
14
|
def self.read(schema, version)
|
13
15
|
file_path = File.join(File.dirname(__FILE__), '../json', version, "#{schema}.json")
|
14
16
|
plain_data = File.open(file_path, 'r'){|f| f.read}
|
15
|
-
ActiveSupport::JSON.decode(plain_data)
|
17
|
+
ActiveSupport::JSON.decode(plain_data).with_indifferent_access
|
16
18
|
end
|
17
19
|
|
18
20
|
# Create a Hash with the available (api)object attributes defined in
|
@@ -40,16 +42,16 @@ module SK
|
|
40
42
|
# iterate over the defined schema fields
|
41
43
|
schema['properties'].each do |field, prop|
|
42
44
|
if prop['type'] == 'array'
|
43
|
-
# always set an empty array
|
44
|
-
data[field] = []
|
45
|
+
data[field] = [] # always set an empty array
|
45
46
|
if rel_objects = obj.send( field )
|
46
47
|
rel_objects.each do |rel_obj|
|
47
|
-
# call related objects to_hash_from_schema method ex:
|
48
|
+
# call related objects to_hash_from_schema method ex:
|
49
|
+
# data[:client][:addresses] << SKApi::Models::Address.to_hash_from_schema(object)
|
48
50
|
data[field] << self.to_hash_from_schema(rel_obj, version)
|
49
51
|
end
|
50
52
|
end
|
51
53
|
elsif prop['type'] == 'object' # a singular related object
|
52
|
-
data[field] = nil
|
54
|
+
data[field] = nil # always set empty val
|
53
55
|
if rel_obj = obj.send( field )
|
54
56
|
data[field] = self.to_hash_from_schema(rel_obj, version)
|
55
57
|
end
|
data/sk_api_schema.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sk_api_schema}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Georg Leciejewski"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-12-03}
|
13
13
|
s.description = %q{SalesKing API JSON schema and utility methods}
|
14
14
|
s.email = %q{gl@salesking.eu}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"json/v1.0/credit_note.json",
|
27
27
|
"json/v1.0/invoice.json",
|
28
28
|
"json/v1.0/line_item.json",
|
29
|
+
"json/v1.0/product.json",
|
29
30
|
"json/v1.0/user.json",
|
30
31
|
"lib/sk_api_schema.rb",
|
31
32
|
"sk_api_schema.gemspec",
|
data/spec/sk_api_schema_spec.rb
CHANGED
@@ -4,8 +4,8 @@ describe SK::Api::Schema do
|
|
4
4
|
|
5
5
|
it "should read json schema file" do
|
6
6
|
schema = SK::Api::Schema.read(:invoice, 'v1.0')
|
7
|
-
schema[
|
8
|
-
schema[
|
7
|
+
schema[:title].should == 'invoice'
|
8
|
+
schema[:type].should == 'object'
|
9
9
|
schema['properties'].should be_a Hash
|
10
10
|
schema['properties']['id']['identity'].should be_true
|
11
11
|
end
|
@@ -45,10 +45,9 @@ describe SK::Api::Schema, 'object parsing' do
|
|
45
45
|
@item.price_single = 0.99
|
46
46
|
end
|
47
47
|
|
48
|
-
|
49
48
|
it "should parse object without relations from schema" do
|
50
49
|
obj_hash = SK::Api::Schema.to_hash_from_schema(@invoice, 'v1.0')
|
51
|
-
obj_hash.should == {"invoice"=>{"number"=>"911", "line_items"=>[], "title"=>"Your Invoice", "id"=>"some-uuid", "
|
50
|
+
obj_hash.should == {"invoice"=>{"number"=>"911", "line_items"=>[], "archived_pdf"=>nil, "title"=>"Your Invoice", "date"=>nil, "id"=>"some-uuid", "client"=>nil, "due_date"=>nil}}
|
52
51
|
client_obj_hash = SK::Api::Schema.to_hash_from_schema(@client, 'v1.0')
|
53
52
|
client_obj_hash.should == {"client"=>{"number"=>"911", "addresses"=>[], "id"=>"some-uuid", "organisation"=>"Dirty Food Inc.", "last_name"=>nil}}
|
54
53
|
end
|
@@ -57,7 +56,7 @@ describe SK::Api::Schema, 'object parsing' do
|
|
57
56
|
@invoice.line_items = [@item]
|
58
57
|
@invoice.client = @client
|
59
58
|
obj_hash = SK::Api::Schema.to_hash_from_schema(@invoice, 'v1.0')
|
60
|
-
obj_hash.should == {"invoice"=>{"number"=>"911", "line_items"=>[{"line_item"=>{"
|
59
|
+
obj_hash.should == {"invoice"=>{"number"=>"911", "line_items"=>[{"line_item"=>{"name"=>"Pork Chops", "position"=>1, "id"=>"some-uuid", "description"=>"Yummi Pork chopped by mexian emigrants", "price_single"=>0.99}}], "archived_pdf"=>nil, "title"=>"Your Invoice", "date"=>nil, "id"=>"some-uuid", "client"=>{"client"=>{"number"=>"911", "addresses"=>[], "id"=>"some-uuid", "organisation"=>"Dirty Food Inc.", "last_name"=>nil}}, "due_date"=>nil}}
|
61
60
|
end
|
62
61
|
|
63
62
|
end
|
@@ -65,7 +64,7 @@ end
|
|
65
64
|
################################################################################
|
66
65
|
# virtual classes used in test
|
67
66
|
class Invoice
|
68
|
-
attr_accessor :id, :title, :description, :number, :date, :due_date, :line_items, :client
|
67
|
+
attr_accessor :id, :title, :description, :number, :date, :due_date, :line_items, :client, :archived_pdf
|
69
68
|
end
|
70
69
|
|
71
70
|
class LineItem
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sk_api_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Georg Leciejewski
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-03 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- json/v1.0/credit_note.json
|
66
66
|
- json/v1.0/invoice.json
|
67
67
|
- json/v1.0/line_item.json
|
68
|
+
- json/v1.0/product.json
|
68
69
|
- json/v1.0/user.json
|
69
70
|
- lib/sk_api_schema.rb
|
70
71
|
- sk_api_schema.gemspec
|