package com.fp.dto.fin;

import java.math.BigDecimal;
import java.sql.Date;

import com.fp.dto.AbstractDataTransport;

/**
 * Clase utilizada en el procesos de transacciones financieras.
 * 
 * @author Jorge Vaca.
 * @version 2.1
 */
public class FinancialItem extends AbstractDataTransport implements Cloneable {

    private static final long serialVersionUID = 1L;

    /** Codigo de rubro asociado a una transaccion monetaria. */
    private Integer itemCode;

    /**
     * Numero de cuenta que se afecta con el rubro. Si el valor del atributo esta vacio se toma la cuenta que llega en
     * el FinancialRequest, dependiendo de la definicion del rubro si es debito o credito.
     */
    private String account;

    /** Codigo de compania a la que pertenece la cuenta. */
    private Integer companyAccount;

    /**
     * Numero de cuota de una tabla de pagos que se afecta, utilizado en cuentas que manejan tablas de pagos ejemplo
     * pago, prestamos.
     */
    private Integer quotaNumber;

    /**
     * Secuencia interna de la cuota de una tabla de pagos que se afecta, utilizado en cuentas que manejan tablas de
     * pagos ejemplo pago, prestamos.
     */
    private Integer quotaSequence;

    /**
     * Codigo contable que se afecta con el movimiento, si llega un valor en este atributo se respeta es valor
     * casocontrario el codigo contable lo obtiene la aplicacion.
     */
    private String accountingCode;

    /**
     * Sucursal destino del movimiento, si afecta a una cuenta producto se toma la sucursal de la cuenta. tambien se
     * utiliza en el manejod e intersucursales.
     */
    private Integer destinyBranch;

    /**
     * Oficina destino del movimiento, si afecta a una cuenta producto se toma la sucursal de la cuenta. tambien se
     * utiliza en el manejod e intersucursales.
     */
    private Integer destinyOffice;

    /**
     * Sucursal origen del movimiento, si afecta a una cuenta producto se toma la sucursal de la cuenta. tambien se
     * utiliza en el manejod e intersucursales.
     */
    private Integer originBranch;

    /**
     * Oficina origen del movimiento, si afecta a una cuenta producto se toma la sucursal de la cuenta. tambien se
     * utiliza en el manejod e intersucursales.
     */
    private Integer originOffice;

    /** Monto de la transaccion */
    private BigDecimal amount;

    /** Codigo de moneda en la que esta expresado el valor del rubro. */
    private String currecy;

    /**
     * Estatus de la cuenta con el que se afecta el moviento, si es una cuneta producto, si llega en blanco se toma de
     * la cuenta producto
     */
    private String accountStatus;

    /**
     * Indica que con el mismo rubro de la transaccion se va a registrar varios asientos en el journal, ejemplo,
     * registro de comprobantes contables, contabilizacion de cuotas de plazo fijo o prestamos.
     */
    private boolean repeating = false;

    /** Tipo de sobregito , ejemplo CONTRACTED,OCASIONAL,INDIRECT, etc */
    private String overdrawCatalog;

    /** Codigo de tabla de tipo de sobregiro OVERDRAWTYPE. */
    private String overdrawCatalogCode;

    /** Codigo de tipo de credito que se afecta con la transaccion. */
    private String creditType;

    /** Codigo de estatus de la operacion que se afecta con la transaccion. */
    private String operationStatus;

    /** Fecha de inicio de la cuota o del sobregiro. */
    private Date beginingDate;

    /** Fecha de vencimiento de la cuota o del sobregiro. */
    private Date expirationDate;

    /** Indica si el tipo de saldo actualiza saldos. Ejm false, en contabilizacion de desembolso de un credito. */
    private boolean updateBalance = true;

    /**
     * Cotizacion de compra o venta, con el cual se calcula el valor en moneda local para grabar en la tbala de journal.
     */
    private BigDecimal exchangeQuote;

    /** Codigo de modulo utilizado en el registro contable de provisiones */
    private String accountmodule;

    /** Codigo de producto utilizado en el registro contable de provisiones */
    private String accountproduct;

    /** Codigo de subproducto utilizado en el registro contable de provisiones */
    private String accountsubproduct;

    /**
     * Crea una instancia de FinancialItem, vacia.
     */
    public FinancialItem() {
    }

    /**
     * Crea una instancia de FinancialItem.
     * 
     * @param pItemCode Codigo de rubro con el cual se ejecuta la transaccion.
     * @param pAmount Monto en el que se afecta el rubro.
     * @param pCurrency Codigo de moneda en la que se expresa el monto del rubro.
     * @throws Exception
     */
    public FinancialItem(Integer pItemCode, BigDecimal pAmount, String pCurrency) throws Exception {
        this.itemCode = pItemCode;
        this.amount = pAmount;
        this.currecy = pCurrency;
    }

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

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

