From 4618bd72858a7efe34a1467d981bd7a1be411c0d Mon Sep 17 00:00:00 2001
From: meskio <meskio@sindominio.net>
Date: Mon, 28 Sep 2020 19:25:35 +0200
Subject: [PATCH] Set the total of purchases negative

---
 api/purchase.go        | 44 ++++++++++++++++++++++++------------------
 api/purchase_test.go   |  2 +-
 src/TransactionList.js |  2 +-
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/api/purchase.go b/api/purchase.go
index 9c8864f..270bc3b 100644
--- a/api/purchase.go
+++ b/api/purchase.go
@@ -40,24 +40,9 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 		purchase[i].Price = product.Price
 	}
 
-	var member Member
-	err = a.db.Where("num = ?", num).Find(&member).Error
-	if err != nil {
-		log.Printf("Can't find member %d: %v", num, err)
-		w.WriteHeader(http.StatusNotAcceptable)
-		return
-	}
-	if member.Balance < total {
-		log.Printf("Member %d don't have enough money (%d-%d)", num, member.Balance, total)
-		w.WriteHeader(http.StatusBadRequest)
-		return
-	}
-	err = a.db.Model(&Member{}).
-		Where("num = ?", num).
-		Update("balance", gorm.Expr("balance - ?", total)).Error
-	if err != nil {
-		log.Printf("Can't update update member balance %d-%d: %v", num, total, err)
-		w.WriteHeader(http.StatusNotAcceptable)
+	httpStatus := a.substractMemberBalance(num, total)
+	if httpStatus != http.StatusOK {
+		w.WriteHeader(httpStatus)
 		return
 	}
 
@@ -66,7 +51,7 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 		Date:      time.Now(),
 		Purchase:  purchase,
 		Type:      "purchase",
-		Total:     total,
+		Total:     -total,
 	}
 	err = a.db.Create(&transaction).Error
 	if err != nil {
@@ -93,3 +78,24 @@ func (a *api) AddPurchase(num int, w http.ResponseWriter, req *http.Request) {
 	}
 
 }
+
+func (a *api) substractMemberBalance(num int, total int) int {
+	var member Member
+	err := a.db.Where("num = ?", num).Find(&member).Error
+	if err != nil {
+		log.Printf("Can't find member %d: %v", num, err)
+		return http.StatusNotAcceptable
+	}
+	if member.Balance < total {
+		log.Printf("Member %d don't have enough money (%d-%d)", num, member.Balance, total)
+		return http.StatusBadRequest
+	}
+	err = a.db.Model(&Member{}).
+		Where("num = ?", num).
+		Update("balance", gorm.Expr("balance - ?", total)).Error
+	if err != nil {
+		log.Printf("Can't update update member balance %d-%d: %v", num, total, err)
+		return http.StatusNotAcceptable
+	}
+	return http.StatusOK
+}
diff --git a/api/purchase_test.go b/api/purchase_test.go
index e176e19..3e979cb 100644
--- a/api/purchase_test.go
+++ b/api/purchase_test.go
@@ -30,7 +30,7 @@ func TestPurchaseAddListMine(t *testing.T) {
 	if len(transactions) != 1 {
 		t.Fatal("Wrong number of transactions", len(transactions), transactions)
 	}
-	if transactions[0].Total != testProduct.Price*products[0].Ammount {
+	if transactions[0].Total != -testProduct.Price*products[0].Ammount {
 		t.Error("Wrong total:", transactions[0].Total)
 	}
 	if len(transactions[0].Purchase) != 1 {
diff --git a/src/TransactionList.js b/src/TransactionList.js
index c52de0e..a5e16de 100644
--- a/src/TransactionList.js
+++ b/src/TransactionList.js
@@ -16,7 +16,7 @@ const columns = [
             };
     }},
     {dataField: 'date', text: 'Fecha', formatter: printDate},
-    {dataField: 'total', text: 'Total', formatter: cell => printMoney(cell)+" €"},
+    {dataField: 'total', text: 'Cantidad', formatter: cell => printMoney(cell)+" €"},
 ]
 
 function TransactionList() {
-- 
GitLab