  /api/v1/quotes:
    get:
      tags:
        - quotes
      summary: "List quotes"
      description: |
        ## GET /api/v1/quotes

        Lists quotes, search and filters allow fine grained lists to be generated.
        
        Query parameters can be added to performed more fine grained filtering of the quotes, these are handled by the QuoteFilters class which defines the methods available
      
      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $quotes = $ninja->quotes->all([
            'per_page' => 10,
            'page' => 1,
            'sort' => 'number|asc'
          ]);
      - lang: curl
        label: curl
        source: |
          curl --request GET \
            --url 'https://invoicing.co/api/v1/quotes?per_page=10&page=1&sort=number&sort_dir=asc' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json'
      operationId: getQuotes
      parameters:
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - $ref: "#/components/parameters/status"
        - $ref: "#/components/parameters/client_id"
        - $ref: "#/components/parameters/created_at"
        - $ref: "#/components/parameters/updated_at"
        - $ref: "#/components/parameters/is_deleted"
        - $ref: "#/components/parameters/filter_deleted_clients"
        - $ref: "#/components/parameters/vendor_id"
        - name: filter
          in: query
          description: |
            Searches across a range of columns including:  
            - number  
            - custom_value1  
            - custom_value2  
            - custom_value3  
            - custom_value4
          required: false
          schema:
            type: string
          example: ?filter=bob
        - name: client_status
          in: query
          description: |
            A comma separated list of quote status strings. Valid options include:  
            - all
            - draft  
            - sent  
            - approved
            - expired
            - upcoming   
          required: false
          schema:
            type: string
          example: ?client_status=paid,unpaid
        - name: number
          in: query
          description: |
            Search quote by quote number 
          required: false
          schema:
            type: string
          example: ?number=Q-001
        - name: sort
          in: query
          description: Returns the list sorted by column in ascending or descending order.
          required: false
          schema:
            type: string
          example: id|desc number|desc balance|asc 
      responses:
        200:
          description: "A list of quotes"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:  
                type: object
                properties:
                  data: 
                    type: array
                    items:
                      $ref: '#/components/schemas/Quote'
                  meta:
                    type: object
                    $ref: '#/components/schemas/Meta'
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
    post:
      tags:
        - quotes
      summary: "Create quote"
      description: |
        ## POST /api/v1/quotes
        Creates an quote for a client.

        Triggered actions are available when updating or creating an quote.

        These are query parameters that can be chained in order to perform additional actions on the entity, these include:
        
        ```
        ?send_email=true [Saves and sends the quote]
        ?mark_sent=true [Saves and marks the quote as sent]
        ?approve=true [Saves and approves the quote]
        ?convert=true [Saves and converts the quote to an invoice]
        ?save_default_footer=true [Saves the current footer as the default footer]
        ?save_default_terms=true [Saves the current terms as the default terms]
        
        ```
      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $invoices = $ninja->quotes->create([
            'client_id' => 'AxP7K9nY5z',
            'date' => '2022-01-01',
            'due_date' => '2022-01-31',
            'frequency_id' => '1',
            'remaining_cycles' => '5',
            'private_notes' => 'super secret',
            'public_notes' => 'public notes',
            'custom_value1' => 'custom value 1',
            'custom_value2' => 'custom value 2',
            'line_items' => [
              [
                    'quantity' => 1,
                    'cost' => 14,
                    'product_key' => 'sku_4_u',
                    'notes' => 'The actual product description',
                    'discount' => 0,
                    'is_amount_discount' => true,
                    'tax_name1' => '',
                    'tax_rate1' => 0,
                    'tax_name2' => '',
                    'tax_rate2' => 0,
                    'tax_name3' => '',
                    'tax_rate3' => 0,
                    'sort_id' => '0',
                    'custom_value1' => 'https://picsum.photos/200',
                    'custom_value2' => '94',
                    'custom_value3' => 'Alias vel eveniet.',
                    'custom_value4' => 'Iusto aut quis qui.',
                    'type_id' => '1',
                    'tax_id' => '1'
              ]
            ]
          ]);
      - lang: curl
        label: curl
        source: |
          curl --request POST \
            --url 'https://invoicing.co/api/v1/quotes' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json' \
            --header 'Content-Type: application/json' \
            --data '{
              "client_id": "AxP7K9nY5z",
              "date": "2022-01-01",
              "due_date": "2022-01-31",
              "private_notes": "super secret",
              "public_notes": "public notes",
              "custom_value1": "custom value 1",
              "custom_value2": "custom value 2",
              "frequency_id": "1",
              "remaining_cycles": "5",
              "line_items": [
                {
                  "quantity": 1,
                  "cost": 14,
                  "product_key": "sku_4_u",
                  "notes": "The actual product description",
                  "discount": 0,
                  "is_amount_discount": true,
                  "tax_name1": "",
                  "tax_rate1": 0,
                  "tax_name2": "",
                  "tax_rate2": 0,
                  "tax_name3": "",
                  "tax_rate3": 0,
                  "sort_id": "0",
                  "custom_value1": "https://picsum.photos/200",
                  "custom_value2": "94",
                  "custom_value3": "Alias vel eveniet.",
                  "custom_value4": "Iusto aut quis qui.",
                  "type_id": "1",
                  "tax_id": "1"
                }
              ]
            }'
      operationId: storeQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
      responses:
        200:
          description: "Returns the saved Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  "/api/v1/quotes/{id}":
    get:
      tags:
        - quotes
      summary: "Show quote"
      description: |
        ## GET /api/v1/quotes/{id}

        Displays an Quote by id

      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $quote = $ninja->quotes->get("D2J234DFA");
      - lang: curl
        label: curl
        source: |
          curl --request GET \
            --url 'https://invoicing.co/api/v1/quotes/D2J234DFA' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json'
      operationId: showQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      responses:
        200:
          description: "Returns the Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
    put:
      tags:
        - quotes
      summary: "Update quote"
      description: |
        ## PUT /api/v1/quotes/{id}

        Handles the updating of an Quote by id.

        Triggered actions are available when updating or creating an quote.

        These are query parameters that can be chained in order to perform additional actions on the entity, these include:
        
        ```
        ?send_email=true [Saves and sends the quote]
        ?mark_sent=true [Saves and marks the quote as sent]
        ?approve=true [Saves and approves the quote]
        ?convert=true [Saves and converts the quote to an invoice]
        ?save_default_footer=true [Saves the current footer as the default footer]
        ?save_default_terms=true [Saves the current terms as the default terms]
        
        ```
      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $invoice = $ninja->invoices->update("D2J234DFA", [
            'date' => '2022-01-01',
            'due_date' => '2022-01-31',
            'private_notes' => 'super secret',
            'public_notes' => 'public notes',
            'line_items' => [
              [
                'product_key' => 'sku_4_u',
                'notes' => 'The actual product description',
              ]
            ]
          ]);
      - lang: curl
        label: curl
        source: |
          curl --request PUT \
            --url 'https://invoicing.co/api/v1/quotes/D2J234DFA' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json' \
            --header 'Content-Type: application/json' \
            --data '{
              "date": "2022-01-01",
              "due_date": "2022-01-31",
              "private_notes": "super secret",
              "public_notes": "public notes",
              "line_items": [
                {
                  "product_key": "sku_4_u",
                  "notes": "The actual product description"
                }
              ]
            }'
      operationId: updateQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      responses:
        200:
          description: "Returns the Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
    delete:
      tags:
        - quotes
      summary: "Delete quote"
      description:  |
        ## DELETE /api/v1/quotes/{id}

        Handles the deletion of an Quote by id.

      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $ninja->quotes->delete("D2J234DFA");
      - lang: curl
        label: curl
        source: |
          curl --request DELETE \
            --url 'https://invoicing.co/api/v1/quotes/D2J234DFA' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE'
      operationId: deleteQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      responses:
        200:
          description: "Returns a HTTP status"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  "/api/v1/quotes/{id}/edit":
    get:
      tags:
        - quotes
      summary: "Edit quote"
      description: |
        ## GET /api/v1/quotes/{id}/edit

        Displays an Quote by id for editting

      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $quote = $ninja->quotes->edit("D2J234DFA");
      - lang: curl
        label: curl
        source: |
          curl --request GET \
            --url 'https://invoicing.co/api/v1/quotes/D2J234DFA/edit' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json'
      operationId: editQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      responses:
        200:
          description: "Returns the Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  /api/v1/quotes/create:
    get:
      tags:
        - quotes
      summary: "Blank quote"
      description: |
        ## GET /api/v1/quotes/create

        Returns a blank object with default values

      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $quote = $ninja->quotes->create();
      - lang: curl
        label: curl
        source: |
          curl --request GET \
            --url 'https://invoicing.co/api/v1/quotes/create' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json'
      operationId: getQuotesCreate
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
      responses:
        200:
          description: "A blank Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  /api/v1/quotes/bulk:
    post:
      tags:
        - quotes
      summary: "Bulk quote actions"
      description: |
        ## POST /api/v1/quotes/bulk

        Performs bulk actions on an array of quotes

      x-codeSamples:
      - lang: php
        label: php
        source: |
          $ninja = new InvoiceNinja("your_token");
          $response = $ninja->quotes->bulk([
            'action' => 'approve',
            'ids' => ['D2J234DFA','D2J234DFA','D2J234DFA']
          ]);
      - lang: curl
        label: curl
        source: |
          curl --request POST \
            --url 'https://invoicing.co/api/v1/quotes/bulk' \
            --header 'X-API-TOKEN: YOUR_API_TOKEN_HERE' \
            --header 'Accept: application/json' \
            --header 'Content-Type: application/json' \
            --data '{
              "action": "approve",
              "ids": ["D2J234DFA","D2J234DFA","D2J234DFA"]
            }'
      operationId: bulkQuotes
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/index"
      requestBody:
        description: "Bulk action details"
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                action:
                  type: string
                  description: |
                    The action to be performed, options include:  
                    - `approve`  
                      Bulk approve an array of quotes  
                    - `convert`  
                      Bulk convert an array of quotes to invoices  
                    - `send_email`  
                      Bulk send an array of quotes as emails  
                    - `mark_sent`  
                      Bulk mark an array of quotes as sent  
                    - `restore`  
                      Restores an array of quotes  
                    - `delete`  
                      Deletes an array of invoices  
                    - `archive`  
                      Archives an array of invoices  
                ids:
                  type: array
                  items:
                    description: "Array of hashed IDs to be bulk 'actioned - ['D2J234DFA','D2J234DFA','D2J234DFA']"
                    type: string
              example:
                action: convert
                ids: ['D2J234DFA','D2J234DFA','D2J234DFA']
      responses:
        200:
          description: "The Quote response"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  "/api/v1/quotes/{id}/{action}":
    get:
      deprecated: true
      tags:
        - quotes
      summary: "Performs a custom action on an Quote"
      description: "Performs a custom action on an Quote.\n\n    The current range of actions are as follows\n    - clone_to_quote\n    - history\n    - delivery_note\n    - mark_paid\n    - download\n    - archive\n    - delete\n    - convert\n    - convert_to_invoice\n    - email"
      operationId: actionQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
        - name: action
          in: path
          description: "The action string to be performed"
          required: true
          schema:
            type: string
            format: string
          example: clone_to_quote
      responses:
        200:
          description: "Returns the Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  "/api/v1/quote/{invitation_key}/download":
    get:
      tags:
        - quotes
      summary: "Download quote PDF"
      description: "Downloads a specific quote"
      operationId: downloadQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: invitation_key
          in: path
          description: "The Quote Invitation Key"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      responses:
        200:
          description: "Returns the quote pdf"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"
  "/api/v1/quotes/{id}/upload":
    post:
      tags:
        - quotes
      summary: "Upload a quote document"
      description: "Handles the uploading of a document to a quote"
      operationId: uploadQuote
      parameters:
        - $ref: "#/components/parameters/X-API-TOKEN"
        - $ref: "#/components/parameters/X-Requested-With"
        - $ref: "#/components/parameters/include"
        - name: id
          in: path
          description: "The Quote Hashed ID"
          required: true
          schema:
            type: string
            format: string
          example: D2J234DFA
      requestBody:
        description: "File Upload Body"
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                _method:
                  type: string
                  example: PUT
                documents:
                  type: array
                  items:
                    description: "Array of binary documents for upload"
                    type: string
                    format: binary
      responses:
        200:
          description: "Returns the Quote object"
          headers:
            X-MINIMUM-CLIENT-VERSION:
              $ref: "#/components/headers/X-MINIMUM-CLIENT-VERSION"
            X-RateLimit-Remaining:
              $ref: "#/components/headers/X-RateLimit-Remaining"
            X-RateLimit-Limit:
              $ref: "#/components/headers/X-RateLimit-Limit"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Quote"
        401:
          $ref: "#/components/responses/401"
        403:
          $ref: "#/components/responses/403"
        422:
          $ref: '#/components/responses/422'
        429:
          $ref: '#/components/responses/429'
        5XX:
          description: 'Server error'
        default:
          $ref: "#/components/responses/default"