agricultural-aggregation-router

SP1V95DB4JK47QVPJBXCEN6MT35JK84CQ4CWS15DQ

Source Code

(define-constant contract-owner tx-sender)
(define-constant err-owner-only (err u100))
(define-constant err-not-found (err u101))
(define-constant err-unauthorized (err u102))
(define-constant err-invalid-params (err u103))

(define-map aggregation-routes
  {route-id: uint}
  {
    source-locations: (list 10 (string-ascii 128)),
    destination: (string-ascii 128),
    product-type: (string-ascii 64),
    total-capacity: uint,
    used-capacity: uint,
    coordinator: principal,
    status: (string-ascii 16)
  }
)

(define-map route-assignments
  {assignment-id: uint}
  {
    route-id: uint,
    farmer: principal,
    location: (string-ascii 128),
    quantity: uint,
    assigned-at: uint
  }
)

(define-data-var route-nonce uint u0)
(define-data-var assignment-nonce uint u0)

(define-read-only (get-route (route-id uint))
  (map-get? aggregation-routes {route-id: route-id})
)

(define-read-only (get-assignment (assignment-id uint))
  (map-get? route-assignments {assignment-id: assignment-id})
)

(define-public (create-route
  (source-locations (list 10 (string-ascii 128)))
  (destination (string-ascii 128))
  (product-type (string-ascii 64))
  (total-capacity uint)
)
  (let ((route-id (var-get route-nonce)))
    (asserts! (> total-capacity u0) err-invalid-params)
    (map-set aggregation-routes {route-id: route-id}
      {
        source-locations: source-locations,
        destination: destination,
        product-type: product-type,
        total-capacity: total-capacity,
        used-capacity: u0,
        coordinator: tx-sender,
        status: "active"
      }
    )
    (var-set route-nonce (+ route-id u1))
    (ok route-id)
  )
)

(define-public (assign-to-route
  (route-id uint)
  (location (string-ascii 128))
  (quantity uint)
)
  (let (
    (route (unwrap! (map-get? aggregation-routes {route-id: route-id}) err-not-found))
    (assignment-id (var-get assignment-nonce))
  )
    (asserts! (is-eq (get status route) "active") err-invalid-params)
    (asserts! (<= (+ (get used-capacity route) quantity) (get total-capacity route)) err-invalid-params)
    (map-set route-assignments {assignment-id: assignment-id}
      {
        route-id: route-id,
        farmer: tx-sender,
        location: location,
        quantity: quantity,
        assigned-at: stacks-block-height
      }
    )
    (map-set aggregation-routes {route-id: route-id}
      (merge route {used-capacity: (+ (get used-capacity route) quantity)})
    )
    (var-set assignment-nonce (+ assignment-id u1))
    (ok assignment-id)
  )
)

(define-public (complete-route (route-id uint))
  (let ((route (unwrap! (map-get? aggregation-routes {route-id: route-id}) err-not-found)))
    (asserts! (is-eq tx-sender (get coordinator route)) err-unauthorized)
    (ok (map-set aggregation-routes {route-id: route-id}
      (merge route {status: "completed"})
    ))
  )
)

Functions (5)

FunctionAccessArgs
get-routeread-onlyroute-id: uint
get-assignmentread-onlyassignment-id: uint
create-routepublicsource-locations: (list 10 (string-ascii 128
assign-to-routepublicroute-id: uint, location: (string-ascii 128
complete-routepublicroute-id: uint