openapi: 3.0.0
info:
  title: Бади АПИ документација
  description: >
    Документација за приступ платформи Бади путем АПИ сервиса.


    > ⚠️ Напомена: АПИ документација још увек није комплетна.


    # Увод

    Добродошли на Бади АПИ документацију. Можете користити Бади АПИ за приступ
    ресурсима на платформи и за фискализацију рачуна.


    ## Окружења

    Доступна су два окружења:

    - **Sandbox**, користи се у сврху тестирања и развоја. Адреса АПИ сервиса је
    https://api.sandbox.badi.rs/v2 а адреса за приступ апликацији је
    https://sandbox.badi.rs

    - **Production**, продукцијско окружење. Адреса АПИ сервиса је
    https://api.production.badi.rs/v2 а адреса за приступ апликацији је
    https://app.badi.rs


    ## Верзија АПИ сервиса

    Тренутно активна верзија АПИ сервиса је **v2**


    ## Локални АПИ сервер

    Од верзије 3.2.0, на апликацији је могуће укључити локални АПИ сервер. Путем
    овог сервера је могуће приступати само ресурсима за фискализацију.

    Ресурсима се приступа путем HTTP протокола на адреси и порту који је
    конфигурисан у апликацији, без верзије АПИ сервиса, на пример:
    http://127.0.0.1:9999/fiscalization/receipts.


    Локалном АПИ серверу се приступа без аутентификације, и приликом захтева се
    не прослећује `clientId` или `storeId`.


    # Аутентификација

    > Аутентификација се не односи на локални АПИ


    Како бисте могли да користите АПИ, потребно је да креирате АПИ кључ и АПИ
    тајну у подешавањима апликације Бади. Више информација можете наћи на
    https://badi.rs/docs/koriscenje/moduli-aplikacije/podesavanja/aplikacije/za-programere/api-kljucevi/.


    > Пажња: АПИ тајна ће бити приказана само једном приликом креирања АПИ
    кључа. Уколико изгубите АПИ тајну, мораћете да је рекреирате. 


    АПИ кључ и тајна морају бити послати при сваком захтеву кроз _Authorization
    header_. Садржај овог поља се шаље као _base64_ кодиран АПИ кључ и тајна у
    формату `API_KEY:API_SECRET`. 


    На пример, ако је ваш АПИ кључ `production.6BO7smrNTMCpugLBzPSVdX` а АПИ
    тајна `6cuiEePSXps0xdHjm4SeQp`, саставите их као
    `production.6BO7smrNTMCpugLBzPSVdX:6cuiEePSXps0xdHjm4SeQp` и кодирајте их
    као _base64_. Добићете вредност
    `cHJvZHVjdGlvbi42Qk83c21yTlRNQ3B1Z0xCelBTVmRYOjZjdWlFZVBTWHBzMHhkSGptNFNlUXA=`. 


    Тако добијену вредност поставите у _Authorization header_ у формату  

    ```Basic
    cHJvZHVjdGlvbi42Qk83c21yTlRNQ3B1Z0xCelBTVmRYOjZjdWlFZVBTWHBzMHhkSGptNFNlUXA=```.
  version: 3.0.0
servers:
  - url: https://api.production.badi.rs/v2
    description: Продукционо окружење
  - url: https://api.sandbox.badi.rs/v2
    description: Окружење за тестирање и развој
security:
  - BasicAuth: []
tags:
  - name: store
    description: Продајна места
    x-displayName: Продајна места
  - name: product
    description: Артикли
    x-displayName: Артикли
  - name: unit
    description: Јединице мере
    x-displayName: Јединице мере
  - name: fiscalization
    x-displayName: Фискализација
    description: >
      Фискализација рачуна је могућа у следећим режимима:

      - Употребом ЛПФР-а или ВПФР-а путем јавног АПИ-ја уз коришћење апликације
      која је покренута на вашем рачунару, захтева сталну интернет везу  

      - Употребом ЛПФР-а или ВПФР-а путем локалног АПИ-ја уз коришћење
      апликације која је покренута на вашем рачунару, интернет веза није
      неопходна

      - Употребом ВПФР-а уз коришћење сертификата (у изради)  
  - name: store_model
    x-displayName: Продајно место
    description: |
      <SchemaDefinition schemaRef="#/components/schemas/Store" />
  - name: product_model
    x-displayName: Артикал
    description: |
      <SchemaDefinition schemaRef="#/components/schemas/ProductWithVariants" />
  - name: taxcore_receipt_model
    x-displayName: Фискални рачун
    description: |
      <SchemaDefinition schemaRef="#/components/schemas/TaxCoreReceipt" />
