Retroalimentación Ingeniería de Software

APDevs - ITC

Proyecto

Construir un modulo de paquetes para el punto de venta

<?php

namespace Modules\Paquetes\Http\Controllers\API;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Paquetes\Entities\Paquete;
use Modules\Sucursales\Entities\Local;
use Exception;

class PaquetesController extends Controller
{

	/**
	 * Display a listing of the resource.
	 * @return Response
	 */
	public function index(Request $request, $local_id)
	{
		$local = Local::findOrFail($local_id);

		return $local->paquetes()->with('opciones')->get();
	}

	/**
	 * Store a newly created resource in storage.
	 * @param  Request $request
	 * @return Response
	 */
	public function store(Request $request, $local_id)
	{
		$local = Local::findOrFail($local_id);

		$paquete = new Paquete($request->all());
		$paquete->local()->associate($local);
		$paquete->saveOrFail();

		return $paquete;
	}

	/**
	 * Show the specified resource.
	 * @return Response
	 */
	public function show($local_id, $paquete_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->with('opciones.platillos', 'opciones.paquetes')
			->findOrFail($paquete_id);

		return $paquete;
	}

	/**
	 * Update the specified resource in storage.
	 * @param  Request $request
	 * @return Response
	 */
	public function update(Request $request, $local_id, $paquete_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$paquete->fill($request->all());
		$paquete->saveOrFail();

		return $paquete;
	}

	/**
	 * Remove the specified resource from storage.
	 * @return Response
	 */
	public function destroy(Request $request, $local_id, $paquete_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		if (! $paquete->delete()) {
			throw new Exception('Error al eliminar paquete');
		}

		return response()->noContent();
	}

}
<?php

namespace Modules\Paquetes\Http\Controllers\API;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Paquetes\Entities\Paquete;
use Modules\Paquetes\Entities\OpcionPaquete;
use Exception;

class OpcionesPaquetesController extends Controller
{

	/**
	 * Display a listing of the resource.
	 * @return Response
	 */
	public function index(Request $request, $local_id, $paquete_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		return $paquete->opciones()->with('platillos', 'productos')->get();
	}

	/**
	 * Store a newly created resource in storage.
	 * @param  Request $request
	 * @return Response
	 */
	public function store(Request $request, $local_id, $paquete_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = new OpcionPaquete($request->all());
		$opcion->paquete()->associate($paquete);
		$opcion->saveOrFail();

		return $opcion;
	}

	/**
	 * Show the specified resource.
	 * @return Response
	 */
	public function show(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()
			->with('platillos', 'productos')
			->findOrFail($opcion_id);

		$opcion->setRelation('paquete', $paquete);

		return $opcion;
	}

	/**
	 * Update the specified resource in storage.
	 * @param  Request $request
	 * @return Response
	 */
	public function update(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()->findOrFail($opcion_id);
		$opcion->fill($request->all());
		$opcion->saveOrFail();

		return $opcion;
	}

	/**
	 * Remove the specified resource from storage.
	 * @return Response
	 */
	public function destroy(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()->findOrFail($opcion_id);

		if (! $opcion->delete()) {
			throw new Exception('Error al eliminar la opcion del paquete');
		}

		return ['success'=>'true'];
	}

}
<?php

namespace Modules\Paquetes\Http\Controllers\API;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Paquetes\Entities\Paquete;
use Modules\Paquetes\Entities\OpcionPaquete;
use Modules\Productos\Entities\Producto;
use Exception;

class ProductosPaquetesController extends Controller
{

	/**
	 * Show the form for creating a new resource.
	 * @return Response
	 */
	public function create(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()->findOrFail($opcion_id);

		return $opcion->productos()->get();
	}

	/**
	 * Store a newly created resource in storage.
	 * @param  Request $request
	 * @return Response
	 */
	public function store(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()
			->with('productos')
			->findOrFail($opcion_id);

		$producto = Producto::findOrFail($request->input('producto_id'));

		if ($opcion->productos->contains($producto)) {
			throw new Exception('Ya existe el producto en la opcion de paquete');
		}

		$opcion->productos()->attach($producto);

		return $producto;
	}

