Introducción

Se realizara una suite de contabilidad para que estudiante pueda practicar y realizar ejercicios y documentos de contabilidad.

Requisitos

Desarrollo

Para iniciar esta suite vamos a realizar el balance general en forma de reporte.
Abrimos nuestro eclipse y creamos un proyecto maven.File->New->MavenProject
Login Test
Seleccionamos en Create a simple project y presionamos Next
Login Test
LLenamos los siguientes campos: Presionamos Finish
student
Una vez generado nuestro proyecto maven nos vamos al archivo pom.xml y pegamos el siguiente código esta para poder compilar con java 1.8.
   <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
           <source>1.8</source>
           <target>1.8</target>
        </configuration>
      </plugin> 
    </plugins>
   </build>

  
Ahora vemos que tenemos un problema nos vamos a nuestro proyecto y le damos clic derecho donde dice Maven->Update Project..
Login Test
Nos marcara un error que no encuentra el archivo web.xml pero lo solucionaremos de la siguiente manera, hacemos clic derecho en el proyecto y selecionamos Properties
Login Test
Selecionamos Project Facets en el recuadro seleccionamos Dynamic Web Module 3.1 y Java Server Faces 2.2 y presionamos Apply posterriormente OK Login Test
Creamos una carpeta en src/main/webapp llamada WEB-INF.Nota:Si tienes eclipse 2019 te genera el archivo web.xml modificalo por el que esta en el código y luego maven->Update Project...
En el directorio WEB-INF creamos el archivo web.xml y escribimos lo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<display-name>studentaccounting</display-name>
 <context-param>
  <param-name>javax.faces.PROJECT_STAGE</param-name>
  <param-value>Development</param-value>
 </context-param>
 <context-param>
  <param-name>primefaces.THEME</param-name>
  <param-value>cupertino</param-value>
 </context-param>
 <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>/faces/*</url-pattern>
 </servlet-mapping>
 <session-config>
  <session-timeout>30</session-timeout>
 </session-config>
 <welcome-file-list>
  <welcome-file>faces/index.xhtml</welcome-file>
 </welcome-file-list>
</web-app>
En el mismo directorio WEB-INF creamos el archivo faces-config.xml y escribimos lo siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">

</faces-config>
Ahora agregamos todas las dependencias y así es como quedaría nuestro archivo pom.xml
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mx.com.tutosoftware.studentaccounting</groupId>
  <artifactId>studentaccounting</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>Student Accounting</name>
  <repositories>
    <repository>
        <id>prime-repo</id>
        <name>PrimeFaces Maven Repository</name>
        <url>http://repository.primefaces.org/</url>
        <layout>default</layout>
    </repository>
</repositories>
  
  
  
  <dependencies>
  
 	<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-api</artifactId>
			<version>2.2.10</version>
		</dependency>
		<dependency>
			<groupId>com.sun.faces</groupId>
			<artifactId>jsf-impl</artifactId>
			<version>2.2.10</version>
		</dependency>

		<!-- http://repo1.maven.org/maven -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>com.sun.el</groupId>
			<artifactId>el-ri</artifactId>
			<version>1.0</version>
		</dependency>
		<dependency>
			<groupId>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>7.0</version>
     </dependency>
     
     <dependency>
    <groupId>org.primefaces.themes</groupId>
    <artifactId>all-themes</artifactId>
    <version>1.0.10</version>
</dependency>
     
     
     
     <!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
<dependency>
    <groupId>com.lowagie</groupId>
    <artifactId>itext</artifactId>
    <version>2.1.7</version>
</dependency>
     
   <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>
     
     
     
     
 </dependencies>    
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
           <source>1.8</source>
           <target>1.8</target>
        </configuration>
      </plugin> 
    </plugins>
   </build>
</project>
  
  
En src/main/java creamos el paquete mx.com.tutosoftware.studentaccounting.bean
En el paquete mx.com.tutosoftware.studentaccounting.bean creamos la clase Reporte esta clase es la que genera el datatable dinámico de nuestro reporte y escribimos:
  package mx.com.tutosoftware.studentaccounting.bean;

import java.io.Serializable;

public class Reporte implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String cuenta;
	private String concepto;
	private double cantidad;
	private double renglon1;
	private double renglon3;
	private double renglon4;
	
	public Reporte(String cuenta, String concepto, double cantidad, double renglon1, double renglon3) {
		super();
		this.cuenta = cuenta;
		this.concepto = concepto;
		this.cantidad = cantidad;
		this.renglon1 = renglon1;
		this.renglon3 = renglon3;
	}

	public String getCuenta() {
		return cuenta;
	}

	public void setCuenta(String cuenta) {
		this.cuenta = cuenta;
	}

	public String getConcepto() {
		return concepto;
	}

	public void setConcepto(String concepto) {
		this.concepto = concepto;
	}

	public double getCantidad() {
		return cantidad;
	}

	public void setCantidad(double cantidad) {
		this.cantidad = cantidad;
	}

	public double getRenglon1() {
		return renglon1;
	}

	public void setRenglon1(double renglon1) {
		this.renglon1 = renglon1;
	}

	public double getRenglon3() {
		return renglon3;
	}

	public void setRenglon3(double renglon3) {
		this.renglon3 = renglon3;
	}

	public double getRenglon4() {
		return renglon4;
	}

	public void setRenglon4(double renglon4) {
		this.renglon4 = renglon4;
	}
	

}
  
  
En el mismo paquete vamos a craer nuestro ManagedBean los vamos llamar Balance es el bean que controla la pantalla del balance.Escribimos lo siguiente:
  package mx.com.tutosoftware.studentaccounting.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;



@ManagedBean
@SessionScoped
public class Balance implements Serializable {
	
	private static final long serialVersionUID = 1L;
	private String empresa;
	private Date fecha;
	private String fechaBalance;
	private String tipoCuenta;
	private String nombreCuenta;
	private static ArrayList<Reporte> reportes = new ArrayList<Reporte>();
	
	
	
	
	
	public String getEmpresa() {
		return empresa;
	}

	public void setEmpresa(String empresa) {
		this.empresa = empresa;
	}

	public Date getFecha() {
		return fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public String getFechaBalance() {
		return fechaBalance;
	}

	public void setFechaBalance(String fechaBalance) {
		this.fechaBalance = fechaBalance;
	}

	public String getTipoCuenta() {
		return tipoCuenta;
	}

	public void setTipoCuenta(String tipoCuenta) {
		this.tipoCuenta = tipoCuenta;
	}

	public String getNombreCuenta() {
		return nombreCuenta;
	}

	public void setNombreCuenta(String nombreCuenta) {
		this.nombreCuenta = nombreCuenta;
	}

	public ArrayList<Reporte> getReportes() {
		return reportes;
	}
	
	public void mostrarFecha() {
		Calendar cal= Calendar.getInstance();
		cal.setTime(fecha);
		int dia=cal.get(Calendar.DAY_OF_MONTH);
		int mes=cal.get(Calendar.MONTH)+1;
		int year=cal.get(Calendar.YEAR);
		
		String mesString;
		
		switch (mes) {
        case 1:  mesString = "Enero";
                 break;
        case 2:  mesString  = "Febrero";
                 break;
        case 3:  mesString = "Marzo";
                 break;
        case 4:  mesString = "Abril";
                 break;
        case 5:  mesString = "Mayo";
                 break;
        case 6:  mesString = "Junio";
                 break;
        case 7:  mesString = "Julio";
                 break;
        case 8:  mesString = "Agosto";
                 break;
        case 9:  mesString = "Septiembre";
                 break;
        case 10: mesString = "Octubre";
                 break;
        case 11: mesString = "Noviembre";
                 break;
        case 12: mesString = "Diciembre";
                 break;
        default: mesString = "Invalid month";
                 break;
        }
		
		
		
	 fechaBalance="Balance General al "+dia+" de "+mesString+" "+year;
		
		
		
		
		
	}
	public void agregarReporte() {
		
    	Reporte reporte1 = new Reporte(this.tipoCuenta,this.nombreCuenta,0.0,0.0,0.0);
    	
    	
    	reportes.add(reporte1);
    	this.nombreCuenta="";
		
	}
	
	
	public void limpiarReporte() {
		fechaBalance = " ";
		empresa = "";
		reportes.clear();
	}
	
	public void onEdit(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Cuenta editada",((Reporte) event.getObject()).getConcepto());  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
       
    public void onCancel(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Cuenta cancelada");   
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        reportes.remove((Reporte) event.getObject());
    }
    
   

}
  
  
  
Por último vamos a crear otro ManagedBean que nos va crear un organigrama para la pantalla de ayuda teórica donde nos muestra todas la cuentas del balance general.Lo vamos a llamar BalanceDiagram
  package mx.com.tutosoftware.studentaccounting.bean;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DefaultOrganigramNode;
import org.primefaces.model.OrganigramNode;

@ManagedBean
@ViewScoped
public class BalanceDiagram implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private OrganigramNode rootNode;
	
	@PostConstruct
    public void init() {
		rootNode = new DefaultOrganigramNode("root", "Balance General", null);
        rootNode.setCollapsible(false);
        rootNode.setDroppable(true);
        
        
        OrganigramNode activo = addDivision(rootNode, "Activo");
        
        
        
        OrganigramNode activoCirculante = addDivision(activo, "Activo Circulante");
        addDivision(activoCirculante, "Caja", "Bancos","Clientes","Almacén"
        		,"Documentos por cobrar");
        
        OrganigramNode activoFijo = addDivision(activo, "Activo Fijo");
        addDivision(activoFijo, "Equipo de oficina", "Edificios","Terrenos","Equipo de reparto"
        		,"Patentes y marcas","Depósitos en garantía","Deudores hipotecarios"
        		,"Aciones,bonos y valores","Papelería y artículos de escritorio"
        		,"Propagenda y publicidad");
        
        OrganigramNode cargosDiferidos = addDivision(activo, "Cargos Diferidos");
        addDivision(cargosDiferidos, "Primas de seguros adelantados", "Gastos de instalación"
        		,"Rentas anticipadas","Intereses pagados por anticipado");
        
        OrganigramNode pasivo = addDivision(rootNode,"Pasivo");
        
        OrganigramNode pasivoCirculante = addDivision(pasivo, "Pasivo Circulante o Flotante");
        addDivision(pasivoCirculante, "Proveedores", "Acreedores Diversos","Impuestos por pagar","Documentos por pagar");
        
        OrganigramNode pasivoFijo = addDivision(pasivo, "Pasivo Fijo o Consolidado");
        addDivision(pasivoFijo,"Documentos por pagar a largo plazo","Acreedores hipotecarios");
        
        OrganigramNode creditosDiferidos = addDivision(pasivo, "Créditos diferidos");
        addDivision(creditosDiferidos,"Rentas cobradas por adelantado","Intereses cobrados anticipadamente");
        
        
        
        OrganigramNode capital = addDivision(rootNode,"Capital");
        addDivision(capital,"Ventas","Costo de ventas","Gastos de administración"
        		,"Gastos y productos financieros","Otros gastos y productos"
        		,"Impuestos sobre la renta","Pérdidas y ganancias","Capital");
	}
	
	protected OrganigramNode addDivision(OrganigramNode parent, String name, String... cuentas) {
        OrganigramNode divisionNode = new DefaultOrganigramNode("division", name, parent);
        divisionNode.setDroppable(true);
        divisionNode.setDraggable(true);
        divisionNode.setSelectable(true);
 
        if (cuentas != null) {
            for (String cuenta : cuentas) {
                OrganigramNode employeeNode = new DefaultOrganigramNode("employee", cuenta, divisionNode);
                employeeNode.setDraggable(true);
                employeeNode.setSelectable(true);
            }
        }
 
        return divisionNode;
    }

	public OrganigramNode getRootNode() {
		return rootNode;
	}

	public void setRootNode(OrganigramNode rootNode) {
		this.rootNode = rootNode;
	}

}