package com.fp.dto.fin;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import com.fp.dto.Request;

/**
 * Clase utilizada en el procesamiento de transacciones finacieras. <br>
 * Ejemplo: Depositos, Pago cheque, Desembolso creditos, Pago intereses certificados deposito. Etc..
 * 
 * @author Jorge Vaca.
 * @version 2.1
 */
public class FinancialRequest extends Request {

    public static String aux = "Hola mundo";

    /* Version del objeto. */
    private static final long serialVersionUID = 1L;

    /** Identificador de la transaccion. */
    protected String oldjournalId;

    /** Modo en el que se ejecuta la transaccion N (Normal) I (Imperativo o Forzado) */
    private String transactionMode = "N";

    /** Fecha contable del movimiento. */
    private Date accountingDate;

    /** Fecha de trabao del movimiento. */
    private Date workingdate;

    /** Fecha de proceso del movimiento, con esta fecha se lleva los saldos de cuentas producto. */
    private Date processDate;

    /**
     * Fecha valor del movimiento, se utiliza en el calculo de ajuste de interese, los cuales se contabilizan con la
     * fecha de hoy.
     */
    private Date valueDate;

    /** True indica que se esta ejecutando un comprobante contable. */
    private boolean accountingVoucher = false;

    /** Numero de documento, papeleta o numero de cheque. */
    private String document;

    /** Numero de documento final, o numero de cheque final, se utiliza en la anulacion de un rango de cheques. */
    private String enddocument;

    /** Glosa de la transaccion,texto libre. */
    private String commentary;

    /** Codigo de area al que pertence el terminal. */
    private String area;

    /** Fecha de compenzacion del movimiento. */
    private Date settlement;

    /** Numero cuenta debito, en una transaccion monetaria. */
    private String debitAccount;

    /**
     * Numero de cuota asociada a la cuenta debito, se utiliza si la transaccion afecta a una cuenta que afecta a una
     * tabla de pagos.
     */
    private Integer debitQuotaNumber;

    /** Numero de cuenta credito, en una transaccion monetaria. */
    private String creditAccount;

    /**
     * Numero de cuota asociada a la cuenta credito, se utiliza si la transaccion afecta a una cuenta que afecta a una
     * tabla de pagos.
     */
    private Integer creditQuotaNumber;

    /** Indica que el request va a ejecutar un reverso de una transaccion. */
    private String reverse = "N";

    /** Numero de mensaje a reversar. */
    private String journalIdReverse;

    /** Sucursal a la que cambiara la cuenta producto */
    private Integer newAccountBranch;

    /** Oficina a la que cambiara la cuenta producto */
    private Integer newAccountOffice;

    /** Sub Producto al cual cambiara la cuenta producto, no se permite cambios de producto de cuentas. */
    private String newSubProduct;

    /** Codigo de deposito utilizado en depositos codificados. */
    private String depositCode;

    /** Lista de rubros enviados desde un canal para ejecutar una transacion. */
    private List<FinancialItem> financialItems = new ArrayList<FinancialItem>();

    /**
     * Indica si se cambia el debito por credito, Ejemplo reverso contable del registro de una CXC en el cobro de la
     * misma.
     */
    private boolean changeDebitByCredit = false;

    /** Indica que al ejecutar una transaccion calcula provisiones o no. */
    private boolean calculateprovision = true;

    /** Codigo de tipos de identificacion */
    private String identificationcatalog;

    /** Codigo de catalogo de tipo de identificacion */
    private String identificationcatalogcode = "IDENTIFICATION";

    /** Identificacion del cliente. */
    private String identification;

    /** Codigo de persona beneficiaria */
    private Integer beneficiaryperson;

    /** Nombre del beneficiario. */
    private String beneficiaryname;

    /** Numero de transaccion de caja multiple, asociado a la fecha de trabajo usuario. */
    private Integer mixnumber;

    /** Indica que la transaccion es de contabilizacion del accrual diario de intereses. */
    private boolean accrualdaily = false;

    /**
     * Entrega una copia de la instancia de FinancialItem.
     * 
     * @return FinancialItem
     * @throws CloneNotSupportedException
     */
    public FinancialRequest cloneMe() throws CloneNotSupportedException {
        return (FinancialRequest) super.clone();
    }

