openapi: 3.0.0
info:
  title: Asset Part Transfer API
  description: API for managing asset part transfers between locations
  version: 1.0.0
  contact:
    name: Repzo
    url: https://repzo.com

servers:
  - url: https://sv.api.repzo.me
    description: Production server
  - url: https://staging.sv.api.repzo.me
    description: Staging server

tags:
  - name: Asset Part Transfer
    description: Operations related to asset part transfer management

paths:
  /asset-part-transfer:
    get:
      tags:
        - Asset Part Transfer
      summary: Get all asset part transfers
      description: Retrieve a list of all asset part transfers with optional filtering and pagination
      parameters:
        - name: limit
          in: query
          description: Maximum number of records to return
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
        - name: offset
          in: query
          description: Number of records to skip for pagination
          required: false
          schema:
            type: integer
            minimum: 0
            default: 0
        - name: sort
          in: query
          description: Field to sort by
          required: false
          schema:
            type: string
        - name: order
          in: query
          description: Sort order (asc or desc)
          required: false
          schema:
            type: string
            enum: [asc, desc]
            default: desc
        - name: filter
          in: query
          description: Filter conditions in JSON format
          required: false
          schema:
            type: string
        - name: search
          in: query
          description: Search term for text fields
          required: false
          schema:
            type: string
      responses:
        "200":
          description: List of asset part transfers retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: array
                    items:
                      $ref: "#/components/schemas/AssetPartTransfer"
                  total:
                    type: integer
                    description: Total number of records
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "500":
          description: Internal server error
    post:
      tags:
        - Asset Part Transfer
      summary: Create a new asset part transfer
      description: Create a new asset part transfer with the provided data
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AssetPartTransferInput"
      responses:
        "201":
          description: Asset part transfer created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: "#/components/schemas/AssetPartTransfer"
        "400":
          description: Bad request
        "401":
          description: Unauthorized
        "500":
          description: Internal server error

  /asset-part-transfer/{id}:
    get:
      tags:
        - Asset Part Transfer
      summary: Get asset part transfer by ID
      description: Retrieve a specific asset part transfer by its ID
      parameters:
        - name: id
          in: path
          required: true
          description: Asset part transfer ID
          schema:
            type: string
      responses:
        "200":
          description: Asset part transfer retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: "#/components/schemas/AssetPartTransfer"
        "404":
          description: Asset part transfer not found
        "401":
          description: Unauthorized
        "500":
          description: Internal server error
    put:
      tags:
        - Asset Part Transfer
      summary: Update asset part transfer
      description: Update an existing asset part transfer with new data
      parameters:
        - name: id
          in: path
          required: true
          description: Asset part transfer ID
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AssetPartTransferInput"
      responses:
        "200":
          description: Asset part transfer updated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: "#/components/schemas/AssetPartTransfer"
        "400":
          description: Bad request
        "404":
          description: Asset part transfer not found
        "401":
          description: Unauthorized
        "500":
          description: Internal server error
    delete:
      tags:
        - Asset Part Transfer
      summary: Delete asset part transfer
      description: Delete an existing asset part transfer
      parameters:
        - name: id
          in: path
          required: true
          description: Asset part transfer ID
          schema:
            type: string
      responses:
        "200":
          description: Asset part transfer deleted successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  message:
                    type: string
                    example: Asset part transfer deleted successfully
        "404":
          description: Asset part transfer not found
        "401":
          description: Unauthorized
        "500":
          description: Internal server error

  /asset-part-transfer/{id}/complete:
    post:
      tags:
        - Asset Part Transfer
      summary: Complete asset part transfer
      description: Mark an asset part transfer as completed
      parameters:
        - name: id
          in: path
          required: true
          description: Asset part transfer ID
          schema:
            type: string
      responses:
        "200":
          description: Asset part transfer completed successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: "#/components/schemas/AssetPartTransfer"
        "404":
          description: Asset part transfer not found
        "401":
          description: Unauthorized
        "500":
          description: Internal server error

