Index: backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java	(revision dec188cb4972a7606df4e43c909e6bae1eaf78b9)
+++ backend/src/main/java/com/tradingmk/backend/config/SecurityConfig.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -27,11 +27,11 @@
                 .authorizeHttpRequests()
                 .requestMatchers(
-                                "/api/auth/**",
-                                "/api/stocks/update",  // morame allow za da postiras
-                                "/api/stocks/**",
-                                "/ws/**",
-                                "/topic/**",
-                                "/api/history/upload",
-                                "/api/history/{symbol}","/api/portfolio/**")
+                        "/api/auth/**",
+                        "/api/stocks/update",  // morame allow za da postiras
+                        "/api/stocks/**",
+                        "/ws/**",
+                        "/topic/**",
+                        "/api/history/upload",
+                        "/api/history/{symbol}","/api/trades/**")
                 .permitAll()
                 .anyRequest()
Index: backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java	(revision dec188cb4972a7606df4e43c909e6bae1eaf78b9)
+++ backend/src/main/java/com/tradingmk/backend/controller/PortfolioController.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -3,4 +3,5 @@
 
 import com.tradingmk.backend.dto.*;
+import com.tradingmk.backend.model.Portfolio;
 import com.tradingmk.backend.model.PortfolioHolding;
 import com.tradingmk.backend.repository.PortfolioHoldingRepository;
@@ -9,5 +10,7 @@
 import com.tradingmk.backend.service.PortfolioService;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
 import org.springframework.security.core.annotation.AuthenticationPrincipal;
 import org.springframework.security.core.userdetails.UserDetails;
@@ -26,4 +29,6 @@
     private final PortfolioHoldingRepository portfolioHoldingRepository;
     private final PortfolioService portfolioService;
+
+
 
     public PortfolioController(PortfolioRepository portfolioRepository, UserRepository userRepository, PortfolioHoldingRepository portfolioHoldingRepository, PortfolioService portfolioService) {
@@ -78,5 +83,4 @@
     }
 
