/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo MES
* Version: 1.2.0
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.mes.genealogiesForComponents;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import com.qcadoo.localization.api.TranslationService;
import com.qcadoo.mes.genealogiesForComponents.constants.GenealogiesForComponentsConstants;
import com.qcadoo.mes.genealogiesForComponents.util.EntityOrderNumberComparator;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.search.SearchRestrictions;
import com.qcadoo.report.api.FontUtils;
import com.qcadoo.report.api.pdf.PdfHelper;
import com.qcadoo.report.api.pdf.ReportPdfView;
import com.qcadoo.security.api.SecurityService;
@Component(value = "genealogyForComponentView")
public class GenealogyForComponentView extends ReportPdfView {
private static final String BATCH_FIELD = "batch";
@Autowired
private SecurityService securityService;
@Autowired
private DataDefinitionService dataDefinitionService;
@Autowired
private TranslationService translationService;
@Autowired
private PdfHelper pdfHelper;
@Override
protected String addContent(final Document document, final Map<String, Object> model, final Locale locale,
final PdfWriter writer) throws DocumentException, IOException {
Entity entity = dataDefinitionService.get(GenealogiesForComponentsConstants.PLUGIN_IDENTIFIER,
GenealogiesForComponentsConstants.MODEL_PRODUCT_IN_BATCH).get(Long.valueOf(model.get("value").toString()));
String documentTitle = translationService
.translate("genealogiesForComponents.genealogyForComponent.report.title", locale);
String documentAuthor = translationService.translate("qcadooReport.commons.generatedBy.label", locale);
pdfHelper
.addDocumentHeader(document, "", documentTitle, documentAuthor, new Date(), securityService.getCurrentUserName());
addTables(document, entity, locale);
return translationService.translate("genealogiesForComponents.genealogyForComponent.report.fileName", locale);
}
@Override
protected void addTitle(final Document document, final Locale locale) {
document.addTitle(translationService.translate("genealogiesForComponents.genealogyForComponent.report.title", locale));
}
private void addTables(final Document document, final Entity entity, final Locale locale) throws DocumentException {
List<String> orderHeader = new ArrayList<String>();
orderHeader.add(translationService.translate("orders.order.number.label", locale));
orderHeader.add(translationService.translate("orders.order.name.label", locale));
orderHeader.add(translationService.translate("orders.order.product.label", locale));
orderHeader.add(translationService
.translate("genealogiesForComponents.genealogyForComponent.report.productBatch", locale));
Paragraph productTitle = new Paragraph(new Phrase(translationService.translate(
"genealogiesForComponents.genealogyForComponent.report.paragrah.product", locale),
FontUtils.getDejavuBold11Light()));
productTitle.setSpacingBefore(20);
document.add(productTitle);
PdfPTable headerData = pdfHelper.createPanelTable(3);
headerData.setSpacingBefore(7);
Entity product = entity.getBelongsToField("productInComponent").getBelongsToField("productInComponent")
.getBelongsToField("product");
pdfHelper.addTableCellAsOneColumnTable(headerData, translationService.translate("basic.product.number.label", locale),
product.getField("number"));
pdfHelper.addTableCellAsOneColumnTable(headerData, translationService.translate("basic.product.name.label", locale),
product.getField("name"));
pdfHelper.addTableCellAsOneColumnTable(headerData,
translationService.translate("genealogiesForComponents.productInBatch.batch.label", locale),
entity.getField(BATCH_FIELD));
document.add(headerData);
Paragraph orderTitle = new Paragraph(
new Phrase(translationService.translate("genealogiesForComponents.genealogyForComponent.report.paragrah.order",
locale), FontUtils.getDejavuBold11Light()));
orderTitle.setSpacingBefore(20);
document.add(orderTitle);
addOrderSeries(document, entity, orderHeader);
}
private void addOrderSeries(final Document document, final Entity entity, final List<String> orderHeader)
throws DocumentException {
PdfPTable table = pdfHelper.createTableWithHeader(4, orderHeader, false);
List<Entity> genealogies = getGenealogies(entity);
Collections.sort(genealogies, new EntityOrderNumberComparator());
for (Entity genealogy : genealogies) {
Entity order = (Entity) genealogy.getField("order");
table.addCell(new Phrase(order.getField("number").toString(), FontUtils.getDejavuRegular9Dark()));
table.addCell(new Phrase(order.getField("name").toString(), FontUtils.getDejavuRegular9Dark()));
Entity product = (Entity) order.getField("product");
if (product == null) {
table.addCell(new Phrase("", FontUtils.getDejavuRegular9Dark()));
} else {
table.addCell(new Phrase(product.getField("name").toString(), FontUtils.getDejavuRegular9Dark()));
}
table.addCell(new Phrase(genealogy.getField(BATCH_FIELD).toString(), FontUtils.getDejavuRegular9Dark()));
}
document.add(table);
}
private List<Entity> getGenealogies(final Entity entity) {
List<Entity> genealogies = new ArrayList<Entity>();
List<Entity> batchList = dataDefinitionService
.get(GenealogiesForComponentsConstants.PLUGIN_IDENTIFIER,
GenealogiesForComponentsConstants.MODEL_PRODUCT_IN_BATCH).find()
.add(SearchRestrictions.eq(BATCH_FIELD, entity.getField(BATCH_FIELD))).list().getEntities();
for (Entity batch : batchList) {
Entity genealogy = ((Entity) ((Entity) batch.getField("productInComponent")).getField("genealogy"));
if (!genealogies.contains(genealogy)) {
genealogies.add(genealogy);
}
}
return genealogies;
}
}