components:
  schemas:
    AssetPartTransfer:
      type: object
      properties:
        _id:
          type: string
          description: Unique identifier for the asset part transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b3"
        transferNumber:
          type: string
          description: Unique transfer number
          example: "TRF-2023-001"
        fromLocation:
          type: object
          properties:
            warehouse:
              type: string
              description: Source warehouse ID
            section:
              type: string
              description: Source section
            shelf:
              type: string
              description: Source shelf
            position:
              type: string
              description: Source position
        toLocation:
          type: object
          properties:
            warehouse:
              type: string
              description: Destination warehouse ID
            section:
              type: string
              description: Destination section
            shelf:
              type: string
              description: Destination shelf
            position:
              type: string
              description: Destination position
        requestedBy:
          type: string
          description: User who requested the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b4"
        approvedBy:
          type: string
          description: User who approved the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b5"
        transferredBy:
          type: string
          description: User who executed the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b6"
        requestDate:
          type: string
          format: date-time
          description: Date when transfer was requested
          example: "2023-01-15T08:00:00Z"
        approvalDate:
          type: string
          format: date-time
          description: Date when transfer was approved
          example: "2023-01-15T09:00:00Z"
        transferDate:
          type: string
          format: date-time
          description: Date when transfer was executed
          example: "2023-01-15T10:00:00Z"
        scheduledDate:
          type: string
          format: date-time
          description: Scheduled transfer date
          example: "2023-01-15T10:00:00Z"
        status:
          type: string
          enum: [requested, approved, in-progress, completed, cancelled]
          default: requested
          description: Status of the transfer
        priority:
          type: string
          enum: [low, medium, high, urgent]
          default: medium
          description: Priority of the transfer
        reason:
          type: string
          description: Reason for the transfer
        items:
          type: array
          items:
            type: object
            properties:
              assetPartUnit:
                type: string
                description: Asset part unit ID
              assetPart:
                type: string
                description: Asset part ID
              serialNumber:
                type: string
                description: Serial number
              quantity:
                type: integer
                minimum: 1
                description: Quantity to transfer
              condition:
                type: string
                enum: [new, good, fair, poor, damaged]
                description: Condition at transfer
              notes:
                type: string
                description: Notes for this item
        totalItems:
          type: integer
          minimum: 0
          description: Total number of items being transferred
        transportMethod:
          type: string
          enum: [manual, vehicle, courier, automated]
          default: manual
          description: Method of transport
        carrier:
          type: string
          description: Carrier/transporter name
        trackingNumber:
          type: string
          description: Tracking number if applicable
        estimatedArrival:
          type: string
          format: date-time
          description: Estimated arrival time
        actualArrival:
          type: string
          format: date-time
          description: Actual arrival time
        cost:
          type: number
          format: double
          minimum: 0
          description: Transfer cost
        currency:
          type: string
          description: Currency code
          example: "USD"
        documents:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              url:
                type: string
                format: uri
              type:
                type: string
                enum: [transfer-order, receipt, photo, other]
        notes:
          type: string
          description: General notes
        metadata:
          type: object
          additionalProperties: true
          description: Additional metadata
        createdAt:
          type: string
          format: date-time
          description: Record creation timestamp
          example: "2023-01-15T08:00:00Z"
        updatedAt:
          type: string
          format: date-time
          description: Record last update timestamp
          example: "2023-01-15T10:30:00Z"
      required:
        - transferNumber
        - fromLocation
        - toLocation
        - requestedBy
        - items

    AssetPartTransferInput:
      type: object
      properties:
        transferNumber:
          type: string
          description: Unique transfer number
          example: "TRF-2023-001"
        fromLocation:
          type: object
          properties:
            warehouse:
              type: string
              description: Source warehouse ID
            section:
              type: string
              description: Source section
            shelf:
              type: string
              description: Source shelf
            position:
              type: string
              description: Source position
        toLocation:
          type: object
          properties:
            warehouse:
              type: string
              description: Destination warehouse ID
            section:
              type: string
              description: Destination section
            shelf:
              type: string
              description: Destination shelf
            position:
              type: string
              description: Destination position
        requestedBy:
          type: string
          description: User who requested the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b4"
        approvedBy:
          type: string
          description: User who approved the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b5"
        transferredBy:
          type: string
          description: User who executed the transfer
          example: "60f7b1b3e4b0e8b3f8b3f8b6"
        requestDate:
          type: string
          format: date-time
          description: Date when transfer was requested
          example: "2023-01-15T08:00:00Z"
        approvalDate:
          type: string
          format: date-time
          description: Date when transfer was approved
          example: "2023-01-15T09:00:00Z"
        transferDate:
          type: string
          format: date-time
          description: Date when transfer was executed
          example: "2023-01-15T10:00:00Z"
        scheduledDate:
          type: string
          format: date-time
          description: Scheduled transfer date
          example: "2023-01-15T10:00:00Z"
        status:
          type: string
          enum: [requested, approved, in-progress, completed, cancelled]
          default: requested
          description: Status of the transfer
        priority:
          type: string
          enum: [low, medium, high, urgent]
          default: medium
          description: Priority of the transfer
        reason:
          type: string
          description: Reason for the transfer
        items:
          type: array
          items:
            type: object
            properties:
              assetPartUnit:
                type: string
                description: Asset part unit ID
              assetPart:
                type: string
                description: Asset part ID
              serialNumber:
                type: string
                description: Serial number
              quantity:
                type: integer
                minimum: 1
                description: Quantity to transfer
              condition:
                type: string
                enum: [new, good, fair, poor, damaged]
                description: Condition at transfer
              notes:
                type: string
                description: Notes for this item
        totalItems:
          type: integer
          minimum: 0
          description: Total number of items being transferred
        transportMethod:
          type: string
          enum: [manual, vehicle, courier, automated]
          default: manual
          description: Method of transport
        carrier:
          type: string
          description: Carrier/transporter name
        trackingNumber:
          type: string
          description: Tracking number if applicable
        estimatedArrival:
          type: string
          format: date-time
          description: Estimated arrival time
        actualArrival:
          type: string
          format: date-time
          description: Actual arrival time
        cost:
          type: number
          format: double
          minimum: 0
          description: Transfer cost
        currency:
          type: string
          description: Currency code
          example: "USD"
        documents:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              url:
                type: string
                format: uri
              type:
                type: string
                enum: [transfer-order, receipt, photo, other]
        notes:
          type: string
          description: General notes
        metadata:
          type: object
          additionalProperties: true
          description: Additional metadata
      required:
        - transferNumber
        - fromLocation
        - toLocation
        - requestedBy
        - items

  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api-key

security:
  - ApiKeyAuth: []