-
     @PostMapping("/sell")
     public ResponseEntity<String> sellStock(@RequestBody SellStockRequest request, Principal principal) {
Index: backend/src/main/java/com/tradingmk/backend/controller/TradeRequestController.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/controller/TradeRequestController.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
+++ backend/src/main/java/com/tradingmk/backend/controller/TradeRequestController.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -0,0 +1,125 @@
+package com.tradingmk.backend.controller;
+
+
+import com.tradingmk.backend.model.Portfolio;
+import com.tradingmk.backend.model.PortfolioHolding;
+import com.tradingmk.backend.model.TradeRequest;
+import com.tradingmk.backend.model.User;
+import com.tradingmk.backend.repository.PortfolioHoldingRepository;
+import com.tradingmk.backend.repository.PortfolioRepository;
+import com.tradingmk.backend.repository.TradeRequestRepository;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/trades")
+public class TradeRequestController {
+
+    private final TradeRequestRepository tradeRequestRepository;
+    private final PortfolioRepository portfolioRepository;
+    private final PortfolioHoldingRepository portfolioHoldingRepository;
+
+    public TradeRequestController(TradeRequestRepository tradeRequestRepository, PortfolioRepository portfolioRepository, PortfolioHoldingRepository portfolioHoldingRepository) {
+        this.tradeRequestRepository = tradeRequestRepository;
+        this.portfolioRepository = portfolioRepository;
+        this.portfolioHoldingRepository = portfolioHoldingRepository;
+    }
+
+    // sending the trade request
+    @PostMapping("/request")
+    public TradeRequest requestTrade(@RequestBody TradeRequest tradeRequest, @AuthenticationPrincipal User user) {
+        tradeRequest.setStatus("PENDING");
+        tradeRequest.setTimestamp(LocalDateTime.now());
+
+        // fetch the portfolio for this user
+        Portfolio portfolio = portfolioRepository.findByUserId(user.getId())
+                .orElseThrow(() -> new RuntimeException("Portfolio not found for user"));
+
+        tradeRequest.setPortfolioId(portfolio.getId());
+        System.out.println("Portfolio ID set: " + portfolio.getId());
+
+        return tradeRequestRepository.save(tradeRequest);
+    }
+
+    // admin views the pending requests
+    @GetMapping("/pending")
+    public List<TradeRequest> getPendingTrades() {
+        return tradeRequestRepository.findByStatus("PENDING");
+    }
+
+    // admin can approve or declinee
+    @PostMapping("/{id}/approve")
+    public TradeRequest approveTrade(@PathVariable Long id) {
+        TradeRequest tr = tradeRequestRepository.findById(id)
+                .orElseThrow(() -> new RuntimeException("Trade not found"));
+
+        if (!"PENDING".equals(tr.getStatus())) {
+            throw new RuntimeException("Trade already processed!");
+        }
+
+        // Load portfolio from tradeRequest
+        Portfolio portfolio = portfolioRepository.findById(tr.getPortfolioId())
+                .orElseThrow(() -> new RuntimeException("Portfolio not found"));
+
+        if ("BUY".equalsIgnoreCase(tr.getType())) {
+            BigDecimal totalCost = BigDecimal.valueOf(tr.getQuantity() * tr.getPricePerUnit());
+//            if (portfolio.getBalance().compareTo(totalCost) < 0) {
+//                throw new RuntimeException("Insufficient balance in portfolio");
+//            }
+            //TODO GET THIS BACK
+            portfolio.setBalance(portfolio.getBalance().subtract(totalCost));
+            portfolioRepository.save(portfolio);
+
+            PortfolioHolding holding = portfolioHoldingRepository
+                    .findByPortfolioIdAndStockSymbol(portfolio.getId(), tr.getStockSymbol())
+                    .orElseGet(() -> {
+                        PortfolioHolding newHolding = new PortfolioHolding();
+                        newHolding.setPortfolio(portfolio);
+                        newHolding.setStockSymbol(tr.getStockSymbol());
+                        newHolding.setQuantity(0);
+                        newHolding.setAvgPrice(BigDecimal.ZERO);
+                        return newHolding;
+                    });
+
+            BigDecimal oldCost = holding.getAvgPrice().multiply(BigDecimal.valueOf(holding.getQuantity()));
+            BigDecimal newCost = BigDecimal.valueOf(tr.getPricePerUnit() * tr.getQuantity());
+            int newQuantity = holding.getQuantity() + tr.getQuantity();
+
+            holding.setQuantity(newQuantity);
+            holding.setAvgPrice(newQuantity > 0 ? (oldCost.add(newCost)).divide(BigDecimal.valueOf(newQuantity), RoundingMode.HALF_UP) : BigDecimal.ZERO);
+
+            portfolioHoldingRepository.save(holding);
+
+        } else if ("SELL".equalsIgnoreCase(tr.getType())) {
+            PortfolioHolding holding = portfolioHoldingRepository
+                    .findByPortfolioIdAndStockSymbol(portfolio.getId(), tr.getStockSymbol())
+                    .orElseThrow(() -> new RuntimeException("No holdings for stock " + tr.getStockSymbol()));
+
+            if (holding.getQuantity() < tr.getQuantity()) {
+                throw new RuntimeException("Not enough stock quantity to sell");
+            }
+
+            holding.setQuantity(holding.getQuantity() - tr.getQuantity());
+            portfolioHoldingRepository.save(holding);
+
+            BigDecimal totalGain = BigDecimal.valueOf(tr.getQuantity() * tr.getPricePerUnit());
+            portfolio.setBalance(portfolio.getBalance().add(totalGain));
+            portfolioRepository.save(portfolio);
+        }
+
+        tr.setStatus("APPROVED");
+        return tradeRequestRepository.save(tr);
+    }
+
+    @PostMapping("/{id}/decline")
+    public TradeRequest declineTrade(@PathVariable Long id) {
+        TradeRequest tr = tradeRequestRepository.findById(id).orElseThrow();
+        tr.setStatus("DECLINED");
+        return tradeRequestRepository.save(tr);
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/model/TradeRequest.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/model/TradeRequest.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
+++ backend/src/main/java/com/tradingmk/backend/model/TradeRequest.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -0,0 +1,92 @@
+package com.tradingmk.backend.model;
+
+import jakarta.persistence.*;
+import jakarta.persistence.Entity;
+
+import java.time.LocalDateTime;
+
+@Entity
+
+public class TradeRequest {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "portfolio_id")
+    private Long portfolioId;
+
+
+    private String stockSymbol;
+    private int quantity;
+    private double pricePerUnit;
+
+    private String type; //buy.sell
+    private String status; // pending , approved, declined
+
+    private LocalDateTime timestamp;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getPortfolioId() {
+        return portfolioId;
+    }
+
+    public void setPortfolioId(Long portfolioId) {
+        this.portfolioId = portfolioId;
+    }
+
+    public String getStockSymbol() {
+        return stockSymbol;
+    }
+
+    public void setStockSymbol(String stockSymbol) {
+        this.stockSymbol = stockSymbol;
+    }
+
+    public int getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(int quantity) {
+        this.quantity = quantity;
+    }
+
+    public double getPricePerUnit() {
+        return pricePerUnit;
+    }
+
+    public void setPricePerUnit(double pricePerUnit) {
+        this.pricePerUnit = pricePerUnit;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public LocalDateTime getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(LocalDateTime timestamp) {
+        this.timestamp = timestamp;
+    }
+}
Index: backend/src/main/java/com/tradingmk/backend/repository/TradeRequestRepository.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/repository/TradeRequestRepository.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
+++ backend/src/main/java/com/tradingmk/backend/repository/TradeRequestRepository.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -0,0 +1,11 @@
+package com.tradingmk.backend.repository;
+
+import com.tradingmk.backend.model.TradeRequest;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface TradeRequestRepository extends JpaRepository<TradeRequest,Long> {
+
+    List<TradeRequest> findByStatus(String status);
+}
Index: backend/src/main/java/com/tradingmk/backend/service/AuthenticationService.java
===================================================================
--- backend/src/main/java/com/tradingmk/backend/service/AuthenticationService.java	(revision dec188cb4972a7606df4e43c909e6bae1eaf78b9)
+++ backend/src/main/java/com/tradingmk/backend/service/AuthenticationService.java	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -54,4 +54,5 @@
         Map<String, Object> extraClaims = new HashMap<>();
         extraClaims.put("email", user.getEmail());
+        extraClaims.put("role", user.getRole().name());
         //final generate token
         var jwtToken = userService.generateToken(extraClaims,user);
@@ -79,4 +80,5 @@
         Map<String, Object> extraClaims = new HashMap<>();
         extraClaims.put("email", user.getEmail());
+        extraClaims.put("role", user.getRole().name());
         //final generate token
         var jwtToken = userService.generateToken(extraClaims,user);
Index: frontend/src/pages/AdminTrades/AdminTrades.jsx
===================================================================
--- frontend/src/pages/AdminTrades/AdminTrades.jsx	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
+++ frontend/src/pages/AdminTrades/AdminTrades.jsx	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -0,0 +1,82 @@
+import React, { useEffect, useState } from "react";
+
+const AdminTrades = () => {
+    const [pendingTrades, setPendingTrades] = useState([]);
+
+    const fetchPending = () => {
+        const token = localStorage.getItem("accessToken");
+        if (!token) {
+            alert("You must be logged in as admin to view trades");
+            return;
+        }
+
+        fetch("http://localhost:8080/api/trades/pending", {
+            headers: {
+                "Authorization": `Bearer ${token}`
+            }
+        })
+            .then(res => {
+                if (!res.ok) return res.text().then(text => { throw new Error(text) });
+                return res.json();
+            })
+            .then(data => setPendingTrades(data))
+            .catch(err => console.error("Error fetching pending trades:", err));
+    };
+
+    useEffect(() => {
+        fetchPending();
+    }, []);
+
+    const handleAction = (id, action) => {
+        const token = localStorage.getItem("accessToken");
+        if (!token) {
+            alert("You must be logged in as admin to perform this action");
+            return;
+        }
+
+        fetch(`http://localhost:8080/api/trades/${id}/${action}`, {
+            method: "POST",
+            headers: {
+                "Authorization": `Bearer ${token}`
+            }
+        })
+            .then(res => {
+                if (!res.ok) return res.text().then(text => { throw new Error(text) });
+                return res.json();
+            })
+            .then(() => fetchPending())
+            .catch(err => alert("Error performing action: " + err.message));
+    };
+
+    return (
+        <div className="p-6">
+            <h2 className="text-xl font-bold mb-4">Pending Trade Requests</h2>
+            <div className="space-y-4">
+                {pendingTrades.map(trade => (
+                    <div key={trade.id} className="border p-4 rounded flex justify-between items-center">
+                        <div>
+                            <div>{trade.type} {trade.quantity} of {trade.stockSymbol} at {trade.pricePerUnit}</div>
+                            <div className="text-sm text-gray-500">{trade.timestamp}</div>
+                        </div>
+                        <div className="flex space-x-2">
+                            <button
+                                className="bg-green-500 text-white px-2 py-1 rounded"
+                                onClick={() => handleAction(trade.id, "approve")}
+                            >
+                                Approve
+                            </button>
+                            <button
+                                className="bg-red-500 text-white px-2 py-1 rounded"
+                                onClick={() => handleAction(trade.id, "decline")}
+                            >
+                                Decline
+                            </button>
+                        </div>
+                    </div>
+                ))}
+            </div>
+        </div>
+    );
+};
+
+export default AdminTrades;
Index: frontend/src/pages/DetailedStockView/DetailedStockView.jsx
===================================================================
--- frontend/src/pages/DetailedStockView/DetailedStockView.jsx	(revision dec188cb4972a7606df4e43c909e6bae1eaf78b9)
+++ frontend/src/pages/DetailedStockView/DetailedStockView.jsx	(revision f7d0ede1e6cd95bd087ca9d0672466b151e711d2)
@@ -97,18 +97,11 @@
 
         if (isDemo) {
-            // loadd
             const storedPortfolio = JSON.parse(localStorage.getItem("demoPortfolio")) || { balance: 100000, holdings: [] };
-
             const totalCost = buyQuantity * currentPrice;
-
             if (storedPortfolio.balance < totalCost) {
-                alert("not enough balance for demo purchase");
+                alert("Not enough balance for demo purchase");
                 return;
             }
-
-
             storedPortfolio.balance -= totalCost;
-
-
             const existingHolding = storedPortfolio.holdings.find(h => h.stockSymbol === symbol);
             if (existingHolding) {
@@ -126,17 +119,15 @@
             setPortfolio(storedPortfolio);
             setAvailableBalance(storedPortfolio.balance);
-
-            alert("demo stock purchased successfully!");
+            alert("Demo stock purchased successfully!");
             setBuyQuantity(0);
             setBuyTotal(0);
         } else {
-
             const token = localStorage.getItem("accessToken");
             if (!token) {
-                alert("you must be logged in to buy stocks");
+                alert("You must be logged in to buy stocks");
                 return;
             }
             try {
-                const response = await fetch("http://localhost:8080/api/portfolio/buy", {
+                const response = await fetch("http://localhost:8080/api/trades/request", {
                     method: "POST",
                     headers: {
@@ -145,8 +136,8 @@
                     },
                     body: JSON.stringify({
-                        portfolioId: portfolioId,
                         stockSymbol: symbol,
                         quantity: parseInt(buyQuantity),
-                        pricePerUnit: currentPrice
+                        pricePerUnit: currentPrice,
+                        type: "BUY"
                     })
                 });
@@ -154,13 +145,12 @@
                 if (!response.ok) {
                     const text = await response.text();
-                    console.error("Error:", text);
-                    alert("Failed to buy stock: " + text);
+                    alert("Failed to request trade: " + text);
                     return;
                 }
 
-                alert("Stock purchased successfully!");
+                alert("Trade request sent! Waiting for broker approval.");
                 setBuyQuantity("");
             } catch (err) {
-                console.error("Fetch error:", err);
+                console.error("Error sending trade request:", err);
                 alert("Network error");
             }
