Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DATABASE_URL="file:./dev.db"
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules
# Keep environment variables out of version control
.env
*.db
*.db-journal
112 changes: 32 additions & 80 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,87 +1,39 @@
# Prueba Técnica - Programador (Back-end)
La siguiente es una prueba para evaluar a los postulantes a programador **Back-end**.

## INTRODUCCIÓN
Este repositorio contiene una serie de requerimientos de un Caso Práctico, que busca evaluar las capacidades técnicas del candidato con respecto a las principales funciones y responsabilidades que se requieren dentro del área de Desarrollo de Tecnología de _Megabite_.

#### ¿Qué se busca evaluar?
Principalmente los siguientes aspectos:
* Creatividad para resolver los requerimientos,
* Calidad del código entregado (estructura y buenas prácticas),
* Eficiencia de los algoritmos entregados,
* Familiaridad con Frameworks y plataformas de desarrollo.

## ENTREGA
1. Recomendamos emplear un máximo de **4 (cuatro) horas** y enviar todo lo que puedas.
2. Se requiere de una **cuenta de GitHub** para realizar este ejercicio.
3. Implementar alguno de los siguientes lenguajes Python, Java o Node + Typescript. Puede usar el framework de su preferencia.
4. **Antes de comenzar a programar:**
* Realizar un `Fork` de este repositorio (https://github.com/Megabite-Food/backend-test).
* Clonar el fork a su máquina local `git clone git@github.com:USERNAME/FORKED-PROJECT.git`
* Crear un `branch` en su cuenta de GitHub utilizando su nombre completo.
6. **Al finalizar**, existen 2 (dos) opciones para entregar su proyecto:
* 1) Realizar un `Commit` de su proyecto, **enviar un `Pull Request` al branch con su NOMBRE**, y notificar a la siguiente dirección de correo electrónico [lespinoza@megabitefood.com](mailto:lespinoza@megabitefood.com) con asunto: [nombre]_[apellido]-resultado test [cargo].
* 2) Crear un archivo comprimido (.zip o .rar) de su proyecto y enviar a la siguiente dirección de correo electrónico lespinoza@megabitefood.com con asunto: [nombre]_[apellido]- resultado prueba técnica [cargo]

## EJERCICIO

Se desea administrar el acceso de vehículos a un estacionamiento de pago. El estacionamiento no se encuentra automatizado, por lo que existe un empleado encargado de registrar las entradas y salidas de vehículos.

Los vehículos se identifican por su número de placa. Cuando un vehículo entra en el estacionamiento el empleado registra su entrada y al salir registra su salida y, en algunos casos, cobra el importe correspondiente por el tiempo de estacionamiento.

El importe cobrado depende del tipo de vehículo:
* Los vehículos oficiales no pagan, pero se registran sus estancias para llevar el control.
(Una estancia consiste en una hora de entrada y una de salida)
* Los residentes pagan a final de mes a razón de PEN S/0.05 el minuto. La aplicación irá acumulando el tiempo (en minutos) que han permanecido estacionados.
* Los no residentes pagan a la salida del estacionamiento a razón de PEN S/0.5 por minuto.
Se prevé que en el futuro puedan incluirse nuevos tipos de vehículos, por lo que la aplicación desarrollada deberá ser fácilmente extensible en ese aspecto.

