Source Code

;; Health Clinic Contract
;; Free community health clinic management
;; Halal - healing the sick
;; Clarity 4 compatible

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u401))
(define-constant ERR-NOT-FOUND (err u404))

(define-data-var patient-count uint u0)
(define-data-var visit-count uint u0)
(define-data-var total-donations uint u0)

(define-map doctors principal { name: (string-utf8 100), specialty: (string-utf8 50), patients-seen: uint, active: bool })
(define-map patients uint { registered-by: principal, age: uint, condition: (string-utf8 200), visits: uint, registered: uint })
(define-map clinic-visits uint { patient-id: uint, doctor: principal, diagnosis: (string-utf8 200), treatment: (string-utf8 200), block: uint })
(define-map clinic-donations principal uint)

(define-public (register-doctor (name (string-utf8 100)) (specialty (string-utf8 50)))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set doctors tx-sender { name: name, specialty: specialty, patients-seen: u0, active: true }) (ok true)))

(define-public (add-doctor (doc principal) (name (string-utf8 100)) (specialty (string-utf8 50)))
  (begin
    (asserts! (is-eq tx-sender CONTRACT-OWNER) ERR-NOT-AUTHORIZED)
    (map-set doctors doc { name: name, specialty: specialty, patients-seen: u0, active: true }) (ok true)))

(define-public (register-patient (age uint) (condition (string-utf8 200)))
  (let ((id (+ (var-get patient-count) u1)))
    (map-set patients id { registered-by: tx-sender, age: age, condition: condition, visits: u0, registered: stacks-block-height })
    (var-set patient-count id) (ok id)))

(define-public (record-visit (patient-id uint) (diagnosis (string-utf8 200)) (treatment (string-utf8 200)))
  (let (
    (doc (unwrap! (map-get? doctors tx-sender) ERR-NOT-AUTHORIZED))
    (p (unwrap! (map-get? patients patient-id) ERR-NOT-FOUND))
    (vid (+ (var-get visit-count) u1))
  )
    (map-set clinic-visits vid { patient-id: patient-id, doctor: tx-sender, diagnosis: diagnosis, treatment: treatment, block: stacks-block-height })
    (map-set patients patient-id (merge p { visits: (+ (get visits p) u1) }))
    (map-set doctors tx-sender (merge doc { patients-seen: (+ (get patients-seen doc) u1) }))
    (var-set visit-count vid) (ok vid)))

(define-public (donate-clinic (amount uint))
  (let ((prev (default-to u0 (map-get? clinic-donations tx-sender))))
    (try! (stx-transfer? amount tx-sender CONTRACT-OWNER))
    (map-set clinic-donations tx-sender (+ prev amount))
    (var-set total-donations (+ (var-get total-donations) amount)) (ok amount)))

(define-read-only (get-doctor (who principal)) (map-get? doctors who))
(define-read-only (get-patient (id uint)) (map-get? patients id))
(define-read-only (get-visit (id uint)) (map-get? clinic-visits id))
(define-read-only (get-patient-count) (ok (var-get patient-count)))
(define-read-only (get-visit-count) (ok (var-get visit-count)))
(define-read-only (get-total-donations) (ok (var-get total-donations)))

Functions (11)

FunctionAccessArgs
register-doctorpublicname: (string-utf8 100
add-doctorpublicdoc: principal, name: (string-utf8 100
register-patientpublicage: uint, condition: (string-utf8 200
record-visitpublicpatient-id: uint, diagnosis: (string-utf8 200
donate-clinicpublicamount: uint
get-doctorread-onlywho: principal
get-patientread-onlyid: uint
get-visitread-onlyid: uint
get-patient-countread-only
get-visit-countread-only
get-total-donationsread-only