invoice_printer 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/simple_invoice.pdf +500 -0
- data/examples/simple_invoice.rb +38 -0
- data/lib/invoice_printer/document.rb +34 -29
- data/lib/invoice_printer/document/item.rb +8 -8
- data/lib/invoice_printer/pdf_document.rb +43 -37
- data/lib/invoice_printer/version.rb +1 -1
- data/test/inputs_test.rb +50 -0
- data/test/test_ext.rb +5 -4
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84c63166563f07600da5c24502fe65718efa116e
|
4
|
+
data.tar.gz: 42db457839724f952cbf2b236452bae952d17457
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8062350622bb3d92c942faf0afa56668b3da088c2894c66e3138e9c88c990434898150517bfb3dc57997ee7ac090b288cc538293ed17e69053f0e2342925726
|
7
|
+
data.tar.gz: 3b9315eaf70122a9ad504bcae26f8520193ff4e5c467a49569123f7308b9f76321ca0c6f3a0d7b8858ee88574af213f6111ee105ba4042516b6c4ec5fea4f343
|
@@ -0,0 +1,500 @@
|
|
1
|
+
%PDF-1.3
|
2
|
+
%����
|
3
|
+
1 0 obj
|
4
|
+
<< /Creator <feff0050007200610077006e>
|
5
|
+
/Producer <feff0050007200610077006e>
|
6
|
+
>>
|
7
|
+
endobj
|
8
|
+
2 0 obj
|
9
|
+
<< /Type /Catalog
|
10
|
+
/Pages 3 0 R
|
11
|
+
>>
|
12
|
+
endobj
|
13
|
+
3 0 obj
|
14
|
+
<< /Type /Pages
|
15
|
+
/Count 1
|
16
|
+
/Kids [5 0 R]
|
17
|
+
>>
|
18
|
+
endobj
|
19
|
+
4 0 obj
|
20
|
+
<< /Length 5402
|
21
|
+
>>
|
22
|
+
stream
|
23
|
+
q
|
24
|
+
/DeviceRGB cs
|
25
|
+
0.000 0.000 0.000 scn
|
26
|
+
|
27
|
+
BT
|
28
|
+
36.0 741.64 Td
|
29
|
+
/F1.0 20 Tf
|
30
|
+
[<496e> 20 <76> 25 <6f696365>] TJ
|
31
|
+
ET
|
32
|
+
|
33
|
+
|
34
|
+
BT
|
35
|
+
402.24 741.64 Td
|
36
|
+
/F1.0 20 Tf
|
37
|
+
[<4e4f> 40 <2e20313938393030303030303031>] TJ
|
38
|
+
ET
|
39
|
+
|
40
|
+
|
41
|
+
BT
|
42
|
+
46.0 688.82 Td
|
43
|
+
/F1.0 10 Tf
|
44
|
+
[<50726f> 15 <7669646572>] TJ
|
45
|
+
ET
|
46
|
+
|
47
|
+
|
48
|
+
BT
|
49
|
+
46.0 665.948 Td
|
50
|
+
/F1.0 14 Tf
|
51
|
+
[<4a6f686e205768697465>] TJ
|
52
|
+
ET
|
53
|
+
|
54
|
+
|
55
|
+
BT
|
56
|
+
46.0 648.82 Td
|
57
|
+
/F1.0 10 Tf
|
58
|
+
[<3574682041> 40 <76> 25 <656e> 10 <75652020202031>] TJ
|
59
|
+
ET
|
60
|
+
|
61
|
+
|
62
|
+
BT
|
63
|
+
46.0 633.82 Td
|
64
|
+
/F1.0 10 Tf
|
65
|
+
[<373437203035>] TJ
|
66
|
+
ET
|
67
|
+
|
68
|
+
|
69
|
+
BT
|
70
|
+
96.0 633.82 Td
|
71
|
+
/F1.0 10 Tf
|
72
|
+
[<4e5943>] TJ
|
73
|
+
ET
|
74
|
+
|
75
|
+
|
76
|
+
BT
|
77
|
+
326.0 688.82 Td
|
78
|
+
/F1.0 10 Tf
|
79
|
+
[<507572636861736572>] TJ
|
80
|
+
ET
|
81
|
+
|
82
|
+
|
83
|
+
BT
|
84
|
+
326.0 665.948 Td
|
85
|
+
/F1.0 14 Tf
|
86
|
+
[<57696c6c20426c6163> 20 <6b>] TJ
|
87
|
+
ET
|
88
|
+
|
89
|
+
|
90
|
+
BT
|
91
|
+
326.0 648.82 Td
|
92
|
+
/F1.0 10 Tf
|
93
|
+
[<3774682041> 40 <76> 25 <656e> 10 <75652020202031>] TJ
|
94
|
+
ET
|
95
|
+
|
96
|
+
|
97
|
+
BT
|
98
|
+
326.0 633.82 Td
|
99
|
+
/F1.0 10 Tf
|
100
|
+
[<373437203730>] TJ
|
101
|
+
ET
|
102
|
+
|
103
|
+
|
104
|
+
BT
|
105
|
+
376.0 633.82 Td
|
106
|
+
/F1.0 10 Tf
|
107
|
+
[<4e5943>] TJ
|
108
|
+
ET
|
109
|
+
|
110
|
+
42.0 706.0 m
|
111
|
+
300.0 706.0 l
|
112
|
+
303.3137 706.0 306.0 703.3137 306.0 700.0 c
|
113
|
+
306.0 562.0 l
|
114
|
+
306.0 558.6863 303.3137 556.0 300.0 556.0 c
|
115
|
+
42.0 556.0 l
|
116
|
+
38.6863 556.0 36.0 558.6863 36.0 562.0 c
|
117
|
+
36.0 700.0 l
|
118
|
+
36.0 703.3137 38.6863 706.0 42.0 706.0 c
|
119
|
+
h
|
120
|
+
S
|
121
|
+
322.0 706.0 m
|
122
|
+
580.0 706.0 l
|
123
|
+
583.3137 706.0 586.0 703.3137 586.0 700.0 c
|
124
|
+
586.0 562.0 l
|
125
|
+
586.0 558.6863 583.3137 556.0 580.0 556.0 c
|
126
|
+
322.0 556.0 l
|
127
|
+
318.6863 556.0 316.0 558.6863 316.0 562.0 c
|
128
|
+
316.0 700.0 l
|
129
|
+
316.0 703.3137 318.6863 706.0 322.0 706.0 c
|
130
|
+
h
|
131
|
+
S
|
132
|
+
|
133
|
+
BT
|
134
|
+
46.0 518.82 Td
|
135
|
+
/F1.0 10 Tf
|
136
|
+
[<50> 40 <61> 30 <796d656e742062> 20 <792062616e6b207472> 10 <616e7366> 30 <6572206f6e20746865206163636f756e742062656c6f> 15 <773a>] TJ
|
137
|
+
ET
|
138
|
+
|
139
|
+
|
140
|
+
BT
|
141
|
+
46.0 503.82 Td
|
142
|
+
/F1.0 10 Tf
|
143
|
+
[<4163636f756e74204e4f3a>] TJ
|
144
|
+
ET
|
145
|
+
|
146
|
+
|
147
|
+
BT
|
148
|
+
111.0 503.82 Td
|
149
|
+
/F1.0 10 Tf
|
150
|
+
[<313536353436353436343635>] TJ
|
151
|
+
ET
|
152
|
+
|
153
|
+
42.0 536.0 m
|
154
|
+
300.0 536.0 l
|
155
|
+
303.3137 536.0 306.0 533.3137 306.0 530.0 c
|
156
|
+
306.0 497.0 l
|
157
|
+
306.0 493.6863 303.3137 491.0 300.0 491.0 c
|
158
|
+
42.0 491.0 l
|
159
|
+
38.6863 491.0 36.0 493.6863 36.0 497.0 c
|
160
|
+
36.0 530.0 l
|
161
|
+
36.0 533.3137 38.6863 536.0 42.0 536.0 c
|
162
|
+
h
|
163
|
+
S
|
164
|
+
|
165
|
+
BT
|
166
|
+
326.0 518.82 Td
|
167
|
+
/F1.0 10 Tf
|
168
|
+
[<497373756520646174653a>] TJ
|
169
|
+
ET
|
170
|
+
|
171
|
+
|
172
|
+
BT
|
173
|
+
426.0 518.82 Td
|
174
|
+
/F1.0 10 Tf
|
175
|
+
[<30352f30332f32303136>] TJ
|
176
|
+
ET
|
177
|
+
|
178
|
+
|
179
|
+
BT
|
180
|
+
326.0 503.82 Td
|
181
|
+
/F1.0 10 Tf
|
182
|
+
[<44756520646174653a>] TJ
|
183
|
+
ET
|
184
|
+
|
185
|
+
|
186
|
+
BT
|
187
|
+
426.0 503.82 Td
|
188
|
+
/F1.0 10 Tf
|
189
|
+
[<31392f30332f32303136>] TJ
|
190
|
+
ET
|
191
|
+
|
192
|
+
322.0 536.0 m
|
193
|
+
580.0 536.0 l
|
194
|
+
583.3137 536.0 586.0 533.3137 586.0 530.0 c
|
195
|
+
586.0 497.0 l
|
196
|
+
586.0 493.6863 583.3137 491.0 580.0 491.0 c
|
197
|
+
322.0 491.0 l
|
198
|
+
318.6863 491.0 316.0 493.6863 316.0 497.0 c
|
199
|
+
316.0 530.0 l
|
200
|
+
316.0 533.3137 318.6863 536.0 322.0 536.0 c
|
201
|
+
h
|
202
|
+
S
|
203
|
+
0.961 0.961 0.961 scn
|
204
|
+
36.0 395.008 148.6971 22.872 re
|
205
|
+
f
|
206
|
+
0.000 0.000 0.000 scn
|
207
|
+
1 w
|
208
|
+
36.0 418.38 m
|
209
|
+
36.0 393.508 l
|
210
|
+
S
|
211
|
+
184.6971 418.38 m
|
212
|
+
184.6971 393.508 l
|
213
|
+
S
|
214
|
+
36.0 417.88 m
|
215
|
+
184.6971 417.88 l
|
216
|
+
S
|
217
|
+
36.0 394.008 m
|
218
|
+
184.6971 394.008 l
|
219
|
+
S
|
220
|
+
/DeviceRGB CS
|
221
|
+
0.000 0.000 0.000 SCN
|
222
|
+
1 w
|
223
|
+
|
224
|
+
BT
|
225
|
+
41.0 401.636 Td
|
226
|
+
/F1.0 12 Tf
|
227
|
+
[<4974656d>] TJ
|
228
|
+
ET
|
229
|
+
|
230
|
+
0.000 0.000 0.000 scn
|
231
|
+
0.961 0.961 0.961 scn
|
232
|
+
184.6971 395.008 98.5342 22.872 re
|
233
|
+
f
|
234
|
+
0.000 0.000 0.000 scn
|
235
|
+
1 w
|
236
|
+
184.6971 418.38 m
|
237
|
+
184.6971 393.508 l
|
238
|
+
S
|
239
|
+
283.2313 418.38 m
|
240
|
+
283.2313 393.508 l
|
241
|
+
S
|
242
|
+
184.6971 417.88 m
|
243
|
+
283.2313 417.88 l
|
244
|
+
S
|
245
|
+
184.6971 394.008 m
|
246
|
+
283.2313 394.008 l
|
247
|
+
S
|
248
|
+
0.000 0.000 0.000 SCN
|
249
|
+
1 w
|
250
|
+
|
251
|
+
BT
|
252
|
+
233.5433 401.636 Td
|
253
|
+
/F1.0 12 Tf
|
254
|
+
[<5175616e74697479>] TJ
|
255
|
+
ET
|
256
|
+
|
257
|
+
0.000 0.000 0.000 scn
|
258
|
+
0.961 0.961 0.961 scn
|
259
|
+
283.2313 395.008 57.329 22.872 re
|
260
|
+
f
|
261
|
+
0.000 0.000 0.000 scn
|
262
|
+
1 w
|
263
|
+
283.2313 418.38 m
|
264
|
+
283.2313 393.508 l
|
265
|
+
S
|
266
|
+
340.5603 418.38 m
|
267
|
+
340.5603 393.508 l
|
268
|
+
S
|
269
|
+
283.2313 417.88 m
|
270
|
+
340.5603 417.88 l
|
271
|
+
S
|
272
|
+
283.2313 394.008 m
|
273
|
+
340.5603 394.008 l
|
274
|
+
S
|
275
|
+
0.000 0.000 0.000 SCN
|
276
|
+
1 w
|
277
|
+
|
278
|
+
BT
|
279
|
+
314.2243 401.636 Td
|
280
|
+
/F1.0 12 Tf
|
281
|
+
[<556e6974>] TJ
|
282
|
+
ET
|
283
|
+
|
284
|
+
0.000 0.000 0.000 scn
|
285
|
+
0.961 0.961 0.961 scn
|
286
|
+
340.5603 395.008 152.2801 22.872 re
|
287
|
+
f
|
288
|
+
0.000 0.000 0.000 scn
|
289
|
+
1 w
|
290
|
+
340.5603 418.38 m
|
291
|
+
340.5603 393.508 l
|
292
|
+
S
|
293
|
+
492.8404 418.38 m
|
294
|
+
492.8404 393.508 l
|
295
|
+
S
|
296
|
+
340.5603 417.88 m
|
297
|
+
492.8404 417.88 l
|
298
|
+
S
|
299
|
+
340.5603 394.008 m
|
300
|
+
492.8404 394.008 l
|
301
|
+
S
|
302
|
+
0.000 0.000 0.000 SCN
|
303
|
+
1 w
|
304
|
+
|
305
|
+
BT
|
306
|
+
413.6444 401.636 Td
|
307
|
+
/F1.0 12 Tf
|
308
|
+
[<5072> -15 <69636520706572206974656d>] TJ
|
309
|
+
ET
|
310
|
+
|
311
|
+
0.000 0.000 0.000 scn
|
312
|
+
0.961 0.961 0.961 scn
|
313
|
+
492.8404 395.008 93.1596 22.872 re
|
314
|
+
f
|
315
|
+
0.000 0.000 0.000 scn
|
316
|
+
1 w
|
317
|
+
492.8404 418.38 m
|
318
|
+
492.8404 393.508 l
|
319
|
+
S
|
320
|
+
586.0 418.38 m
|
321
|
+
586.0 393.508 l
|
322
|
+
S
|
323
|
+
492.8404 417.88 m
|
324
|
+
586.0 417.88 l
|
325
|
+
S
|
326
|
+
492.8404 394.008 m
|
327
|
+
586.0 394.008 l
|
328
|
+
S
|
329
|
+
0.000 0.000 0.000 SCN
|
330
|
+
1 w
|
331
|
+
|
332
|
+
BT
|
333
|
+
539.648 401.636 Td
|
334
|
+
/F1.0 12 Tf
|
335
|
+
[<416d6f756e74>] TJ
|
336
|
+
ET
|
337
|
+
|
338
|
+
0.000 0.000 0.000 scn
|
339
|
+
1 w
|
340
|
+
36.0 394.508 m
|
341
|
+
36.0 369.636 l
|
342
|
+
S
|
343
|
+
184.6971 394.508 m
|
344
|
+
184.6971 369.636 l
|
345
|
+
S
|
346
|
+
36.0 370.136 m
|
347
|
+
184.6971 370.136 l
|
348
|
+
S
|
349
|
+
0.000 0.000 0.000 SCN
|
350
|
+
1 w
|
351
|
+
|
352
|
+
BT
|
353
|
+
41.0 377.764 Td
|
354
|
+
/F1.0 12 Tf
|
355
|
+
[<50726f67> 10 <72> 10 <616d6d696e67>] TJ
|
356
|
+
ET
|
357
|
+
|
358
|
+
0.000 0.000 0.000 scn
|
359
|
+
1 w
|
360
|
+
184.6971 394.508 m
|
361
|
+
184.6971 369.636 l
|
362
|
+
S
|
363
|
+
283.2313 394.508 m
|
364
|
+
283.2313 369.636 l
|
365
|
+
S
|
366
|
+
184.6971 370.136 m
|
367
|
+
283.2313 370.136 l
|
368
|
+
S
|
369
|
+
0.000 0.000 0.000 SCN
|
370
|
+
1 w
|
371
|
+
|
372
|
+
BT
|
373
|
+
264.8873 377.764 Td
|
374
|
+
/F1.0 12 Tf
|
375
|
+
[<3130>] TJ
|
376
|
+
ET
|
377
|
+
|
378
|
+
0.000 0.000 0.000 scn
|
379
|
+
1 w
|
380
|
+
283.2313 394.508 m
|
381
|
+
283.2313 369.636 l
|
382
|
+
S
|
383
|
+
340.5603 394.508 m
|
384
|
+
340.5603 369.636 l
|
385
|
+
S
|
386
|
+
283.2313 370.136 m
|
387
|
+
340.5603 370.136 l
|
388
|
+
S
|
389
|
+
0.000 0.000 0.000 SCN
|
390
|
+
1 w
|
391
|
+
|
392
|
+
BT
|
393
|
+
324.8923 377.764 Td
|
394
|
+
/F1.0 12 Tf
|
395
|
+
[<6872>] TJ
|
396
|
+
ET
|
397
|
+
|
398
|
+
0.000 0.000 0.000 scn
|
399
|
+
1 w
|
400
|
+
340.5603 394.508 m
|
401
|
+
340.5603 369.636 l
|
402
|
+
S
|
403
|
+
492.8404 394.508 m
|
404
|
+
492.8404 369.636 l
|
405
|
+
S
|
406
|
+
340.5603 370.136 m
|
407
|
+
492.8404 370.136 l
|
408
|
+
S
|
409
|
+
0.000 0.000 0.000 SCN
|
410
|
+
1 w
|
411
|
+
|
412
|
+
BT
|
413
|
+
464.4884 377.764 Td
|
414
|
+
/F1.0 12 Tf
|
415
|
+
[<24203930>] TJ
|
416
|
+
ET
|
417
|
+
|
418
|
+
0.000 0.000 0.000 scn
|
419
|
+
1 w
|
420
|
+
492.8404 394.508 m
|
421
|
+
492.8404 369.636 l
|
422
|
+
S
|
423
|
+
586.0 394.508 m
|
424
|
+
586.0 369.636 l
|
425
|
+
S
|
426
|
+
492.8404 370.136 m
|
427
|
+
586.0 370.136 l
|
428
|
+
S
|
429
|
+
0.000 0.000 0.000 SCN
|
430
|
+
1 w
|
431
|
+
|
432
|
+
BT
|
433
|
+
550.976 377.764 Td
|
434
|
+
/F1.0 12 Tf
|
435
|
+
[<2420393030>] TJ
|
436
|
+
ET
|
437
|
+
|
438
|
+
0.000 0.000 0.000 scn
|
439
|
+
|
440
|
+
BT
|
441
|
+
480.352 318.648 Td
|
442
|
+
/F2.0 16 Tf
|
443
|
+
[<54> 80 <6f74616c3a2020202420393030>] TJ
|
444
|
+
ET
|
445
|
+
|
446
|
+
|
447
|
+
BT
|
448
|
+
552.648 27.384 Td
|
449
|
+
/F1.0 12 Tf
|
450
|
+
[<31202f2031>] TJ
|
451
|
+
ET
|
452
|
+
|
453
|
+
Q
|
454
|
+
|
455
|
+
endstream
|
456
|
+
endobj
|
457
|
+
5 0 obj
|
458
|
+
<< /Type /Page
|
459
|
+
/Parent 3 0 R
|
460
|
+
/MediaBox [0 0 612.0 792.0]
|
461
|
+
/Contents 4 0 R
|
462
|
+
/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
|
463
|
+
/Font << /F1.0 6 0 R
|
464
|
+
/F2.0 7 0 R
|
465
|
+
>>
|
466
|
+
>>
|
467
|
+
>>
|
468
|
+
endobj
|
469
|
+
6 0 obj
|
470
|
+
<< /Type /Font
|
471
|
+
/Subtype /Type1
|
472
|
+
/BaseFont /Helvetica
|
473
|
+
/Encoding /WinAnsiEncoding
|
474
|
+
>>
|
475
|
+
endobj
|
476
|
+
7 0 obj
|
477
|
+
<< /Type /Font
|
478
|
+
/Subtype /Type1
|
479
|
+
/BaseFont /Helvetica-Bold
|
480
|
+
/Encoding /WinAnsiEncoding
|
481
|
+
>>
|
482
|
+
endobj
|
483
|
+
xref
|
484
|
+
0 8
|
485
|
+
0000000000 65535 f
|
486
|
+
0000000015 00000 n
|
487
|
+
0000000109 00000 n
|
488
|
+
0000000158 00000 n
|
489
|
+
0000000215 00000 n
|
490
|
+
0000005669 00000 n
|
491
|
+
0000005859 00000 n
|
492
|
+
0000005956 00000 n
|
493
|
+
trailer
|
494
|
+
<< /Size 8
|
495
|
+
/Root 2 0 R
|
496
|
+
/Info 1 0 R
|
497
|
+
>>
|
498
|
+
startxref
|
499
|
+
6058
|
500
|
+
%%EOF
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This is an example of a very simple invoice.
|
3
|
+
|
4
|
+
lib = File.expand_path('../../lib', __FILE__)
|
5
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
+
require 'invoice_printer'
|
7
|
+
|
8
|
+
item = InvoicePrinter::Document::Item.new(
|
9
|
+
name: 'Programming',
|
10
|
+
quantity: '10',
|
11
|
+
unit: 'hr',
|
12
|
+
price: '$ 90',
|
13
|
+
amount: '$ 900'
|
14
|
+
)
|
15
|
+
|
16
|
+
invoice = InvoicePrinter::Document.new(
|
17
|
+
number: 'NO. 198900000001',
|
18
|
+
provider_name: 'John White',
|
19
|
+
provider_street: '5th Avenue',
|
20
|
+
provider_street_number: '1',
|
21
|
+
provider_postcode: '747 05',
|
22
|
+
provider_city: 'NYC',
|
23
|
+
purchaser_name: 'Will Black',
|
24
|
+
purchaser_street: '7th Avenue',
|
25
|
+
purchaser_street_number: '1',
|
26
|
+
purchaser_postcode: '747 70',
|
27
|
+
purchaser_city: 'NYC',
|
28
|
+
issue_date: '05/03/2016',
|
29
|
+
due_date: '19/03/2016',
|
30
|
+
total: '$ 900',
|
31
|
+
bank_account_number: '156546546465',
|
32
|
+
items: [item]
|
33
|
+
)
|
34
|
+
|
35
|
+
InvoicePrinter.print(
|
36
|
+
document: invoice,
|
37
|
+
file_name: 'simple_invoice.pdf'
|
38
|
+
)
|
@@ -40,6 +40,8 @@ module InvoicePrinter
|
|
40
40
|
# +amount should equal the sum of all item's +amount+,
|
41
41
|
# but this is not enforced.
|
42
42
|
class Document
|
43
|
+
class InvalidInput < StandardError; end
|
44
|
+
|
43
45
|
attr_reader :number,
|
44
46
|
# Provider fields
|
45
47
|
:provider_name,
|
@@ -107,36 +109,39 @@ module InvoicePrinter
|
|
107
109
|
account_iban: nil,
|
108
110
|
account_swift: nil,
|
109
111
|
items: nil)
|
110
|
-
@number = number
|
111
|
-
@provider_name = provider_name
|
112
|
-
@provider_ic = provider_ic
|
113
|
-
@provider_dic = provider_dic
|
114
|
-
@provider_street = provider_street
|
115
|
-
@provider_street_number = provider_street_number
|
116
|
-
@provider_postcode = provider_postcode
|
117
|
-
@provider_city = provider_city
|
118
|
-
@provider_city_part = provider_city_part
|
119
|
-
@provider_extra_address_line = provider_extra_address_line
|
120
|
-
@purchaser_name = purchaser_name
|
121
|
-
@purchaser_ic = purchaser_ic
|
122
|
-
@purchaser_dic = purchaser_dic
|
123
|
-
@purchaser_street = purchaser_street
|
124
|
-
@purchaser_street_number = purchaser_street_number
|
125
|
-
@purchaser_postcode = purchaser_postcode
|
126
|
-
@purchaser_city = purchaser_city
|
127
|
-
@purchaser_city_part = purchaser_city_part
|
128
|
-
@purchaser_extra_address_line = purchaser_extra_address_line
|
129
|
-
@issue_date = issue_date
|
130
|
-
@due_date = due_date
|
131
|
-
@subtotal = subtotal
|
132
|
-
@tax = tax
|
133
|
-
@tax2 = tax2
|
134
|
-
@tax3 = tax3
|
135
|
-
@total = total
|
136
|
-
@bank_account_number = bank_account_number
|
137
|
-
@account_iban = account_iban
|
138
|
-
@account_swift = account_swift
|
112
|
+
@number = String(number)
|
113
|
+
@provider_name = String(provider_name)
|
114
|
+
@provider_ic = String(provider_ic)
|
115
|
+
@provider_dic = String(provider_dic)
|
116
|
+
@provider_street = String(provider_street)
|
117
|
+
@provider_street_number = String(provider_street_number)
|
118
|
+
@provider_postcode = String(provider_postcode)
|
119
|
+
@provider_city = String(provider_city)
|
120
|
+
@provider_city_part = String(provider_city_part)
|
121
|
+
@provider_extra_address_line = String(provider_extra_address_line)
|
122
|
+
@purchaser_name = String(purchaser_name)
|
123
|
+
@purchaser_ic = String(purchaser_ic)
|
124
|
+
@purchaser_dic = String(purchaser_dic)
|
125
|
+
@purchaser_street = String(purchaser_street)
|
126
|
+
@purchaser_street_number = String(purchaser_street_number)
|
127
|
+
@purchaser_postcode = String(purchaser_postcode)
|
128
|
+
@purchaser_city = String(purchaser_city)
|
129
|
+
@purchaser_city_part = String(purchaser_city_part)
|
130
|
+
@purchaser_extra_address_line = String(purchaser_extra_address_line)
|
131
|
+
@issue_date = String(issue_date)
|
132
|
+
@due_date = String(due_date)
|
133
|
+
@subtotal = String(subtotal)
|
134
|
+
@tax = String(tax)
|
135
|
+
@tax2 = String(tax2)
|
136
|
+
@tax3 = String(tax3)
|
137
|
+
@total = String(total)
|
138
|
+
@bank_account_number = String(bank_account_number)
|
139
|
+
@account_iban = String(account_iban)
|
140
|
+
@account_swift = String(account_swift)
|
139
141
|
@items = items
|
142
|
+
|
143
|
+
raise InvalidInput, 'items are not only a type of InvoicePrinter::Document::Item' \
|
144
|
+
unless @items.select{ |i| !i.is_a?(InvoicePrinter::Document::Item) }.empty?
|
140
145
|
end
|
141
146
|
end
|
142
147
|
end
|
@@ -35,14 +35,14 @@ module InvoicePrinter
|
|
35
35
|
tax2: nil,
|
36
36
|
tax3: nil,
|
37
37
|
amount: nil)
|
38
|
-
@name = name
|
39
|
-
@quantity = quantity
|
40
|
-
@unit = unit
|
41
|
-
@price = price
|
42
|
-
@tax = tax
|
43
|
-
@tax2 = tax2
|
44
|
-
@tax3 = tax3
|
45
|
-
@amount = amount
|
38
|
+
@name = String(name)
|
39
|
+
@quantity = String(quantity)
|
40
|
+
@unit = String(unit)
|
41
|
+
@price = String(price)
|
42
|
+
@tax = String(tax)
|
43
|
+
@tax2 = String(tax2)
|
44
|
+
@tax3 = String(tax3)
|
45
|
+
@amount = String(amount)
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -14,10 +14,11 @@ module InvoicePrinter
|
|
14
14
|
# logo: 'example.jpg'
|
15
15
|
# )
|
16
16
|
class PDFDocument
|
17
|
-
attr_reader :invoice, :labels, :file_name, :font, :logo
|
18
|
-
|
19
17
|
class FontFileNotFound < StandardError; end
|
20
18
|
class LogoFileNotFound < StandardError; end
|
19
|
+
class InvalidInput < StandardError; end
|
20
|
+
|
21
|
+
attr_reader :invoice, :labels, :file_name, :font, :logo
|
21
22
|
|
22
23
|
DEFAULT_LABELS = {
|
23
24
|
name: 'Invoice',
|
@@ -58,22 +59,28 @@ module InvoicePrinter
|
|
58
59
|
@document = document
|
59
60
|
@labels = PDFDocument.labels.merge(labels)
|
60
61
|
@pdf = Prawn::Document.new
|
62
|
+
@font = font
|
63
|
+
@logo = logo
|
64
|
+
|
65
|
+
raise InvalidInput, 'document is not a type of InvoicePrinter::Document' \
|
66
|
+
unless @document.is_a?(InvoicePrinter::Document)
|
61
67
|
|
62
|
-
if logo &&
|
63
|
-
if File.exist?(logo)
|
68
|
+
if @logo && !@logo.empty?
|
69
|
+
if File.exist?(@logo)
|
64
70
|
@logo = logo
|
65
71
|
else
|
66
|
-
|
72
|
+
raise LogoFileNotFound, "Logotype file not found at #{@logo}"
|
67
73
|
end
|
68
74
|
end
|
69
75
|
|
70
|
-
if font &&
|
71
|
-
if File.exist?(font)
|
72
|
-
set_fonts(font) if font
|
76
|
+
if @font && !@font.empty?
|
77
|
+
if File.exist?(@font)
|
78
|
+
set_fonts(@font) if @font
|
73
79
|
else
|
74
|
-
|
80
|
+
raise FontFileNotFound, "Font file not found at #{@font}"
|
75
81
|
end
|
76
82
|
end
|
83
|
+
|
77
84
|
build_pdf
|
78
85
|
end
|
79
86
|
|
@@ -98,7 +105,6 @@ module InvoicePrinter
|
|
98
105
|
bold_italic: font
|
99
106
|
})
|
100
107
|
@pdf.font(font_name)
|
101
|
-
@font = font_name
|
102
108
|
end
|
103
109
|
|
104
110
|
def build_pdf
|
@@ -158,7 +164,7 @@ module InvoicePrinter
|
|
158
164
|
at: [60, 605],
|
159
165
|
width: 240
|
160
166
|
)
|
161
|
-
|
167
|
+
unless @document.provider_city_part.empty?
|
162
168
|
@pdf.text_box(
|
163
169
|
@document.provider_city_part,
|
164
170
|
size: 10,
|
@@ -166,7 +172,7 @@ module InvoicePrinter
|
|
166
172
|
width: 240
|
167
173
|
)
|
168
174
|
end
|
169
|
-
|
175
|
+
unless @document.provider_extra_address_line.empty?
|
170
176
|
@pdf.text_box(
|
171
177
|
@document.provider_extra_address_line,
|
172
178
|
size: 10,
|
@@ -174,7 +180,7 @@ module InvoicePrinter
|
|
174
180
|
width: 240
|
175
181
|
)
|
176
182
|
end
|
177
|
-
|
183
|
+
unless @document.provider_ic.empty?
|
178
184
|
@pdf.text_box(
|
179
185
|
"#{@labels[:ic]}: #{@document.provider_ic}",
|
180
186
|
size: 10,
|
@@ -182,7 +188,7 @@ module InvoicePrinter
|
|
182
188
|
width: 240
|
183
189
|
)
|
184
190
|
end
|
185
|
-
|
191
|
+
unless @document.provider_dic.empty?
|
186
192
|
@pdf.text_box(
|
187
193
|
"#{@labels[:dic]}: #{@document.provider_dic}",
|
188
194
|
size: 10,
|
@@ -223,7 +229,7 @@ module InvoicePrinter
|
|
223
229
|
at: [340, 605],
|
224
230
|
width: 240
|
225
231
|
)
|
226
|
-
|
232
|
+
unless @document.purchaser_city_part.empty?
|
227
233
|
@pdf.text_box(
|
228
234
|
@document.purchaser_city_part,
|
229
235
|
size: 10,
|
@@ -231,7 +237,7 @@ module InvoicePrinter
|
|
231
237
|
width: 240
|
232
238
|
)
|
233
239
|
end
|
234
|
-
|
240
|
+
unless @document.purchaser_extra_address_line.empty?
|
235
241
|
@pdf.text_box(
|
236
242
|
@document.purchaser_extra_address_line,
|
237
243
|
size: 10,
|
@@ -241,7 +247,7 @@ module InvoicePrinter
|
|
241
247
|
end
|
242
248
|
@pdf.stroke_rounded_rectangle([0, 670], 270, 150, 6)
|
243
249
|
@pdf.stroke_rounded_rectangle([280, 670], 270, 150, 6)
|
244
|
-
|
250
|
+
unless @document.purchaser_dic.empty?
|
245
251
|
@pdf.text_box(
|
246
252
|
"#{@labels[:dic]}: #{@document.purchaser_dic}",
|
247
253
|
size: 10,
|
@@ -249,7 +255,7 @@ module InvoicePrinter
|
|
249
255
|
width: 240
|
250
256
|
)
|
251
257
|
end
|
252
|
-
|
258
|
+
unless @document.purchaser_ic.empty?
|
253
259
|
@pdf.text_box(
|
254
260
|
"#{@labels[:ic]}: #{@document.purchaser_ic}",
|
255
261
|
size: 10,
|
@@ -260,7 +266,7 @@ module InvoicePrinter
|
|
260
266
|
end
|
261
267
|
|
262
268
|
def build_payment_method_box
|
263
|
-
if @document.bank_account_number.
|
269
|
+
if @document.bank_account_number.empty?
|
264
270
|
@pdf.stroke_rounded_rectangle([0, 540 - @push_down], 270, 45, 6)
|
265
271
|
@pdf.text_box(
|
266
272
|
@labels[:payment],
|
@@ -296,7 +302,7 @@ module InvoicePrinter
|
|
296
302
|
at: [75, 515 - @push_down],
|
297
303
|
width: 240
|
298
304
|
)
|
299
|
-
|
305
|
+
unless @document.account_swift.empty?
|
300
306
|
@pdf.text_box(
|
301
307
|
"#{@labels[:swift]}:",
|
302
308
|
size: 10,
|
@@ -312,7 +318,7 @@ module InvoicePrinter
|
|
312
318
|
box_height += 15
|
313
319
|
push_iban = 15
|
314
320
|
end
|
315
|
-
|
321
|
+
unless @document.account_iban.empty?
|
316
322
|
@pdf.text_box(
|
317
323
|
"#{@labels[:iban]}:",
|
318
324
|
size: 10,
|
@@ -331,8 +337,8 @@ module InvoicePrinter
|
|
331
337
|
end
|
332
338
|
|
333
339
|
def build_info_box
|
334
|
-
issue_date_present =
|
335
|
-
due_date_present =
|
340
|
+
issue_date_present = !@document.issue_date.empty?
|
341
|
+
due_date_present = !@document.due_date.empty?
|
336
342
|
if issue_date_present
|
337
343
|
@pdf.text_box(
|
338
344
|
"#{@labels[:issue_date]}:",
|
@@ -401,7 +407,7 @@ module InvoicePrinter
|
|
401
407
|
}
|
402
408
|
}
|
403
409
|
|
404
|
-
@pdf.table(items, styles)
|
410
|
+
@pdf.table(items, styles) unless items.empty?
|
405
411
|
end
|
406
412
|
|
407
413
|
# Determine sections of the items table to show based on provided data
|
@@ -409,14 +415,14 @@ module InvoicePrinter
|
|
409
415
|
items_params = {}
|
410
416
|
|
411
417
|
@document.items.each do |item|
|
412
|
-
items_params[:names] = true
|
413
|
-
items_params[:quantities] = true
|
414
|
-
items_params[:units] = true
|
415
|
-
items_params[:prices] = true
|
416
|
-
items_params[:taxes] = true
|
417
|
-
items_params[:taxes2] = true
|
418
|
-
items_params[:taxes3] = true
|
419
|
-
items_params[:amounts] = true
|
418
|
+
items_params[:names] = true unless item.name.empty?
|
419
|
+
items_params[:quantities] = true unless item.quantity.empty?
|
420
|
+
items_params[:units] = true unless item.unit.empty?
|
421
|
+
items_params[:prices] = true unless item.price.empty?
|
422
|
+
items_params[:taxes] = true unless item.tax.empty?
|
423
|
+
items_params[:taxes2] = true unless item.tax2.empty?
|
424
|
+
items_params[:taxes3] = true unless item.tax3.empty?
|
425
|
+
items_params[:amounts] = true unless item.amount.empty?
|
420
426
|
end
|
421
427
|
|
422
428
|
items_params
|
@@ -466,10 +472,10 @@ module InvoicePrinter
|
|
466
472
|
@pdf.move_down(25)
|
467
473
|
|
468
474
|
items = []
|
469
|
-
items << ["#{@labels[:subtotal]}:", @document.subtotal]
|
470
|
-
items << ["#{@labels[:tax]}:", @document.tax]
|
471
|
-
items << ["#{@labels[:tax2]}:", @document.tax2]
|
472
|
-
items << ["#{@labels[:tax3]}:", @document.tax3]
|
475
|
+
items << ["#{@labels[:subtotal]}:", @document.subtotal] unless @document.subtotal.empty?
|
476
|
+
items << ["#{@labels[:tax]}:", @document.tax] unless @document.tax.empty?
|
477
|
+
items << ["#{@labels[:tax2]}:", @document.tax2] unless @document.tax2.empty?
|
478
|
+
items << ["#{@labels[:tax3]}:", @document.tax3] unless @document.tax3.empty?
|
473
479
|
|
474
480
|
width = [
|
475
481
|
"#{@labels[:subtotal]}#{@document.subtotal}".size,
|
@@ -487,7 +493,7 @@ module InvoicePrinter
|
|
487
493
|
}
|
488
494
|
|
489
495
|
@pdf.span(width, position: :right) do
|
490
|
-
@pdf.table(items, styles)
|
496
|
+
@pdf.table(items, styles) unless items.empty?
|
491
497
|
end
|
492
498
|
|
493
499
|
@pdf.move_down(15)
|
data/test/inputs_test.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class InputsTest < Minitest::Test
|
4
|
+
include InvoicePrinterHelpers
|
5
|
+
|
6
|
+
def test_refuse_documents_of_wrong_class
|
7
|
+
assert_raises(StandardError) do
|
8
|
+
InvoicePrinter::PDFDocument.new(document: String.new)
|
9
|
+
end
|
10
|
+
|
11
|
+
assert_raises(StandardError) do
|
12
|
+
InvoicePrinter.render(document: String.new)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_refuse_items_of_wrong_class
|
17
|
+
assert_raises(StandardError) do
|
18
|
+
InvoicePrinter::Document.new(items: String.new)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_non_string_inputs_are_converted_to_strings
|
23
|
+
params = default_document_params.merge(
|
24
|
+
provider_ic: 12345678910,
|
25
|
+
provider_dic: 12345678910,
|
26
|
+
purchaser_ic: 12345678910,
|
27
|
+
purchaser_dic: 12345678910
|
28
|
+
)
|
29
|
+
|
30
|
+
# No exceptions should be raised
|
31
|
+
invoice = InvoicePrinter::Document.new(params)
|
32
|
+
InvoicePrinter.render(document: invoice)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_missing_font_raises_an_exception
|
36
|
+
invoice = InvoicePrinter::Document.new(default_document_params)
|
37
|
+
|
38
|
+
assert_raises(InvoicePrinter::PDFDocument::FontFileNotFound) do
|
39
|
+
InvoicePrinter.render(document: invoice, font: 'missing.font')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_missing_logo_raises_an_exception
|
44
|
+
invoice = InvoicePrinter::Document.new(default_document_params)
|
45
|
+
|
46
|
+
assert_raises(InvoicePrinter::PDFDocument::LogoFileNotFound) do
|
47
|
+
InvoicePrinter.render(document: invoice, logo: 'missing.png')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/test/test_ext.rb
CHANGED
@@ -16,8 +16,8 @@ module InvoicePrinter
|
|
16
16
|
strings << @document.provider_city_part
|
17
17
|
strings << @document.provider_extra_address_line
|
18
18
|
|
19
|
-
strings << "#{@labels[:ic]}: #{@document.provider_ic}" unless @document.provider_ic.
|
20
|
-
strings << "#{@labels[:dic]}: #{@document.provider_dic}" unless @document.provider_dic.
|
19
|
+
strings << "#{@labels[:ic]}: #{@document.provider_ic}" unless @document.provider_ic.empty?
|
20
|
+
strings << "#{@labels[:dic]}: #{@document.provider_dic}" unless @document.provider_dic.empty?
|
21
21
|
|
22
22
|
strings << @labels[:purchaser]
|
23
23
|
strings << @document.purchaser_name
|
@@ -27,8 +27,8 @@ module InvoicePrinter
|
|
27
27
|
strings << @document.purchaser_city_part
|
28
28
|
strings << @document.purchaser_extra_address_line
|
29
29
|
|
30
|
-
strings << "#{@labels[:ic]}: #{@document.purchaser_ic}" unless @document.purchaser_ic.
|
31
|
-
strings << "#{@labels[:dic]}: #{@document.purchaser_dic}" unless @document.purchaser_dic.
|
30
|
+
strings << "#{@labels[:ic]}: #{@document.purchaser_ic}" unless @document.purchaser_ic.empty?
|
31
|
+
strings << "#{@labels[:dic]}: #{@document.purchaser_dic}" unless @document.purchaser_dic.empty?
|
32
32
|
|
33
33
|
# Account
|
34
34
|
if @document.bank_account_number.nil?
|
@@ -68,6 +68,7 @@ module InvoicePrinter
|
|
68
68
|
strings << @document.tax2
|
69
69
|
strings << "#{@labels[:tax3]}:"
|
70
70
|
strings << @document.tax3
|
71
|
+
|
71
72
|
strings << "#{@labels[:total]}: #{@document.total}"
|
72
73
|
|
73
74
|
# TODO: dynamically test page numbers
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: invoice_printer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josef Strzibny
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prawn
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- examples/czech_invoice.pdf
|
82
82
|
- examples/czech_invoice.rb
|
83
83
|
- examples/example.jpg
|
84
|
+
- examples/simple_invoice.pdf
|
85
|
+
- examples/simple_invoice.rb
|
84
86
|
- invoice_printer.gemspec
|
85
87
|
- lib/invoice_printer.rb
|
86
88
|
- lib/invoice_printer/document.rb
|
@@ -88,6 +90,7 @@ files:
|
|
88
90
|
- lib/invoice_printer/pdf_document.rb
|
89
91
|
- lib/invoice_printer/version.rb
|
90
92
|
- test/dates_box_test.rb
|
93
|
+
- test/inputs_test.rb
|
91
94
|
- test/invoice_printer_test.rb
|
92
95
|
- test/items_table_test.rb
|
93
96
|
- test/labels_test.rb
|
@@ -120,6 +123,7 @@ specification_version: 4
|
|
120
123
|
summary: Super simple PDF invoicing in pure Ruby
|
121
124
|
test_files:
|
122
125
|
- test/dates_box_test.rb
|
126
|
+
- test/inputs_test.rb
|
123
127
|
- test/invoice_printer_test.rb
|
124
128
|
- test/items_table_test.rb
|
125
129
|
- test/labels_test.rb
|