openapi: 3.0.0
servers:
  - description: Ambiente di test
    url: https://turismo-coll.regione.campania.it/turismoweb/api-gestionali
  - description: Ambiente di esercizio
    url: https://turismo.regione.campania.it/turismoweb/api-gestionali
info:
  description: Invio movimentazione strutture ricettive
  x-summary: Invio movimentazione strutture ricettive
  x-api-id: APIMovimentazione
  version: "1.3.0"
  title: Invio movimentazione strutture ricettive

tags:
  - name: Login
  - name: Invio movimentazione

paths:
  /v1/codici-istat:
    get:
      tags:
        - Codici Istat
      summary: Codici istat
      operationId: codiciIstat
      description: Ritorna la lista di codici istat ammessi dal sistema
      responses:
        '200':
          description: Lista dei codici istat ammessi dal sistema per province e nazioni
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CodiciIstatResponse'
  /v1/auth/login:
    post:
      tags:
        - Login
      summary: Login
      operationId: login
      description: Ritorna il token di autenticazione
      responses:
        '200':
          description: Username e password corrette
          content:
            application/json:
              schema:
                type: object
                properties:
                  accessToken:
                    description: Token da utilizzare nelle transazioni
                    type: string
                    example: eyjhbGciOiJSUzI1NiIsINVSHGhepnDu13SwRBL-v-y-04_6e6IJbMzreZwPI-epwdVPQe-ENhpvms1WdGM_DmgMLZ8YQFS4LDl2R7ZHT8AgXe-WCFV6OFkA7zvdeFwQ3kVVZE0HlNgHgoi4DrgMfwwz_ku1yJNjP3ztTY1nEqmA
                  expiresIn:
                    description: validità del token
                    type: integer
                    format: int32
                    example: 3000
        '401':
          description: Username e password errate
        '5XX':
          description: Errore inatteso (server error)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StrutturaLogin'
        description: Dati per effettuale il login
        required: true
  /v1/movimentazione/ultima-rilevazione:
    get:
      tags:
        - Ultima rilevazione
      summary: Recupera data ultima rilevazione
      operationId: ultimaRilevazione
      description: API per recuperare la data dell'ultima rilevazione inserita a sistema
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Oggetto contenente la data dell'ultima movimentazione
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UltimaRilevazioneResponse'
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '5XX':
          description: Errore inatteso (server error)
  /v1/anagrafica:
    get:
      tags:
        - Anagrafica struttura ricettiva
      summary: Recupera l'anagrafica della struttura ricettiva loggata
      operationId: anagrafica
      description: API per recuperare l'anagrafica della struttura ricettiva loggata
      security:
        - bearerAuth: []
      responses:
        '200':
          description: Oggetto contenente l'anagrafica della struttura ricettiva loggata
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnagraficaResponse'
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '5XX':
          description: Errore inatteso (server error)
  /v1/movimentazione:
    post:
      tags:
        - Invio movimentazione
      summary: Invio movimentazione
      operationId: invio_movimentazione
      description: API per inviare la movimentazione della struttura ricettiva
      security:
        - bearerAuth: []
      responses:
        '201':
          description: Informazioni salvate correttament
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '5XX':
          description: Errore inatteso (server error)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MovimentazioniRequest'
        description: Struttura dati per inserire movimentazioni (ATTENZIONE per ogni movimentazione deve essere presente o il codiceNazione o il codiceProvincia)
        required: true
    put:
      tags:
        - Modifica movimentazione
      summary: Modifica movimentazione
      operationId: modifica_movimentazione
      description: API per modificre la movimentazione della struttura ricettiva
      security:
        - bearerAuth: []
      responses:
        '201':
          description: Informazioni salvate correttamente
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '5XX':
          description: Errore inatteso (server error)
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MovimentazioniRequest'
        description: Struttura dati per inserire movimentazioni (ATTENZIONE per ogni movimentazione deve essere presente o il codiceNazione o il codiceProvincia)
        required: true
    get:
      tags:
        - Recupera movimentazione
      summary: Recupera movimentazione
      operationId: recupera_movimentazione
      description: API per recuperare la movimentazione della struttura ricettiva
      security:
        - bearerAuth: []
      parameters:
        - in: query
          name: dataInizio
          required: true
          schema:
            type: string
            pattern: '^\d{8}$'
            example: '01012023'
          description: Data di inizio della ricerca nel formato DDMMYYYY
        - in: query
          name: offset
          required: false
          schema:
            type: integer
            default: 1
          description: Offset per la ricerca (opzionale)
      responses:
        '200':
          description: Informazioni recuperate correttamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MovimentazioniResponse'
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '5XX':
          description: Errore inatteso (server error)
    delete:
      tags:
        - Elimina movimentazione
      summary: Elimina movimentazione
      operationId: elimina_movimentazione
      description: API per eliminare la movimentazione della struttura ricettiva
      security:
        - bearerAuth: []
      parameters:
        - in: query
          name: dataInizio
          required: true
          schema:
            type: string
            pattern: '^\d{8}$'
            example: '01012023'
          description: Data di inizio nel formato DDMMYYYY
        - in: query
          name: offset
          required: false
          schema:
            type: integer
            default: 1
          description: Offset per la paginazione (default 1)
      responses:
        '204':
          description: Movimentazione eliminata correttamente
        '400':
          description: Formato della richiesta non valido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Token non valido
        '403':
          description: Operazione non consentita
        '404':
          description: Movimentazione non trovata
        '5XX':
          description: Errore inatteso (server error)
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Inserire il token JWT ottenuto dall'endpoint di login
  schemas:
    StrutturaLogin:
      type: object
      properties:
        cusr:
          type: string
          description: Identificativo regionale struttura
          example: 15123123ALBXXXX
        apiKey:
          type: string
          description: Api Key associata alla struttura
          example: 321a2559-c38c-42f3-a738-73a7f4d6fc25
      required:
        - cusr
        - apiKey
    MovimentazioniRequest:
      type: object
      properties:
        giornate:
          type: array
          items:
            $ref: '#/components/schemas/Movimentazioni'
    MovimentazioniResponse:
      type: object
      properties:
        giornate:
          type: array
          items:
            $ref: '#/components/schemas/Movimentazioni'
    CodiciIstatResponse:
      type: object
      properties:
        province:
          type: array
          items:
            $ref: '#/components/schemas/CodiciIstatResponseItem'
        nazioni:
          type: array
          items:
            $ref: '#/components/schemas/CodiciIstatResponseItem'
    UltimaRilevazioneResponse:
      type: object
      properties:
        dataUltimaRilevazione:
          type: string
          description: Data dell'ultima rilevazione inserita a sistema nel formato ggmmaaaa, null se non sono presenti rilevazioni
          example: 01052025
    AnagraficaResponse:
      type: object
      properties:
        denominazione:
          type: string
          description: Denominazione della struttura
        codiceFiscale:
          type: string
          description: Codice fiscale del titolare
        partitaIva:
          type: string
          description: Partita IVA della struttura ricettiva
        cin:
          type: string
          description: Codice Identificativo Nazionale
        cusr:
          type: string
          description: Codice Unico Struttura Ricettiva
        indirizzo:
          type: string
          description: Indirizzo della struttura
        civico:
          type: string
          description: Numero civico
        cap:
          type: string
          description: Codice di Avviamento Postale
        comune:
          type: string
          description: Comune di ubicazione
        provincia:
          type: string
          description: Provincia di ubicazione
        macroCategoria:
          type: string
          description: Macro categoria della struttura ricettiva
        categoria:
          type: string
          description: Categoria della struttura ricettiva
        sottoCategoria:
          type: string
          description: Sotto categoria della struttura ricettiva
        numeroCamere:
          type: integer
          description: Numero di camere disponibili
          minimum: 0
        numeroUnitaAbitative:
          type: integer
          description: Numero di unità abitative
          minimum: 0
        numeroPiazzole:
          type: integer
          description: Numero di piazzole (per campeggi)
          minimum: 0
        numeroPostiLetto:
          type: integer
          description: Numero totale di posti letto
          minimum: 0
        numeroBagni:
          type: integer
          description: Numero di bagni/servizi igienici
          minimum: 0
        email:
          type: string
          format: email
          description: Indirizzo email di contatto
        sitoWeb:
          type: string
          format: uri
          description: Sito web della struttura ricettiva
    ErrorResponse:
      type: object
      properties:
        errore:
          type: string
          description: 'Errore riscontrato'
    Movimentazioni:
      type: object
      properties:
        dataRilevazione:
          type: string
          description: Data della rilevazione nel formato 'ggmmaaaa'
          example: '01052025'
        camereOccupate:
          type: integer
          description: Camere occupate nella giornata
          example: 2
        strutturaChiusa:
          type: boolean
          description: Indica se la struttura è chiusa nella giornata
          example: false
        movimentazioni:
          type: array
          items:
            oneOf:
              - type: object
                properties:
                  codiceNazione:
                    type: string
                    description: Codice ept della nazione di provenienza
                    example: '206'
                  arrivi:
                    type: integer
                    description: Arrivi nella giornata
                    example: 2
                  presentiNottePrecedente:
                    type: integer
                    description: Presenti nella notte precedente
                    example: 2
                  partenze:
                    type: integer
                    description: Partiti nella giornata
                    example: 2
                required:
                  - codiceNazione
                  - arrivi
                  - presentiNottePrecedente
                  - partenze
              - type: object
                properties:
                  codiceProvincia:
                    type: string
                    description: Codice istat della provincia di provenienza
                    example: '063'
                  arrivi:
                    type: integer
                    description: Arrivi nella giornata
                    example: 2
                  presentiNottePrecedente:
                    type: integer
                    description: Presenti nella notte precedente
                    example: 2
                  partenze:
                    type: integer
                    description: Partiti nella giornata
                    example: 2
                required:
                  - codiceProvincia
                  - arrivi
                  - presentiNottePrecedente
                  - partenze
      required:
        - dataRilevazioni
        - camereOccupate
        - movimentazioni
    CodiciIstatResponseItem:
      type: object
      properties:
        descrizione:
          type: string
          description: Descrizione di Provincia o Nazione
        codiceIstat:
          type: string
          description: Codice istat