0% encontró este documento útil (0 votos)
44 vistas62 páginas

FINAL

dsds
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
44 vistas62 páginas

FINAL

dsds
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

UNIVERSIDAD PRIVADA DEL VALLE

FACULTAD DE INFORMÁTICA Y ELECTRÓNICA

CARRERA DE INGENIERÍA DE SISTEMAS INFORMATICOS

SISTEMA WEB DE CONTROL DE INVENTARIOS PARA LA EMPRESA UNITARIA


VIVIKID

Integrantes:
Fernando Andrés Mendiola Andrade 100%
Josías Leonardo Perales Tapia 100%

Asignatura: Ingeniería de Software


Docente: Ing. Virginia Aspiazu Castro
Semestre: 1/2024

La Paz – Bolivia
I

CAPITULO III: INGENIERIA DEL PROYECTO


El sistema de control d inventario para la tienda de cosméticos VIVIKID está usando
la metodología XP, L planificación y ejecución de las tareas se detallan en la tabla
de planificación
Metodología y modelos base
(TABLA DE PLANIFICACION)
II

FASES TAREAS DOCUMENTOS RESPONSABLE


3.1.1 ANÁLISIS DE LA SITUACIÓN  Entrevista Equipo
ACTUAL

3.1.1.1 RECOPILACION DE
INFORMACION
3.1 3.1.1.2 ESPECIFICACION DE  Tabla de Equipo
PLANIFICACION PERSONAL INVOLUCRADO identificación
personal
2. REQUERIMIENTOS  épicas Equipo
3.1.2.1 ESPECIFIACION DE  tablas de
REQUERIMINETOS POR historias de
USUARIOS usuario

3.1.2.2 ESQUEMATIZACION DE LOS  diagrama de Equipo


REQUERIMIENTOS casos de uso de
alto nivel

3.2 ITERACIONES 3.2.1 ITERACION 1: MODULO DE  Tabla de Perales


PRODUCTOS Planificación de Josías
Productos
3.2.1.1 PLANIFICACION

3.2.1.2 ANALISIS  Casos de uso


expandido
3.2.1.3 DISEÑO  diagrama de
actividades
 Diseño de proceso
 mockups
 Diseño de interfaz
 diagrama de
 Diseño de objetos
navegación
 diagrama
 Diseño de base de entidad relación
datos

 Diseño arquitectónico

3.2.1.4 DESARROLLO  scripts

 Codificación  capturas de
pantalla
 Codificación de
interfaces  modelo
relacional MySQL
 Construcción de base
de datos  diccionario de
datos

3.2.1.5 PRUEBAS  Tabla de


prueba unitaria
III

3.2.2 ITERACION 2: MODULO DE  Tabla de Perales


COMPRAS Planificación de Josías
Compras
3.2.2.1 PLANIFICACION

3.2.2.2 ANALISIS  Casos de uso


expandido
3.2.2.3 DISEÑO  diagrama de
actividades
 Diseño de proceso
 mockups
 Diseño de interfaz
 diagrama de
 Diseño de objetos
navegación
 diagrama
 Diseño de base de entidad relación
datos

 Diseño arquitectónico

3.2.2.4 DESARROLLO  scripts

 Codificación  capturas de
pantalla
 Codificación de
interfaces  modelo
relacional MySQL
 Construcción de base
de datos  diccionario de
datos
3.2.2.5 PRUEBAS  Tabla de
prueba unitaria
3.2.3 ITERACION 3: MODULO DE  Tabla de Perales
ADMINISTRACIÓN DE SISTEMA Planificación de Josías
Ventas
3.2.3.1 PLANIFICACION

3.2.3.2 ANALISIS  Casos de uso


expandido
3.2.3.3 DISEÑO  diagrama de
actividades
 Diseño de proceso
 mockups
 Diseño de interfaz
 diagrama de
 Diseño de objetos
navegación
 diagrama
 Diseño de base de entidad relación
datos

 Diseño arquitectónico

3.2.3.4 DESARROLLO  scripts

 Codificación  capturas de
pantalla
IV

 Codificación de
interfaces  modelo
relacional MySQL
 Construcción de base
de datos  diccionario de
datos

3.2.3.5 PRUEBAS Tabla de prueba unitaria

3.2.2.1 Planificación Diagrama de Gantt FERNANDO


*Planificar iteraciones MENDIOLA

3.2.2.2 Análisis Diagrama de caso de uso FERNANDO


*Analizar procedimientos expandido MENDIOLA
3.2.2.3 Diseño Mockups FERNANDO
*Diseño de la interfaz de MENDIOLA
usuario
3.2.4
Iteración 4 - *Diseño de la base de datos Modelo Entidad relación FERNANDO
CLIENTES MENDIOLA
3.2.2.4 Desarrollo Scripts
*Codificación de backend
FERNANDO
MENDIOLA
3.2.2.5 Prueba Tabla de pruebas
*Prueba unitaria unitarias FERNANDO
MENDIOLA

3.2.5 3.2.3.1 Planificación Diagrama de Gantt FERNANDO


Iteración 5 – *Planificar iteraciones MENDIOLA
INFORMES Y REPORTES

3.2.3.2 Análisis * Diagrama de caso de uso FERNANDO


Analizar expandido MENDIOLA
procedimientos
3.2.3.3 Diseño Mockups FERNANDO
*Diseño de la interfaz de MENDIOLA
usuario
*Diseño de la base de datos Modelo Entidad relación FERNANDO
MENDIOLA
3.2.3.4 Desarrollo Scripts FERNANDO
*Codificación de backend MENDIOLA

*Desarrollar la interfaz gráfica Capturas de pantalla


FERNANDO
MENDIOLA
V

*Modelar la base de datos Modelo lógico de la base FERNANDO


de datos MENDIOLA
3.2.3.5 Prueba Tabla de pruebas FERNANDO
*Prueba unitaria unitarias MENDIOLA
*Identificación y
corrección de errores Informe de errores
3.2.6 3.2.4.1 Planificación Diagrama de Gantt FERNANDO
Iteración 6 - *Planificar iteraciones MENDIOLA
VENTAS 3.2.4.2 Análisis •Diagrama de Caso de
*Analizar procedimientos Uso expandido

3.2.4.3 Diseño •Mockups


*Diseño de la interfaz de
usuario

3.2.4.4 Desarrollo scripts FERNANDO


*Codificar Backend MENDIOLA

3.2.4.5 Prueba Tabla de pruebas FERNANDO


*Pruebas unitarias unitarias MENDIOLA
*Identificar y corregir los
errores
VI

ANALISIS DE LA SITUACIÓN ACTUAL

La tienda de cosméticos VIVIKID es un negocio de compra y venta de productos


relacionados a la cosmética y moda de útiles de belleza, esta tienda se encuentra
en la frontera entre dos países, Bolivia y Perú por lo que recibe clientes de ambos
lados,
La tienda VIVIKID adquiere productos de proveedores que pueden ser registrados o
terciarios y luego los revende a un precio elevado para generar ganancias, Cuenta
con una jerarquía de empleados contando con el administrador, vendedores y
ayudantes de inventario

