import { Column, Entity, JoinColumn, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn, } from "typeorm"; import { RequestLocal, RequestPrint, UserAddress } from ".."; import { User } from "./User"; @Entity({ comment: "Tabla para agregar los pedidos realizados a través de la plataforma.", }) export class Request { @PrimaryGeneratedColumn({ type: "int", comment: "Número de identificación (ID) único de cada registro.", }) id: number; @Column({ length: 50, unique: true, type: "varchar", comment: "Código único de cada pedido.\r\nEste código servirá para filtrar por pedidos en la plataforma terminal, y si se va a pagar en efectivo, entonces puede dictar ese número o generar un código QR para leer y traer la información.", }) code: string; @ManyToOne(() => User, (user) => user.requests, { nullable: true, onDelete: "SET NULL", onUpdate: "NO ACTION", }) @JoinColumn({ name: "user" }) user: User | null; @ManyToOne(() => UserAddress, (userAddress) => userAddress.requests, { nullable: true, onDelete: "NO ACTION", onUpdate: "NO ACTION", }) @JoinColumn({ name: "address" }) address: UserAddress | null; @Column({ length: 15, type: "varchar", nullable: true, default: null, comment: "Contacto del usuario que recibe el pedido. Este campo es cuando el order_type es tipo 3 y no hay información de las direcciones de entrega del usuario", }) delivery_phone: string | null; @Column({ length: 200, type: "varchar", nullable: true, default: null, comment: "Observaciones de la entrega del pedido. Este campo es cuando el order_type es tipo 3 y no hay información de las direcciones de entrega del usuario", }) delivery_comments: string | null; @Column({ length: 150, type: "varchar", nullable: true, default: null, comment: "Dirección donde se va a entregar el pedido. Este campo es cuando el order_type es tipo 3 y no hay información de las direcciones de entrega del usuario", }) delivery_address: string | null; @Column({ default: 1, type: "int", width: 1, comment: "Este campo hace referencia a si el tipo es:\r\n\r\n1. Individual: Un solo usuario ordena y paga.\r\n\r\n2. Grupal: El usuario principal puede agregar a otros colaboradores para realizar un pedido grupal (a tener en cuenta que el usuario principal es el único que puede realizar el pago del pedido).", }) order_mode: number; @Column({ default: 1, type: "int", width: 1, comment: "Puedo saber si el pedido es para:\r\n1. Comer en el establecimiento.\r\n2. Recoger para llevar.\r\n3. Para llevar.", }) order_type: number; @Column({ type: "decimal", precision: 10, scale: 2, comment: "Costo total del pedido, aquí toca tener en cuenta los productos (request_product) que se agreguen al pedido (request) y los complementos (request_product_group_complement).", }) order_cost: number; @Column({ default: 0, type: "int", width: 1, comment: "Estado en el que se encuentra un pedido.\r\n0. En proceso: El usuario está agregando los productos del/los local/es.\r\n1. Creado: El usuario ya creó el pedido con los prductos en los/el local/es especificado/s.\r\n2. Cancelado: El usuario canceló el pedido, esto sólo se permite si aún no está pago el pedido.\r\n3. Rechazado: Si un local canceló el pedido por x circustancias. Cabe resaltar que si el pedido fue solicitado a más de un local, el estado 3 sólo se agregaría al pedido si todos los locales cancelaron (Se tiene un estado para cada local en la tabla request_local) -> Aún no se sabe si este estado va.\r\n4. Finalizado: El pedido fue entregado y también pagado. Si el pedido se realizó en varios locales, entonces sólo se pasará a Finalizado, cuando todos los locales a los que se le hizo el pedido están pagos y con los productos entregados.", }) status: number; @Column({ type: "datetime", default: () => "CURRENT_TIMESTAMP", comment: "Fecha en la que el cliente final crea el pedido.", }) created: Date; @Column({ type: "datetime", onUpdate: "CURRENT_TIMESTAMP", nullable: true, default: null, comment: "Fecha en la que el cliente final hace la última actualización del pedido.", }) updated: Date | null; @OneToMany(() => RequestLocal, (requestLocal) => requestLocal.request) requests_local: RequestLocal[]; @ManyToMany(() => User, (user) => user.requests_group) @JoinTable({ name: "request_group", joinColumn: { name: "request", referencedColumnName: "id", }, inverseJoinColumn: { name: "user", referencedColumnName: "id", }, }) requests_group: User[]; @OneToMany(() => RequestPrint, (requestPrint) => requestPrint.request) request_prints: RequestPrint[]; }