jueves, 24 de febrero de 2011

PROYECTO: Especificación Técnica

Taller de Programación Orientada a Objetos – Semana 5 – Reporte 5`

SISTEMA DE FACTURACIÓN





Título: Especificación Técnica "Sistema de Facturación"
Autor: Juan Carlos Espinosa Ceniceros
Version del software: 0.3

Índice:
0. Introducción y Generalidades
1. Clases y Métodos
2. GUI
3. Base de Datos

0. Introducción



El Sistema de Facturación involucra una serie de interfaces que en conjunto generan uno de los sistemas de administración más poderoso del mundo.

0.1 Objetivo



El objetivo del software es mejorar la administración de una empresa, proporcionando las herramientas necesarias para:
- Facilitar la creación de facturas.
- Facilitar la contabilidad de la empresa.
- Reducir tiempos y costos.

0.2 Descripcion Funcional



El sistema contempla las siguientes funciones:
- Manejar una base de datos con todos clientes.
- Manejar una base de datos con las facturas.
- Mantener un registro de todos los movimientos realizados a una factura, un cliente y a la base de datos en general.
- Generar de forma automática reportes de contabilidad, ya sean diarios, semanales, quincenales o mensuales.
- Generar según las necesidades del usuario, copias digitales de cada documento, las cuales podrán ser impresas cuando sea necesario.
- Permitir la búsqueda de un documento, aplicando una variedad de filtros según las necesidades del usuario.

0.3 Aspectos técnicos



- Sistema portable (compatible, por lo menos, con los 3 sistemas operativos más usados en PCs)
- Escrito en lenguaje de programación JAVA, integrando librerías de MySQL.
- Incorporación de todas las librerías necesarias para exportar documentos a PDF, impresora y facturación electrónica

Se trata de un sistema monousuario, basado en las necesidades de una sola persona que a su vez es la administradora del negocio, por lo que no se ha pensado en implementar algún sistema de seguridad. Aún asi se ha evaluado esta opción y posiblemente se incluya un sistema de control en el cual sea necesario introducir una contraseña para realizar algunas acciones delicadas. No se tienen visualizadas dichas acciones delicadas, pero se espera que con el tiempo salgan a relucir estos detalles.

1. Clases y Métodos



Se contemplan 4 clases padre diferentes y 5 subclases. Una mejor funcionalidad posiblemente se traduzca en algunas clases extra, pero eso se verá conforme haya más avances.

1.1 Clase Billing



Es la clase principal, prepara la interfaz gráfica creando la ventana principal, una barra con menús y una barra de herramientas. Controla las comunicaciones entre las demás clases y la comunicación entre la base de datos y la aplicación principal. Cierra las comunicaciones y finaliza la aplicación.

1.1.1 Subclase Proxy



Su función principal es abrir un camino entre la aplicación principal y la base de datos. Sus atributos pueden ser una factura y una persona. Abre, manipula, guarda y cierra la base de datos. Busca, abre, manipula, guarda y cierra archivos.

Métodos de la Subclase

1.1.1.1 Método write()

Su función es guardar algún dato dependiendo del tipo de información recibida, puede recibir una factura o un cliente. El método responde de diferente forma a cada caso. Si el dato es un cliente, se procede a almacenarlo en la base de datos. Si el dato es una factura, se procede a guardarla en un formato compatible. Para ello se genera ya sea un nuevo archivo en la computadora o un nuevo registro en la base de datos. Los datos se escriben en el archivo de forma que puedan ser extraídos fácilmente después y se procede a almacenarlo. Los datos del cliente se vacían en el registro y se procede a guardarlo en la base de datos.
*NOTA: Aún falta definir el formato y la manera de guardar la factura. Falta generar la base de datos.

1.1.1.2 Método read()

Su función es extraer datos, ya de una factura o de la base de datos. Recibe un string que indica el valor a extraer y un entero cuya función es actuar como bandera e indicar el tipo de dato enviado. El método abre la base de datos o un archivo según sea el caso. Posteriormente se lee en busca de coincidencias, una vez que se ha dado con el dato, esté se almacena en alguna variable, lista o estructura y se regresan los datos que se han pedido.
*NOTA: Aún falta definir el proceso para ejecutar este método y la forma en que los datos serán regresados.

1.1.1.3 Método find()

Su función es realizar búsquedas profundas, puede combinarse con el método read() para generar resultados. Una vez realizado el proceso de read() su función será ordenar los datos hallados y mostrarlos en una estructura lógica que pueda ser interpretada fácilmente por el usuario.
Recibe un string que indica el valor a extraer y un entero cuya función es actuar como bandera e indicar el tipo de dato enviado. Regresa los resultados de la búsqueda.
*NOTA: Falta la implementación completa.

1.1.1.4 Método delete()

Se encarga de eliminar una factura o cliente de la base de datos. Su funcionalidad se combina con los métodos read() y find() para poder ubicar el archivo o dato preciso a eliminar.
Simplemente borra el archivo o registro seleccionado sin alterar la estructura de los demás registros o archivos. Recibe un string que indica el nombre del archivo o registro a eliminar y un entero cuya función es actuar como bandera e indicar el tipo de dato enviado. Regresa un entero, 0 para éxito, cualquier otro valor para error. Posteriormente se muestra un mensaje indicando la razón del error.
*NOTA: Falta la implementación

1.1.2 Método gui()


Como su nombre lo indica, contiene todas aquellas instrucciones necesarias para generar la interfaz gráfica. Importa funciones de la librería javax.swing para crear ventanas, paneles y botones necesarios para la interfaz. Se genera la ventana principal y los paneles donde se colocarán los demás elementos (botones, cuadros de texto, etcétera). Se definen tamaños, colores y demás elementos necesarios.

1.1.3 Constructor



public Billing(): Es el constructor de la clase, su función es generar una nueva área de trabajo. Provee los canales de comunicación y demás funciones.

1.1.4 Método principal



public static void main (String[] args ): Clase principal dentro de cualquier código generado en el lenguaje de programación JAVA, se encarga de llamar al contructor y al método Gui().
*NOTA: Falta la implementación avanzada del constructor, el método gui() y el método main().

1.2 Clase Person



Son las personas involucradas en una factura, es decir, el proveedor y el cliente.
Esta clase tiene dos subclases:

1.2.1 Subclase Client



Genera un nuevo cliente, es el primer paso para generar la factura. Los atributos son los justos para lograr una buena identificación del mismo.

1.2.2 Subclase Supplier



Genera un nuevo proveedor para la factura, esto es en teoría ya que solo existe un solo proveedor. Por consiguiente se tiene la teoría de que los datos de esta persona serán estáticos a menos que se necesite lo contrario.

1.2.3 Método getData()

Su función es pedir los datos que almacenaran los atributos del cliente. Se necesita primero implementarlo en la línea de comandos, una entrada y salida básica de datos. Posteriormente se debe implementar en forma de cuadros de texto en la ventana principal. Los datos son almacenados en el cliente. El cliente debe enviarse a la factura para su posterior manipulación.

1.3 Clase Order



Es el primer paso para generar una factura, se crea una lista con todos los artículos incluidos en la orden de compra.

1.3.1Método getOrder()

Su función es capturar la orden y almacenar la información en los atributos de la misma. Se implementa una interfaz secilla, una entrada y salida de datos básica en la terminal. Después se implementa por medio de campos de texto en la interfaz. Toda la orden se almacena, se empaqueta y es enviada a la factura.

1.4 Clase Bill



Es el último lugar que visita toda la información que hemos capturado, por consiguiente, es la clase que se encarga de generar la factura y redireccionarla de diferentes formas.
La clase tiene como atributos un proveedor (Supplier), un cliente (Client) y un pedido (Order). La unión de estos tres conforma la factura. Posteriormente la factura queda en Standby, esperando alguna instrucción del usuario. Dichas instrucciones quedan definidas por los siguientes métodos:

1.4.1 Método make()

Hasta ahora es un método hipotético. Su función será generar folios para sí misma, el cual debe ser progresivo y diferente a todos los anteriores, posteriormente se unirán las 2 personas (Person [Supplier, Client]) y el pedido. Se generara la factura.
Su función parece más la de un constructor, pero veremos si es necesario para realizar otras acciones.

1.4.2 Método export()

Su función es la de exportar la factura a diferentes formatos, puede ser en formato local para simplemente guardarla en la computadora.
También se puede exportar la factura a PDF para generar una versión electrónica. Y la última opción es generar una versión compatible para ser impresa.
*NOTA: Falta la implementación de ambos métodos y las librerías que ayudaran a exportar

2. GUI



La ventana principal es generada por el método gui() dentro de la clase principal Billing.
gui() genera una ventana, posteriormente se genera la barra de menús con 3 botones a los cuales se asignan estas funciones:

1. Nueva Factura: Provee herramientas para generar una nueva factura y otras acciones.
2. Base de Datos: Provee herramientas para manipular la base de datos.
3. Búsqueda: Provee herramientas y filtros para buscar un cliente o factura.

Los tres botones anteriores son montados en un panel tipo gridLayout()

Cada uno de los menús afecta una segunda barra llamada barra de herramientas. Esta barra provee acciones específicas para cada menú por lo cual debe ser redibujada cada vez que se cambia entre los 3 menús antes escritos.

Al centro se encontrara el panel principal, por asi llamarlo. Es el panel que cambiara dependiendo del menú seleccionado y posteriormente servirá para mostrar el área con los campos para generar una nueva factura, los resultados de una búsqueda o la visualización de una factura en PDF.

3. Base de datos



Se integra al sistema una base de datos usando MySQL.
*NOTA: Falta la base de datos.

4. Referencias



Estas referencias explican a grandes razgos lo que es una especificación técnica:

http://spanish.joelonsoftware.com/PainlessSpecs/2.html
http://spanish.joelonsoftware.com/PainlessSpecs/WhatTimeIsIt_Spanish.html
http://www.ub.edu.ar/catedras/ingenieria/ing_software/ubftecwwwdfd/espsoft/espsoft.htm
http://es.w3support.net/index.php?db=so&id=677901

Estas referencia contienen ejemplos acerca de como realizar una especificación técnica

http://www.joelonsoftware.com/articles/fog0000000043.html
http://www.cajatrujillo.com.pe/portalnew/doc/proveedores/ESPECIFICACIONESTECNICASSWANTIFRAUDE.pdf
http://www.gridlab.org/Resources/Deliverables/D9.2.pdf

lunes, 14 de febrero de 2011

PROYECTO: Presentación de Temas

Programación Orientada a Objetos - Semana 5 - Reporte 5

Les subo las diapositivas de mi clase, están muy claras y creo no necesitan explicación alguna :)











domingo, 13 de febrero de 2011

PROYECTO: Documentación y Herramientas Avanzadas de desarrollo

Taller de Programación Orientada a Objetos – Semana 4 – Reporte 4

Que tal compañeros!!

En la siguiente entrada les mostraré como aplique la herramienta JAVADOC a mi código en particular. La verdad fue muy fácil y sencillo y lo mejor es que no hay que instalar nada (tomando en cuenta que han instalado el JDK, y que están codificando en el lenguaje JAVA)


Para referencias de cómo instalar JDK en sus equipos den clic AQUÍ


Para empezar hay que identificar cada clase, y a su vez los métodos que dicha clase, y a su vez los parámetros que recibe el método y el valor que regresa.
Después hay que tener aunque sea una vaga idea de para qué sirve cada parte que hemos identificado, para así lograr generar un comentario sólido y explicar claramente su funcionalidad.

Posteriormente procederemos a generar nuestra documentación con el comando: javadoc, en mi caso con la siguiente sintáxis:

En las imágenes pueden ver ejemplos de los comentarios que introduje en mi código, así como parte de las clases con sus métodos que intenté explicar.





Después de una serie de comentarios parecidos en otras clases y métodos de mi código logré un resultado como este:



Son varias capturas de pantalla donde se muestra la documentación generada por Javadoc.

Y una parte del HTML generado, también vía captura de pantalla.






Espero les sea útil esta información

Saludos!!!

PROYECTO: Documentación y Herramientas de desarrollo

Programación Orientada a Objetos – Semana 4 – Reporte 4

La documentación en cualquier producto es importante, nos dan las instrucciones a seguir en caso de que se genere alguna duda o problema, mucha gente no le da crédito a la documentación de un artículo y por lo general al abrir algo nuevo comenzamos por tirar los instructivos y hasta las pólizas de seguro sin ni siquiera darles un vistazo.

Nosotros como desarrolladores tenemos la obligación de proporcionar a nuestros clientes un documento claro y conciso donde explicamos al funcionamiento de nuestro software; esta será una futura referencia para todos aquellos que quieran ayudarnos a mejorar nuestro software y para guiarlos y que entiendan la visión que tuvimos al momento de construirlo; incluso será una referencia para nosotros mismos ya que en códigos extensos es imposible recordar para que funcionaba y que acción realizaba un segmento de nuestro código.

Por lo general, en los lenguajes de programación que así lo permiten, los comentarios son suficientes para colocar referencias en ciertas partes de nuestro código, sin embargo, existen ciertas herramientas que nos ayudan a generar documentos avanzados que permiten tener una perspectiva más amplia y detallada de las partes y funciones de nuestro software.

JAVADOC





El lenguaje de programación Java incluye una poderosa herramienta que nos permite generar la documentación de nuestro código de manera rápida y bastante profesional, su nombre es JAVADOC.

Javadoc es capaz de generar la documentación de nuestro código de manera instantánea y sin necesidad de abandonar la tradicional sintaxis de los comentarios dentro del código.

Metodología



La forma de generar la documentación por medio de Javadoc es simple, tan fácil como introducir comentarios dentro de nuestro código.

Simplemente tenemos que colocar la explicación ya sea de una clase, método o atributo dentro de un espacio parecido a este:
/**
*Aqui
*pon
*el
*comentario
*

Como pueden ver, el inicio del comentario inicia con una diagonal y DOS asteriscos (los dos asteriscos son parte de la sintaxis de Javadoc, sirven como identificadores) y cada línea empieza con un asterisco y el comentario finaliza con un asterisco y una diagonal.

Si se quiere explicar el funcionamiento de una clase o función, el comentario de Javadoc se coloca justamente arriba de la misma, por ejemplo:
/**
* Clase de tipo Animal
* Genera un objeto animal
*/
public class Animal {
private String reino;
private String familia
}


En los métodos se puede colocar un identificador de parámetros que indica, valga la redundancia, los parámetros que dicho método recibe como atributos, para ello de escribe @param, y posteriormente el nombre del parámetro y la explicación del mismo. Así mismo el identificador @return indica el tipo y nombre del valor regresado por el método. Por ejemplo:
/**
* Divide un número entre otro número
* @param x Dividendo
* @param y Divisor
* @return El cociente de la division.
*/
Double division (double x, double y) {
Return cociente;
}


Para terminar, se deberá generar la documentación del código escribiendo en la terminal la instruccion Javadoc, con una sintaxis mas o menos asi:

javadoc ubicación

donde "ubicación" deberá sustituirse por la ubicación de nuestro paquete de clases, es como si fueramos a compilar pero utilizando el comando javadoc

Javadoc genera varios archivitos HTML y páginas de estilo CSS que en conjunto formaran una documentación muy parecida a la que encontramos en la página oficial de la API de Java. De igual forma podremos navegar por nuestra página donde veremos el resultado final de todos los comentarios que colocamos dentro del código.
Para más referencias sobre el uso, identificadores, sintaxis o tips acerca de Javadoc se puede visitar la página oficial del proyecto siguiendo esta liga:


El link lo agregaré a la barra de Recursos, la cual pueden encontrar en el Sidebar de mi blog.

Saludos!!!

☺ ☻ ☺ ☻

martes, 8 de febrero de 2011

PROYECTO: Implementación de Herencia y Poliformismo

Taller de Programación Orientada a Objetos - Semana 3 - Reporte 3

Hola de nuevo!!

Tal como lo expliqué en la entrada de abajo, trataré de implementar la herencia en el código de mi proyecto:

CLASE PERSONA

Esta clase contiene todos los datos propios de las personas que interactúan en el negocio, en este caso el comprador o cliente, y el vendedor o proveedor.
public class Persona {
   private String nombre;
   private String direccion;
   private String empresa;
   private String rfc;
   private String mail;
      
   public Persona (String n, String d, String e, String r, String m) {
      nombre = n;
      direccion = d;
      empresa = e;
      rfc = r;
      mail = m;
   }
}

class Proveedor extends Persona {
   public Proveedor (String n, String d, String e, String r, String m) {
   super(n, d, e, r, m);
   }
}

class Cliente extends Persona {
   public Cliente (String n, String d, String e, String r, String m) {
   super(n, d, e, r, m);
   }
}

CLASE Factura

La clase Factura puede generar dos tipos de facturas: electronicas o en papel
Esta clase hará uso de los datos de las personas involucradas y del pedido para generarse a si misma
public class Bill {

    private Person client;
    private Person supplier;
    private Order order;

    private String id;

    public Bill (Person c, Person s, Order o, String i) {
        client = c;
        supplier = s;
        order = o;
        id = i;
    }
}

class ElectronicBill extends Bill {
    public ElectronicBill (Person c, Person s, Order o, String i) {
        super (c, s, o, i);
    }
}

class PaperBill extends Bill {
    public PaperBill (Person c, Person s, Order o, String i) {
        super (c, s, o, i);
    }
}


Estas son las implementaciones de herencia en mi código, espero les sea útil la información.

SALUDOS!! :)

PROYECTO: Herencia y Polimorfismo

Programación Orientada a Objetos - Semana 3 - Reporte 3

Hola a todos. Para este reporte veremos cómo implementar la herencia y polimorfismo en el código de nuestro proyecto.

Para empezar veamos algunas definiciones y ejemplos rápidos:

HERENCIA: Cuando una clase padre (o superclase) comparte atributos y métodos propios con las clases hijas (o subclases).

Para que se entienda mejor:
En el mundo hay animales (superclase), pero hay diferentes tipos de animales (mamíferos, reptiles, aves, peces [subclases]). La clase animales hereda a las demás subclases algunos de sus atributos, por ejemplo: número de patas, color, tamaño, etcétera. A su vez hereda algunos métodos, por ejemplo: ver, oler, oir.

Las subclases pueden a su vez implementar métodos propios, por ejemplo: las avez vuelan, característica dificílmente compartible con los demás. Es el mismo caso con los peces, los cuales nadan y los demás no.

Atributos serían las características de los animales (físico, aunque no necesariamente), y los métodos serían lo que los animales hacen con dichos atributos.





POLIMORFISMO: La superclase puede hacer referencia a cualquiera de sus subclases, y dependiendo de dicha referencia, serán los métodos a ejecutar y su resultado.

Por ejemplo:
Animal hace referencia a la subclase mamífero y se ejecuta el método Desplazamiento y se imprime la línea ("Los mamíferos van sobre sus patas peludas").
En cambio si animal hace referencia a la subclase pez y se ejecuta el método Desplazamiento se imprimira la línea ("Los peces nadan con sus delicadas aletas").
El resultado depende de la referencia hecha por la superclase.

Aplicando al código



Hice una reformulación masiva de mi código para poder lograr que éste tema encajará en mi proyecto.

La herencia la aplicaré en la clase que ahora llamo Persona. Esta clase tiene 2 subclases idénticas llamadas Cliente y Proveedor, ambos comparten los atributos de la clase madre:

- Un nombre
- Una dirección
- Un RFC (Importantísimo en las facturas)
- Una empresa
- Etcétera

Ambas subclases se construyen de acuerdo a los atributos de la clase madre.

Una factura comparte atributos de otras clases, ya que una factura se genera a partir de un Cliente, un Proveedor y un Pedido (2 personas y 1 pedido). Entonces, haciendo uso de algunos métodos, se necesitan saber los atributos de las personas y del pedido para poder llenar la factura. Por consiguiente debe existir cierta herencia por parte de las personas hacia las facturas.

Un comunicación entre mi aplicación y mi base de datos necesita saber más cosas que ningún otro, primeramente necesito saber si he de buscar una factura o un cliente; sabiendo eso yo necesito usar los atributos de alguna de estas 2 clases para generar una buena búsqueda, alta, baja o modificación.

Es una explicación general de mi código, espero generar mas ideas conforme realizo mi código asi que espero hacer más conexiones raras entre mis clases conforme pasé el tiempo (no mucho :) ).

Saludos