// SPDX-License-Identifier: FIRChain pragma solidity ^0.7.1; contract FIRChain { enum Roles {NoRole, PoliceStation, HeadQuarters} enum ComplaintType {Nil, Missing, Found} event verifyEvent(bool Status); event findMatchEvent(uint256 fid1, uint256 fid2); struct PoliceStationStruct { uint256 pId; address ethAddr; string name; string addr; string state; uint256 phno; Roles role; } struct FIRStruct { uint256 fId; string name; string details; string state; uint uniqueId; ComplaintType ctype; uint256 registeredDate; uint256 closedDate; bool findMatch; bool status; } mapping(uint256 => PoliceStationStruct) Police; mapping(uint256 => uint256) HeadQuarter; mapping(uint256 => uint256[]) PoliceStations; mapping(address => uint256) Registered; mapping(uint => bool) MissingStatus; mapping(uint => bool) FoundStatus; mapping(uint => uint256) MissingId; mapping(uint => uint256) FoundId; mapping(uint256 => FIRStruct) FIR; mapping(uint256 => uint256[]) FIRDetails; uint256 PS_id; uint256 FIR_id; string[29] public States = [ "Andhra Pradesh", "Arunachal Pradesh", "Assam", "Bihar", "Chhattisgarh", "Goa", "Gujarat", "Haryana", "Himachal Pradesh", "Jammu and Kashmir", "Jharkhand", "Karnataka", "Kerala", "Madhya Pradesh", "Maharashtra", "Manipur", "Meghalaya", "Mizoram", "Nagaland", "Odisha", "Punjab", "Rajasthan", "Sikkim", "Tamil Nadu", "Telangana", "Tripura", "Uttar Pradesh", "Uttarakhand", "West Bengal" ]; address owner; constructor() { owner = msg.sender; } modifier onlyPoliceStation() { require(Registered[msg.sender] == 1); _; } modifier onlyHeadQuarter() { require(Registered[msg.sender] == 2); _; } modifier onlyOwner() { require(owner == msg.sender); _; } function assignPoliceStation( string calldata _name, address _ethAddr, string calldata _addr, uint256 _state, uint256 _phno ) external onlyOwner { require(Registered[_ethAddr] == 0, "Already Registered"); PS_id++; Police[PS_id].pId = PS_id; Police[PS_id].name = _name; Police[PS_id].ethAddr = _ethAddr; Police[PS_id].addr = _addr; Police[PS_id].state = States[_state]; Police[PS_id].phno = _phno; Police[PS_id].role = Roles(1); Registered[_ethAddr] = uint256(Roles(1)); PoliceStations[_state].push(PS_id); } function assignHeadQuarter( string calldata _name, address _ethAddr, string calldata _addr, uint256 _state, uint256 _phno ) external onlyOwner { require(Registered[_ethAddr] == 0, "Already Registered"); require(HeadQuarter[_state] != 1, "HeadQuarter Already Assigned"); PS_id++; Police[PS_id].pId = PS_id; Police[PS_id].name = _name; Police[PS_id].ethAddr = _ethAddr; Police[PS_id].addr = _addr; Police[PS_id].state = States[_state]; Police[PS_id].phno = _phno; Police[PS_id].role = Roles(2); Registered[_ethAddr] = uint256(Roles(2)); PoliceStations[_state].push(PS_id); HeadQuarter[_state] = 1; } function fileMissingComplaint( string calldata _name, string calldata _details, uint256 _state, uint _uniqueId ) external onlyPoliceStation { FIR_id++; MissingId[_uniqueId] = FIR_id; MissingStatus[_uniqueId] = true; FIR[FIR_id].fId = FIR_id; FIR[FIR_id].name = _name; FIR[FIR_id].details = _details; FIR[FIR_id].state = States[_state]; FIR[FIR_id].uniqueId = _uniqueId; FIR[FIR_id].ctype = ComplaintType(1); FIR[FIR_id].registeredDate = block.timestamp; FIR[FIR_id].findMatch = false; FIR[FIR_id].status = false; FIRDetails[_state].push(FIR_id); } //bakki parameters ellam add cheyyanam function fileFoundComplaint( string calldata _name, string calldata _details, uint256 _state, uint _uniqueId ) external onlyPoliceStation { FIR_id++; FoundId[_uniqueId] = FIR_id; FoundStatus[_uniqueId] = true; FIR[FIR_id].fId = FIR_id; FIR[FIR_id].name = _name; FIR[FIR_id].details = _details; FIR[FIR_id].state = States[_state]; FIR[FIR_id].uniqueId = _uniqueId; FIR[FIR_id].ctype = ComplaintType(2); FIR[FIR_id].registeredDate = block.timestamp; FIR[FIR_id].findMatch = false; FIR[FIR_id].status = false; } function verifyComplaint(uint256 _fId1, uint256 _fId2) public onlyHeadQuarter returns (bool status) { if (FIR[_fId1].findMatch == true && FIR[_fId2].findMatch == true) { FIR[_fId1].status = true; FIR[_fId2].status = true; FIR[_fId1].closedDate = block.timestamp; FIR[_fId2].closedDate = block.timestamp; emit verifyEvent(true); return true; } emit verifyEvent(false); return false; } function findMatch(uint _uniqueId) public onlyHeadQuarter returns (uint256 ID1, uint256 ID2) { uint256 a; uint256 b; if ( MissingStatus[_uniqueId] == true && FoundStatus[_uniqueId] == true ) { FIR[MissingId[_uniqueId]].findMatch = true; FIR[FoundId[_uniqueId]].findMatch = true; a = MissingId[_uniqueId]; b = FoundId[_uniqueId]; } emit findMatchEvent(a, b); return (a, b); } function getFIRDetails(uint256 _fId) public view returns ( string memory Name, string memory Details, string memory State, uint UniqueId, uint256[4] memory Id_Type_RegisteredDate_ClosedDate, bool Status ) { return ( FIR[_fId].name, FIR[_fId].details, FIR[_fId].state, FIR[_fId].uniqueId, [ FIR[_fId].fId, uint256(FIR[_fId].ctype), FIR[_fId].registeredDate, FIR[_fId].closedDate ], FIR[_fId].status ); } }
0.6.8