DataSeeder.java

package cz.vsb.crm.config;

import cz.vsb.crm.dto.AccountRequest;
import cz.vsb.crm.dto.AccountResponse;
import cz.vsb.crm.dto.LeadLineRequest;
import cz.vsb.crm.dto.LeadRequest;
import cz.vsb.crm.dto.OrderLineRequest;
import cz.vsb.crm.dto.OrderRequest;
import cz.vsb.crm.dto.ProductRequest;
import cz.vsb.crm.dto.ProductResponse;
import cz.vsb.crm.dto.UserRequest;
import cz.vsb.crm.dto.UserResponse;
import cz.vsb.crm.repository.AccountRepository;
import cz.vsb.crm.service.AccountService;
import cz.vsb.crm.service.LeadService;
import cz.vsb.crm.service.OrderService;
import cz.vsb.crm.service.ProductService;
import cz.vsb.crm.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

@Component
@Profile("dev")
@RequiredArgsConstructor
public class DataSeeder implements CommandLineRunner {

    private final AccountRepository accountRepository;
    private final AccountService accountService;
    private final UserService userService;
    private final ProductService productService;
    private final LeadService leadService;
    private final OrderService orderService;

    @Override
    public void run(String... args) {
        if (accountRepository.count() > 0) {
            return;
        }

        UserResponse admin = userService.create(
                new UserRequest("admin", "Admin", "admin@vsb.cz", "admin12345"));
        UserResponse manager = userService.create(
                new UserRequest("manager", "Manager", "manager@vsb.cz", "manager12345"));
        userService.create(
                new UserRequest("operator", "User", "operator@vsb.cz", "operator12345"));

        AccountResponse acme = accountService.create(new AccountRequest(
                "Acme Corporation", "Manufacturing", "1 Industrial Way, Ostrava",
                "+420 555 010 100", "info@acme.example", "Customer",
                "Jan Novak", "jan.novak@acme.example", "+420 555 010 101", "Procurement", null));
        AccountResponse globex = accountService.create(new AccountRequest(
                "Globex s.r.o.", "Retail", "42 Market Street, Brno",
                "+420 555 020 200", "contact@globex.example", "Customer",
                "Eva Svobodova", "eva@globex.example", "+420 555 020 201", "Buyer", null));
        accountService.create(new AccountRequest(
                "Initech a.s.", "Software", "7 Tech Park, Praha",
                "+420 555 030 300", "hello@initech.example", "Prospect",
                "Petr Dvorak", "petr@initech.example", "+420 555 030 301", "CTO", null));
        accountService.create(new AccountRequest(
                "Oldcorp", "Legacy", null, null, null, "Inactive",
                null, null, null, null, LocalDate.now().minusDays(30)));

        ProductResponse laptop = productService.create(new ProductRequest(
                "Laptop Pro 15", "15-inch business laptop", new BigDecimal("1299.00"), 100, null));
        ProductResponse mouse = productService.create(new ProductRequest(
                "Wireless Mouse", "Ergonomic wireless mouse", new BigDecimal("24.90"), 500, null));
        ProductResponse monitor = productService.create(new ProductRequest(
                "4K Monitor 27", "27-inch 4K UHD monitor", new BigDecimal("389.00"), 80, null));
        ProductResponse keyboard = productService.create(new ProductRequest(
                "Mechanical Keyboard", "Tactile mechanical keyboard", new BigDecimal("89.00"), 200, null));
        productService.create(new ProductRequest(
                "USB-C Dock", "Docking station with charging", new BigDecimal("159.00"), 120, null));
        productService.create(new ProductRequest(
                "Webcam HD", "1080p webcam", new BigDecimal("49.00"), 300, null));

        leadService.create(new LeadRequest(acme.id(), manager.id(), "Website", "Qualified",
                new BigDecimal("5000.00"), null,
                List.of(new LeadLineRequest(laptop.id(), 3), new LeadLineRequest(monitor.id(), 3))));
        leadService.create(new LeadRequest(globex.id(), admin.id(), "Referral", "New",
                new BigDecimal("1200.00"), null,
                List.of(new LeadLineRequest(keyboard.id(), 10))));

        orderService.create(new OrderRequest(acme.id(), null, manager.id(), "Processing", "Standard", null,
                List.of(new OrderLineRequest(laptop.id(), 2, null),
                        new OrderLineRequest(mouse.id(), 5, null))));
        orderService.create(new OrderRequest(globex.id(), null, admin.id(), "New", "Express", null,
                List.of(new OrderLineRequest(monitor.id(), 4, null),
                        new OrderLineRequest(keyboard.id(), 4, null))));
    }
}