# Опис форматерів
Для генерації чеків ми використовуємо бібліотеку `receipt`, яка за замовчуванням 
має наступні формати:

- `ruler`
- `text`
- `empty`
- `propeties`
- `table`

Ці формати мають обмеження, наприклад, `table` підтримує лише певні (захардкоджені 
імена стовпців). Але також ця бібліотека підтримує можливість розширення кастомними 
форматами.

Таким чином, ми додали ще декілька форматів:

- `smartTable` - форматер для таблиці, яка використовує під капотом або `narrowTable`, 
- або `wideTable`, залежно від ширини чека.
- `smartProperties`.
- `summary`

Розглянемо кожен з них детальніше.

## Ruler
Це просто рядок символів, які вказані в конфігурації, за замовчуванням це `-`. 
Використовується для розділення різних блоків чека.
```
Data example:                        
[                                     
  { type: 'ruler'}    
]

Receipt example:
'--------------------'
```

## Text
Текст з можливістю вирівнювання по лівому, центральному та правому краю.
```
Data example:                        
[                                      
   {                                  
      type: 'text',                   
      value: 'Test value left',       
      align: 'left',
   },
   {
      type: 'text',
      value: [
         'Test value center line1',
         'Test value center line2',
      ],
      align: 'center',
   },
   {
      type: 'text',
      value: 'Test value right',
      align: 'right',
   }
]

Receipt example:
'Test value left                         ', 
'         Test value center line1        ',
'         Test value center line2        ',
'                        Test value right',
```

## Empty
Порожній рядок, який використовується для розділення різних блоків чека.
```
Data example:                        
[                                     
  { type: 'empty'}    
]

Receipt example:
' ',
```

## SmartProperties
Формує таблицю з двома колонками: назва та значення. На відміну від стандартного 
`properties`, де колонка назв отримує ширину найдовшого рядка назви, ширина колонок 
буде у пропорції 4:6. Також є можливість приховувати деякі рядки.
```
Data example:                                             
[                                                          
  {                                                        
    type: 'smartProperties',                              
    lines: [                                             
      { name: "Официан", value: "Сергей" },
      { name: "Цех", value: "Кухня" },
      { name: "Стіл №", value: "1 (Основний зал)" },
      { name: "Тип замовлення", value: "У закладі" },
      { name: "Комментарии", value: "", hide: true },
    ],
  },
]

Receipt example:
'Официан             Сергей                        ',
'Цех                 Кухня                         ',
'Стіл №              1 (Основний зал)              ',
'Тип замовлення      У закладі                     ',
```

## Summary

```
Data example:
{
  type: 'summary',
  lines: [
    {name: 'Загальний обіг', value: priceFormat(12.20)},
    {name: 'Готівка', value: priceFormat(5.10)},
    {name: 'Картка', value: priceFormat(7.10)},
    {name: 'Кількість чеків', value: 20},
 ],
 delimeter: '.',
 hideTopBorder: false,
 hideBottomBorder: false,
}

Receipt example:
'--------------------------------------------------',
'Загальний обіг ............................. 12,20',
'Готівка ..................................... 5,10',
'Картка ...................................... 7,10',
'Кількість чеків  20',
'--------------------------------------------------',
```

## SmartTable
Під капотом вона застосовує або `narrowTable`, або `wideTable` в залежності від 
ширини чека.

### NarrowTable
NarrowTable - таблиця для чеків малої ширини. Вирівнює назву по лівому краю, а 
кількість, ціну та загальну суму - по правому. Якщо вся позиція не поміщається в 
одному рядку, назва друкується в першому, а кількість, ціна та загальна сума - в 
другому рядку. Ігнорує заголовок таблиці. (Повторює старий формат текстового чека). 
Дані однакові як для `narrowTable`, так і для `wideTable`.
``` 
Data example with long line:                                          
[                                                                      
  {                                                                    
     type: 'smartTable',                                               
     headers: [                                                        
        {name: 'Назва', relation: 10},                                 
        {name: 'Кількість', relation: 10},
        {name: 'Ціна', relation: 10},
        {name: 'Сума', relation: 10},
     ],
     items: [
        { row: ['Сирна паличка', '1 шт.', '200.00грн.', '200.00грн.'] },
        { row: ['Морозиво', '2 шт.', '92.13грн.', '184.26грн.'] },
     ],
  },
]

Receipt example:
'------------------------------',
'Сирна паличка                 ',
'   1 шт. 200.00грн. 200.00грн.',
'Морозиво                      ',
'    2 шт. 92.13грн. 184.26грн.',


Data example short line:                                               
[                                                                      
  {                                                                    
     type: 'smartTable',                                               
     items: [
        ['Сирна паличка', '1шт.'],
        ['Морозиво', '2шт.'],
     ],
  },
]

Receipt example:
'------------------------------',
'Сирна паличка             1шт.',
'Морозиво                  2шт.',
```

### WideTable
WideTable - таблиця для чеків "широкої" ширини. Формує повноцінну таблицю як з 
заголовком, так і без нього. Ширину стовбців можна задати за допомогою властивості 
relation.
```
Data example whit header:                                            
[                                                                    
  {                                                                 
     type: 'smartTable',                                             
     headers: [                                                      
        {name: 'Назва', relation: 10},                                
        {name: 'Кількість', relation: 5},                            
        {name: 'Ціна', relation: 5},
     ],
     items: [
        { row: ['Сирна паличка', '1 шт.', '200.00'] },
        { row: ['Морозиво', '2 шт.', '92.13'] },
     ],
  },
]

Receipt example:
'---------------------------------',
'Назва           Кількість   Ціна ',
'                                 ',
'Сирна паличка   1 шт.      200.00',
'Морозиво        2 шт.       92.13',
'---------------------------------',


Data example without header:                                         
[                                                                     
  {                                                                  
     type: 'smartTable',                                             
     items: [
        ['Сирна паличка',  200.00'],
        ['Морозиво',       '92.13'],
     ],
  },
]

Receipt example:
'---------------------------------',
'Сирна паличка              200.00',
'Морозиво                    92.13',
```

### Summary
Формує таблицю з двома колонками: назва та значення та точками між ними. 
Якщо значення не строка, то значеться рендериться одразу після назви.
```
Data example:
{
  type: 'summary',
  lines: [
    {name: 'Загальний обіг', value: priceFormat(12.20)},
    {name: 'Готівка', value: priceFormat(5.10)},
    {name: 'Картка', value: priceFormat(7.10)},
    {name: 'Кількість чеків', value: 20},
  ],
  delimeter: '.',
  hideTopBorder: false,
  hideBottomBorder: false,
}

Receipt example:
'--------------------------------------------------',
'Загальний обіг ............................. 12,20',
'Готівка ..................................... 5,10',
'Картка ...................................... 7,10',
'Кількість чеків  20',
'--------------------------------------------------',
```
