Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.4.24+commit.e67f0147.js&optimize=false&gist=
import "./ManufacturersManager.sol";
pragma solidity ^0.4.18;
contract ProductManager is ManufacturersManager{
//ProductStatusという列挙型の型を設定
enum ProductStatus {Shipped, Owned,Disposed}
//製品の情報構造
struct ProductInfo {
address owner;
address recipient;
ProductStatus pStatus;
uint creationTime;
uint8 nTransferred;
//address manufacuture
}
//製品のEPCを受けて、製品の情報構造を返す
mapping (uint => ProductInfo) products;
//製品(EPC)が本当に呼び出したメーカーのものなのか確認
/* function checkAuthorship(uint _EPC) returns(bool){
//EPCデータベースで確認⇨今の所できない
} */
//製品をブロックチェーン上に登録
function enrollProduct(address _manufacturerAddress, uint _EPC) public onlyNotExist(_EPC) {
//if checkAuthorship(_EPC)
products[_EPC].owner = _manufacturerAddress;
products[_EPC].pStatus = ProductStatus.Owned;
products[_EPC].creationTime = now;
products[_EPC].nTransferred = 0;
}
function shipProduct(address _reciever, uint _EPC) public onlyExist(_EPC) onlyOwner(_EPC) onlyStatusIs(_EPC, ProductStatus.Owned) {
if (_reciever == products[_EPC].owner) {
//製品の所有者が_recieverの時(すでに出発している)、例外処理⇨何もしない
/* throw; */
} else {
//製品の所有者が_recieverじゃないとき
products[_EPC].pStatus = ProductStatus.Shipped;
products[_EPC].recipient = _reciever;
}
}
//受け手は、製品を受け取ったら、製品の所有者、ステータス、配送回数を更新
function receiveProduct(uint _EPC) public onlyExist(_EPC) onlyRecipient(_EPC) onlyStatusIs(_EPC, ProductStatus.Shipped) {
products[_EPC].owner = msg.sender;
products[_EPC].pStatus = ProductStatus.Owned;
products[_EPC].nTransferred = products[_EPC].nTransferred + 1;
// if (products[EPC].nTransferred <= MAXTRANSFER) {
// msg.sender.send(transferReward);
// }
}
//確認用
function checkOwnership(uint _EPC) public view returns(address){
return(products[_EPC].owner);
}
////製造者が一つという前提になっているから注意!(0or1)///
//指定された製品が構造体に登録されていない
modifier onlyNotExist (uint _EPC) {
require(products[_EPC].owner == 0x0000000000000000000000000000000000000000);
_;
}
//指定された製品Cが構造体に登録されている
modifier onlyExist (uint _EPC) {
require(products[_EPC].owner != 0x0000000000000000000000000000000000000000);
_;
}
//本当に受けて(msg.sender)は真の受け手なのか
modifier onlyRecipient (uint _EPC) {
require(products[_EPC].recipient == msg.sender);
_;
}
//本当に自分はオーナーなの?
modifier onlyOwner (uint _EPC) {
require(products[_EPC].owner == msg.sender);
_;
}
//製品のステータスが指定の状況の時
modifier onlyStatusIs (uint _EPC, ProductStatus thisStatus) {
require(products[_EPC].pStatus == thisStatus);
_;
}
}
pragma solidity ^0.4.18;
contract ManufacturersManager {
struct ManufacturerInfo {
uint id;
uint companyPrefix;
string companyName;
uint expireTime;
}
/* ManufacturerInfo[] public manufacturerInfos; */
mapping(uint => ManufacturerInfo) public manufacturerInfos;
//アドレスを指定すると、メーカーの情報を返す
mapping(address => ManufacturerInfo) addressToManufacturer;
//メーカーのPrefixを指定すると、その会社のaddressを返す
mapping(uint => address) companyPrefixToAddress;
uint manufacturerCounter;
function enrollManufacturer (address companyAddress, uint _companyPrefix, string _companyName, uint _expireTime) public {
//manufacturerInfosのid(manufacturerCounter)=1番目から代入している
manufacturerCounter ++;
manufacturerInfos[manufacturerCounter] = ManufacturerInfo(manufacturerCounter, _companyPrefix, _companyName, _expireTime);
companyPrefixToAddress[_companyPrefix] = companyAddress;
}
function getManufacturer() public view returns(uint []) {
//idを入れるarrayを用意
uint[] memory manufacturerIds = new uint[](manufacturerCounter);
uint numberOfManufacturer = 0;
//配列にmanufacturerのidを入れていく(mappingにはid=1番目から入っているのでi=1からroopする)
for(uint i = 1; i <= manufacturerCounter; i++){
manufacturerIds[numberOfManufacturer] = manufacturerInfos[i].id;
numberOfManufacturer++;
}
return manufacturerIds;
}
}