##### Casos de uso
![ Casos de uso](https://i.ibb.co/4JnJwyG/Screenshot-2021-06-12-at-20-11-11.png)

A continuación se describen los casos de uso. No se entra en detalles de la interacción entre el empleado y la aplicación (punto 1 de cada caso de uso), puesto que no va a ser tarea de este ejercicio desarrollar esa parte.

###### **Caso de uso "Registra entrada"**
1. El empleado elige la opción "registrar entrada" e introduce el número de placa del coche que entra.
2. La aplicación apunta la hora de entrada del vehículo.

###### **Caso de uso "Registra salida"**
1. El empleado elige la opción "registrar salida" e introduce el número de placa del coche que sale.
2. La aplicación realiza las acciones correspondientes al tipo de vehículo:
* Oficial: asocia la estancia (hora de entrada y hora de salida) con el vehículo
* Residente: suma la duración de la estancia al tiempo total acumulado
* No residente: obtiene el importe a pagar

###### **Caso de uso "Da de alta vehículo oficial"**
1. El empleado elige la opción "dar de alta vehículo oficial" e introduce su número de placa.
2. La aplicación añade el vehículo a la lista de vehículos oficiales

###### **Caso de uso "Da de alta vehículo de residente"**
1. El empleado elige la opción "dar de alta vehículo de residente" e introduce su número de placa.
2. La aplicación añade el vehículo a la lista de vehículos de residentes.

###### **Caso de uso "Comienza mes"**
1. El empleado elige la opción "comienza mes".
2. La aplicación elimina las estancias registradas en los coches oficiales y pone a cero el tiempo estacionado por los vehículos de residentes.

###### **Caso de uso "Pagos de residentes"**
1. El empleado elige la opción "genera informe de pagos de residentes" e introduce el nombre del archivo en el que quiere generar el informe.
2. La aplicación genera un archivo que detalla el tiempo estacionado y el dinero a pagar por cada uno de los vehículos de residentes. El formato del archivo será el mostrado a continuación:

## INSTALACION
- instalar dependencias
```bash
npm install
```
- restaurar esquema de base de datos
```bash
npx prisma db push
```
Núm. placa Tiempo estacionado (min.) Cantidad a pagar
S1234A 20134 1006.70
4567ABC 4896 244.80
... ..... .....
- ingresar los registros iniciales necesarios
```bash
npx prisma db seed
```
La aplicación contará con un programa principal basado en un menú que permitirá al empleado interactuar con la aplicación (dicho programa principal no forma parte de este ejercicio).
### uso
Los endpoints disponibles son:
- vehicles para dar de alta nuevos vehiculos (especificando su tipo)
- parking para registrar el uso del servicio
Inicar el servicio:
```bash
npm run start
```
Hacer request desde un cliente http: curl, postman a http://localhost:3000/

para dar de alta un vehiculo:
- metodo: POST
- endpoint: /vehicles
- body(JSON): {"licensePlate":"UIOP0987","vehicleTypeId":3}

##### Persistencia de datos
La información de cada una de las estancias de los vehículos será almacenada en una base de datos SQLite (file). Debido a que el manejador de base de datos puede ser modificado en cualquier momento, se utilizará un ORM.
para registrar un uso de parking
- metodo: POST
- endpoint: /parking
- body(JSON): {"licensePlate":"UIOP0987"}

##### Puntos que se deben desarrollar
* Diagrama de clases y diagrama de secuencia de las partes encargadas de la aplicación.
* Aplicación para gestionar las estancias de los vehículos. Deberá incluir:
* Código de las clases que permitan gestionar los vehículos con sus datos asociados (estancias, tiempo, etc.), las listas de vehículos registrados como oficiales y residentes, etc.
* Mapeo de las clases para poder almacenar la información en la base de datos.
* Clases para gestionar la persistencia de datos, incluida la configuración de conexión a la base de datos.
### justificacion
La tabla VehicleType permite soportar los diferentes tipos actuales y agregar nuevos
La tabla Tariff permite mantener un control de las tarifas aplicadas segun el tipo
1 change: 1 addition & 0 deletions dist/prisma/seed.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export {};
70 changes: 70 additions & 0 deletions dist/prisma/seed.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/prisma/seed.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions dist/src/app.controller.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { AppService } from "./app.service";
export declare class AppController {
private readonly appService;
constructor(appService: AppService);
getHello(): string;
}
34 changes: 34 additions & 0 deletions dist/src/app.controller.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/app.controller.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions dist/src/app.module.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export declare class AppModule {
}
25 changes: 25 additions & 0 deletions dist/src/app.module.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/app.module.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions dist/src/app.service.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export declare class AppService {
getHello(): string;
}
20 changes: 20 additions & 0 deletions dist/src/app.service.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/app.service.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/main.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export {};
10 changes: 10 additions & 0 deletions dist/src/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/main.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions dist/src/parking/dto/create-parking.dto.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export declare class CreateParkingDto {
}
7 changes: 7 additions & 0 deletions dist/src/parking/dto/create-parking.dto.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/parking/dto/create-parking.dto.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions dist/src/parking/dto/update-parking.dto.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { CreateParkingDto } from './create-parking.dto';
declare const UpdateParkingDto_base: import("@nestjs/mapped-types").MappedType<Partial<CreateParkingDto>>;
export declare class UpdateParkingDto extends UpdateParkingDto_base {
}
export {};
9 changes: 9 additions & 0 deletions dist/src/parking/dto/update-parking.dto.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/parking/dto/update-parking.dto.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions dist/src/parking/entities/parking.entity.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export declare class Parking {
}
7 changes: 7 additions & 0 deletions dist/src/parking/entities/parking.entity.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions dist/src/parking/entities/parking.entity.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions dist/src/parking/parking.controller.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Parking } from "@prisma/client";
import { ParkingService } from "./parking.service";
export declare class ParkingController {
private readonly parkingService;
constructor(parkingService: ParkingService);
create(createParkingDto: Parking): Promise<Parking>;
findAll(): string;
update(id: string, updateParkingDto: Parking): Promise<string>;
remove(id: string): Promise<string>;
}
Loading