x-tagGroups:
  - name: АПИ методе
    tags:
      - store
      - product
      - fiscalization
  - name: Модели
    tags:
      - product_model
      - store_model
      - taxcore_receipt_model
paths:
  /stores:
    get:
      description: |
        Листа свих продајних места везаних за налог
        > ⚠️ Ова метода враћа сва продајна места без пагинације
      tags:
        - store
      summary: Листа продајних места
      operationId: getStores
      responses:
        '200':
          description: Продајна места
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Store'
    post:
      description: >
        Додавање продајног места

        > ⚠️ Коришћење апликације Бади се наплаћује по продајном месту, тако да
        будите сигурни да ли желите да додате ново продајно место.
      tags:
        - store
      summary: Додавање продајног места
      operationId: createStore
      requestBody:
        $ref: '#/components/requestBodies/Store'
      responses:
        '201':
          description: Продајно место
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Store'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /stores/{storeId}:
    patch:
      parameters:
        - in: path
          required: true
          name: storeId
          description: ИД продајног места
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
      description: |
        Измена продајног места
      tags:
        - store
      summary: Измена продајног места
      operationId: updateStore
      requestBody:
        $ref: '#/components/requestBodies/Store'
      responses:
        '200':
          description: Продајно место
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Store'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Продајно место није пронађено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    delete:
      parameters:
        - in: path
          required: true
          name: storeId
          description: ИД продајног места
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
      description: |
        Брисање продајног места
      tags:
        - store
      summary: Брисање продајног места
      operationId: deleteStore
      requestBody:
        $ref: '#/components/requestBodies/Store'
      responses:
        '200':
          description: Успешно обрисано продајно место
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties: {}
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Продајно место није пронађено
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /products:
    get:
      description: |
        Листа свих артикала
        > ⚠️ Ова метода враћа све артикле без пагинације
      tags:
        - product
      summary: Листа артикала
      operationId: getProducts
      responses:
        '200':
          description: Артикли
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProductWithVariants'
    post:
      description: |
        Додавање артикла
      tags:
        - product
      summary: Додавање артикла
      operationId: createProduct
      requestBody:
        $ref: '#/components/requestBodies/ProductWithImages'
      responses:
        '201':
          description: Артикал
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductWithVariants'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40003001: Шифра је већ у употреби
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /products/{productId}:
    patch:
      parameters:
        - in: path
          required: true
          name: productId
          description: ИД артикла
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
      description: |
        Измена артикла
      tags:
        - product
      summary: Измена артикла
      operationId: updateProduct
      requestBody:
        $ref: '#/components/requestBodies/ProductWithImages'
      responses:
        '200':
          description: Артикал
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductWithVariants'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40003001: Шифра је већ у употреби
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Артикал није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    delete:
      parameters:
        - in: path
          required: true
          name: productId
          description: ИД Artikla
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
      description: |
        Брисање артикла
      tags:
        - product
      summary: Брисање артикла
      operationId: deleteProduct
      requestBody:
        $ref: '#/components/requestBodies/Product'
      responses:
        '200':
          description: Успешно обрисан артикал
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties: {}
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Артикал није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /fiscalization/receipts:
    post:
      description: |
        Издавање фискалног рачуна
      tags:
        - fiscalization
      summary: Издавање фискалног рачуна
      operationId: fiscalizationCreateReceipt
      requestBody:
        $ref: '#/components/requestBodies/FiscalizationCreateReceipt'
      responses:
        '200':
          description: Фискални рачун
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaxCoreReceipt'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40080003: Износ повраћаја мора бити мањи или једнак износу уплате
            у готовини

            - 40080004: Збир свих начина плаћања мора бити већи или једнак
            износу рачуна

            - 40080009: Збир свих начина плаћања је 0

            - 40080010: Рефундација авансних рачуна пре почетка примене
            еФискализавије није подржана преко АПИ-ја

            - 40080011: Спецификација уплата по пореским ознакама се не поклапа
            са пореским ознакама артикала

            - 40080012: Недостаје спецификација уплата по пореским ознакама
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Грешка сервера
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /fiscalization/receipts/{invoiceNumber}/add-advance-payment:
    post:
      description: |
        Додавање авансне уплате
      tags:
        - fiscalization
      summary: Додавање авансне уплате
      parameters:
        - in: path
          required: true
          name: invoiceNumber
          description: ИД или број фискалног рачуна
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
              - type: string
                pattern: ^a-zA-Z-0-9{8}\-a-zA-Z-0-9{8}\-\d+$
      operationId: fiscalizationAddAdvancePayment
      requestBody:
        $ref: '#/components/requestBodies/FiscalizationAddAdvancePayment'
      responses:
        '200':
          description: Фискални рачун
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaxCoreReceipt'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40080003: Износ повраћаја мора бити мањи или једнак износу уплате
            у готовини

            - 40080004: Збир свих начина плаћања мора бити већи или једнак
            износу рачуна

            - 40080007: Неподржана врста рачуна

            - 40080009: Збир свих начина плаћања је 0

            - 40080011: Спецификација уплата по пореским ознакама се не поклапа
            са пореским ознакама артикала

            - 40080012: Недостаје спецификација уплата по пореским ознакама

            - 40080014: Авансни рачун је већ затворен

            - 40080015: Укупан износ авансног рачуна је већ уплаћен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Фискални рачун није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Грешка сервера
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /fiscalization/receipts/{invoiceNumber}/close-advance:
    post:
      description: |
        Затварање аванса
      tags:
        - fiscalization
      summary: Затварање аванса
      parameters:
        - in: path
          required: true
          name: invoiceNumber
          description: ИД или број фискалног рачуна
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
              - type: string
                pattern: ^a-zA-Z-0-9{8}\-a-zA-Z-0-9{8}\-\d+$
      operationId: fiscalizationCloseAdvance
      requestBody:
        $ref: '#/components/requestBodies/FiscalizationCloseAdvance'
      responses:
        '200':
          description: Фискални рачуни
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TaxCoreReceipt'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40080003: Износ повраћаја мора бити мањи или једнак износу уплате
            у готовини

            - 40080007: Неподржана врста рачуна

            - 40080009: Збир свих начина плаћања је 0

            - 40080013: Недостају ставке рачуна. Није могуће аутоматски одредити
            износе по ставкама рачуна

            - 40080014: Авансни рачун је већ затворен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Фискални рачун није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Грешка сервера
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /fiscalization/receipts/{invoiceNumber}/copy:
    post:
      description: |
        Издавање копије фискалног рачуна
      tags:
        - fiscalization
      summary: Издавање копије фискалног рачуна
      parameters:
        - in: path
          required: true
          name: invoiceNumber
          description: ИД или број фискалног рачуна
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
              - type: string
                pattern: ^a-zA-Z-0-9{8}\-a-zA-Z-0-9{8}\-\d+$
      operationId: fiscalizationCopy
      requestBody:
        $ref: '#/components/requestBodies/FiscalizationCopy'
      responses:
        '200':
          description: Фискални рачун
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaxCoreReceipt'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Фискални рачун није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Грешка сервера
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /fiscalization/receipts/{invoiceNumber}/refund:
    post:
      description: |
        Рефундација
      tags:
        - fiscalization
      summary: Рефундација
      parameters:
        - in: path
          required: true
          name: invoiceNumber
          description: ИД или број фискалног рачуна
          schema:
            oneOf:
              - $ref: '#/components/schemas/Id'
              - type: string
                pattern: ^a-zA-Z-0-9{8}\-a-zA-Z-0-9{8}\-\d+$
      operationId: fiscalizationRefund
      requestBody:
        $ref: '#/components/requestBodies/FiscalizationRefund'
      responses:
        '200':
          description: Фискални рачуни
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TaxCoreReceipt'
        '400':
          description: >
            Грешка у захтеву. Могуће грешке су:

            - 40090001: Грешка у валидацији параметара. Више детаља можете
            пронаћи у пољу `validation`

            - 40080003: Износ повраћаја мора бити мањи или једнак износу уплате
            у готовини

            - 40080007: Неподржана врста рачуна

            - 40080009: Збир свих начина плаћања је 0

            - 40080013: Недостају ставке рачуна. Није могуће аутоматски одредити
            износе по ставкама рачуна

            - 40080014: Авансни рачун је већ затворен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Фискални рачун није пронађен
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Грешка сервера
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  securitySchemes:
    BasicAuth:
      type: http
      scheme: basic
  requestBodies:
    Store:
      content:
        application/json:
          schema:
            allOf:
              - description: Моје продајно место
              - $ref: '#/components/schemas/Store'
    Product:
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ProductWithVariants'
    ProductWithImages:
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ProductWithVariants'
              - $ref: '#/components/schemas/ProductImages'
    FiscalizationCreateReceipt:
      content:
        application/json:
          schema:
            allOf:
              - description: Креирање фискалног рачуна
              - $ref: '#/components/schemas/FiscalizationCreateReceipt'
    FiscalizationAddAdvancePayment:
      content:
        application/json:
          schema:
            allOf:
              - description: Додавање авансне уплате
              - $ref: '#/components/schemas/FiscalizationAddAdvancePayment'
    FiscalizationCloseAdvance:
      content:
        application/json:
          schema:
            allOf:
              - description: Затварање аванса
              - $ref: '#/components/schemas/FiscalizationCloseAdvance'
    FiscalizationCopy:
      content:
        application/json:
          schema:
            allOf:
              - description: Издавање копије фискалног рачуна
              - $ref: '#/components/schemas/FiscalizationCopy'
    FiscalizationRefund:
      content:
        application/json:
          schema:
            allOf:
              - description: Рефундација
              - $ref: '#/components/schemas/FiscalizationRefund'
  schemas:
    Id:
      description: ИД
      type: string
      format: uuid
    FiscalizationInvoiceType:
      description: Врста рачуна
      format: string
      enum:
        - normal
        - advance
        - proforma
        - training
    FiscalizationTransactionType:
      description: Врста трансацкије
      format: string
      enum:
        - sale
        - refund
    FiscalizationReceiptDelivery:
      description: Начин издавања фискалног рачуна
      type: object
      minProperties: 1
      properties:
        thermalPrinter:
          type: boolean
          description: Термални штампач
        a4Printer:
          type: boolean
          description: >
            А4 штампач

            > Пажња: У случају да је одабрана штампа на А4 штампачу, нећете
            добити одговор све док корисник не затвори дијалог за штампу.
            Препоручујемо да преузимате фискални рачун у ПДФ формату и штампу
            вршите из ваше апликације.
        email:
          type: string
          format: email
          description: Електронска пошта
        pdf:
          type: boolean
          description: ПДФ (УРЛ до фајла)
        base64pdf:
          type: boolean
          description: ПДФ (Base64)
    FiscalizationItems:
      description: Ставке фискалног рачуна
      type: array
      minItems: 1
      items:
        type: object
        required:
          - sku
          - quantity
        properties:
          sku:
            description: Шифра артикла на платформи Бади
            type: number
            minimum: 1
          quantity:
            description: Количина
            type: number
            minimum: 0.01
          unitPrice:
            description: >-
              Јединична цена артикла. Уколико је ово поље изостављено, користиће
              се цена дефинисана на платформи Бади
            type: number
    FiscalizationItemsRefund:
      description: Ставке фискалног рачуна
      type: array
      minItems: 1
      items:
        type: object
        required:
          - sku
          - quantity
        properties:
          sku:
            description: Шифра артикла на платформи Бади
            type: number
            minimum: 1
          quantity:
            description: Количина
            type: number
            minimum: 0.01
    FiscalizationPayments:
      description: Начини плаћања фискалног рачуна
      type: object
      properties:
        cash:
          type: number
          description: Готовина
        card:
          type: number
          description: Платна картица
        check:
          type: number
          description: Чек
        mobilemoney:
          type: number
          description: Инстант плаћање
        wiretransfer:
          type: number
          description: Пренос на рачун
        voucher:
          type: number
          description: Ваучер
        other:
          type: number
          description: Друго безготовинско плаћање
    FiscalizationCreateReceipt:
      description: Креирање фискалног рачуна
      type: object
      required:
        - receiptDelivery
        - payments
        - items
        - invoiceType
        - transactionType
      properties:
        storeId:
          deprecated: true
          description: >-
            Продајно место које се користи за издавање фискалног рачуна. Само
            једна апликација може бити отворена по продајном месту, како би
            рачун био издат. Из овог разлога препоручујемо да користите
            `clientId` уместо `storeId`.
          allOf:
            - $ref: '#/components/schemas/Id'
        clientId:
          description: Клијент који се користи за издавање рачуна.
          allOf:
            - $ref: '#/components/schemas/Id'
        invoiceType:
          allOf:
            - $ref: '#/components/schemas/FiscalizationInvoiceType'
        transactionType:
          allOf:
            - $ref: '#/components/schemas/FiscalizationTransactionType'
        buyerId:
          description: >-
            ИД купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        buyerCostCenterId:
          description: >-
            Опционо поље купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        payments:
          minProperties: 1
          allOf:
            - $ref: '#/components/schemas/FiscalizationPayments'
        referentDocumentNumber:
          description: >-
            Број референтног документа. Користите само у случају потребе ручног
            референцирања рачуна, у свим осталим случајевима користите АПИ
            методе за вршење акција над фискалним рачунима.
          type: string
          pattern: ^a-zA-Z-0-9{8}\-a-zA-Z-0-9{8}\-\d+$
        referentDocumentDT:
          description: >-
            Датум референтног документа. Користите само у случају када шаљете
            `referentDocumentNumber`.
          type: string
          format: date-time
        posTime:
          description: ЕСИР време, користите када је уплата аванса настала ранијег датума
          type: string
          format: date-time
        items:
          minItems: 1
          allOf:
            - $ref: '#/components/schemas/FiscalizationItems'
        unknownAmountAdvance:
          description: >-
            Издавање аванса без познатог коначног износа. Додавање авансних
            уплата неће бити ограничено. Потребно је унети спецификацију уплата
            по пореским ознакама уколико се на рачуну налази више од једне
            пореске ознаке.
          type: boolean
        advanceSpecification:
          description: >-
            Спецификација уплата по пореским ознакама. Обавезно је само када се
            на фискалном рачуну налази више пореских ознака и коначан износ није
            познат.
          type: object
          properties:
            Ђ:
              description: Износ
              type: number
            Е:
              description: Износ
              type: number
            Г:
              description: Износ
              type: number
            А:
              description: Износ
              type: number
        discount:
          description: >
            Попуст на целом рачуну.

            > Напомена: попуст се примењује на свакој ставци појединачно, па
            може доћи одступања у односу на износ који се добија када би се
            попуст применио на коначном износу рачуна.
          type: number
        additionalText:
          description: Додатни текст који ће се штампати након фискалног рачуна
          type: string
        receiptDelivery:
          allOf:
            - $ref: '#/components/schemas/FiscalizationReceiptDelivery'
    FiscalizationAddAdvancePayment:
      description: Додавање авансне уплате
      type: object
      required:
        - receiptDelivery
        - payments
      properties:
        storeId:
          deprecated: true
          description: >-
            Продајно место које се користи за издавање фискалног рачуна. Само
            једна апликација може бити отворена по продајном месту, како би
            рачун био издат. Из овог разлога препоручујемо да користите
            `clientId` уместо `storeId`.
          allOf:
            - $ref: '#/components/schemas/Id'
        clientId:
          description: Клијент који се користи за издавање рачуна.
          allOf:
            - $ref: '#/components/schemas/Id'
        buyerId:
          description: >-
            ИД купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        buyerCostCenterId:
          description: >-
            Опционо поље купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        payments:
          minProperties: 1
          allOf:
            - $ref: '#/components/schemas/FiscalizationPayments'
        posTime:
          description: ЕСИР време, користите када је уплата аванса настала ранијег датума
          type: string
          format: date-time
        advanceSpecification:
          description: >-
            Спецификација уплата по пореским ознакама. Обавезно је само када се
            на фискалном рачуну налази више пореских ознака и коначан износ није
            познат.
          type: object
          properties:
            Ђ:
              description: Износ
              type: number
            Е:
              description: Износ
              type: number
            Г:
              description: Износ
              type: number
            А:
              description: Износ
              type: number
        additionalText:
          description: Додатни текст који ће се штампати након фискалног рачуна
          type: string
        receiptDelivery:
          allOf:
            - $ref: '#/components/schemas/FiscalizationReceiptDelivery'
    FiscalizationCloseAdvance:
      description: Затварање аванса
      type: object
      required:
        - receiptDelivery
        - payments
      properties:
        storeId:
          deprecated: true
          description: >-
            Продајно место које се користи за издавање фискалног рачуна. Само
            једна апликација може бити отворена по продајном месту, како би
            рачун био издат. Из овог разлога препоручујемо да користите
            `clientId` уместо `storeId`.
          allOf:
            - $ref: '#/components/schemas/Id'
        clientId:
          description: Клијент који се користи за издавање рачуна.
          allOf:
            - $ref: '#/components/schemas/Id'
        buyerId:
          description: >-
            ИД купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        buyerCostCenterId:
          description: >-
            Опционо поље купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        payments:
          allOf:
            - $ref: '#/components/schemas/FiscalizationPayments'
        items:
          description: >-
            Ставке рачуна, шаље се уколико је непознат коначан износ авансног
            рачуна и на рачуну постоји више ставки.
          minItems: 1
          allOf:
            - $ref: '#/components/schemas/FiscalizationItems'
        additionalText:
          description: Додатни текст који ће се штампати након фискалног рачуна
          type: string
        receiptDelivery:
          allOf:
            - $ref: '#/components/schemas/FiscalizationReceiptDelivery'
    FiscalizationCopy:
      description: Издавање копије фискалног рачуна
      type: object
      required:
        - receiptDelivery
      properties:
        storeId:
          deprecated: true
          description: >-
            Продајно место које се користи за издавање фискалног рачуна. Само
            једна апликација може бити отворена по продајном месту, како би
            рачун био издат. Из овог разлога препоручујемо да користите
            `clientId` уместо `storeId`.
          allOf:
            - $ref: '#/components/schemas/Id'
        clientId:
          description: Клијент који се користи за издавање рачуна.
          allOf:
            - $ref: '#/components/schemas/Id'
        receiptDelivery:
          allOf:
            - $ref: '#/components/schemas/FiscalizationReceiptDelivery'
    FiscalizationRefund:
      description: Рефундација
      type: object
      required:
        - receiptDelivery
        - payments
        - buyerId
      properties:
        storeId:
          deprecated: true
          description: >-
            Продајно место које се користи за издавање фискалног рачуна. Само
            једна апликација може бити отворена по продајном месту, како би
            рачун био издат. Из овог разлога препоручујемо да користите
            `clientId` уместо `storeId`.
          allOf:
            - $ref: '#/components/schemas/Id'
        clientId:
          description: Клијент који се користи за издавање рачуна.
          allOf:
            - $ref: '#/components/schemas/Id'
        buyerId:
          description: >-
            ИД купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        buyerCostCenterId:
          description: >-
            Опционо поље купца, мора бити у складу са
            [шифраником](https://www.purs.gov.rs/sw4i/download/files/box/_id_53315/sifarnik%20jedinstvenog%20ID%20kupca.pdf)
          type: string
        payments:
          allOf:
            - $ref: '#/components/schemas/FiscalizationPayments'
        items:
          description: Ставке рачуна које се рефундирају
          minItems: 1
          allOf:
            - $ref: '#/components/schemas/FiscalizationItemsRefund'
        additionalText:
          description: Додатни текст који ће се штампати након фискалног рачуна
          type: string
        receiptDelivery:
          allOf:
            - $ref: '#/components/schemas/FiscalizationReceiptDelivery'
        advanceSpecification:
          description: >-
            Спецификација рефундација по пореским ознакама. Обавезно је само
            када се на фискалном рачуну налази више пореских ознака и коначан
            износ није познат.
          type: object
          properties:
            Ђ:
              description: Износ
              type: number
            Е:
              description: Износ
              type: number
            Г:
              description: Износ
              type: number
            А:
              description: Износ
              type: number
    TaxCoreReceipt:
      description: Фискални рачун
      type: object
      properties:
        requestedBy:
          type: string
          description: >-
            ЈИД безбедносног елемента који је захтевао потписивање фискалног
            рачуна
        sdcDateTime:
          type: string
          format: date-time
          description: Датум и време издавања фискалног рачуна
        invoiceCounter:
          type: string
          description: Бројач рачуна
        invoiceCounterExtension:
          type: string
          description: Тип бројача рачуна
        invoiceNumber:
          type: string
          description: Број фискалног рачуна
        taxItems:
          type: array
          description: Ставке пореза
          items:
            type: object
            properties:
              categoryType:
                type: number
                description: Тип категорије
              categoryName:
                type: string
                description: Назив категорије
              label:
                type: string
                maxLength: 1
                minLength: 1
                description: Пореска ознака
              rate:
                type: number
                minimum: 0
                maximum: 100
                description: Пореска стопа
              amount:
                type: number
                minimum: 0
                description: Износ
        verificationUrl:
          type: string
          format: url
          description: Верификациони УРЛ
        verificationQRCode:
          type: string
          description: Верификациони QR код у GIF формату
        journal:
          type: string
          description: >
            Фискални рачун у текстуалном формату.

            > Напомена: У овом пољу се налази текст рачуна какав је вратио
            процесор фискалних рачуна, и он не садржи све додатне информације
            које су додате од стране ЕСИР-а.
        messages:
          type: string
          description: Поруке процесора фискалних рачуна
        signedBy:
          type: string
          description: ЈИД безбедносног елемента који је потписао фискални рачун
        encryptedInternalData:
          type: string
          description: Шифровани интерни подаци
        signature:
          type: string
          description: Дигитални потпис
        totalCounter:
          type: number
          description: Укупан број издатих рачуна
        transactionTypeCounter:
          type: number
          description: Укупан број издатих рачуна за тренутан тип трансакције
        totalAmount:
          type: number
          description: Укупан износ рачуна
        taxGroupRevision:
          type: number
          description: Ревизија пореске групе
        businessName:
          type: string
          description: Назив предузећа
        tin:
          type: string
          description: Порески идентификациони број (ПИБ)
        locationName:
          type: string
          description: Назив пословног простора
        address:
          type: string
          description: Адреса
        district:
          type: string
          description: Општина
        mrc:
          type: string
          description: Регистарски број произвођача ПФР-а
        pdf:
          type: string
          description: >
            УРЛ до ПДФ фајла

            > Напомена: УРЛ ће бити важећи 10 минута од издавања фискалног
            рачуна. 
        base64pdf:
          type: string
          description: ПДФ фајл у base64 формату
    Store:
      description: Продајно место
      type: object
      required:
        - name
      properties:
        id:
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/Id'
        name:
          description: Назив
          type: string
          minLength: 1
        address:
          description: Адреса
          type: string
        city:
          description: Град
          type: string
        zip:
          description: Поштански број
          type: string
        gln:
          description: ГЛН
          type: string
        phone:
          description: Број телефона
          type: string
        language:
          description: Језик на ком се издаје фискални рачун
          enum:
            - sr-Cyrl-RS
            - sr-Latn-RS
          default: sr-Cyrl-RS
        printMethod:
          description: Доступни начини издавања фискалног рачуна
          type: object
          properties:
            thermal:
              description: Термални штампач
              type: boolean
            a4:
              description: А4 штампач
              type: boolean
            email:
              description: Електронска пошта
              type: boolean
        printBankAccounts:
          description: Штампа текућих рачуна уколико је начин плаћања пренос на рачун
          type: boolean
        printDiscounts:
          description: Штампа остварених попуста
          type: boolean
        paymentMethodsOrder:
          description: Редослед начина плаћања на прозору за плаћање
          type: array
        productPickerType:
          description: Начин приказа производа на каси
          type: string
          enum:
            - list
            - grid
        isSoundEnabled:
          description: Репродукција звучних сигнала при куцању артикала
          type: boolean
        defaultUnknownAmountAdvance:
          description: >-
            Да ли је подразумевано укључена опција за аванс без познатог
            коначног износа
          type: boolean
    Product:
      description: Артикал
      type: object
      required:
        - name
        - taxRateLabel
      properties:
        id:
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/Id'
        name:
          description: Назив
          type: string
          minLength: 1
        sku:
          description: Шифра
          type: number
        manufacturerSku:
          description: Шифра произвођача
          type: string
        description:
          description: Опис у HTML формату
          type: string
        descriptionPlain:
          description: Опис у текстуалном формату
          type: string
          readOnly: true
        saleUnitId:
          description: Продајна јединица мере
          allOf:
            - $ref: '#/components/schemas/Id'
        baseUnitId:
          description: Јединица мере у којој је исказана количина производа
          allOf:
            - $ref: '#/components/schemas/Id'
        quantityPerBaseUnit:
          description: Количина у јединици мере
          type: number
        price:
          description: Цена са ПДВ-ом
          type: number
        taxRateLabel:
          description: Пореска ознака
          type: string
          enum:
            - Ђ
            - Е
            - Г
            - А
        subtitle:
          description: Кратак опис
          type: string
        productType:
          description: Врста артикла
          type: string
          enum:
            - product
            - service
            - digital
        weight:
          description: Маса
          type: number
        dimensions:
          description: Димензије у центиметрима, у формату ШИРИНАxДУБИНАxВИСИНА
          type: string
        hasVariants:
          description: Артикал има варијанте
          type: boolean
        variantName:
          description: Назив варијанте, само уколико је артикал варијанта
          type: string
        ean:
          description: ГТИН артикла
          type: string
        coverImage:
          description: Главна фотографија
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/File'
        categories:
          description: ИД-еви категорија у којима се налази артикал
          type: array
          items:
            allOf:
              - $ref: '#/components/schemas/Id'
    ProductImages:
      type: object
      properties:
        images:
          description: ИД-еви фајлова
          type: array
          items:
            $ref: '#/components/schemas/Id'
    ProductWithVariants:
      allOf:
        - $ref: '#/components/schemas/Product'
        - $ref: '#/components/schemas/Timestamps'
      properties:
        variants:
          type: array
          items:
            allOf:
              - $ref: '#/components/schemas/Product'
    File:
      description: Фајл
      type: object
      allOf:
        - $ref: '#/components/schemas/Timestamps'
      properties:
        id:
          readOnly: true
          allOf:
            - $ref: '#/components/schemas/Id'
        filename:
          description: Назив фајла
          type: string
        originalFilename:
          description: Оригинални назив фајла
          type: string
        mimetypeFilename:
          description: Тип фајла
          type: string
        size:
          description: Величина оригиналног фајла у бајтовима
          type: number
        reference:
          description: Референца односно ентитет који садржи овај фајл
          type: string
        referenceId:
          allOf:
            - $ref: '#/components/schemas/Id'
          description: ИД ентитета који садржи овај фајл
          type: string
        private:
          description: Приватан фајл
          type: boolean
        urls:
          description: УРЛ-ови до фајлова
          type: object
          properties:
            original:
              description: Оригинални фајл
              type: string
            64x64:
              description: Слика димензија 64x64 пиксела
              type: string
            128x128:
              description: Слика димензија 128x128 пиксела
              type: string
            256x256:
              description: Слика димензија 256x256 пиксела
              type: string
            512x512:
              description: Слика димензија 512x512 пиксела
              type: string
            1024x1024:
              description: Слика димензија 1024x1024 пиксела
              type: string
    Timestamps:
      type: object
      properties:
        createdAt:
          description: Датум и време креирања
          type: string
          format: date-time
        updatedAt:
          description: Датум и време измене
          type: string
          format: date-time
        deletedAt:
          description: Датум и време брисања
          type: string
          format: date-time
    Error:
      type: object
      properties:
        code:
          description: Статус код
          type: number
        errorCode:
          description: Код грешке
          type: number
        description:
          description: Опис грешке
          type: string
