/**
*
* Copyright
* 2009-2015 Jayway Products AB
* 2016-2017 Föreningen Sambruk
*
* Licensed under AGPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/agpl.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package se.streamsource.streamflow.web.domain.entity.form;
import org.qi4j.api.entity.Identity;
import org.qi4j.api.injection.scope.Structure;
import org.qi4j.api.injection.scope.This;
import org.qi4j.api.mixin.Mixins;
import org.qi4j.api.query.Query;
import org.qi4j.api.query.QueryExpressions;
import org.qi4j.api.specification.Specification;
import org.qi4j.api.structure.Module;
import org.qi4j.api.unitofwork.UnitOfWork;
import org.qi4j.api.util.Iterables;
import org.qi4j.api.value.ValueBuilder;
import se.streamsource.streamflow.api.administration.form.AttachmentFieldValue;
import se.streamsource.streamflow.api.workspace.cases.form.AttachmentFieldSubmission;
import se.streamsource.streamflow.api.workspace.cases.form.FieldDTO;
import se.streamsource.streamflow.api.workspace.cases.form.SubmittedFormDTO;
import se.streamsource.streamflow.api.workspace.cases.form.SubmittedFormListDTO;
import se.streamsource.streamflow.api.workspace.cases.form.SubmittedFormsListDTO;
import se.streamsource.streamflow.api.workspace.cases.form.SubmittedPageDTO;
import se.streamsource.streamflow.api.workspace.cases.general.SecondSigneeInfoValue;
import se.streamsource.streamflow.util.Strings;
import se.streamsource.streamflow.web.domain.Describable;
import se.streamsource.streamflow.web.domain.structure.SubmittedFieldValue;
import se.streamsource.streamflow.web.domain.structure.form.FieldValueDefinition;
import se.streamsource.streamflow.web.domain.structure.form.SubmittedFormValue;
import se.streamsource.streamflow.web.domain.structure.form.SubmittedForms;
import se.streamsource.streamflow.web.domain.structure.form.SubmittedPageValue;
import se.streamsource.streamflow.web.domain.structure.task.DoubleSignatureTask;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.qi4j.api.query.QueryExpressions.*;
/**
* JAVADOC
*/
@Mixins(SubmittedFormsQueries.Mixin.class)
public interface SubmittedFormsQueries
{
SubmittedFormsListDTO getSubmittedForms();
SubmittedFormDTO getSubmittedForm( int idx );
/**
* Get the latest form submissions for each type of form
*
* @return
*/
Iterable<SubmittedFormValue> getLatestSubmittedForms();
AttachmentFieldSubmission getAttachmentFieldValue(String id);
class Mixin
implements SubmittedFormsQueries
{
@This
SubmittedForms.Data submittedForms;
@Structure
Module module;
public SubmittedFormsListDTO getSubmittedForms()
{
UnitOfWork uow = module.unitOfWorkFactory().currentUnitOfWork();
ValueBuilder<SubmittedFormsListDTO> listBuilder = module.valueBuilderFactory().newValueBuilder(SubmittedFormsListDTO.class);
ValueBuilder<SubmittedFormListDTO> formBuilder = module.valueBuilderFactory().newValueBuilder(SubmittedFormListDTO.class);
SubmittedFormsListDTO list = listBuilder.prototype();
SubmittedFormListDTO formDTO = formBuilder.prototype();
for (SubmittedFormValue form : submittedForms.submittedForms().get())
{
formDTO.submissionDate().set( form.submissionDate().get() );
Describable.Data submitter = uow.get( Describable.Data.class, form.submitter().get().identity() );
formDTO.submitter().set( submitter.description().get() );
Describable.Data formName = uow.get( Describable.Data.class, form.form().get().identity() );
formDTO.form().set( formName.description().get() );
formDTO.href().set(form.form().get().identity());
formDTO.id().set(form.form().get().identity());
formDTO.unread().set( form.unread().get() );
list.forms().get().add( formBuilder.newInstance() );
}
return listBuilder.newInstance();
}
public SubmittedFormDTO getSubmittedForm( int idx )
{
UnitOfWork uow = module.unitOfWorkFactory().currentUnitOfWork();
ValueBuilder<SubmittedFormDTO> formBuilder = module.valueBuilderFactory().newValueBuilder(SubmittedFormDTO.class);
SubmittedFormDTO formDTO = formBuilder.prototype();
SubmittedFormValue form = submittedForms.submittedForms().get().get( idx );
formDTO.submissionDate().set( form.submissionDate().get() );
formDTO.href().set(form.form().get().identity());
formDTO.id().set(form.form().get().identity());
Describable.Data submitter = uow.get( Describable.Data.class, form.submitter().get().identity() );
formDTO.submitter().set( submitter.description().get() );
Describable.Data formName = uow.get( Describable.Data.class, form.form().get().identity() );
formDTO.form().set( formName.description().get() );
ValueBuilder<FieldDTO> fieldBuilder = module.valueBuilderFactory().newValueBuilder(FieldDTO.class);
FieldDTO fieldDTO = fieldBuilder.prototype();
for (SubmittedPageValue submittedPageValue : form.pages().get())
{
ValueBuilder<SubmittedPageDTO> pageBuilder = module.valueBuilderFactory().newValueBuilder(SubmittedPageDTO.class);
SubmittedPageDTO pageDTO = pageBuilder.prototype();
Describable.Data page = uow.get(Describable.Data.class, submittedPageValue.page().get().identity());
pageDTO.name().set(page.description().get());
for (SubmittedFieldValue fieldValue : submittedPageValue.fields().get())
{
Describable.Data field = uow.get( Describable.Data.class, fieldValue.field().get().identity() );
fieldDTO.field().set( field.description().get() );
fieldDTO.value().set( fieldValue.value().get() );
FieldValueDefinition.Data fieldDefinition = uow.get( FieldValueDefinition.Data.class, fieldValue.field().get().identity() );
fieldDTO.fieldType().set( fieldDefinition.fieldValue().get().type().getName() );
pageDTO.fields().get().add( fieldBuilder.newInstance() );
}
formDTO.pages().get().add(pageBuilder.newInstance());
}
formDTO.signatures().get().addAll(form.signatures().get());
if( form.secondsignee().get() != null )
{
ValueBuilder<SecondSigneeInfoValue> secondSigneeInfoBuilder = form.secondsignee().get().buildWith();
DoubleSignatureTask.Data task = (DoubleSignatureTask.Data)findSecondSigneeTaskRef( form );
if (task != null) {
secondSigneeInfoBuilder.prototype().secondsigneetaskref().set( ((Identity)task).identity().get() );
secondSigneeInfoBuilder.prototype().lastReminderSent().set( task.lastReminderSent().get() );
secondSigneeInfoBuilder.prototype().secondDraftUrl().set( task.secondDraftUrl().get() );
}
formDTO.secondSignee().set( secondSigneeInfoBuilder.newInstance() );
}
return formBuilder.newInstance();
}
private DoubleSignatureTask findSecondSigneeTaskRef( SubmittedFormValue form )
{
DoubleSignatureTask.Data doubleSignData = QueryExpressions.templateFor( DoubleSignatureTask.Data.class );
Query<DoubleSignatureTask> query = module.queryBuilderFactory().newQueryBuilder( DoubleSignatureTask.class )
.where( and( eq( doubleSignData.submittedForm().get().submissionDate(), form.submissionDate().get() ),
eq( doubleSignData.submittedForm().get().form(), form.form().get() ),
eq( doubleSignData.submittedForm().get().submitter(), form.submitter().get() )
) ).newQuery( module.unitOfWorkFactory().currentUnitOfWork() );
DoubleSignatureTask task = query.find();
return task;
}
public Iterable<SubmittedFormValue> getLatestSubmittedForms()
{
List<SubmittedFormValue> forms = (List<SubmittedFormValue>) Iterables.addAll(new ArrayList<SubmittedFormValue>(), submittedForms.submittedForms().get());
Collections.reverse(forms);
// Filter out duplicates
return Iterables.filter(new Specification<SubmittedFormValue>()
{
Set<String> formIds = new HashSet<String>();
public boolean satisfiedBy(SubmittedFormValue submittedFormValue)
{
String formId = submittedFormValue.form().get().identity();
if (formIds.contains(formId))
return false;
formIds.add(formId);
return true;
}
}, forms);
}
public AttachmentFieldSubmission getAttachmentFieldValue(String id)
{
for (int i = 0; i < this.getSubmittedForms().forms().get().size(); i++)
{
for (SubmittedPageDTO submittedPageDTO : this.getSubmittedForm(i).pages().get())
{
for (FieldDTO fieldDTO : submittedPageDTO.fields().get())
{
if (fieldDTO.fieldType().get().equals(AttachmentFieldValue.class.getName()))
{
if (!Strings.empty( fieldDTO.value().get() ))
{
AttachmentFieldSubmission submission = module.valueBuilderFactory().newValueFromJSON(AttachmentFieldSubmission.class, fieldDTO.value().get());
if (submission.attachment().get().identity().equals(id)) return submission;
}
}
}
}
}
return null;
}
}
}