    /**
     * Entrega el valor de: oldjournalId
     * 
     * @return String
     */
    public String getOldjournalId() {
        return this.oldjournalId;
    }

    /**
     * Fija el valor de: oldjournalId
     * 
     * @param oldjournalId valor a almacenar en el objeto.
     */
    public void setOldjournalId(String oldjournalId) {
        this.oldjournalId = oldjournalId;
    }

    /**
     * Metodo que cambia el codigo de transaccion del FinancialRequest.
     * 
     * @param pModule Codigo de modulo al que pertenece la nueva transaccion.
     * @param pTransaction Codigo de la nueva transaccion.
     * @param pVersion Version de la nueva transaccion.
     * @throws Exception
     */
    public void changeTransaction(String pModule, Integer pTransaction, Integer pVersion) throws Exception {
        this.transactionModule = pModule;
        this.transactionCode = pTransaction;
        this.transactionVersion = pVersion;
    }

    /**
     * Encera financialItems de una transaccion.
     */
    public void cleanItems() {
        this.financialItems = new ArrayList<FinancialItem>();
    }

    /**
     * Entrega el valor de: transactionMode
     * 
     * @return String
     */
    public String getTransactionMode() {
        return this.transactionMode;
    }

    /**
     * Fija el valor de: transactionMode
     * 
     * @param transactionMode
     */
    public void setTransactionMode(String transactionMode) {
        this.transactionMode = transactionMode;
    }

    /**
     * Entrega el valor de: accountingDate
     * 
     * @return Date
     */
    public Date getAccountingDate() {
        return this.accountingDate;
    }

    /**
     * Fija el valor de: accountingDate
     * 
     * @param accountingDate
     */
    public void setAccountingDate(Date accountingDate) {
        this.accountingDate = accountingDate;
    }

    /**
     * Entrega el valor de: workingdate
     * 
     * @return Date
     */
    public Date getWorkingdate() {
        return this.workingdate;
    }

    /**
     * Fija el valor de workingDate
     * 
     * @param workingdate value to set
     */
    public void setWorkingdate(Date workingdate) {
        this.workingdate = workingdate;
    }

    /**
     * Entrega el valor de: processDate
     * 
     * @return Date
     */
    public Date getProcessDate() {
        return this.processDate;
    }

    /**
     * Fija el valor de: processDate
     * 
     * @param processDate
     */
    public void setProcessDate(Date processDate) {
        this.processDate = processDate;
    }

    /**
     * Entrega el valor de: valueDate
     * 
     * @return Date
     */
    public Date getValueDate() {
        return this.valueDate;
    }

    /**
     * Fija el valor de: valueDate
     * 
     * @param valueDate
     */
    public void setValueDate(Date valueDate) {
        this.valueDate = valueDate;
    }

    /**
     * Entrega el valor de: accountingVoucher
     * 
     * @return boolean
     */
    public boolean isAccountingVoucher() {
        return this.accountingVoucher;
    }

    /**
     * Fija el valor de: accountingVoucher
     * 
     * @param accountingVoucher
     */
    public void setAccountingVoucher(boolean accountingVoucher) {
        this.accountingVoucher = accountingVoucher;
    }

    /**
     * Entrega el valor de: document
     * 
     * @return String
     */
    public String getDocument() {
        return this.document;
    }

    /**
     * Fija el valor de: document
     * 
     * @param document
     */
    public void setDocument(String document) {
        this.document = document;
    }

    /**
     * @return the enddocument
     */
    public String getEnddocument() {
        return this.enddocument;
    }

    /**
     * @param enddocument the enddocument to set
     */
    public void setEnddocument(String enddocument) {
        this.enddocument = enddocument;
    }

    /**
     * Entrega el valor de: commentary
     * 
     * @return String
     */
    public String getCommentary() {
        return this.commentary;
    }

    /**
     * Fija el valor de: commentary
     * 
     * @param commentary
     */
    public void setCommentary(String commentary) {
        this.commentary = commentary;
    }

