biblivre3.circulation.CirculationBO.java Source code

Java tutorial

Introduction

Here is the source code for biblivre3.circulation.CirculationBO.java

Source

/**
 *  Este arquivo  parte do Biblivre3.
 *  
 *  Biblivre3  um software livre; voc pode redistribu-lo e/ou 
 *  modific-lo dentro dos termos da Licena Pblica Geral GNU como 
 *  publicada pela Fundao do Software Livre (FSF); na verso 3 da 
 *  Licena, ou (caso queira) qualquer verso posterior.
 *  
 *  Este programa  distribudo na esperana de que possa ser  til, 
 *  mas SEM NENHUMA GARANTIA; nem mesmo a garantia implcita de
 *  MERCANTIBILIDADE OU ADEQUAO PARA UM FIM PARTICULAR. Veja a
 *  Licena Pblica Geral GNU para maiores detalhes.
 *  
 *  Voc deve ter recebido uma cpia da Licena Pblica Geral GNU junto
 *  com este programa, Se no, veja em <http://www.gnu.org/licenses/>.
 * 
 *  @author Alberto Wagner <alberto@biblivre.org.br>
 *  @author Danniel Willian <danniel@biblivre.org.br>
 * 
 */

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package biblivre3.circulation;

import biblivre3.cataloging.bibliographic.BiblioSearchBO;
import biblivre3.cataloging.bibliographic.RecordDTO;
import biblivre3.circulation.lending.LendingBO;
import biblivre3.circulation.lending.LendingDTO;
import biblivre3.circulation.lending.LendingFineBO;
import biblivre3.circulation.lending.LendingFineDTO;
import biblivre3.circulation.lending.LendingHistoryDTO;
import biblivre3.config.Config;
import biblivre3.config.ConfigurationEnum;
import biblivre3.cataloging.holding.HoldingBO;
import biblivre3.cataloging.holding.HoldingDTO;
import biblivre3.utils.ApplicationConstants;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.Barcode39;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import mercury.BaseBO;
import mercury.I18nUtils;
import mercury.MemoryFileDTO;

/**
 *
 */
public class CirculationBO extends BaseBO {

    private int recordsPPage;
    private CirculationDAO dao;

    public CirculationBO() {
        try {
            final String rpp = Config.getConfigProperty(ConfigurationEnum.RECORDS_PER_PAGE);
            this.recordsPPage = Integer.valueOf(rpp);
            dao = new CirculationDAO();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            this.recordsPPage = 25;
        }
    }

    public final UserDTO searchByName(String name) {
        return dao.searchByName(name);
    }

    public final UserDTO searchByUserId(int userid) {
        UserDTO dto = dao.searchByUserId(userid);
        if (dto != null) {
            List<LendingFineDTO> fines = new LendingFineBO().listLendingFines(dto, true);
            float totalFines = 0f;
            for (LendingFineDTO fine : fines) {
                totalFines += fine.getValue();
            }
            dto.setTotalFines(totalFines);
        }
        return dto;
    }

    public final UserDTO searchByLoginId(int loginId) {
        return dao.searchByLoginId(loginId);
    }

    public final UsersDTO list(String registration, String name, int userId, int offset) {
        return dao.list(registration, name, userId, 0, offset, this.recordsPPage);
    }

    public final UserTypeDTO getUserTypeById(final Integer serial) {
        return dao.findUserTypeById(serial);
    }

    public final int addUser(UserDTO userDTO) {
        return dao.addUser(userDTO);
    }

    public final void deleteUser(int userId) {
        dao.deleteUser(userId);
    }

    public final boolean blockUser(int userId, boolean block) {
        return dao.blockUser(userId, block);
    }

    public final void updateUser(UserDTO userDTO, int userid) {
        dao.updateUser(userDTO, userid);
    }

    public Collection<UserTypeDTO> findAllUserType() {
        return dao.findAllUserType();
    }

    public boolean existsUserCard(int userId, String userType) {
        return dao.existsUserCard(userId, userType);
    }

    public boolean insertUserCard(UserCardDTO userCard) {
        return dao.insertUserCard(userCard);
    }

    public Integer countUsersByUserType(Integer userTypeId) {
        return dao.countUsersByUserType(userTypeId);
    }

    public Integer countUserCards() {
        return dao.countUserCards();
    }

    public UserHistoryDTO getUserHistory(Integer userID) {
        UserHistoryDTO dto = new UserHistoryDTO();
        UserDTO user = new UserDTO();
        user.setUserid(userID);

        LendingBO lendingBo = new LendingBO();
        HoldingBO holdingBo = new HoldingBO();
        LendingFineBO fineBo = new LendingFineBO();
        BiblioSearchBO biblioBo = new BiblioSearchBO();
        List<LendingDTO> currentLendings = (List<LendingDTO>) lendingBo.listLendings(user);
        //Populate author and title
        for (LendingDTO ldto : currentLendings) {
            HoldingDTO holding = holdingBo.getById(ldto.getHoldingSerial());
            RecordDTO record = biblioBo.getById(holding.getRecordSerial());
            String[] detail = holdingBo.getBibliographicDetails(record);

            ldto.setAuthor(detail[0]);
            ldto.setTitle(detail[1]);
            ldto.setAssetHolding(holding.getAssetHolding());
        }
        dto.setCurrentLendings(currentLendings);

        List<LendingHistoryDTO> pastLendings = (List<LendingHistoryDTO>) lendingBo.listHistory(user);
        //Populate author and title
        for (LendingHistoryDTO ldto : pastLendings) {
            HoldingDTO holding = holdingBo.getById(ldto.getHoldingSerial());
            RecordDTO record = biblioBo.getById(holding.getRecordSerial());
            String[] detail = holdingBo.getBibliographicDetails(record);

            ldto.setAuthor(detail[0]);
            ldto.setTitle(detail[1]);
            ldto.setAssetHolding(holding.getAssetHolding());
        }
        dto.setPastLendings(pastLendings);

        Collection<LendingFineDTO> fines = fineBo.listLendingFines(user);
        List<LendingFineDTO> currentFines = new ArrayList<LendingFineDTO>();
        List<LendingFineDTO> pastFines = new ArrayList<LendingFineDTO>();
        for (LendingFineDTO fine : fines) {
            if (fine.getPayment() != null) {
                pastFines.add(fine);
            } else {
                currentFines.add(fine);
            }
        }
        dto.setCurrentFines(currentFines);
        dto.setPastFines(pastFines);

        return dto;
    }