RECOPILACION DE INFORMACIÓN
REALIZACIÓN DEL CUESTIONARIO
A partir de la información recopilada en la entrevista, se procedió a realizar un
cuestionario para poder recopilar más información relevante y de una forma más
personalizada para el cliente. Luego pudimos reunirnos de nuevo con la propietaria del
negocio para poder realizarle el cuestionario.
TRANSCRIPCIÓN DEL CUESTIONARIO REALIZADO
Cuestionario:
1. ¿Actualmente cuentan con un sistema ya implementado?
R. - No, es totalmente manual el control que se hace, no hay un sistema.
2. ¿Su negocio cuenta con una jerarquía de roles?
R. - Somos tres personas, yo como propietaria, mi esposo está en el área de
comercialización y una persona más nos ayuda con la distribución y almacenamiento
3. ¿Qué servicios ofrece a sus clientes?
R. - Lo que hacemos es vender los productos de cosmética de diferentes marcas como
loreal, elementos relacionados con el area de cosmetica, salud y cosmetica natural
4. ¿Como maneja la entrada de nuevos productos al inventario?
R. - hacíamos el control en una hoja Excel, que nos permite la cantidad el control de los
productos, la fecha de vencimiento y el precio de compra para poder controlar el margen
de ganancia, sin embargo, la laptop que teníamos se dañó y desde entonces estamos
haciendo el control manual
5. ¿Ustedes son proveedores de estos productos?
R. - No, tenemos más o menos 20 proveedores
6. ¿Qué cualidades registra de los productos para mantener un control?
VII

R. – La fecha de vencimiento y el lote de cuando hemos comprado


7. ¿Quiénes serán los usuarios de sistema?
R. – Mi persona(dueño) y el personal de compra y venta, cuando carecemos de tiempo los
tres teniamos acceso
8. ¿Qué rol es el que va a hacer más uso del sistema?
R. – Gestionar inventarios, fechas de vencimiento y lotes.
9. ¿Tiene contemplado en un futuro cercano expandir su negocio?
R. - Si, nos ayudaria tener mas control de los productos y expandirnos hacia una pagina
web
10. ¿Sabiendo que su negocio se encentra en frontera, cuentan con facilidades para
controlar su margen de utilidad?
R. - no, como mencionamos teniamos una hoja de excel pero como la computadora se
dañó lo hacemos desde entonces de manera manual
11. ¿Qué le convendría más a su negocio?
Inventarios hacer control de los inventarios tener un control, en una base de datos, la
cantidad de ventas la información actualizada, para poder tener en cuenta el lote y lo que
ya se ha vencido, porque nos ha pasado que compramos un lote, y como no hay un
adecuado control hemos despachado lotes, no se pueden vender productos vencidos, la
logica es tener en cuenta los lotes, ver cuanto hay en el almacén cuales son los depósitos,
cuando no hay control , nos hemos quedado con mercadería vencida, o productos con
fecha de vencimiento muy corta y ya no conviene la venta a los clientes.
12. ¿Maneja diferentes tipos de moneda?
Si, vendo en soles porque los vendedores son en su mayoria peruanos, y convertimos a
bolivianos en la frontera, usamos tres tipos de moneda, bolivianos, dolares, y soles, tipo
de cambio el costeo de los productos. Primero saber que se esta cotizando la moneda y
hacer el costeo de productos. justamente el tipo de cambio el tipo de cambio es bien
fluctiuante
13. ¿Qué es lo que busca que resuelva el a corto plazo?
R. -Controlar los ingresos y salidas de productos a almacenes para controlar la cantidad
real, mantener actualizado el precio unitario de venta, conocer estos datos cuando se
realizan ventas al por mayor, controlas las fechas de vencimiento de los productos.
14. ¿Cuáles son sus metas a largo plazo?
R. -Consolidarnos como una empresa y crecer, atraer inversionistas dejando de ser una
empresa unipersonal y magnificando los nichos de mercado a los cuales llegamos
ampliando nuestra gama de clientes, pero también de proveedores.
VIII

ESPECIFIACION DE REQUERIMINETOS POR USUARIOS

Épicas
Épicas de administrador

Épicas de vendedor

Yo como: Vendedor Yo como: Vendedor

Quiero: Revisar un historial de Quiero: Imprimir detalles de venta


ventas
Para: cumplir con las normas de la
Para: Atender reclamos tienda

Épicas de ayudante de inventario

Yo como: Ayudante de inventario Yo como: Ayudante de inventario


Quiero: que se tome en cuenta Quiero: poder visualizar los
recibir pagos acordes a mi esfuerzo productos
mi participación en las ventas
Para: ser mas eficiente a la hora de
Para: recibir pagos acordes a mi extraer y estibar los productos que
esfuerzo entran y salen
IX

TABLAS DE HISTORIAS DE USUARIO

AYUDANTE INVENTARIO

Historia Nro. 1 Registro de productos en inventario


Com Personal de Inventario
o:
Quie Registrar y filtrar productos del inventario
ro:
Para: Poder ingresar la información de nuevos productos que
se descargan a la tienda. Esto incluye el nombre del
producto, una descripción, el precio y la cantidad
disponible en stock.

Historia Nro. 2 Filtrado de productos


Com Personal de Inventario
o:
Quie Filtrar el registro de productos
ro:
Para: Buscar rápidamente un producto específico,
descargarlo del inventario y entregarlo al cliente con
mayor rapidez

Historia Nro. 3 Verificación de participación


Com Personal de inventario
o:
Quie Verificar mi participación en una venta
ro:
Para: Poder atender reclamos con fundamento y justificar mis
pagos
X

VENDEDOR

Historia Nro. 1 Facturación de detalle de venta


Com Vendedor
o:
Quie Combinar la información de las ventas con la de
ro: los clientes
Para: Tener la capacidad de generar recibos detallados
de las ventas que realice

Historia Nro. 2 Historial de ventas


Com Vendedor
o:
Quie Consultar el historial de ventas que realicé
ro:
Para: Poder atender reclamos con fundamento y
justificar mis pagos

Historia Nro. 3 Visualización de productos


Com Vendedor
o:
Quie Visualizar los productos existentes en inventario
ro:
Para: Verificar si un producto existe o no sin depender
del personal de inventario

Historia Nro. 4 Ventas de productos


Com Vendedor
o:
Quie Administrar las ventas que realizo, modificarlas y
ro: cancelarlas si no se realizan
Para: Tener un mayor control sobre las ventas que
realizo
XI

ADMINISTRADOR

Historia Nro.1 Administración de personal


Com Administrador
o:
Quie Registrar y controlar nuevo personal para la tienda
ro:
Para: Controlar los turnos del personal y administrar sus pagos

Historia Nro. 2 Administración de transacciones


Com Administrador
o:
Quie Controlar los cambios y actualizaciones que suceden en la
ro: tienda
Para: Prevenir errores o equivocaciones en el registro de información
y mantenerme al tanto del uso que el personal le da al sistema

Historia Nro. 3 Administración de Pagina Web Informativa