	/**
	 * Remove the specified resource from storage.
	 * @return Response
	 */
	public function destroy(Request $request, $local_id, $paquete_id, $opcion_id)
	{
		$paquete = Paquete::where('local_id', '=', $local_id)
			->findOrFail($paquete_id);

		$opcion = $paquete->opciones()
			->with('productos')
			->findOrFail($opcion_id);

		$producto = Producto::findOrFail($request->input('producto_id'));

		if ($opcion->productos->contains($producto)) {
			throw new Exception('Ya existe el producto en la opcion de paquete');
		}

		$opcion->productos()->attach($producto);

		return $producto;
	}

}
{
    "id": 1,
    "local_id": 1,
    "nombre": "Paquete 1",
    "precio": 100,
    "codigo": "paquete1",
    "created_at": "2018-06-04 19:36:00",
    "updated_at": "2018-06-04 19:36:00",
    "opciones": [
        {
            "id": 1,
            "paquete_id": 1,
            "nombre": "Bebida",
            "descripcion": "Bebida taparrosca o preparada",
            "cantidad": 1,
            "created_at": "2018-06-04 19:37:38",
            "updated_at": "2018-06-04 19:37:38",
            "platillos": [
                {
                    "id": 6,
                    "local_id": 1,
                    "nombre": "Naranjada",
                    "costo": 0,
                    "porcentaje_ganancia": 100,
                    "precio_sugerido": 0,
                    "precio_venta": 25,
                    "historial_costos": "",
                    "historial_precios": "",
                    "created_at": "2018-06-04 19:57:54",
                    "updated_at": "2018-06-04 19:57:54",
                    "porcentaje_estimado": 0,
                    "imagen": "",
                    "costo_adicional": 0,
                    "costo_productos": 0,
                    "codigo_barras": null,
                    "pivot": {
                        "opcion_id": 1,
                        "platillo_id": 6,
                        "created_at": "2018-06-04 19:58:36",
                        "updated_at": "2018-06-04 19:58:36"
                    }
                },
                {
                    "id": 7,
                    "local_id": 1,
                    "nombre": "Limonada",
                    "costo": 0,
                    "porcentaje_ganancia": 100,
                    "precio_sugerido": 0,
                    "precio_venta": 25,
                    "historial_costos": "",
                    "historial_precios": "",
                    "created_at": "2018-06-04 19:58:05",
                    "updated_at": "2018-06-04 19:58:05",
                    "porcentaje_estimado": 0,
                    "imagen": "",
                    "costo_adicional": 0,
                    "costo_productos": 0,
                    "codigo_barras": null,
                    "pivot": {
                        "opcion_id": 1,
                        "platillo_id": 7,
                        "created_at": "2018-06-04 19:58:39",
                        "updated_at": "2018-06-04 19:58:39"
                    }
                }
            ],
            "productos": [
                {
                    "id": 1015,
                    "created_at": "2018-06-04 19:41:07",
                    "updated_at": "2018-06-04 19:46:47",
                    "nombre": "Sprite 500ml",
                    "descripcion": "",
                    "codigo_barras": "sprite1",
                    "tipo_unidad": "pieza",
                    "categoria_id": null,
                    "codigo_producto": "sprite",
                    "created_by": null,
                    "pivot": {
                        "opcion_id": 1,
                        "producto_id": 1015,
                        "created_at": "2018-06-04 19:48:49",
                        "updated_at": "2018-06-04 19:48:49"
                    },
                    "categoria": null
                },
                {
                    "id": 1014,
                    "created_at": "2018-06-04 19:40:44",
                    "updated_at": "2018-06-04 19:41:33",
                    "nombre": "Coca Cola 500ml",
                    "descripcion": "",
                    "codigo_barras": "cocacola",
                    "tipo_unidad": "pieza",
                    "categoria_id": 16,
                    "codigo_producto": "",
                    "created_by": null,
                    "pivot": {
                        "opcion_id": 1,
                        "producto_id": 1014,
                        "created_at": "2018-06-04 19:49:04",
                        "updated_at": "2018-06-04 19:49:04"
                    },
                    "categoria": {
                        "id": 16,
                        "nombre": "bebidas",
                        "descripcion": "",
                        "created_at": "2018-06-04 19:40:44",
                        "updated_at": "2018-06-04 19:40:44"
                    }
                }
            ]
        },
        {
            "id": 2,
            "paquete_id": 1,
            "nombre": "Pizza mediana",
            "descripcion": "Pizza mediana de especialidad",
            "cantidad": 1,
            "created_at": "2018-06-04 19:52:39",
            "updated_at": "2018-06-04 19:52:39",
            "platillos": [
                {
                    "id": 3,
                    "local_id": 1,
                    "nombre": "Pizza Pepperoni",
                    "costo": 0,
                    "porcentaje_ganancia": 100,
                    "precio_sugerido": 0,
                    "precio_venta": 150,
                    "historial_costos": "",
                    "historial_precios": "",
                    "created_at": "2018-06-04 19:54:16",
                    "updated_at": "2018-06-04 19:54:16",
                    "porcentaje_estimado": 0,
                    "imagen": "",
                    "costo_adicional": 0,
                    "costo_productos": 0,
                    "codigo_barras": null,
                    "pivot": {
                        "opcion_id": 2,
                        "platillo_id": 3,
                        "created_at": "2018-06-04 19:55:48",
                        "updated_at": "2018-06-04 19:55:48"
                    }
                },
                {
                    "id": 4,
                    "local_id": 1,
                    "nombre": "Pizza Mexicana",
                    "costo": 0,
                    "porcentaje_ganancia": 100,
                    "precio_sugerido": 0,
                    "precio_venta": 180,
                    "historial_costos": "",
                    "historial_precios": "",
                    "created_at": "2018-06-04 19:54:44",
                    "updated_at": "2018-06-04 19:55:08",
                    "porcentaje_estimado": 0,
                    "imagen": "",
                    "costo_adicional": 0,
                    "costo_productos": 0,
                    "codigo_barras": null,
                    "pivot": {
                        "opcion_id": 2,
                        "platillo_id": 4,
                        "created_at": "2018-06-04 19:55:52",
                        "updated_at": "2018-06-04 19:55:52"
                    }
                },
                {
                    "id": 5,
                    "local_id": 1,
                    "nombre": "Pizza Tres Quesos",
                    "costo": 0,
                    "porcentaje_ganancia": 100,
                    "precio_sugerido": 0,
                    "precio_venta": 180,
                    "historial_costos": "",
                    "historial_precios": "",
                    "created_at": "2018-06-04 19:54:59",
                    "updated_at": "2018-06-04 19:55:20",
                    "porcentaje_estimado": 0,
                    "imagen": "",
                    "costo_adicional": 0,
                    "costo_productos": 0,
                    "codigo_barras": null,
                    "pivot": {
                        "opcion_id": 2,
                        "platillo_id": 5,
                        "created_at": "2018-06-04 19:55:55",
                        "updated_at": "2018-06-04 19:55:55"
                    }
                }
            ],
            "productos": []
        }
    ]
}