    /**
     * Entrega el valor de: area
     * 
     * @return String
     */
    public String getArea() {
        return this.area;
    }

    /**
     * Fija el valor de: area
     * 
     * @param area
     */
    public void setArea(String area) {
        this.area = area;
    }

    /**
     * Entrega el valor de: settlement
     * 
     * @return Date
     */
    public Date getSettlement() {
        return this.settlement;
    }

    /**
     * Fija el valor de: settlement
     * 
     * @param settlement
     */
    public void setSettlement(Date settlement) {
        this.settlement = settlement;
    }

    /**
     * Entrega el valor de: debitAccount
     * 
     * @return String
     */
    public String getDebitAccount() {
        return this.debitAccount;
    }

    /**
     * Fija el valor de: debitAccount
     * 
     * @param debitAccount
     */
    public void setDebitAccount(String debitAccount) {
        this.debitAccount = debitAccount;
    }

    /**
     * Entrega el valor de: debitQuotaNumber
     * 
     * @return Integer
     */
    public Integer getDebitQuotaNumber() {
        return this.debitQuotaNumber;
    }

    /**
     * Fija el valor de: debitQuotaNumber
     * 
     * @param debitQuotaNumber
     */
    public void setDebitQuotaNumber(Integer debitQuotaNumber) {
        this.debitQuotaNumber = debitQuotaNumber;
    }

    /**
     * Entrega el valor de: creditAccount
     * 
     * @return String
     */
    public String getCreditAccount() {
        return this.creditAccount;
    }

    /**
     * Fija el valor de: creditAccount
     * 
     * @param creditAccount
     */
    public void setCreditAccount(String creditAccount) {
        this.creditAccount = creditAccount;
    }

    /**
     * Entrega el valor de: creditQuotaNumber
     * 
     * @return Integer
     */
    public Integer getCreditQuotaNumber() {
        return this.creditQuotaNumber;
    }

    /**
     * Fija el valor de: creditQuotaNumber
     * 
     * @param creditQuotaNumber
     */
    public void setCreditQuotaNumber(Integer creditQuotaNumber) {
        this.creditQuotaNumber = creditQuotaNumber;
    }

    /**
     * Entrega el valor de: reverse
     * 
     * @return String
     */
    public String getReverse() {
        return this.reverse;
    }

    /**
     * Fija el valor de: reverse
     * 
     * @param reverse
     */
    public void setReverse(String reverse) {
        this.reverse = reverse;
    }

    /**
     * Entrega el valor de: journalIdReverse
     * 
     * @return String
     */
    public String getJournalIdReverse() {
        return this.journalIdReverse;
    }

    /**
     * Fija el valor de: journalIdReverse
     * 
     * @param journalIdReverse
     */
    public void setJournalIdReverse(String journalIdReverse) {
        this.journalIdReverse = journalIdReverse;
    }

    /**
     * Entrega el valor de: newAccountBranch
     * 
     * @return Integer
     */
    public Integer getNewAccountBranch() {
        return this.newAccountBranch;
    }

    /**
     * Fija el valor de: newAccountBranch
     * 
     * @param newAccountBranch
     */
    public void setNewAccountBranch(Integer newAccountBranch) {
        this.newAccountBranch = newAccountBranch;
    }

    /**
     * Entrega el valor de: newAccountOffice
     * 
     * @return Integer
     */
    public Integer getNewAccountOffice() {
        return this.newAccountOffice;
    }

    /**
     * Fija el valor de: newAccountOffice
     * 
     * @param newAccountOffice
     */
    public void setNewAccountOffice(Integer newAccountOffice) {
        this.newAccountOffice = newAccountOffice;
    }

    /**
     * Entrega el valor de: newSubProduct
     * 
     * @return String
     */
    public String getNewSubProduct() {
        return this.newSubProduct;
    }

    /**
     * Fija el valor de: newSubProduct
     * 
     * @param newSubProduct
     */
    public void setNewSubProduct(String newSubProduct) {
        this.newSubProduct = newSubProduct;
    }