Com Administrador
o:
Quie Utilizar una página web
ro:
Para: Aumentar el alcance comercial de mi tienda

Historia Nro. 4 Administración de proveedores


Com Administrador
o:
Quie Registrar y controlar nuevos proveedores para la tienda
ro:
Para: Expandir el catálogo de productos y administrar las compras de
productos de los proveedores

Historia Nro. 5 Administración de clientes


Com Administrador
o:
Quie Registrar y controlar nuevos clientes que compran en la tienda
XII

ro:
Para: Tener un seguimiento de los clientes que compran en la tienda

ITERACION 2: MODULO DE COMPRAS


PLANIFICACION

DIAGRAMA DE GANTT

Seman Fase Tareas


a
1 Planificación Definir historias de usuario
2 Análisis Analizar requerimientos
3 Diseño Diseñar arquitectura del sistema
4-5 Desarrollo Codificar características del producto
6 Pruebas Realizar pruebas unitarias e integradas

ANALISIS

CASO DE USO EXPANDIDO


XIII

DISEÑO

DISEÑO DE PROCESO

DIAGRAMA DE ACTIVIDADES
XIV

DISEÑO DE INTERFAZ

MOCKUPS
XV

DISEÑO DE NAVEGACIÓN

DIAGRAMA DE OBJETOS

DISEÑO DE BASE DE DATOS

DIAGRAMA ENTIDAD-RELACIÓN
XVI

DESARROLLO

CODIFICACIÓN

Funciones.js (compras)
XVII