    public int[] generateUserCardsByDate(Date startDate, Date endDate) {
        SimpleDateFormat expectedFormat = new SimpleDateFormat("yyyy-MM-dd");
        ArrayList<UserDTO> list = new CirculationDAO().getUsersByDate(expectedFormat.format(startDate),
                expectedFormat.format(endDate));
        HashMap<Integer, UserTypeDTO> userTypes = new HashMap<Integer, UserTypeDTO>();
        int total = list.size();
        int added = 0;

        for (int i = 0; i < total; i++) {
            UserDTO userDto = list.get(i);
            UserTypeDTO userTypeDto;

            if (userTypes.containsKey(userDto.getUserType())) {
                userTypeDto = userTypes.get(userDto.getUserType());
            } else {
                userTypeDto = this.getUserTypeById(userDto.getUserType());
                userTypes.put(userDto.getUserType(), userTypeDto);
            }
            String userTypeName = userTypeDto != null ? userTypeDto.getName() : "";
            boolean alreadyInList = new CirculationDAO().existsUserCard(userDto.getUserid(), userTypeName);
            if (alreadyInList) {
                continue;
            }

            UserCardDTO userCard = new UserCardDTO();
            userCard.setUserId(userDto.getUserid());
            userCard.setUserName(userDto.getName());
            userCard.setUserType(userTypeName);
            if (this.insertUserCard(userCard)) {
                added++;
            }
        }

        int result[] = new int[2];
        result[0] = total;
        result[1] = added;

        return result;
    }

    public final ArrayList<UserCardDTO> listPendingUserCards() {
        return dao.listPendingUserCards();
    }

    public final ArrayList<UserCardDTO> listSelectedUserCards(String[] cards) {
        return dao.listSelectedUserCards(cards);
    }

    public boolean deleteUserCards(String[] cards) {
        return dao.deleteUserCards(cards);
    }

    public MemoryFileDTO createFileUserCardsPDF(ArrayList<UserCardDTO> cards, int startOffset, Properties i18n) {
        Document document = new Document();
        MemoryFileDTO file = new MemoryFileDTO();
        file.setFileName("user_cards_" + new Date().getTime() + ".pdf");
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            document.setPageSize(PageSize.A4);
            document.setMargins(7.15f * ApplicationConstants.MM_UNIT, 7.15f * ApplicationConstants.MM_UNIT,
                    9.09f * ApplicationConstants.MM_UNIT, 9.09f * ApplicationConstants.MM_UNIT);
            document.open();
            PdfPTable table = new PdfPTable(3);
            table.setWidthPercentage(100f);
            PdfPCell cell;
            int i = 0;
            for (i = 0; i < startOffset; i++) {
                cell = new PdfPCell();
                cell.setBorder(Rectangle.NO_BORDER);
                cell.setFixedHeight(46.47f * ApplicationConstants.MM_UNIT);
                table.addCell(cell);
            }
            for (UserCardDTO card : cards) {
                String userEnrollNumber = String.valueOf(card.getUserId());
                PdfContentByte cb = writer.getDirectContent();
                Barcode39 code39 = new Barcode39();
                code39.setExtended(true);
                while (userEnrollNumber.length() < 10) {
                    userEnrollNumber = "0" + userEnrollNumber;
                }
                code39.setCode(userEnrollNumber);
                code39.setStartStopText(false);
                Image image39 = code39.createImageWithBarcode(cb, null, null);
                image39.scalePercent(110f);
                Paragraph para = new Paragraph();
                String name = card.getUserName();
                name = name.length() >= 30 ? name.substring(0, 30) : name;
                Phrase p1 = new Phrase(name + "\n");
                Phrase p2 = new Phrase(new Chunk(image39, 0, 0));
                Phrase p3 = new Phrase(
                        I18nUtils.getText(i18n, "LABEL_USER_SERIAL") + ": " + card.getUserId() + "\n");
                Phrase p4 = new Phrase(
                        I18nUtils.getText(i18n, "LABEL_USER_TYPE") + ": " + card.getUserType() + "\n\n");
                para.add(p1);
                para.add(p3);
                para.add(p4);
                para.add(p2);
                cell = new PdfPCell(para);
                i++;
                cell.setFixedHeight(46.47f * ApplicationConstants.MM_UNIT);
                cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
                cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
                cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);
            }
            if ((i % 3) != 0) {
                while ((i % 3) != 0) {
                    i++;
                    cell = new PdfPCell();
                    cell.setBorder(Rectangle.NO_BORDER);
                    table.addCell(cell);
                }
            }
            document.add(table);
            writer.flush();
            document.close();
            writer.close();
            file.setFileData(baos.toByteArray());
        } catch (DocumentException de) {
            System.out.println(de.getMessage());
        }
        return file;
    }

}