¿Qué aprendimos? 

Uso del framework Laravel

<?php

namespace Modules\Paquetes\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Paquetes\Entities\Paquete;

class PaquetesController extends Controller
{
    /**
     * Display a listing of the resource.
     * @return Response
     */
    public function index(Request $request)
    {
        $local_id = $request->local_id;
        if ($request->filled('local_id')) {
    return $query = DB::table('paquetes')->select('nombre','costo')->where('local_id','=',$local_id);
         }
        return Paquete::all();
    }

    /**
     * Store a newly created resource in storage.
     * @param  Request $request
     * @return Response
     */
    public function store(Request $request)
    {
         $request->validate(Paquete::$rules);
         return Paquete::create($request->all());
    }

    /**
     * Show the specified resource.
     * @return Response
     */

    public function show($paquete_id)
    {
        $paquete = Paquete::findOrFail($paquete_id);
        return $paquete;
    }
    

    /**
     * Update the specified resource in storage.
     * @param  Request $request
     * @return Response
     */
    public function update(Request $request, $paquete_id)
    {
         $paquete = Paquete::findOrFail($paquete_id);

        $paquete->update($request->all());

        return $paquete;

    }

    /**
     * Remove the specified resource from storage.
     * @return Response
     */
    public function destroy($paquete_id)
    {
        $paquete = Paquete::findOrFail($paquete_id);

        $paquete->delete();

        return ['success'=>true];
    }
}

Creación de recursos para API

Código colaborativo

git fetch
# Descarga los cambios realizados en el repositorio remoto.

git merge <nombre_rama>
# Impacta en la rama en la que te encuentras parado, los cambios realizados en la rama “nombre_rama”.

git pull
# Unifica los comandos fetch y merge en un único comando.

