import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryGeneratedColumn, } from "typeorm"; import { DiscountCodeUserProduct, Local } from ".."; import { CodeRedemptionHistoryUser } from "./CodeRedemptionHistoryUser"; import { Company } from "./Company"; import { Partner } from "./Partner"; @Entity("discount_code_user", { comment: "Códigos de descuento para los usuarios.", }) export class DiscountCodeUser { @PrimaryGeneratedColumn({ type: "int", comment: "Número de identificación (ID) único de cada registro.", }) id: number; @ManyToOne(() => Company, (company) => company.discount_code_users, { onDelete: "CASCADE", onUpdate: "NO ACTION", }) @JoinColumn({ name: "company" }) company: Company; @ManyToOne(() => Local, (local) => local.discount_code_locals, { onDelete: "CASCADE", onUpdate: "NO ACTION", }) @JoinColumn({ name: "local" }) local: Local; @Column({ length: 10, type: "varchar", comment: "Código del descuento para compartirlo.", }) code: string; @Column({ length: 100, type: "varchar", comment: "Nombre del descuento.", }) name: string; @Column({ default: 1, type: "int", width: 1, comment: "Columna para diferenciar el tipo de descuento que se va a crear:\n1: Descuento del pedido/Descuento referido.\n2: Promoción producto/s: Acá el descuento se aplica por porcentaje o monto fijo a los producto/s que se agreguen.\n3: Promoción producto: Este A diferencia del modo tipo 2, este no se aplica un descuento por porcentaje o monto fijo, se aplica en 2x1 - 2x3 o 3x4.", }) mode: number; @Column({ default: 1, type: "int", width: 1, comment: "Segmento al que se le aplica el descuento.\n1: Todos los usuarios: Cualquier usuario puede aplicar al descuento.\n2: Nuevos usuarios: Nuevos usuarios que compren en el restaurante.\n3: Usuarios fieles: Los usuarios que más compren en ese restaurante.\n4: Usuarios perdidos: Los usuarios que han dejado de comprar en el restaurante.", }) user_segment: number; @Column({ type: "varchar", length: 40, nullable: true, default: null, comment: "Presupuesto limitado: Indica si el descuento va a tener un presupuesto limitado, es decir, si yo agrego un valor (eje: 600.000 COP), cuando se agote ese presupuesto la promoción/descuento se finalizará.\nSi queda en null este campo, lo que indica es que tendrá un presupuesto ilimitado, entonces finalizará una vez se agote el límite de uso o fecha de expiración.", }) limited_budget: string; @Column({ length: 10, type: "varchar", comment: "Descuento que se aplica." }) discount: string; @Column({ type: "int", width: 1, comment: "Campo para el tipo de descuento: \r\n1. Porcentaje.\r\n2. Valor en moneda.", }) type: number; @Column({ nullable: true, default: null, type: "int", comment: "Validamos sí el descuento se aplica para una cantidad límite de usuarios. Entonces, no debería tener en cuenta la fecha de expiración o, si quiero agregar las 2 condicionales.", }) use_limit: number | null; @Column({ type: "datetime", default: () => "CURRENT_TIMESTAMP", comment: "Fecha de creación del registro.", }) created: Date; @ManyToOne( () => Partner, (partner) => partner.discounts_code_user_created_by, { onDelete: "CASCADE", onUpdate: "NO ACTION", }, ) @JoinColumn({ name: "created_by" }) created_by: Partner; @Column({ type: "date", comment: "Fecha inicial del descuento.", }) start: string; @Column({ type: "date", nullable: true, default: null, comment: "Fecha de expiración del registro.", }) expiration: string | null; @Column({ type: "json", nullable: true, default: null, comment: "Columna de tipos JSON para agregar en un arreglo los días que se pueden repetir el descuento.", }) repeat_days: any | null; @Column({ type: "datetime", nullable: true, default: null, onUpdate: "CURRENT_TIMESTAMP", comment: "Fecha de actualización.", }) updated: Date | null; @ManyToOne(() => Partner, (partner) => partner.discount_code_partners, { onDelete: "CASCADE", onUpdate: "NO ACTION", nullable: true, }) @JoinColumn({ name: "updated_by" }) updated_by: Partner | null; @Column({ default: 1, type: "int", width: 1, comment: "Estado del registro, es decir: \n 1. Activo: Es visible en la plataforma. \n 0. Inactivo: No será visible en la plataforma.", }) status: number; @OneToMany( () => CodeRedemptionHistoryUser, (codeRedemptionHistoryUser) => codeRedemptionHistoryUser.discount_code_user, ) code_redemptions_history_users: CodeRedemptionHistoryUser[]; @OneToMany( () => DiscountCodeUserProduct, (discountCodeUserProduct) => discountCodeUserProduct.discount_code_user, ) discount_code_user_products: DiscountCodeUserProduct[]; }