Skip to content

Commit

Permalink
Merge pull request nus-cs2103-AY2324S1#90 from LicongHuang/convertlead
Browse files Browse the repository at this point in the history
Add Convertion of class
  • Loading branch information
yuxunn committed Oct 25, 2023
2 parents 1ed7500 + 928e16d commit 833d99a
Show file tree
Hide file tree
Showing 8 changed files with 351 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Address;
import seedu.address.model.person.Client;
import seedu.address.model.person.Email;
import seedu.address.model.person.Lead;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.tag.Tag;

/**
* Converts a Client to a Lead in the address book.
*/
public class ConvertClientToLeadCommand extends Command {
public static final String COMMAND_WORD = "converttolead";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Converts a client to a lead by the index "
+ "number used in the displayed person list. \n"
+ "Parameters: INDEX (must be a positive integer)\n"
+ "Example: " + COMMAND_WORD + " 1";

public static final String MESSAGE_CONVERT_SUCCESS = "Converted Client to Lead: %1$s";

private final Index index;

public ConvertClientToLeadCommand(Index index) {
requireNonNull(index);
this.index = index;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
List<Person> lastShownList = model.getFilteredPersonList();

if (index.getZeroBased() >= lastShownList.size()) {
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}

Person personToConvert = lastShownList.get(index.getZeroBased());

if (!(personToConvert instanceof Client)) {
throw new CommandException("The person at the specified index is not a Client.");
}

Name name = personToConvert.getName();
Phone phone = personToConvert.getPhone();
Email email = personToConvert.getEmail();
Address address = personToConvert.getAddress();
Set<Tag> tags = new HashSet<Tag>();
tags.remove(new Tag("Client"));
tags.add(new Tag("Lead"));
// TODO: Add more fields from client to lead


Lead convertedLead = new Lead(name, phone, email, address, tags);

model.setPerson(personToConvert, convertedLead);
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return new CommandResult(String.format(MESSAGE_CONVERT_SUCCESS, Messages.format(convertedLead)));
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

if (!(other instanceof ConvertClientToLeadCommand)) {
return false;
}

ConvertClientToLeadCommand otherConvertCommand = (ConvertClientToLeadCommand) other;
return index.equals(otherConvertCommand.index);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.person.Address;
import seedu.address.model.person.Client;
import seedu.address.model.person.Email;
import seedu.address.model.person.Lead;
import seedu.address.model.person.Name;
import seedu.address.model.person.Person;
import seedu.address.model.person.Phone;
import seedu.address.model.tag.Tag;

/**
* Converts a Lead to a Client in the address book.
*/
public class ConvertLeadToClientCommand extends Command {
public static final String COMMAND_WORD = "converttoclient";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Converts a lead to a client by the index "
+ "number used in the displayed person list. \n"
+ "Parameters: INDEX (must be a positive integer)\n"
+ "Example: " + COMMAND_WORD + " 1";

public static final String MESSAGE_CONVERT_SUCCESS = "Converted Lead to Client: %1$s";

private final Index index;

public ConvertLeadToClientCommand(Index index) {
requireNonNull(index);
this.index = index;
}

@Override
public CommandResult execute(Model model) throws CommandException {
requireNonNull(model);
List<Person> lastShownList = model.getFilteredPersonList();

if (index.getZeroBased() >= lastShownList.size()) {
throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}

Person personToConvert = lastShownList.get(index.getZeroBased());

if (!(personToConvert instanceof Lead)) {
throw new CommandException("The person at the specified index is not a Lead.");
}

Name name = personToConvert.getName();
Phone phone = personToConvert.getPhone();
Email email = personToConvert.getEmail();
Address address = personToConvert.getAddress();
Set<Tag> tags = new HashSet<>();
tags.remove(new Tag("Lead"));
tags.add(new Tag("Client"));
// TODO: Add more fields from lead to client

Client convertedClient = new Client(name, phone, email, address, tags);

model.setPerson(personToConvert, convertedClient);
model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return new CommandResult(String.format(MESSAGE_CONVERT_SUCCESS, Messages.format(convertedClient)));
}

@Override
public boolean equals(Object other) {
if (other == this) {
return true;
}

if (!(other instanceof ConvertLeadToClientCommand)) {
return false;
}

ConvertLeadToClientCommand otherConvertCommand = (ConvertLeadToClientCommand) other;
return index.equals(otherConvertCommand.index);
}
}

10 changes: 9 additions & 1 deletion src/main/java/seedu/address/logic/parser/AddressBookParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import seedu.address.logic.commands.AddLeadCommand;
import seedu.address.logic.commands.ClearCommand;
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.ConvertClientToLeadCommand;
import seedu.address.logic.commands.ConvertLeadToClientCommand;
import seedu.address.logic.commands.DeleteCommand;
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.ExitCommand;
Expand Down Expand Up @@ -89,10 +91,16 @@ public Command parseCommand(String userInput) throws ParseException {

case ListLeadCommand.COMMAND_WORD:
return new ListLeadCommand();

case ConvertLeadToClientCommand.COMMAND_WORD:
return new ConvertLeadToClientCommandParser().parse(arguments);

case ConvertClientToLeadCommand.COMMAND_WORD:
return new ConvertClientToLeadCommandParser().parse(arguments);

case ViewCommand.COMMAND_WORD:
return new ViewCommandParser().parse(arguments);

default:
logger.finer("This user input caused a ParseException: " + userInput);
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
Expand Down
16 changes: 5 additions & 11 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,10 @@
public class CliSyntax {

/* Prefix definitions */
public static final Prefix PREFIX_NAME = new Prefix("n/");
public static final Prefix PREFIX_PHONE = new Prefix("p/");
public static final Prefix PREFIX_EMAIL = new Prefix("e/");
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
public static final Prefix PREFIX_TAG = new Prefix("t/");

public static final Prefix PREFIX_NAME_TP = new Prefix("--name");
public static final Prefix PREFIX_PHONE_TP = new Prefix("--phone");
public static final Prefix PREFIX_EMAIL_TP = new Prefix("--email");
public static final Prefix PREFIX_ADDRESS_TP = new Prefix("--address");
public static final Prefix PREFIX_TAG_TP = new Prefix("--tag");
public static final Prefix PREFIX_NAME = new Prefix("--name ");
public static final Prefix PREFIX_PHONE = new Prefix("--phone ");
public static final Prefix PREFIX_EMAIL = new Prefix("--email ");
public static final Prefix PREFIX_ADDRESS = new Prefix("--address ");
public static final Prefix PREFIX_TAG = new Prefix("--tag ");

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package seedu.address.logic.parser;

import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;

import java.util.Arrays;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.ConvertClientToLeadCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.NameContainsKeywordsPredicate;

/**
* Parses input arguments and creates a new FindCommand object
*/
public class ConvertClientToLeadCommandParser implements Parser<ConvertClientToLeadCommand> {

/**
* Parses the given {@code String} of arguments in the context of the FindCommand
* and returns a FindCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/

public ConvertClientToLeadCommand parse(String args) throws ParseException {
String trimmedArgs = args.trim();
if (trimmedArgs.isEmpty()) {
throw new ParseException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, ConvertClientToLeadCommand.MESSAGE_USAGE));
}

try {
Index index = ParserUtil.parseIndex(trimmedArgs);
return new ConvertClientToLeadCommand(index);
} catch (ParseException pe) {
throw new ParseException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, ConvertClientToLeadCommand.MESSAGE_USAGE), pe);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package seedu.address.logic.parser;

import static seedu.address.logic.Messages.MESSAGE_INVALID_COMMAND_FORMAT;

import java.util.Arrays;

import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.ConvertLeadToClientCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.person.NameContainsKeywordsPredicate;

/**
* Parses input arguments and creates a new FindCommand object
*/
public class ConvertLeadToClientCommandParser implements Parser<ConvertLeadToClientCommand> {

/**
* Parses the given {@code String} of arguments in the context of the FindCommand
* and returns a FindCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/

public ConvertLeadToClientCommand parse(String args) throws ParseException {
String trimmedArgs = args.trim();
if (trimmedArgs.isEmpty()) {
throw new ParseException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, ConvertLeadToClientCommand.MESSAGE_USAGE));
}

try {
Index index = ParserUtil.parseIndex(trimmedArgs);
return new ConvertLeadToClientCommand(index);
} catch (ParseException pe) {
throw new ParseException(
String.format(MESSAGE_INVALID_COMMAND_FORMAT, ConvertLeadToClientCommand.MESSAGE_USAGE), pe);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;

import org.junit.jupiter.api.Test;

import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
import seedu.address.model.person.Client;
import seedu.address.model.person.Lead;
import seedu.address.testutil.TypicalPersons;

public class ConvertClientToLeadCommandTest {
private Model model = new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());
private Model expectedModel = new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());

@Test
public void execute_validClientIndex_success() {
Client clientToConvert = TypicalPersons.getTypicalClients().get(0); // assuming you have a list of clients
ConvertClientToLeadCommand command = new ConvertClientToLeadCommand(clientToConvert.getIndex());

String expectedMessage = String.format(ConvertClientToLeadCommand.MESSAGE_CONVERT_SUCCESS, clientToConvert);
expectedModel.deletePerson(clientToConvert);
expectedModel.addPerson(new Lead(clientToConvert)); // Assuming a constructor for Lead is available

assertCommandSuccess(command, model, expectedMessage, expectedModel);
}

@Test
public void execute_invalidClientIndex_failure() {
int outOfBoundIndex = model.getFilteredPersonList().size() + 1;
ConvertClientToLeadCommand command = new ConvertClientToLeadCommand(Index.fromOneBased(outOfBoundIndex));

assertCommandFailure(command, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}

// Add more test cases for edge cases, if necessary
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;

import org.junit.jupiter.api.Test;

import seedu.address.model.Model;
import seedu.address.model.ModelManager;
import seedu.address.model.UserPrefs;
import seedu.address.model.person.Client;
import seedu.address.model.person.Lead;
import seedu.address.testutil.TypicalPersons;

public class ConvertLeadToClientCommandTest {
private Model model = new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());
private Model expectedModel = new ModelManager(TypicalPersons.getTypicalAddressBook(), new UserPrefs());

@Test
public void execute_validLeadIndex_success() {
Lead leadToConvert = TypicalPersons.getTypicalLeads().get(0); // assuming you have a list of leads
ConvertLeadToClientCommand command = new ConvertLeadToClientCommand(leadToConvert.getIndex());

String expectedMessage = String.format(ConvertLeadToClientCommand.MESSAGE_CONVERT_SUCCESS, leadToConvert);
expectedModel.deletePerson(leadToConvert);
expectedModel.addPerson(new Client(leadToConvert)); // Assuming a constructor for Client is available

assertCommandSuccess(command, model, expectedMessage, expectedModel);
}

@Test
public void execute_invalidLeadIndex_failure() {
int outOfBoundIndex = model.getFilteredPersonList().size() + 1;
ConvertLeadToClientCommand command = new ConvertLeadToClientCommand(Index.fromOneBased(outOfBoundIndex));

assertCommandFailure(command, model, Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);
}

// Add more test cases for edge cases, if necessary
}

0 comments on commit 833d99a

Please sign in to comment.