Sie sind auf Seite 1von 8

pragma solidity ^0.5.

1;

pragma experimental ABIEncoderV2;

contract MedicalPrescriptionContract {

struct RegulatoryAuthority {

string name;

bool isValid;

struct Physician {

uint license;

string name;

string lastname;

bytes32 signature;

int[] prescriptionsCode;

bool isValid;

struct Pharmacist {

string name;

bool isValid;

struct Patient {

string name;

string lastname;

string affiliateNumber;

uint sex;

uint birthDay;

int[] prescriptionsCode;
bool isValid;

struct DataAnalyzer {

string name;

bool isValid;

struct Prescription {

address physicianAddress;

address patientAddress;

string[] drugs;

string diagnosis;

uint date;

string place;

bytes32 signature;

PrescriptionStatus status;

bool isValid;

enum PrescriptionStatus {CREATED, DELIVERED}

address owner;

mapping(address => RegulatoryAuthority) regulatoryAuthorities;

mapping(address => Physician) physicians;

mapping(address => Patient) patients;

mapping(address => Pharmacist) pharmacists;

mapping(int => Prescription) prescriptions;

int prescriptionsLength;

mapping(address => DataAnalyzer) dataAnalyzers;


constructor() public {

owner = msg.sender;

prescriptionsLength = 0;

modifier onlyOwner {

require(

msg.sender == owner,

"Only owner can call this function."

);

_;

modifier onlyRegulatoryAuthority {

require(

regulatoryAuthorities[msg.sender].isValid,

"Only Regulatory Authority can call this function."

);

_;

modifier onlyPhysician {

require(

physicians[msg.sender].isValid,

"Only Physicians can call this function."

);

_;

modifier onlyPhysiciansOrPatientsOrPharmacists {

require(
physicians[msg.sender].isValid || patients[msg.sender].isValid ||
pharmacists[msg.sender].isValid,

"Only Physicians, Patients or Pharmacists can call this function."

);

_;

function addRegulatoryAuthority(address _regulatoryAuthority, string memory _name) public


onlyOwner returns (bool success) {

if (regulatoryAuthorities[_regulatoryAuthority].isValid) return false;

regulatoryAuthorities[_regulatoryAuthority].name = _name;

regulatoryAuthorities[_regulatoryAuthority].isValid = true;

return true;

function getRegulatoryAuthorities(address _regulatoryAuthority) public view onlyOwner


returns(bool success, string memory name){

return (regulatoryAuthorities[_regulatoryAuthority].isValid,
regulatoryAuthorities[_regulatoryAuthority].name);

function addPhysician(address _physician, uint _license, string memory _name, string memory
_lastname, bytes32 _signature) public onlyRegulatoryAuthority returns (bool success) {

if (physicians[_physician].isValid) return false;

physicians[_physician].license = _license;

physicians[_physician].name = _name;

physicians[_physician].lastname = _lastname;

physicians[_physician].signature = _signature;

physicians[_physician].isValid = true;

return true;

}
function getPhysician(address _physician) public view returns(bool success, uint _license, string
memory physicianName, string memory physicianLastname) {

return (physicians[_physician].isValid,

physicians[_physician].license,

physicians[_physician].name,

physicians[_physician].lastname

);

function addPatient(address _patient, string memory _name, string memory _lastname, string
memory _affiliateNumber, uint _sex, uint _birthDay) public onlyPhysician returns (bool success) {

if (patients[_patient].isValid) return false;

patients[_patient].name = _name;

patients[_patient].lastname = _lastname;

patients[_patient].affiliateNumber = _affiliateNumber;

patients[_patient].sex = _sex;

patients[_patient].birthDay = _birthDay;

patients[_patient].isValid = true;

return true;

function addPharmacist(address _pharmacist, string memory _name) public


onlyRegulatoryAuthority returns (bool success) {

if (pharmacists[_pharmacist].isValid) return false;

pharmacists[_pharmacist].name = _name;

pharmacists[_pharmacist].isValid = true;

return true;

function addDataAnalyzer(address _dataAnalyzer, string memory _name) public


onlyRegulatoryAuthority returns (bool success) {

if (dataAnalyzers[_dataAnalyzer].isValid) return false;


dataAnalyzers[_dataAnalyzer].name = _name;

dataAnalyzers[_dataAnalyzer].isValid = true;

return true;

function generatePresciptionCode(int index) private returns (int) {

//generate hash

return index;

function createPresciption(address _patient, string[] memory _drugs, string memory _diagnosis,


uint _date, string memory _place) public onlyPhysician returns (bool success, int prescriptionCode) {

int code = generatePresciptionCode(prescriptionsLength);

if (prescriptions[code].isValid || !patients[_patient].isValid) return (false, -1);

prescriptions[code].physicianAddress = msg.sender;

prescriptions[code].patientAddress = _patient;

prescriptions[code].drugs = _drugs;

prescriptions[code].diagnosis = _diagnosis;

prescriptions[code].date = _date;

prescriptions[code].place = _place;

prescriptions[code].signature = physicians[msg.sender].signature;

prescriptions[code].status = PrescriptionStatus.CREATED;

prescriptions[code].isValid = true;

physicians[msg.sender].prescriptionsCode.push(code);

patients[_patient].prescriptionsCode.push(code);

prescriptionsLength += 1;

return (true, code);


}

function getPresciption(int _prescriptionCode) public onlyPhysiciansOrPatientsOrPharmacists


returns (bool success, address physicianAddress, address patientAddress, string[] memory drugs,
string memory diagnosis, uint date, string memory place, bytes32 signature, uint status) {

Prescription memory prescription = prescriptions[_prescriptionCode];

//physicians can only get their own prescription

if(physicians[msg.sender].isValid) {

require(msg.sender == prescription.physicianAddress, "You only can get your own


prescription");

//patients can only get their own prescription

if(patients[msg.sender].isValid) {

require(msg.sender == prescription.patientAddress, "You only can get your own


prescription");

//delivered to Pharmacists

if(pharmacists[msg.sender].isValid) {

prescriptions[_prescriptionCode].status = PrescriptionStatus.DELIVERED;

prescription.status = PrescriptionStatus.DELIVERED;

return (prescription.isValid,

prescription.physicianAddress,

prescription.patientAddress,

prescription.drugs,

prescription.diagnosis,

prescription.date,

prescription.place,
prescription.signature,

uint(prescription.status)

);

Das könnte Ihnen auch gefallen