    /**
     * Adiciona un item a procesar en la transaccion.
     * 
     * @param pFinancialItem Datos del FinancialItem.
     * @throws Exception
     */
    public void addFinancialItem(FinancialItem pFinancialItem) throws Exception {
        this.financialItems.add(pFinancialItem);
    }

    /**
     * Adiciona una Lista de item a procesar en la transaccion.
     * 
     * @param pFinancialItems Lista de items.
     * @throws Exception
     */
    public void addFinancialItems(List<FinancialItem> pFinancialItems) throws Exception {
        this.financialItems.addAll(pFinancialItems);
    }

    /**
     * Entrega el valor de: financialItems
     * 
     * @return List<FinancialItem>
     */
    public List<FinancialItem> getFinancialItems() {
        return this.financialItems;
    }

    /**
     * Fija el valor de: financialItems
     * 
     * @param financialItems
     */
    public void setFinancialItems(List<FinancialItem> financialItems) {
        this.financialItems = financialItems;
    }

    /**
     * Entrega el valor de: depositCode
     * 
     * @return String
     */
    public String getDepositCode() {
        return this.depositCode;
    }

    /**
     * Fija el valor de: depositCode
     * 
     * @param depositCode
     */
    public void setDepositCode(String depositCode) {
        this.depositCode = depositCode;
    }

    /**
     * Entrega el valor de: changeDebitByCredit
     * 
     * @return boolean
     */
    public boolean isChangeDebitByCredit() {
        return this.changeDebitByCredit;
    }

    /**
     * Fija el valor de changeDebitByCredit
     * 
     * @param changeDebitByCredit value to set
     */
    public void setChangeDebitByCredit(boolean changeDebitByCredit) {
        this.changeDebitByCredit = changeDebitByCredit;
    }

    /**
     * Entrega el valor de: calculateprovision
     * 
     * @return boolean
     */
    public boolean isCalculateprovision() {
        return this.calculateprovision;
    }

    /**
     * Fija el valor de: calculateprovision
     * 
     * @param calculateprovision
     */
    public void setCalculateprovision(boolean calculateprovision) {
        this.calculateprovision = calculateprovision;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return String
     */
    public String getIdentificationcatalog() {
        return this.identificationcatalog;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param identificationcatalog valor a almacenar en el objeto.
     */
    public void setIdentificationcatalog(String identificationcatalog) {
        this.identificationcatalog = identificationcatalog;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return String
     */
    public String getIdentificationcatalogcode() {
        return this.identificationcatalogcode;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param identificationcatalogcode valor a almacenar en el objeto.
     */
    public void setIdentificationcatalogcode(String identificationcatalogcode) {
        this.identificationcatalogcode = identificationcatalogcode;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return Integer
     */
    public Integer getBeneficiaryperson() {
        return this.beneficiaryperson;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param beneficiaryperson valor a almacenar en el objeto.
     */
    public void setBeneficiaryperson(Integer beneficiaryperson) {
        this.beneficiaryperson = beneficiaryperson;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return String
     */
    public String getBeneficiaryname() {
        return this.beneficiaryname;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param beneficiaryname valor a almacenar en el objeto.
     */
    public void setBeneficiaryname(String beneficiaryname) {
        this.beneficiaryname = beneficiaryname;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return String
     */
    public String getIdentification() {
        return this.identification;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param identification valor a almacenar en el objeto.
     */
    public void setIdentification(String identification) {
        this.identification = identification;
    }

    /**
     * Entrega el valor de: FinancialRequest.java
     * 
     * @return Integer
     */
    public Integer getMixnumber() {
        return this.mixnumber;
    }

    /**
     * Fija el valor de: FinancialRequest.java
     * 
     * @param mixnumber valor a almacenar en el objeto.
     */
    public void setMixnumber(Integer mixnumber) {
        this.mixnumber = mixnumber;
    }

    /**
     * Entrega el valor de: accrualdaily
     * 
     * @return boolean
     */
    public boolean isAccrualdaily() {
        return this.accrualdaily;
    }

    /**
     * Fija el valor de: accrualdaily
     * 
     * @param accrualdaily value to set
     */
    public void setAccrualdaily(boolean accrualdaily) {
        this.accrualdaily = accrualdaily;
    }

}