git commit -am "<mensaje>"
# Confirma los cambios realizados. El “mensaje” generalmente se usa para asociar al commit una breve descripción de los cambios realizados.

git push origin <nombre_rama>
# Sube la rama “nombre_rama” al servidor remoto.

git status
# Muestra el estado actual de la rama, como los cambios que hay sin commitear.

git add <nombre_archivo>
# Comienza a trackear el archivo “nombre_archivo”.

git checkout -b <nombre_rama_nueva>
# Crea una rama a partir de la que te encuentres parado con el nombre “nombre_rama_nueva”, y luego salta sobre la rama nueva, por lo que quedas parado en esta última.

git checkout -t origin/<nombre_rama>
# Si existe una rama remota de nombre “nombre_rama”, al ejecutar este comando se crea una rama local con el nombre “nombre_rama” para hacer un seguimiento de la rama remota con el mismo nombre.

git branch
# Lista todas las ramas locales.

git branch -a
# Lista todas las ramas locales y remotas.

git branch -d <nombre_rama>
# Elimina la rama local con el nombre “nombre_rama”.

git push origin <nombre_rama>
# Commitea los cambios desde el branch local origin al branch “nombre_rama”.

git remote prune origin
# Actualiza tu repositorio remoto en caso que algún otro desarrollador haya eliminado alguna rama remota.

git reset --hard HEAD
# Elimina los cambios realizados que aún no se hayan hecho commit.

git revert <hash_commit>
# Revierte el commit realizado, identificado por el “hash_commit”.

Abstracción a Módulos

Gráficos de trabajo

Sistema de control escolar

APDevs POS

Aspectos a considerar

Conocimiento del lenguaje

    /**
     * Display a listing of the resource.
     * @return Response
     */
    public function index(Request $request)
    {
        $local_id = $request->local_id;

        if ($request->filled('local_id'))
        {
            return $query = DB::table('paquete')
                ->select('nombre','costo')
                ->where('local_id','=',local_id);
        }

        //return Paquete::all();
    }

Bases de programación

<?php

namespace Modules\Productos\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Productos\Entities\Producto;

class ProductosController extends Controller
{
    /**
     * Display a listing of the resource.
     * @return Response
     */
    public function index()
    {
        return Producto::all();
    }

    /**
     * Store a newly created resource in storage.
     * @param  Request $request
     * @return Response
     */
public function store(Request $request)
{
    $producto = new Producto($request->all());

    if ($request->hasFile('imagen')) {
        $producto->imagen = $this->uploadFile($request);
    }

    $producto->save();

    return $producto;
}


    /**
     * Show the specified resource.
     * @return Response
     */
    public function show($producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        return $producto;
    }

    /**
     * Update the specified resource in storage.
     * @param  Request $request
     * @return Response
     */
    public function update(Request $request, $producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        $producto->update($request->all());

        return $producto;
    }

    /**
     * Remove the specified resource from storage.
     * @return Response
     */
    public function destroy($producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        $producto->delete();

        return ['success'=>true];
    }
}

Probar el código / TDD

<?php

namespace Modules\Productos\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\Productos\Entities\Producto;

class ProductosController extends Controller
{
    /**
     * Display a listing of the resource.
     * @return Response
     */
    public function index()
    {
        return Producto::all();
    }

    /**
     * Store a newly created resource in storage.
     * @param  Request $request
     * @return Response
     */
public function store(Request $request)
{
    $producto = new Producto($request->all());

    if ($request->hasFile('imagen')) {
        $producto->imagen = $this->uploadFile($request);
    }

    $producto->save();

    return $producto;
}


    /**
     * Show the specified resource.
     * @return Response
     */
    public function show($producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        return $producto;
    }

    /**
     * Update the specified resource in storage.
     * @param  Request $request
     * @return Response
     */
    public function update(Request $request, $producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        $producto->update($request->all());

        return $producto;
    }

    /**
     * Remove the specified resource from storage.
     * @return Response
     */
    public function destroy($producto_id)
    {
        $producto = Producto::findOrFail($producto_id);

        $producto->delete();

        return ['success'=>true];
    }
}

Design Patterns

¡Gracias!

jmanuel@apdevs.com

José Manuel Ruiz Pérez

Retroalimentación Ingeniería de Software 2018

By JManuel Ruiz

Retroalimentación Ingeniería de Software 2018

Integración de alumnos a proyectos de software

  • 626