diff --git a/chaincode/controller/bid/bid_controller.go b/chaincode/controller/bid/bid_controller.go index c6a19ef80489404a2cd258b8adfda659e7eef201..16503d78fbdbd7ecf5754d8c312b1810ba6d1919 100644 --- a/chaincode/controller/bid/bid_controller.go +++ b/chaincode/controller/bid/bid_controller.go @@ -14,6 +14,7 @@ import ( "git.code.tecnalia.com/ledgerbuilder/sdk/shared" "github.com/mitchellh/mapstructure" + "git.code.tecnalia.com/blockchain/hypercog/controller/stats" errs "git.code.tecnalia.com/traceblock/sdk/constants" "git.code.tecnalia.com/traceblock/sdk/controller/base" "git.code.tecnalia.com/traceblock/sdk/controller/split" @@ -224,22 +225,20 @@ func (c BidDecisionController) RejectBid(stub shared.LedgerBuildrStubInterface, return c.SaveAbstractAsset(stub, biddableAsset) } -func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) protos.Response { - fnName := "BidController:AcceptBid" - +func (c BidDecisionController) _acceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) (*protos.Response, error) { biddableAsset, bid, err := c.bidResponse(stub, params, true) if err != nil { - return api.NewApiResponsePtr(fnName, err, nil).SendResponse() + return nil, err } if biddableAsset.Quantity < bid.Quantity { - return api.NewApiResponsePtr(fnName, errInvalidBidQuantity, nil).SendResponse() + return nil, errInvalidBidQuantity } // TODO check is this transactional? respAcceptedStock:= c.SaveAbstractAsset(stub, biddableAsset) if respAcceptedStock.Status != shared.OK { - return respAcceptedStock + return &respAcceptedStock, nil } var soldStock *model.TraceableAsset @@ -256,7 +255,7 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, subAssets, err := split.SplitAsset(c.TraceblockBaseController, stub, biddableAsset, *splitParams) if err != nil { - return api.NewApiResponsePtr(fnName, err, nil).SendResponse() + return nil, err } newStock := subAssets[0] @@ -267,7 +266,7 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, respNewStock:= c.SaveAbstractAsset(stub, &newStock) if respNewStock.Status != shared.OK { - return respNewStock + return &respNewStock, nil } soldStock = &subAssets[1] @@ -286,5 +285,19 @@ func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, transferredAsset := transfer.TransferAsset(stub, soldStock, transferParams) - return c.SaveAbstractAsset(stub, transferredAsset) + err = stats.RegisterSale(stub, soldStock.Quantity, bid.Price, soldStock.Units) + if err != nil { + return nil, err + } + + ret := c.SaveAbstractAsset(stub, transferredAsset) + return &ret, nil +} + +func (c BidDecisionController) AcceptBid(stub shared.LedgerBuildrStubInterface, params shared.LedgerBuildrAsset) protos.Response { + ret, err := c._acceptBid(stub, params) + if err != nil { + return api.NewApiResponsePtr("BidController:AcceptBid", err, nil).SendResponse() + } + return *ret } \ No newline at end of file diff --git a/chaincode/controller/stats/stub.go b/chaincode/controller/stats/stub.go index be2689c9b104472d95d5c773746006e74e4b569f..35dc18f7bc83c705f60edb91f1a2c03cb7607b07 100644 --- a/chaincode/controller/stats/stub.go +++ b/chaincode/controller/stats/stub.go @@ -94,7 +94,7 @@ func AddOrgIfNotExist(stub shared.LedgerBuildrStubInterface, org string) (err er } -func RetrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) { +func retrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawStats, *model.RawStats, error) { org, err := stub.GetOrganization() if err != nil { return nil, nil, err @@ -113,7 +113,7 @@ func RetrieveExistingStats(stub shared.LedgerBuildrStubInterface) (*model.RawSta return globalStats, customStats, nil } -func UpgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) { +func upgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawStats, customStats *model.RawStats) (error) { org, err := stub.GetOrganization() if err != nil { return err @@ -134,5 +134,40 @@ func UpgradeStats(stub shared.LedgerBuildrStubInterface, globalStats *model.RawS return err } + return nil +} + + +func RegisterSlag(stub shared.LedgerBuildrStubInterface, quantity uint32, units string) (error) { + globalStats, customStats, err := retrieveExistingStats(stub) + if err != nil { + return err + } + + customStats.RegisterSlag(quantity, units) + globalStats.RegisterSlag(quantity, units) + + err = upgradeStats(stub, globalStats, customStats) + if err != nil { + return err + } + + return nil +} + +func RegisterSale(stub shared.LedgerBuildrStubInterface, quantity uint32, price float32, units string) (error) { + globalStats, orgStats, err := retrieveExistingStats(stub) + if err != nil { + return err + } + + orgStats.UpgradeSell(quantity, price, units) + orgStats.UpgradeSell(quantity, price, units) + + err = upgradeStats(stub, globalStats, orgStats) + if err != nil { + return err + } + return nil } \ No newline at end of file diff --git a/chaincode/middleware/stats.go b/chaincode/middleware/stats.go index 6b62c81dc0bfb441d4a440d7487cc8b68f8991bd..71dd771f39162b62144e00957e1cebac7925e59c 100644 --- a/chaincode/middleware/stats.go +++ b/chaincode/middleware/stats.go @@ -24,15 +24,7 @@ func _updateSlagProduction(stub shared.LedgerBuildrStubInterface, ctl shared.Con status, ok := asst.Get("status") if ok && status == "slag" { - globalStats, customStats, err := stats.RetrieveExistingStats(stub) - if err != nil { - return nil, err - } - - customStats.RegisterSlag(asst.Quantity, asst.Units) - globalStats.RegisterSlag(asst.Quantity, asst.Units) - - err = stats.UpgradeStats(stub, globalStats, customStats) + err := stats.RegisterSlag(stub, asst.Quantity, asst.Units) if err != nil { return nil, err }