Integrated stock reduction logic and branding updates

This commit is contained in:
2026-04-16 09:11:49 +05:30
parent 3d6a57593d
commit 54172f6dff
16 changed files with 187 additions and 102 deletions

View File

@@ -40,6 +40,7 @@ public class OrderController {
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate,
@RequestParam(required = false) String status,
@RequestParam(required = false) String paymentType,
@RequestParam(required = false) String orderType,
@RequestParam(required = false) String search,
@RequestParam(defaultValue = "false") boolean archived,
@RequestParam(defaultValue = "0") int page,
@@ -66,6 +67,9 @@ public class OrderController {
if (paymentType != null && !paymentType.isEmpty()) {
predicates.add(cb.equal(root.get("paymentMethod"), paymentType));
}
if (orderType != null && !orderType.isEmpty()) {
predicates.add(cb.equal(root.get("orderType"), orderType));
}
if (search != null && !search.isEmpty()) {
String searchLower = "%" + search.toLowerCase() + "%";
Join<Order, User> userJoin = root.join("user", JoinType.LEFT);
@@ -110,53 +114,61 @@ public class OrderController {
@PostMapping
public ResponseEntity<Map<String, Object>> placeOrder(@RequestBody Order order) {
// Link items to the order for bidirectional relationship
if (order.getItems() != null) {
for (OrderItem item : order.getItems()) {
System.out.println("🛒 RECEIVED ITEM: " + item.getProductName() + " | StallID: " + item.getStallId() + " | StallName: " + item.getStallName());
item.setOrder(order);
}
}
// Use the actual creation time or current time for counting
LocalDateTime now = LocalDateTime.now();
order.setCreatedAt(now);
// Calculate start of current day to find how many orders placed today
LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
long todaysOrderCount = orderRepository.countByCreatedAtGreaterThanEqual(startOfDay);
// Generate formatted display ID (#001, #002...) resetting daily
String displayId = String.format("%03d", todaysOrderCount + 1);
order.setDisplayOrderId(displayId);
// Save the complete order first
Order savedOrder = orderRepository.save(order);
// --- Reduct Stock Logic ---
if (savedOrder.getItems() != null) {
for (OrderItem item : savedOrder.getItems()) {
Long productId = item.getProductId();
if (productId != null) {
productRepository.findById(productId).ifPresent(product -> {
int currentStock = product.getStock() != null ? product.getStock() : 0;
product.setStock(currentStock - item.getQuantity());
productRepository.save(product);
System.out.println("Updating Stock for " + product.getName() + ": " + currentStock + " -> " + product.getStock());
});
try {
// Link items to the order for bidirectional relationship
if (order.getItems() != null) {
for (OrderItem item : order.getItems()) {
System.out.println("🛒 RECEIVED ITEM: " + item.getProductName());
item.setOrder(order);
}
}
// Use the actual creation time or current time for counting
LocalDateTime now = LocalDateTime.now();
order.setCreatedAt(now);
// Calculate start of current day to find how many orders placed today
LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
long todaysOrderCount = orderRepository.countByCreatedAtGreaterThanEqual(startOfDay);
// Generate formatted display ID (#001, #002...) resetting daily
String displayId = String.format("%03d", todaysOrderCount + 1);
order.setDisplayOrderId(displayId);
// Save the complete order first
Order savedOrder = orderRepository.save(order);
// --- Reduct Stock Logic ---
if (savedOrder.getItems() != null) {
for (OrderItem item : savedOrder.getItems()) {
Long productId = item.getProductId();
if (productId != null) {
productRepository.findById(productId).ifPresent(product -> {
int currentStock = product.getStock() != null ? product.getStock() : 0;
product.setStock(currentStock - item.getQuantity());
productRepository.save(product);
System.out.println("Updating Stock for " + product.getName() + ": " + currentStock + " -> " + product.getStock());
});
}
}
}
System.out.println("Placed Daily Order: " + savedOrder.getId() + " -> Display ID: #" + displayId);
Map<String, Object> response = new HashMap<>();
response.put("success", true);
response.put("orderNumber", savedOrder.getOrderNumber());
response.put("displayOrderId", savedOrder.getDisplayOrderId());
response.put("message", "Order placed successfully");
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("success", false);
errorResponse.put("error", e.getMessage());
return ResponseEntity.status(500).body(errorResponse);
}
System.out.println("Placed Daily Order: " + savedOrder.getId() + " -> Display ID: #" + displayId);
Map<String, Object> response = new HashMap<>();
response.put("success", true);
response.put("orderNumber", savedOrder.getOrderNumber()); // Secure ID for QR
response.put("displayOrderId", savedOrder.getDisplayOrderId()); // Sequential ID (#001)
response.put("message", "Order placed successfully");
return ResponseEntity.ok(response);
}
@GetMapping("/user/{userId}")

View File

@@ -16,6 +16,16 @@ public class ProductController {
@Autowired
private ProductRepository productRepository;
@GetMapping("/categories")
public List<String> getAllCategories() {
return productRepository.findAll().stream()
.map(Product::getCategory)
.filter(c -> c != null && !c.isEmpty())
.distinct()
.sorted()
.toList();
}
@GetMapping
public org.springframework.data.domain.Page<Product> getAllProducts(
@RequestParam(defaultValue = "0") int page,

View File

@@ -41,6 +41,9 @@ public class Order {
@Column(nullable = false)
private LocalDateTime createdAt;
@Column(nullable = false)
private String orderType = "STORE_ORDER"; // STORE_ORDER, QR_ORDER, MY_ORDER, etc.
@Column(name = "is_archived", nullable = false)
private boolean isArchived = false;
@@ -97,6 +100,9 @@ public class Order {
public boolean isArchived() { return isArchived; }
public void setArchived(boolean archived) { isArchived = archived; }
public String getOrderType() { return orderType; }
public void setOrderType(String orderType) { this.orderType = orderType; }
public List<OrderItem> getItems() { return items; }
public void setItems(List<OrderItem> items) { this.items = items; }
}