pragma solidity ^0.4.17; contract Session { enum State { CREATE, START, CLOSE } struct Token { address _account; uint price; } struct Product { string name; string description; bytes32[] images; uint numberPricing; uint proposedPrice; uint finalPrice; uint deviation; Token[10] productTokens; State state; } uint public numberProduct = 0; uint maxProduct = 10; uint maxParticipant = 10; Product [10] public products; Product public currentProduct; Token public currentToken; address public admin; function Session() public { admin = msg.sender; } function startSession(uint _productId) public { if(_productId > maxProduct) { revert(); } if (products[_productId].state == State.CLOSE) { revert(); } products[_productId].state = State.START; } function closeSession(uint _productId, uint finalPrice) public returns(uint) { if(_productId > maxProduct) { revert(); } if (products[_productId].state != State.START) { revert(); } uint tuso = finalPrice - products[_productId].proposedPrice; if(tuso < 0) { tuso = -tuso; } uint dnew = tuso*100/finalPrice; products[_productId].finalPrice = finalPrice; products[_productId].deviation = dnew; products[_productId].state = State.CLOSE; return dnew; } function addNewProduct(string name, string description) public { if(numberProduct > maxProduct - 1){ revert(); } Token[10] emptyArray; products[numberProduct].name = name; products[numberProduct].description = description; products[numberProduct].images.push("image"); products[numberProduct].numberPricing = 0; products[numberProduct].proposedPrice = 0; products[numberProduct].finalPrice = 0; products[numberProduct].deviation = 0; products[numberProduct].productTokens = emptyArray; products[numberProduct].state = State.CREATE; numberProduct++; } function updateProduct(uint productId, string name, string description) public { if(productId > maxProduct - 1){ revert(); } products[productId].name = name; products[productId].description = description; } function checkPricingSessionOnGoing(uint productId) public returns(bool) { return (products[productId].state == State.START); } function numberPricingSession() public constant returns(uint){ return numberProduct; } function viewProduct(uint productId) public constant returns(uint, uint, uint) { currentProduct = products[productId]; return (products[productId].numberPricing, products[productId].proposedPrice, products[productId].finalPrice); } function viewPricingSession(uint productId, uint productTokenNumber) public returns( address, uint) { currentProduct = products[productId]; currentToken = currentProduct.productTokens[productTokenNumber]; return (currentProduct.productTokens[productTokenNumber]._account, currentProduct.productTokens[productTokenNumber].price); } function numberProductToken(uint productId) public returns(uint) { return (products[productId].numberPricing); } function pricing(uint _productId, uint _price, address _account) public { currentProduct = products[_productId]; if (products[_productId].state != State.START) { revert(); } uint numberPricing = products[_productId].numberPricing; bool pricedBefore = false; for(uint participantId = 0; participantId < products[_productId].numberPricing; participantId ++) { Token tmp = products[_productId].productTokens[participantId]; if(tmp._account == _account) { pricedBefore = true; products[_productId].productTokens[participantId].price = _price; break; } } if(!pricedBefore) { products[_productId].productTokens[numberPricing]._account = _account; products[_productId].productTokens[numberPricing].price = _price; numberPricing ++; products[_productId].numberPricing = numberPricing; } } function checkParticipantPicing(uint _productId, address _account) public returns (bool) { for(uint participantId = 0; participantId < products[_productId].numberPricing; participantId ++) { Token tmp = products[_productId].productTokens[participantId]; if(tmp._account == _account) { return (true); } } return (false); } function setProposedPrice(uint productId, uint proposedPrice) public { products[productId].proposedPrice = proposedPrice; } }