    /**
     * Fija el valor de itemCode
     * 
     * @param code
     */
    public void setItemCode(Integer itemCode) {
        this.itemCode = itemCode;
    }

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

    /**
     * Fija el valor de account
     * 
     * @param account
     */
    public void setAccount(String account) {
        this.account = account;
    }

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

    /**
     * Fija el valor de companyAccount
     * 
     * @param companyAccount
     */
    public void setCompanyAccount(Integer companyAccount) {
        this.companyAccount = companyAccount;
    }

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

    /**
     * Fija el valor de quotaNumber
     * 
     * @param quotaNumber
     */
    public void setQuotaNumber(Integer quotaNumber) {
        this.quotaNumber = quotaNumber;
    }

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

    /**
     * Fija el valor de quotaSequence
     * 
     * @param quotaSequence value to set
     */
    public void setQuotaSequence(Integer quotaSequence) {
        this.quotaSequence = quotaSequence;
    }

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

    /**
     * Fija el valor de accountingCode
     * 
     * @param accountingCode
     */
    public void setAccountingCode(String accountingCode) {
        this.accountingCode = accountingCode;
    }

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

    /**
     * Fija el valor de destinyBranch
     * 
     * @param destinyBranch
     */
    public void setDestinyBranch(Integer destinyBranch) {
        this.destinyBranch = destinyBranch;
    }

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

    /**
     * Fija el valor de destinyOffice
     * 
     * @param destinyOffice
     */
    public void setDestinyOffice(Integer destinyOffice) {
        this.destinyOffice = destinyOffice;
    }

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

    /**
     * Fija el valor de: originBranch
     * 
     * @param originBranch value to set
     */
    public void setOriginBranch(Integer originBranch) {
        this.originBranch = originBranch;
    }

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

    /**
     * Fija el valor de: originOffice
     * 
     * @param originOffice value to set
     */
    public void setOriginOffice(Integer originOffice) {
        this.originOffice = originOffice;
    }

    /**
     * Entrega el valor de: amount
     * 
     * @return BigDecimal
     */
    public BigDecimal getAmount() {
        return this.amount;
    }

    /**
     * Fija el valor de amount
     * 
     * @param amount
     */
    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

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

    /**
     * Fija el valor de accountStatus
     * 
     * @param accountStatus
     */
    public void setAccountStatus(String accountStatus) {
        this.accountStatus = accountStatus;
    }

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

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

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

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

    @Override
    public String toString() {
        String data = "itemCode:" + this.itemCode + " currecy:" + this.currecy + " account:" + this.account + " cia:" + this.companyAccount
                + " amount:" + this.amount + " qn: " + this.quotaNumber;
        return data;
    }

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

    /**
     * Fija el valor de overdrawCatalog
     * 
     * @param overdrawCatalog value to set
     */
    public void setOverdrawCatalog(String overdrawCatalog) {
        this.overdrawCatalog = overdrawCatalog;
    }

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

    /**
     * Fija el valor de overdrawCatalogCode
     * 
     * @param overdrawCatalogCode value to set
     */
    public void setOverdrawCatalogCode(String overdrawCatalogCode) {
        this.overdrawCatalogCode = overdrawCatalogCode;
    }

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

    /**
     * Fija el valor de creditType
     * 
     * @param creditType value to set
     */
    public void setCreditType(String creditType) {
        this.creditType = creditType;
    }

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

    /**
     * Fija el valor de: operationStatus
     * 
     * @param operationStatus value to set
     */
    public void setOperationStatus(String operationStatus) {
        this.operationStatus = operationStatus;
    }

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

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

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

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

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

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

    /**
     * Entrega el valor de: exchangeQuote
     * 
     * @return BigDecimal
     */
    public BigDecimal getExchangeQuote() {
        return this.exchangeQuote;
    }

    /**
     * Fija el valor de: exchangeQuote
     * 
     * @param exchangeQuote
     */
    public void setExchangeQuote(BigDecimal exchangeQuote) {
        this.exchangeQuote = exchangeQuote;
    }

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

    /**
     * Fija el valor de: accountmodule
     * 
     * @param accountmodule value to set
     */
    public void setAccountmodule(String accountmodule) {
        this.accountmodule = accountmodule;
    }

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

    /**
     * Fija el valor de: accountproduct
     * 
     * @param accountproduct value to set
     */
    public void setAccountproduct(String accountproduct) {
        this.accountproduct = accountproduct;
    }

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

    /**
     * Fija el valor de: accountsubproduct
     * 
     * @param accountsubproduct value to set
     */
    public void setAccountsubproduct(String accountsubproduct) {
        this.accountsubproduct = accountsubproduct;
    }

}
