use of org.estatio.module.capex.dom.task.Task in project estatio by estatio.
the class EnforceTaskAssignmentPolicySubscriber method on.
@EventHandler
@Subscribe
public void on(Task_mixinActAbstract.ActionDomainEvent ev) {
if (ev.getSemantics().isSafeInNature()) {
return;
}
final Class stateTransitionClass = ev.getStateTransitionClass();
final Task task = (Task) ev.getMixedIn();
final StateTransition transition = stateTransitionService.findFor(task);
if (transition == null) {
// shouldn't occur
return;
}
final Class taskTransitionClass = stateTransitionService.transitionClassFor(transition.getTransitionType());
if (stateTransitionClass != taskTransitionClass) {
// or, maybe should hide (and then we can delete code in the subtypes of the mixinAbstract
return;
}
final Object domainObject = transition.getDomainObject();
applyPolicy(stateTransitionClass, domainObject, ev);
}
use of org.estatio.module.capex.dom.task.Task in project estatio by estatio.
the class EnforceTaskAssignmentPolicySubscriber method applyPolicy.
<DO, ST extends StateTransition<DO, ST, STT, S>, STT extends StateTransitionType<DO, ST, STT, S>, S extends State<S>> Optional<String> applyPolicy(final Class<ST> stateTransitionClass, final DO entityOrViewModel) {
if (EstatioTogglzFeature.ApproveByProxy.isActive()) {
return Optional.empty();
}
final DO entity = unwrapIfRequired(entityOrViewModel);
final ST pendingTransition = stateTransitionService.pendingTransitionOf(entity, stateTransitionClass);
if (pendingTransition == null) {
return Optional.empty();
}
final Task task = pendingTransition.getTask();
if (task == null) {
return Optional.empty();
}
final Person meAsPerson = personRepository.me();
if (meAsPerson == null) {
return Optional.of("Could not locate Person for current user");
}
// first guard: meAsPerson always needs the PartyRoleType the task is assigned to
List<PartyRoleType> meAsPersonRoleTypes = Lists.newArrayList(meAsPerson.getRoles()).stream().map(PartyRole::getRoleType).collect(Collectors.toList());
if (!meAsPersonRoleTypes.contains(task.getAssignedTo())) {
return Optional.of(String.format("Task assigned to '%s' role", task.getAssignedTo().getKey()));
}
// second guard: if the task is assigned to a specific person it needs to be meAsPerson
final Person taskAssignedTo = task.getPersonAssignedTo();
if (taskAssignedTo == null || taskAssignedTo == meAsPerson) {
return Optional.empty();
} else {
return Optional.of(String.format("Task assigned to %s", taskAssignedTo.getReference()));
}
}
use of org.estatio.module.capex.dom.task.Task in project estatio by estatio.
the class Task_title_Test method setUp.
@Before
public void setUp() throws Exception {
partyRoleType = PartyRoleType.builder().key("PROJECT_MANAGER").build();
person = Person.builder().username("jcapriata@abc.loc").build();
task = new Task(partyRoleType, person, "Feed the cat", LocalDateTime.now(), "cat.Cat") {
@Override
void appendTitleOfObject(final StringBuilder buf) {
buf.append("Tiddles");
}
};
}
use of org.estatio.module.capex.dom.task.Task in project estatio by estatio.
the class IncomingInvoiceApprovalState_IntegTest method paid_by_credit_card_skips_bank_account_verification_and_creates_check_task_for_treasury.
@Test
public void paid_by_credit_card_skips_bank_account_verification_and_creates_check_task_for_treasury() {
// given
PartyRoleType typeForTreasurer = partyRoleTypeRepository.findByKey(PartyRoleTypeEnum.TREASURER.getKey());
// workaround: clear MeService#me cache
queryResultsCache.resetForNextTransaction();
sudoService.sudo(Person_enum.JonathanPropertyManagerGb.getRef().toLowerCase(), (Runnable) () -> wrap(incomingInvoice).changePaymentMethod(PaymentMethod.CREDIT_CARD));
sudoService.sudo(Person_enum.JonathanPropertyManagerGb.getRef().toLowerCase(), (Runnable) () -> wrap(mixin(IncomingInvoice_complete.class, incomingInvoice)).act("PROPERTY_MANAGER", null, null));
// workaround: clear MeService#me cache
queryResultsCache.resetForNextTransaction();
sudoService.sudo(Person_enum.PeterPanProjectManagerGb.getRef().toLowerCase(), (Runnable) () -> wrap(mixin(IncomingInvoice_approve.class, incomingInvoice)).act("COUNTRY_DIRECTOR", null, null, false));
List<Task> tasksForTreasury = taskRepository.findIncompleteByRole(typeForTreasurer);
assertThat(tasksForTreasury).isEmpty();
BankAccount bankAccount = incomingInvoice.getBankAccount();
assertThat(bankAccount).isNotNull();
BankAccountVerificationState state = stateTransitionService.currentStateOf(bankAccount, BankAccountVerificationStateTransition.class);
assertThat(state).isEqualTo(BankAccountVerificationState.NOT_VERIFIED);
// when
// workaround: clear MeService#me cache
queryResultsCache.resetForNextTransaction();
sudoService.sudo(Person_enum.OscarCountryDirectorGb.getRef().toLowerCase(), (Runnable) () -> wrap(mixin(IncomingInvoice_approveAsCountryDirector.class, incomingInvoice)).act(null, false));
// then
assertThat(incomingInvoice.getApprovalState()).isEqualTo(IncomingInvoiceApprovalState.PAYABLE);
List<IncomingInvoiceApprovalStateTransition> transitions = incomingInvoiceStateTransitionRepository.findByDomainObject(incomingInvoice);
assertThat(transitions.size()).isEqualTo(7);
assertThat(transitions.get(0).getTransitionType()).isEqualTo(IncomingInvoiceApprovalStateTransitionType.CHECK_PAYMENT);
tasksForTreasury = taskRepository.findIncompleteByRole(typeForTreasurer);
assertThat(tasksForTreasury.size()).isEqualTo(1);
assertThat(tasksForTreasury.get(0).getDescription()).isEqualTo("Check Payment");
// and still
state = stateTransitionService.currentStateOf(bankAccount, BankAccountVerificationStateTransition.class);
assertThat(state).isEqualTo(BankAccountVerificationState.NOT_VERIFIED);
// and when
// workaround: clear MeService#me cache
queryResultsCache.resetForNextTransaction();
sudoService.sudo(Person_enum.EmmaTreasurerGb.getRef().toLowerCase(), (Runnable) () -> wrap(mixin(IncomingInvoice_checkPayment.class, incomingInvoice)).act(null, false));
// then
assertThat(incomingInvoice.getApprovalState()).isEqualTo(IncomingInvoiceApprovalState.PAID);
}
Aggregations