TaisukeHoshino
5/21/2018 - 3:32 AM

Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.

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;
  }
}