com.mobicage.rogerthat.enterprise.samples.hr.bizz.GenerateExpenseNote.java Source code

Java tutorial

Introduction

Here is the source code for com.mobicage.rogerthat.enterprise.samples.hr.bizz.GenerateExpenseNote.java

Source

/*
 * Copyright (c) 2011-2014, MOBICAGE NV
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 * must display the following acknowledgement:
 * This product includes software developed by Mobicage NV.
 * 4. Neither the name of the Mobicage NV nor the
 * names of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY MOBICAGE NV ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL MOBICAGE NV BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @@license_version:1.7@@
 */
package com.mobicage.rogerthat.enterprise.samples.hr.bizz;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.logging.Logger;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.mobicage.rogerthat.enterprise.samples.dal.Expense;
import com.mobicage.rogerthat.enterprise.samples.dal.ExpenseNote;
import com.mobicage.rogerthat.enterprise.samples.dal.ExpenseNoteDocOutputStream;
import com.mobicage.rogerthat.enterprise.samples.dal.User;

public class GenerateExpenseNote {

    private static final Logger log = Logger.getLogger(GenerateExpenseNote.class.getName());

    private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.00");
    private static Font titleFont = new Font(Font.FontFamily.HELVETICA, 18, Font.BOLD);

    public int handle(final User user, final User manager, final ExpenseNote en)
            throws MalformedURLException, IOException, DocumentException {

        log.info("Building list of expenses ...");
        List<Expense> expenses = Expense.list(en);
        log.info("Retrieved " + expenses.size() + " expenses from the datastore");

        log.info("Creating ExpenseNoteDocOutputStream");
        ExpenseNoteDocOutputStream stream = new ExpenseNoteDocOutputStream(en);

        Document document = new Document();
        PdfWriter.getInstance(document, stream);
        document.open();

        document.addTitle("Expense note " + en.id + " of " + user.name);
        document.addSubject("Expense note generated by Rogerthat Enterprise!");
        document.addKeywords("expense note");
        document.addAuthor(user.name);
        document.addCreator("Rogerthat OneApp Enterprise Mobility");

        Paragraph preface = new Paragraph();

        preface.add(new Paragraph("TP Vision expense note", titleFont));
        preface.add(new Paragraph(" "));

        DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
        Date date = new Date();
        preface.add(new Paragraph("Date: " + dateFormat.format(date)));
        preface.add(new Paragraph("Requestor: " + user.name));
        preface.add(new Paragraph("Approver: " + manager.name));
        preface.add(new Paragraph(" "));

        PdfPTable table = new PdfPTable(7);
        table.setWidthPercentage(110);
        table.setWidths(new int[] { 5, 15, 15, 35, 10, 15, 10 });
        addHeader(table, "Id");
        addHeader(table, "Date");
        addHeader(table, "Nature");
        addHeader(table, "Description");
        addHeader(table, "Account");
        addHeader(table, "Amount");
        addHeader(table, "Voucher");
        table.setHeaderRows(1);

        Collections.sort(expenses, new Comparator<Expense>() {
            @Override
            public int compare(Expense e1, Expense e2) {
                return (int) (e1.date - e2.date);
            }
        });
        int i = 0;
        double total = 0;
        for (Expense expense : expenses) {
            PdfPCell c1 = new PdfPCell(new Phrase("" + ++i));
            c1.setHorizontalAlignment(Element.ALIGN_CENTER);
            table.addCell(c1);
            table.addCell(dateFormat.format(new Date(expense.date * 1000)));
            table.addCell(expense.nature);
            table.addCell(expense.description);
            table.addCell("" + expense.account);
            c1 = new PdfPCell(new Phrase(DECIMAL_FORMAT.format(expense.amount) + " " + expense.currency));
            c1.setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell(c1);
            table.addCell(expense.voucher);
            total += expense.amount;
        }

        preface.add(table);

        preface.add(new Paragraph(" "));
        preface.add(new Paragraph("Total: " + DECIMAL_FORMAT.format(total), titleFont));

        document.add(preface);

        i = 0;
        for (Expense expense : expenses) {
            i++;
            if (expense.receipt == null)
                continue;

            document.newPage();
            Paragraph receipt = new Paragraph();
            receipt.add(new Paragraph("Attachment " + i, titleFont));
            document.add(receipt);
            Image image = Image.getInstance(new URL(expense.receipt));
            image.setRotationDegrees(-90);
            float scaler = (document.getPageSize().getWidth() / image.getWidth()) * 100;

            image.scalePercent(scaler);
            document.add(image);
        }

        document.close();
        stream.close();

        return stream.getSize();

    }

    private void addHeader(PdfPTable table, String title) {
        PdfPCell c1 = new PdfPCell(new Phrase(title));
        c1.setHorizontalAlignment(Element.ALIGN_CENTER);
        table.addCell(c1);
    }

}