Source Code

(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-AIRCRAFT-NOT-FOUND (err u101))
(define-constant ERR-STAGE-NOT-FOUND (err u102))

(define-map aircraft-production
  { aircraft-id: uint }
  {
    model: (string-ascii 50),
    serial-number: (string-ascii 30),
    customer: principal,
    assembly-stage: (string-ascii 30),
    started-at: uint,
    estimated-completion: uint,
    actual-completion: uint,
    status: (string-ascii 20),
    manufacturer: principal
  }
)

(define-map assembly-stages
  { aircraft-id: uint, stage-id: uint }
  {
    stage-name: (string-ascii 50),
    description: (string-ascii 200),
    started-at: uint,
    completed-at: uint,
    quality-check: bool,
    completed: bool
  }
)

(define-data-var aircraft-nonce uint u0)

(define-public (start-assembly
  (model (string-ascii 50))
  (serial-number (string-ascii 30))
  (customer principal)
  (estimated-completion uint)
)
  (let ((aircraft-id (var-get aircraft-nonce)))
    (map-set aircraft-production
      { aircraft-id: aircraft-id }
      {
        model: model,
        serial-number: serial-number,
        customer: customer,
        assembly-stage: "fuselage",
        started-at: stacks-block-height,
        estimated-completion: estimated-completion,
        actual-completion: u0,
        status: "in-assembly",
        manufacturer: tx-sender
      }
    )
    (var-set aircraft-nonce (+ aircraft-id u1))
    (ok aircraft-id)
  )
)

(define-public (add-assembly-stage
  (aircraft-id uint)
  (stage-id uint)
  (stage-name (string-ascii 50))
  (description (string-ascii 200))
)
  (let ((aircraft (unwrap! (map-get? aircraft-production { aircraft-id: aircraft-id }) ERR-AIRCRAFT-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get manufacturer aircraft)) ERR-NOT-AUTHORIZED)
    (ok (map-set assembly-stages
      { aircraft-id: aircraft-id, stage-id: stage-id }
      {
        stage-name: stage-name,
        description: description,
        started-at: u0,
        completed-at: u0,
        quality-check: false,
        completed: false
      }
    ))
  )
)

(define-public (complete-stage (aircraft-id uint) (stage-id uint) (quality-passed bool))
  (let (
    (aircraft (unwrap! (map-get? aircraft-production { aircraft-id: aircraft-id }) ERR-AIRCRAFT-NOT-FOUND))
    (stage (unwrap! (map-get? assembly-stages { aircraft-id: aircraft-id, stage-id: stage-id }) ERR-STAGE-NOT-FOUND))
  )
    (asserts! (is-eq tx-sender (get manufacturer aircraft)) ERR-NOT-AUTHORIZED)
    (ok (map-set assembly-stages
      { aircraft-id: aircraft-id, stage-id: stage-id }
      (merge stage {
        completed: true,
        completed-at: stacks-block-height,
        quality-check: quality-passed
      })
    ))
  )
)

(define-public (update-assembly-stage (aircraft-id uint) (new-stage (string-ascii 30)))
  (let ((aircraft (unwrap! (map-get? aircraft-production { aircraft-id: aircraft-id }) ERR-AIRCRAFT-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get manufacturer aircraft)) ERR-NOT-AUTHORIZED)
    (ok (map-set aircraft-production
      { aircraft-id: aircraft-id }
      (merge aircraft { assembly-stage: new-stage })
    ))
  )
)

(define-public (complete-assembly (aircraft-id uint))
  (let ((aircraft (unwrap! (map-get? aircraft-production { aircraft-id: aircraft-id }) ERR-AIRCRAFT-NOT-FOUND)))
    (asserts! (is-eq tx-sender (get manufacturer aircraft)) ERR-NOT-AUTHORIZED)
    (ok (map-set aircraft-production
      { aircraft-id: aircraft-id }
      (merge aircraft {
        status: "completed",
        actual-completion: stacks-block-height
      })
    ))
  )
)

(define-read-only (get-aircraft-info (aircraft-id uint))
  (map-get? aircraft-production { aircraft-id: aircraft-id })
)

(define-read-only (get-stage-info (aircraft-id uint) (stage-id uint))
  (map-get? assembly-stages { aircraft-id: aircraft-id, stage-id: stage-id })
)

Functions (7)

FunctionAccessArgs
start-assemblypublicmodel: (string-ascii 50
add-assembly-stagepublicaircraft-id: uint, stage-id: uint, stage-name: (string-ascii 50
complete-stagepublicaircraft-id: uint, stage-id: uint, quality-passed: bool
update-assembly-stagepublicaircraft-id: uint, new-stage: (string-ascii 30
complete-assemblypublicaircraft-id: uint
get-aircraft-inforead-onlyaircraft-id: uint
get-stage-inforead-onlyaircraft-id: uint, stage-id: uint