$(document).ready(function () {

$("#procesarCompra").click(function () {
var fila = $("#tablaCompras tr").length;
if (fila < 2) {
Swal.fire({
icon: 'warning',
title: 'No hay productos en la venta',
showConfirmButton: false,
timer: 2500
})
} else {
const total = {
totalP: $("#total").val()
}

$.ajax({
url: base + "Compras/registrar",
type: 'POST',
data: total,
success: function (response) {
Swal.fire({
icon: 'success',
title: 'Compra Generado',
showConfirmButton: false,
timer: 1500
})
ListarCompras();
}
})
}
});

CODIFICACIÓN DE INTERFACES

Listar.php

<?php encabezado() ?>


XVIII

<!-- Begin Page Content -->


<div class="page-content bg-light">
<div class="page-header bg-light">
<div class="container-fluid">
<h2 class="h5 no-margin-bottom">Nueva Compra</h2>
</div>
</div>
<section>
<div class="container-fluid">
<form action="" method="post" id="frmCompras" class="row"
autocomplete="off">
<div class="col-lg-3">
<div class="form-group">
<label for="buscar_codigo"><i class="fas fa-
barcode"></i> Código de barras</label>
<input type="hidden" id="id" name="id">
<input id="buscar_codigo"
onkeyup="BuscarCodigo(event);" class="form-control" type="text" name="codigo"
placeholder="Código de barras">
<span class="text-danger d-none" id="error"><i
class="fas fa-ad"></i> No hay producto</span>
</div>
</div>
<div class="col-lg-4">
<div class="form-group">
<label for="nombre">Producto</label>
<input id="nombre" class="form-control" type="hidden"
name="nombre">
<br />
<strong id="nombreP"></strong>
</div>
</div>
<div class="col-lg-2">
<div class="form-group">
<label for="cantidad">Cantidad</label>
<input id="cantidad" class="form-control" type="text"
name="cantidad" onkeyup="IngresarCantidad(event);">
</div>
</div>
<div class="col-lg-3">
<div class="form-group">
<label for="precio"><i class="fas fa-ad"></i>
Precio</label>
<input id="precio" class="form-control" type="hidden"
name="precio">
<br />
<strong id="precioP"></strong>
</div>
XIX

</div>
</form>
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-light mt-4"
id="tablaCompras">
<thead class="thead-dark">
<tr>
<th>Id</th>
<th>Producto</th>
<th>Cantidad</th>
<th>Precio</th>
<th>Total</th>
<th>Accion</th>
</tr>
</thead>
<tbody id="ListaCompras">

</tbody>
</table>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-4 ml-auto">
<div class="form-group mt-2">
<strong class="text-primary"><i class="fas fa-
ad"></i> Total a pagar: </strong>
<input type="hidden" id="total" value="0.00"
name="total" class="form-control mb-2">
<strong id="totalV"></strong><br>
<button class="btn btn-danger" type="button"
id="AnularCompra"><i class="fas fa-ad"></i> Anular</button>
<button class="btn btn-success" type="button"
id="procesarCompra"><i class="fas fa-ad"></i> Procesar</button>
</div>
</div>
</div>
</div>
</section>
</div>
<?php pie() ?>

ListarCompras.php

<?php encabezado() ?>


<!-- Begin Page Content -->
<div class="page-content bg-light">
XX

<div class="page-header bg-light">


<div class="container-fluid">
<h2 class="h5 no-margin-bottom">Compras Generadas</h2>
</div>
</div>
<section>
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<div class="table-responsive">
<table class="table table-hover table-bordered"
id="Table">
<thead class="thead-dark">
<tr>
<th>Id</th>
<th>Total</th>
<th>Fecha</th>
<th>Accion</th>
</tr>
</thead>
<tbody>
<?php foreach ($data as $lista) { ?>
<tr>
<td><?php echo $lista['id']; ?></td>
<td><?php echo $lista['total']; ?
></td>
<td><?php echo $lista['fecha']; ?
></td>
<td>
<a href="<?php echo base_url(); ?
>Compras/ver?id=<?php echo $lista['id']; ?>" target="_blank" rel="noopener
noreferrer" class="btn btn-primary">Ver</a>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>
</div>
<?php pie() ?>
VerCompras.php

<?php
require_once "Assets/pdf/fpdf.php";
$total = 0.00;
XXI

$pdf = new FPDF('P', 'mm', array(105, 148));


$pdf->AddPage();
$pdf->setFont('Arial', 'B', 14);
$pdf->setTitle("Reporte de Compra");
$pdf->image(base_url().'Assets/img/logo.jpg', 70, 5, 30, 30, 'JPG');
$pdf->setFont('Arial', 'B', 10);
$pdf->Cell(50, 5, utf8_decode($alert['nombre']), 0, 1, 'L');
$pdf->Cell(20, 5, utf8_decode("Ruc"), 0, 0, 'L');
$pdf->setFont('Arial', '', 10);
$pdf->Cell(50, 5, utf8_decode($alert['ruc']), 0, 1, 'L');
$pdf->setFont('Arial', 'B', 10);
$pdf->Cell(20, 5, utf8_decode("Teléfono"), 0, 0, 'L');
$pdf->setFont('Arial', '', 10);
$pdf->Cell(50, 5, utf8_decode($alert['telefono']), 0, 1, 'L');
$pdf->setFont('Arial', 'B', 10);
$pdf->Cell(20, 5, utf8_decode("Dirección"), 0, 0, 'L');
$pdf->setFont('Arial', '', 10);
$pdf->Cell(50, 5, utf8_decode($alert['direccion']), 0, 1, 'L');
$pdf->Ln();
$pdf->setFont('Arial', 'B', 10);
$pdf->Cell(80, 8, utf8_decode("Detalle de los Productos"), 0, 1, 'C');
$pdf->setFont('Arial', 'B', 10);
$pdf->SetTextColor(255, 255, 255);
$pdf->Cell(45, 5, utf8_decode('Descripción'), 1, 0, 'L', 1);
$pdf->Cell(10, 5, 'Cant.', 1, 0, 'L', 1);
$pdf->Cell(15, 5, 'Precio', 1, 0, 'L', 1);
$pdf->Cell(20, 5, 'Sub Total', 1, 1, 'L', 1);

foreach ($data as $compras) {


$subtotal = $compras['cantidad'] * $compras['precio'];
$total = $total + $subtotal;
$pdf->SetTextColor(0, 0, 0);
$pdf->Cell(45, 5, utf8_decode($compras['producto']), 1, 0, 'L');
$pdf->Cell(10, 5, $compras['cantidad'], 1, 0, 'L');
$pdf->Cell(15, 5, $compras['precio'], 1, 0, 'L');
$pdf->Cell(20, 5, number_format($subtotal, 2, '.', ','), 1, 1, 'L');
}
$pdf->Ln();
$pdf->Cell(90, 5, 'Total S/.'. number_format( $total, 2, '.', ','), 0, 1,
'R');

$pdf->Output();
?>

ComprasModel.php

?php
class ComprasModel extends Mysql{
XXII

public $id, $id_compra ,$codigo, $nombre, $cantidad, $precio, $id_producto


,$id_usuario, $total;
public function __construct()
{
parent::__construct();
}
public function selectCompras()
{
$sql = "SELECT * FROM compras WHERE estado = 1";
$res = $this->select_all($sql);
return $res;
}
public function selectDetalle()
{
$sql = "SELECT * FROM detalle_temp WHERE id_usuario = $_SESSION[id]";
$res = $this->select_all($sql);
return $res;
}
public function insertarDetalle(String $nombre, string $cantidad ,string
$precio, string $total, string $id_producto ,string $id_usuario)
{
$return = "";
$this->nombre = $nombre;
$this->cantidad = $cantidad;
$this->precio = $precio;
$this->total = $total;
$this->id_producto = $id_producto;
$this->id_usuario = $id_usuario;

$query = "INSERT INTO detalle_temp(nombre, cantidad, precio,


total, id_producto ,id_usuario) VALUES (?,?,?,?,?,?)";
$data = array($this->nombre,$this->cantidad, $this->precio, $this-
>total,$this->id_producto,$this->id_usuario);
$resul = $this->insert($query, $data);
$return = $resul;
return $return;
}
public function buscarProducto(int $codigo)
{
$this->codigo = $codigo;
$sql = "SELECT * FROM productos WHERE codigo = '{$this->codigo}' AND
estado = 1";
$res = $this->select($sql);
if (empty($res)) {
$res = 0;
}
return $res;
}
XXIII

public function actualizarCompras(String $codigo, string $nombre, string


$cantidad, string $precio, int $id)
{
$return = "";
$this->codigo = $codigo;
$this->nombre = $nombre;
$this->cantidad = $cantidad;
$this->precio = $precio;
$this->id = $id;
$query = "UPDATE compras SET codigo=?, nombre=?, cantidad=?, precio=?
WHERE id=?";
$data = array($this->codigo, $this->nombre, $this->cantidad, $this-
>precio, $this->id);
$resul = $this->update($query, $data);
$return = $resul;
return $return;
}
public function buscarProductoexiste($id_producto, $id_usuario)
{
$query = "SELECT * FROM detalle_temp WHERE id_usuario =
'{$id_usuario}' AND id_producto = '{$id_producto}'";
$resul = $this->select($query);
return $resul;
}
public function actualizarCantidad(int $cantidad,String $total, int $id)
{
$this->cantidad = $cantidad;
$this->total = $total;
$this->id = $id;
$query = "UPDATE detalle_temp SET cantidad =?, total =? WHERE id =?";
$data = array($this->cantidad, $this->total ,$this->id);
$resul = $this->update($query, $data);
return $resul;
}
public function verificarProductos($id_usuario)
{
$query = "SELECT * FROM detalle_temp WHERE id_usuario =
'{$id_usuario}'";
$resul = $this->select_all($query);
return $resul;
}
public function stockActual($id_producto)
{
$query = "SELECT cantidad FROM productos WHERE id = '{$id_producto}'";
$resul = $this->select($query);
return $resul;
}
public function buscaridC()
XXIV

{
$sql = "SELECT MAX(id) from compras";
$res = $this->select($sql);
return $res;
}
public function registrarCompra(String $total)
{
$return = "";
$this->total = $total;
$query = "INSERT INTO compras(total) VALUES (?)";
$data = array($this->total);
$resul = $this->insert($query, $data);
$return = $resul;
return $return;
}

public function registrarDetalle(String $id_compra, string $nombre ,string


$id_producto, string $cantidad, string $precio, $id_usuario)
{
$return = "";
$this->id_compra = $id_compra;
$this->id_producto = $id_producto;
$this->cantidad = $cantidad;
$this->precio = $precio;
$this->id_usuario = $id_usuario;
$this->nombre = $nombre;

$query = "INSERT INTO


detalle_compra(id_compra,producto,id_producto ,cantidad, precio,id_usuario)
VALUES (?,?,?,?,?,?)";
$data = array($this->id_compra,$this->nombre, $this->id_producto,
$this->cantidad, $this->precio, $this->id_usuario);
$resul = $this->insert($query, $data);
$return = $resul;
return $return;
}
public function ListaCompras(int $id_compra)
{
$sql = "SELECT * FROM detalle_compra WHERE id_compra =
'{$id_compra}'";
$res = $this->select_all($sql);
return $res;
}
public function registrarStock(int $cantidad, int $id)
{
$this->cantidad = $cantidad;
$this->id = $id;
$query = "UPDATE productos SET cantidad =? WHERE id =?";
XXV

$data = array($this->cantidad, $this->id);


$resul = $this->update($query, $data);
return $resul;
}
public function selectConfiguracion()
{
$sql = "SELECT * FROM configuracion";
$res = $this->select($sql);
return $res;
}
public function VaciarCompra(string $id_usuario)
{
$this->id = $id_usuario;
$sql = "DELETE FROM detalle_temp WHERE id_usuario = $id_usuario";
$resul = $this->delete($sql);
}
}

CONTRUCCIÓN DE BASE DE DATOS


XXVI

PRUEBAS

TABLA DE PRUEBA UNITARIA

ID Descripción Pasos Datos de Entrada Resultado Estado


Prueba Esperado
C1 Verificar 1. Acceder a la Producto: ID=1, Compra creada Exitosa
creación de página de Cantidad=10, correctamente
compra compras Proveedor: ID=2 y guardada en
la base de datos
2. Llenar el
formulario de
compra

3. Enviar el
formulario
C2 Verificar listado 1. Acceder a la N/A Mostrar lista de Exitosa
de compras página de listado compras con
de compras datos correctos
C3 Verificar 1. Acceder a la Producto: ID=1, Compra Exitosa
actualización de página de Cantidad=15, actualizada
compra edición de Proveedor: ID=2 correctamente
compra en la base de
datos
2. Modificar los
datos

3. Enviar el
formulario
C4 Verificar 1. Acceder a la Compra ID=1 Compra No
eliminación de página de listado eliminada Ejecutada
compra de compras correctamente
de la base de
2. Seleccionar datos
una compra

3. Eliminar la
compra
XXVII

ITERACION 1: MODULO DE PRODUCTOS


PLANIFICACION

DIAGRAMA DE GANTT

Seman Fase Tareas


a
7 Planificación Definir historias de usuario
8 Análisis Analizar requerimientos
9 Diseño Diseñar arquitectura del sistema
10-11 Desarrollo Codificar características del producto
12 Pruebas Realizar pruebas unitarias e integradas

ANALISIS

CASO DE USO EXPANDIDO


XXVIII

DISEÑO

DISEÑO DE PROCESO

DIAGRAMA DE ACTIVIDADES
XXIX

DISEÑO DE INTERFAZ

MOCKUPS

DISEÑO DE NAVEGACIÓN

DIAGRAMA DE OBJETOS
XXX

DISEÑO DE BASE DE DATOS

DIAGRAMA ENTIDAD-RELACIÓN

DESARROLLO
XXXI

CODIFICACIÓN

Conexión.php

<?php

$host = "localhost";
$user = "root";
$clave = "";
$bd = "sis_venta";
$conexion = mysqli_connect($host,$user,$clave,$bd);
if (mysqli_connect_errno()){
echo "No se pudo conectar a la base de datos";
exit();
}
mysqli_select_db($conexion,$bd) or die("No se encuentra la base de
datos");
mysqli_set_charset($conexion,"utf8");
?>

agregar_producto.php (php)

<?php
include_once "includes/header.php";
include "../conexion.php";
$id_user = $_SESSION['idUser'];
$permiso = "productos";
$sql = mysqli_query($conexion, "SELECT p.*, d.* FROM permisos p INNER JOIN
detalle_permisos d ON p.id = d.id_permiso WHERE d.id_usuario = $id_user AND
p.nombre = '$permiso'");
$existe = mysqli_fetch_all($sql);
if (empty($existe) && $id_user != 1) {
header("Location: permisos.php");
}
if (empty($_GET['id'])) {
header("Location: productos.php");
} else {
$id_producto = $_GET['id'];
if (!is_numeric($id_producto)) {
header("Location: productos.php");
}
$consulta = mysqli_query($conexion, "SELECT * FROM producto WHERE
codproducto = $id_producto");
$data_producto = mysqli_fetch_assoc($consulta);
}
if (!empty($_POST)) {
$alert = "";
XXXII

if (!empty($_POST['cantidad']) || !empty($_POST['precio']) || !
empty($_POST['producto_id'])) {
$precio = $_POST['precio'];
$cantidad = $_POST['cantidad'];
$producto_id = $_GET['id'];
$total = $cantidad + $data_producto['existencia'];
$query_insert = mysqli_query($conexion, "UPDATE producto SET
existencia = $total WHERE codproducto = $id_producto");
if ($query_insert) {
$alert = '<div class="alert alert-success" role="alert">
Stock actualizado
</div>';
} else {
$alert = '<div class="alert alert-danger" role="alert">
Error al ingresar la cantidad
</div>';
}mysqli_close($conexion);
} else {
$alert = '<div class="alert alert-danger" role="alert">
Todo los campos son obligatorios
</div>';
}
editar_producto.php (php)

<?php
include_once "includes/header.php";
include "../conexion.php";
$id_user = $_SESSION['idUser'];
$permiso = "productos";
$sql = mysqli_query($conexion, "SELECT p.*, d.* FROM permisos p INNER JOIN
detalle_permisos d ON p.id = d.id_permiso WHERE d.id_usuario = $id_user AND
p.nombre = '$permiso'");
$existe = mysqli_fetch_all($sql);
if (empty($existe) && $id_user != 1) {
header("Location: permisos.php");
}
if (!empty($_POST)) {
$alert = "";
if (empty($_POST['codigo']) || empty($_POST['producto']) ||
empty($_POST['precio'])) {
$alert = '<div class="alert alert-primary" role="alert">
Todo los campos son requeridos
</div>';
} else {
$codproducto = $_GET['id'];
$codigo = $_POST['codigo'];
$producto = $_POST['producto'];
$precio = $_POST['precio'];
XXXIII

$query_update = mysqli_query($conexion, "UPDATE producto SET codigo =


'$codigo', descripcion = '$producto', precio= $precio WHERE codproducto =
$codproducto");
if ($query_update) {
$alert = '<div class="alert alert-primary" role="alert">
Producto Modificado
</div>';
} else {
$alert = '<div class="alert alert-primary" role="alert">
Error al Modificar
</div>';
}
}
}

// Validar producto

if (empty($_REQUEST['id'])) {
header("Location: productos.php");
} else {
$id_producto = $_REQUEST['id'];
if (!is_numeric($id_producto)) {
header("Location: productos.php");
}
$query_producto = mysqli_query($conexion, "SELECT * FROM producto WHERE
codproducto = $id_producto");
$result_producto = mysqli_num_rows($query_producto);

if ($result_producto > 0) {
$data_producto = mysqli_fetch_assoc($query_producto);
} else {
header("Location: productos.php");
}
}
?>

Producto.php (php)

<?php include_once "includes/header.php";


include "../conexion.php";
$id_user = $_SESSION['idUser'];
$permiso = "productos";
$sql = mysqli_query($conexion, "SELECT p.*, d.* FROM permisos p INNER JOIN
detalle_permisos d ON p.id = d.id_permiso WHERE d.id_usuario = $id_user AND
p.nombre = '$permiso'");
$existe = mysqli_fetch_all($sql);
if (empty($existe) && $id_user != 1) {
header("Location: permisos.php");
}
XXXIV

if (!empty($_POST)) {
$codigo = $_POST['codigo'];
$producto = $_POST['producto'];
$precio = $_POST['precio'];
$cantidad = $_POST['cantidad'];
$usuario_id = $_SESSION['idUser'];
$alert = "";
if (empty($codigo) || empty($producto) || empty($precio) || $precio <
0 || empty($cantidad) || $cantidad < 0) {
$alert = '<div class="alert alert-danger" role="alert">
Todo los campos son obligatorios
</div>';
} else {
$query = mysqli_query($conexion, "SELECT * FROM producto WHERE
codigo = '$codigo'");
$result = mysqli_fetch_array($query);
if ($result > 0) {
$alert = '<div class="alert alert-warning" role="alert">
El código ya existe
</div>';
} else {
$query_insert = mysqli_query($conexion,"INSERT INTO
producto(codigo,descripcion,precio,existencia,usuario_id) values ('$codigo',
'$producto','$precio','$cantidad','$usuario_id')");
if ($query_insert) {
$alert = '<div class="alert alert-success" role="alert">
Producto Registrado
</div>';
} else {
$alert = '<div class="alert alert-danger" role="alert">
Error al registrar el producto
</div>';
}
}
}
}
?>
XXXV

CODIFICACIÓN DE INTERFACES

agregar_producto.php (html)

<div class="row">
<div class="col-lg-6 m-auto">
<div class="card">
<div class="card-header bg-primary">
Agregar Producto
</div>
<div class="card-body">
<form action="" method="post">
<?php echo isset($alert) ? $alert : ''; ?>
<div class="form-group">
<label for="precio">Precio Actual</label>
<input type="text" class="form-control" value="<?php
echo $data_producto['precio']; ?>" disabled>
</div>
<div class="form-group">
<label for="precio">Cantidad de productos
Disponibles</label>
<input type="number" class="form-control" value="<?
php echo $data_producto['existencia']; ?>" disabled>
</div>
<div class="form-group">
<label for="precio">Nuevo Precio</label>
<input type="text" placeholder="Ingrese nombre del
precio" name="precio" class="form-control" value="<?php echo
$data_producto['precio']; ?>">
</div>
<div class="form-group">
<label for="cantidad">Agregar Cantidad</label>
<input type="number" placeholder="Ingrese cantidad"
name="cantidad" id="cantidad" class="form-control">
</div>

<input type="submit" value="Actualizar" class="btn btn-


primary">
<a href="productos.php" class="btn btn-
danger">Regresar</a>
</form>
</div>
</div>
</div>
</div>
XXXVI

editar_producto.php (html)

<div class="row">
<div class="col-lg-6 m-auto">

<div class="card">
<div class="card-header bg-primary text-white">
Modificar producto
</div>
<div class="card-body">
<form action="" method="post">
<?php echo isset($alert) ? $alert : ''; ?>
<div class="form-group">
<label for="codigo">Código de Barras</label>
<input type="text" placeholder="Ingrese código de barras"
name="codigo" id="codigo" class="form-control" value="<?php echo
$data_producto['codigo']; ?>">
</div>
<div class="form-group">
<label for="producto">Producto</label>
<input type="text" class="form-control" placeholder="Ingrese
nombre del producto" name="producto" id="producto" value="<?php echo
$data_producto['descripcion']; ?>">

</div>
<div class="form-group">
<label for="precio">Precio</label>
<input type="text" placeholder="Ingrese precio" class="form-
control" name="precio" id="precio" value="<?php echo $data_producto['precio'];
?>">

</div>
<input type="submit" value="Actualizar Producto" class="btn btn-
primary">
<a href="productos.php" class="btn btn-danger">Atras</a>
</form>
</div>
</div>
</div>
</div>
XXXVII

Producto.php (html)

<button class="btn btn-primary mb-2" type="button" data-toggle="modal" data-


target="#nuevo_producto"><i class="fas fa-plus"></i></button>
<?php echo isset($alert) ? $alert : ''; ?>
<div class="table-responsive">
<table class="table table-striped table-bordered" id="tbl">
<thead class="thead-dark">
<tr>
<th>#</th>
<th>Código</th>
<th>Producto</th>
<th>Precio</th>
<th>Stock</th>
<th>Estado</th>
<th></th>
</tr>
</thead>
<tbody>
<?php
include "../conexion.php";

$query = mysqli_query($conexion, "SELECT * FROM producto");


$result = mysqli_num_rows($query);
if ($result > 0) {
while ($data = mysqli_fetch_assoc($query)) {
if ($data['estado'] == 1) {
$estado = '<span class="badge badge-pill badge-
success">Activo</span>';
} else {
$estado = '<span class="badge badge-pill badge-
danger">Inactivo</span>';
}
?>
<tr>
<td><?php echo $data['codproducto']; ?></td>
<td><?php echo $data['codigo']; ?></td>
<td><?php echo $data['descripcion']; ?></td>
<td><?php echo $data['precio']; ?></td>
<td><?php echo $data['existencia']; ?></td>
<td><?php echo $estado ?></td>
<td>
<?php if ($data['estado'] == 1) { ?>
<a href="agregar_producto.php?id=<?php echo
$data['codproducto']; ?>" class="btn btn-primary"><i class='fas fa-audio-
description'></i></a>
XXXVIII

<a href="editar_producto.php?id=<?php echo


$data['codproducto']; ?>" class="btn btn-success"><i class='fas fa-
edit'></i></a>

<form action="eliminar_producto.php?id=<?php
echo $data['codproducto']; ?>" method="post" class="confirmar d-inline">
<button class="btn btn-danger"
type="submit"><i class='fas fa-trash-alt'></i> </button>
</form>
<?php } ?>
</td>
</tr>
<?php }
} ?>
</tbody>

</table>
</div>
<div id="nuevo_producto" class="modal fade" tabindex="-1" role="dialog" aria-
labelledby="my-modal-title" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title" id="my-modal-title">Nuevo
Producto</h5>
<button class="close" data-dismiss="modal" aria-
label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form action="" method="post" autocomplete="off">
<?php echo isset($alert) ? $alert : ''; ?>
<div class="form-group">
<label for="codigo">Código de Barras</label>
<input type="text" placeholder="Ingrese código de
barras" name="codigo" id="codigo" class="form-control">
</div>
<div class="form-group">
<label for="producto">Producto</label>
<input type="text" placeholder="Ingrese nombre del
producto" name="producto" id="producto" class="form-control">
</div>
<div class="form-group">
<label for="precio">Precio</label>
<input type="text" placeholder="Ingrese precio"
class="form-control" name="precio" id="precio">
</div>
XXXIX

<div class="form-group">
<label for="cantidad">Cantidad</label>
<input type="number" placeholder="Ingrese cantidad"
class="form-control" name="cantidad" id="cantidad">
</div>
<input type="submit" value="Guardar Producto" class="btn
btn-primary">
</form>
</div>
</div>
</div>
</div>

CONTRUCCIÓN DE BASE DE DATOS


XL

PRUEBAS

TABLA DE PRUEBA UNITARIA

ID Descripción Pasos Datos de Resultado Esperado Estado


Prueba Entrada
P1 Verificar 1. Acceder a la Nombre: Producto creado Exitosa
creación de página de "Producto A", correctamente y
producto productos Precio: 100, guardado en la base
Stock: 50 de datos
2. Llenar el
formulario de
producto

3. Enviar el
formulario
P2 Verificar listado 1. Acceder a la N/A Mostrar lista de Exitosa
de productos página de productos con datos
listado de correctos
productos
P3 Verificar 1. Acceder a la Nombre: Producto actualizado Exitosa
actualización de página de "Producto B", correctamente en la
producto edición de Precio: 150, base de datos
producto Stock: 60

2. Modificar los
datos

3. Enviar el
formulario
P4 Verificar 1. Acceder a la Producto ID=1 Producto eliminado Exitosa
eliminación de página de correctamente de la
producto listado de base de datos
productos

2. Seleccionar
un producto

3. Eliminar el
producto
XLI

ITERACION 3: MODULO DE ADMINISTRACIÓN DE SISTEMA


PLANIFICACION

DIAGRAMA DE GANTT

Seman Fase Tareas


a
13 Planificación Definir historias de usuario
14 Análisis Analizar requerimientos
15 Diseño Diseñar arquitectura del sistema
16-17 Desarrollo Codificar características del producto
18 Pruebas Realizar pruebas unitarias e integradas

ANALISIS

CASO DE USO EXPANDIDO


XLII

DISEÑO

DISEÑO DE PROCESO

DIAGRAMA DE ACTIVIDADES
XLIII

DISEÑO DE INTERFAZ

MOCKUPS

DISEÑO DE NAVEGACIÓN

DIAGRAMA DE OBJETOS
XLIV

DISEÑO DE BASE DE DATOS

DIAGRAMA ENTIDAD-RELACIÓN
XLV

DESARROLLO

CODIFICACIÓN

Rol.php (php)

<?php include_once "includes/header.php";

require_once "../conexion.php";
$id = $_GET['id'];
$sqlpermisos = mysqli_query($conexion, "SELECT * FROM permisos");
$usuarios = mysqli_query($conexion, "SELECT * FROM usuario WHERE idusuario =
$id");
$consulta = mysqli_query($conexion, "SELECT * FROM detalle_permisos WHERE
id_usuario = $id");
$resultUsuario = mysqli_num_rows($usuarios);
if (empty($resultUsuario)) {
header("Location: usuarios.php");
}
$datos = array();
foreach ($consulta as $asignado) {
$datos[$asignado['id_permiso']] = true;
}
if (isset($_POST['permisos'])) {
$id_user = $_GET['id'];
$permisos = $_POST['permisos'];
mysqli_query($conexion, "DELETE FROM detalle_permisos WHERE id_usuario =
$id_user");
if ($permisos != "") {
foreach ($permisos as $permiso) {
$sql = mysqli_query($conexion, "INSERT INTO
detalle_permisos(id_usuario, id_permiso) VALUES ($id_user,$permiso)");
if ($sql == 1) {
header("Location: rol.php?id=".$id_user."&m=si");
} else {
$alert = '<div class="alert alert-primary" role="alert">
Error al actualizar permisos
</div>';
}
}
}
}
?>
XLVI

Usuarios.php (php)

<?php include_once "includes/header.php";


include "../conexion.php";
$id_user = $_SESSION['idUser'];
$permiso = "usuarios";
$sql = mysqli_query($conexion, "SELECT p.*, d.* FROM permisos p INNER JOIN
detalle_permisos d ON p.id = d.id_permiso WHERE d.id_usuario = $id_user AND
p.nombre = '$permiso'");
$existe = mysqli_fetch_all($sql);
if (empty($existe) && $id_user != 1) {
header("Location: permisos.php");
}
if (!empty($_POST)) {
$alert = "";
if (empty($_POST['nombre']) || empty($_POST['correo']) ||
empty($_POST['usuario']) || empty($_POST['clave'])) {
$alert = '<div class="alert alert-danger" role="alert">
Todo los campos son obligatorios
</div>';
} else { $nombre = $_POST['nombre'];
$email = $_POST['correo'];
$user = $_POST['usuario'];
$clave = md5($_POST['clave']);
$query = mysqli_query($conexion, "SELECT * FROM usuario where correo =
'$email'");
$result = mysqli_fetch_array($query);
if ($result > 0) {
$alert = '<div class="alert alert-warning" role="alert">
El correo ya existe
</div>';
} else { $query_insert = mysqli_query($conexion, "INSERT INTO
usuario(nombre,correo,usuario,clave) values ('$nombre', '$email', '$user',
'$clave')");
if ($query_insert) {
$alert = '<div class="alert alert-primary" role="alert">
Usuario registrado
</div>';
header("Location: usuarios.php");
} else {
$alert = '<div class="alert alert-danger" role="alert">
Error al registrar
</div>';
}
}
}
}
?>
XLVII

CODIFICACIÓN DE INTERFACES

Rol.php (html)

<div class="row">

<div class="col-md-6 mx-auto">


<div class="card">
<div class="card-header bg-warning text-white">
Permisos
</div>
<div class="card-body">
<form method="post" action="">
<?php if(isset($_GET['m']) && $_GET['m'] == 'si') { ?>
<div class="alert alert-success" role="alert">
Permisos actualizado
</div>

<?php } ?>
<?php while ($row = mysqli_fetch_assoc($sqlpermisos)) { ?>
<div class="form-check form-check-inline m-4">
<label for="permisos" class="p-2 text-
uppercase"><?php echo $row['nombre']; ?></label>
<input id="permisos" type="checkbox"
name="permisos[]" value="<?php echo $row['id']; ?>" <?php

if (isset($datos[$row['id']])) {

echo "checked";

?>>
</div>
<?php } ?>
<br>
<button class="btn btn-primary btn-block"
type="submit">Modificar</button>
</form>
</div>
</div>
</div>
</div>

Usuarios.php (html)
XLVIII

<button class="btn btn-primary" type="button" data-toggle="modal" data-


target="#nuevo_usuario"><i class="fas fa-plus"></i></button>
<div id="nuevo_usuario" class="modal fade" tabindex="-1" role="dialog" aria-
labelledby="my-modal-title" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header bg-primary text-white">
<h5 class="modal-title" id="my-modal-title">Nuevo Usuario</h5>
<button class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form action="" method="post" autocomplete="off">
<?php echo isset($alert) ? $alert : ''; ?>
<div class="form-group">
<label for="nombre">Nombre</label>
<input type="text" class="form-control"
placeholder="Ingrese Nombre" name="nombre" id="nombre">
</div>
<div class="form-group">
<label for="correo">Correo</label>
<input type="email" class="form-control"
placeholder="Ingrese Correo Electrónico" name="correo" id="correo">
</div>
<div class="form-group">
<label for="usuario">Usuario</label>
<input type="text" class="form-control"
placeholder="Ingrese Usuario" name="usuario" id="usuario">
</div>
<div class="form-group">
<label for="clave">Contraseña</label>
<input type="password" class="form-control"
placeholder="Ingrese Contraseña" name="clave" id="clave">
</div>
<input type="submit" value="Registrar" class="btn btn-
primary">
</form>
</div>
</div>
</div>
</div>
<div class="table-responsive">
<table class="table table-hover table-striped table-bordered mt-2"
id="tbl">
<thead class="thead-dark">
<tr>
<th>#</th>
XLIX

<th>Usuario</th>
<th>Nombre</th>
<th>Correo</th>
<th>Estado</th>
<th></th>
</tr>
</thead>
<tbody>
<?php ?>
<?php
include "../conexion.php";

$query = mysqli_query($conexion, "SELECT * FROM usuario ORDER BY


estado DESC");
$result = mysqli_num_rows($query);
if ($result > 0) {
while ($data = mysqli_fetch_assoc($query)) {
if ($data['estado'] == 1) {
$estado = '<span class="badge badge-pill badge-
success">Activo</span>';
} else {
$estado = '<span class="badge badge-pill badge-
danger">Inactivo</span>';
}
?>
<tr>

<td><?php echo $data['idusuario']; ?></td>


<td><?php echo $data['nombre']; ?></td>
<td><?php echo $data['correo']; ?></td>
<td><?php echo $data['usuario']; ?></td>
<td><?php echo $estado; ?></td>
<td>
<?php if ($data['estado'] == 1) { ?>
<a href="rol.php?id=<?php echo
$data['idusuario']; ?>" class="btn btn-warning"><i class='fas fa-key'></i></a>
<a href="editar_usuario.php?id=<?php echo
$data['idusuario']; ?>" class="btn btn-success"><i class='fas fa-
edit'></i></a>
<form action="eliminar_usuario.php?id=<?php
echo $data['idusuario']; ?>" method="post" class="confirmar d-inline">
<button class="btn btn-danger"
type="submit"><i class='fas fa-trash-alt'></i> </button>
</form>
<?php } ?>
</td>
</tr>
<?php }
L

} ?>
</tbody>
</table>
</div>

CONTRUCCIÓN DE BASE DE DATOS

PRUEBAS

TABLA DE PRUEBA UNITARIA

ID Descripción Pasos Datos de Entrada Resultado Estado


Prueba Esperado
A1 Verificar 1. Acceder a la Nombre: "Usuario A", Usuario creado Exitosa
creación de página de Email: correctamente
usuario administración de "[email protected]", y guardado en
usuarios Rol: "Admin" la base de
datos
2. Llenar el
formulario de
usuario

3. Enviar el
formulario
A2 Verificar 1. Acceder a la N/A Mostrar lista de Exitosa
listado de página de listado usuarios con
usuarios de usuarios datos correctos
A3 Verificar 1. Acceder a la Nombre: "Usuario B", Usuario No
actualización página de edición Email: actualizado ejecutada
de usuario de usuario "[email protected]", correctamente
Rol: "User" en la base de
2. Modificar los datos
datos

3. Enviar el
formulario
A4 Verificar 1. Acceder a la Usuario ID=1 Usuario Exitosa
eliminación de página de listado eliminado
usuario de usuarios correctamente
de la base de
2. Seleccionar un datos
usuario

3. Eliminar el
usuario

ITERACION 4: MODULO DE CLIENTES


LI

PLANIFICACION:

DIAGRAMA DE GANTT

Planificación del proyecto

Tarea Fecha de inicio Fecha de fin Responsable

Reunión inicial 2024-03-01 2024-03-02 Josias Perales

Definición de objetivos 2024-03-03 2024-03-04 Fernando Mendiola

Asignación de roles 2024-03-05 2024-03-06 Josias Perales

Desarrollo del producto

Tarea Fecha de inicio Fecha de fin Responsable

Diseño del software 2024-03-20 2024-03-30 Josias Perales

Desarrollo del software 2024-04-01 2024-04-30 Fernando Mendiola

Pruebas del software 2024-05-01 2024-05-09 Josias Perales

ANALISIS:

Caso expandido de uso de ventas

Caso de uso: Registro de venta

Actores: Vendedor

Propósito: Registrar las ventas realizadas a los clientes

Resumen: El vendedor ingresará al sistema en el módulo de Ventas, procederá a registrar los


productos vendidos con sus respectivas cantidades, precios y detalles del cliente. Al
finalizar el registro, el sistema emitirá un reporte en el módulo de informes y reportes.

Tipo: Primario

DISEÑO:
LII

Diseño de la interfaz de usuario

DESARROLLO:

añadir cliente
LIII

editar cliente

Eliminar cliente

PRUEBA:

Error Identificado Descripción Corrección Código Corregido

Uso de mysqli_fetch_all Verificación php $sql =


mysqli_fetch_all puede fallar si la añadida para mysqli_query($conexion,
"SELECT p.*, d.* FROM
sin verificar conexión consulta no se ejecuta asegurar que la
correctamente. permisos p INNER JOIN
exitosa consulta se
detalle_permisos d ON p.id =
ejecuta d.id_permiso WHERE
correctamente. d.id_usuario = $id_user AND
p.nombre = '$permiso'"); if
(!$sql) { die('Error en la
consulta de permisos: ' .
LIV

mysqli_error($conexion)); }
$existe =
mysqli_fetch_all($sql);

Las
variables
No hay $id_use
escape r y php $id_user =
de $permis mysqli_real_escape_string($conexio
Uso de
variables o deberían mysqli_real_escape_strin n, $_SESSION['idUser']); $permiso
para ser =
g para escapar las variables. mysqli_real_escape_string($conexio
prevenir escapadas
SQL para n, $permiso);
Injection prevenir
SQL
Injection.

Verificación php $query =


añadida para mysqli_query($conexion,
asegurar que la "SELECT v.*, c.idcliente,
c.nombre FROM ventas v
mysqli_fetch_assoc consulta se INNER JOIN cliente c ON
mysqli_fetch_assoc ejecuta
puede fallar si la v.id_cliente =
no verifica la consulta
consulta no se ejecuta c.idcliente"); if (!
exitosa $query) { die('Error en
correctamente.
la consulta de ventas:
correctamente. ' .
mysqli_error($conexion));
}

Las
variables php <td><?php echo
que se htmlspecialchars($row['id']); ?></td>
Falta de <td><?php echo
muestran en Uso de
sanitización htmlspecialchars($row['nombre']); ?
el HTML htmlspecialchars
de salida ></td> <td><?php echo
deben ser para sanitizar las htmlspecialchars($row['total']); ?
para prevenir
sanitizadas variables. ></td> <td><?php echo
XSS
para htmlspecialchars($row['fecha']); ?
prevenir ></td>
XSS.

ITERACION 5: MODULO DE INFORMES Y REPORTES

PLANIFICACION:
LV

ANALISIS:

Caso expandido de uso de Informes y Reportes

Caso de uso: Visualización de Informes y Reportes

Actores: Administrador

Propósito: Controlar las compras y ventas de la tienda

Resumen: El administrador ingresará al sistema en el módulo de Informes


y reportes, procederá a visualizar las compras y ventas
realizadas con detalle de fecha. Estos datos no se podrán
modificar

Tipo: Secundario

DISEÑO:
LVI

DESARROLLO:

PRUEBA:
LVII

ITERACION 6: MODULO DE VENTAS

PLANIFICACION:
LVIII

ANALISIS:

Caso expandido de uso de ventas

Caso de uso: Registro de venta

Actores: Vendedor

Propósito: Registrar las ventas realizadas a los clientes

Resumen: El vendedor ingresará al sistema en el módulo de Ventas,


procederá a registrar los productos vendidos con sus
respectivas cantidades, precios y detalles del cliente. Al
finalizar el registro, el sistema emitirá un reporte en el módulo
de informes y reportes.

Tipo: Primario

DISEÑO:

DESARROLLO:

Interfaz de ventas
LIX

Lista de ventas

PRUEBA:
LX

VENTAS:

LISTA_VENTAS
LXI

También podría gustarte