import { Repository } from "typeorm"; import { getSeverityNameDiscountType, getStatusBasic } from ".."; import { IPropsDiscountUserOrCompany } from "../interfaces"; export async function getDiscountsCodeUserInformation( repository: Repository, { status, company, lazyEvent }: IPropsDiscountUserOrCompany, ) { try { const queryBuilder = repository .createQueryBuilder("discount_code_user") .skip(lazyEvent.first) .take(lazyEvent.rows); // DOC: Filtro global if (lazyEvent.filters["global"] && lazyEvent.filters["global"].value) { const globalValue = `%${lazyEvent.filters[ "global" ].value.toLowerCase()}%`; queryBuilder.andWhere( "(LOWER(discount_code_user.local_name) LIKE :globalValue OR LOWER(discount_code_user.created_by_name) LIKE :globalValue OR LOWER(discount_code_user.created_by_surname) LIKE :globalValue OR LOWER(discount_code_user.code) LIKE :globalValue OR LOWER(discount_code_user.discount) LIKE :globalValue OR LOWER(partner_name) LIKE :globalValue OR LOWER(discount_code_user.partner_surname) LIKE :globalValue OR discount_code_user.number_of_times_used LIKE :globalValue OR discount_code_user.use_limit LIKE :globalValue OR discount_code_user.start LIKE :globalValue OR discount_code_user.expiration LIKE :globalValue)", { globalValue: globalValue || getStatusBasic(lazyEvent.filters["global"].value.toLowerCase()) || getSeverityNameDiscountType( lazyEvent.filters["global"].value.toLowerCase(), ), }, ); } // DOC: Filtro por estado FILTRO POR DEFECTO if (status !== null && status >= 0) { queryBuilder.andWhere("discount_code_user.status = :status", { status: status, }); } // DOC: Filtro por company FILTRO POR DEFECTO if (!!company && company >= 0) { queryBuilder.andWhere("discount_code_user.company = :company", { company: company, }); } // DOC: Aplicación de filtros globales para las columnas de las tablas. const filters = lazyEvent.filters; Object.keys(filters).forEach((key) => { let value = filters[key].value; if ( (Array.isArray(value) && value.length > 0) || (!Array.isArray(value) && value && key !== "global") ) { const matchMode = filters[key].matchMode; if (!Array.isArray(value) && value) { value = filters[key].value.toLowerCase(); } const accessKey = key.split(".").length > 1 ? `${key}` : `discount_code_user.${key}`; switch (matchMode) { case "custom": // 📌 Filtro por created / updated (rango de fechas en UTC) if (key === "created" || key === "updated") { if (Array.isArray(value) && value.length === 2) { const [from, to] = value; if (from !== null && to === null) { queryBuilder.andWhere(`${accessKey} >= :from`, { from: new Date(from), }); } else if (from === null && to !== null) { queryBuilder.andWhere(`${accessKey} <= :to`, { to: new Date(to), }); } else if (from !== null && to !== null) { queryBuilder.andWhere(`${accessKey} BETWEEN :from AND :to`, { from: new Date(from), to: new Date(to), }); } } } if ( (key === "number_of_times_used" || key === "use_limit" || key === "discount") && matchMode === "custom" ) { const [from, to] = value || [null, null]; if (from !== null && to === null) { queryBuilder.andWhere(`${accessKey} >= :from`, { from, }); } else if (from === null && to !== null) { queryBuilder.andWhere(`${accessKey} <= :to`, { to, }); } else if (from !== null && to !== null) { queryBuilder.andWhere(`${accessKey} BETWEEN :from AND :to`, { from, to, }); } } // 📌 Filtro por created_by (array de ids) if (key === "created_by") { if (Array.isArray(value) && value.length > 0) { queryBuilder.andWhere(`${accessKey} IN (:...${key})`, { [key]: value, }); } } // 📌 Filtro por updated_by (array de ids) if (key === "updated_by") { if (Array.isArray(value) && value.length > 0) { queryBuilder.andWhere(`${accessKey} IN (:...${key})`, { [key]: value, }); } } if (key === "local") { if (Array.isArray(value) && value.length > 0) { queryBuilder.andWhere(`${accessKey} IN (:...${key})`, { [key]: value, }); } } // if (key === "repeat_days") { // if (Array.isArray(value) && value.length > 0) { // const conditions = value.map((day, index) => { // const param = `${key}_${index}`; // queryBuilder.setParameter(param, `"${day}"`); // return `JSON_CONTAINS(discount_code_user.repeat_days, :${param})`; // }); // queryBuilder.andWhere(`(${conditions.join(" OR ")})`); // } // } break; case "contains": queryBuilder.andWhere(`${accessKey} LIKE :${key}`, { [key]: `%${value}%`, }); break; case "startsWith": queryBuilder.andWhere(`${accessKey} LIKE :${key}`, { [key]: `${value}%`, }); break; case "endsWith": queryBuilder.andWhere(`${accessKey} LIKE :${key}`, { [key]: `%${value}`, }); break; case "equals": // if (key === "status") { // queryBuilder.andWhere("discount_code_user.status = :status", { // status: getStatusBasic(filters[key].value ?? ""), // }); // } else if (key === "typeText") { // queryBuilder.andWhere("discount_code_user.type = :type", { // type: getSeverityNameDiscountType(filters[key].value ?? ""), // }); // } else if (key === "updated_by") { // const updatedByIds = filters[key].value.map( // (element: Partner) => element.id, // ); // if (updatedByIds.length > 0) { // queryBuilder.andWhere( // "discount_code_user.updated_by IN (:...updatedByIds)", // { // updatedByIds, // }, // ); // } // } else { // } queryBuilder.andWhere(`${accessKey} = :${key}`, { [key]: value, }); break; case "notContains": queryBuilder.andWhere(`${accessKey} NOT LIKE :${key}`, { [key]: `%${value}%`, }); break; case "notEquals": queryBuilder.andWhere(`${accessKey} != :${key}`, { [key]: value, }); break; case "in": // DOC: Si el modo de coincidencia es "in". if (Array.isArray(value)) { queryBuilder.andWhere(`${accessKey} IN (:...${key})`, { [key]: value, }); } break; case "notIn": // DOC: Si el modo de coincidencia es "notIn if (Array.isArray(value)) { queryBuilder.andWhere(`${accessKey} NOT IN (:...${key})`, { [key]: value, }); } break; case "lt": // DOC: Si el modo de coincidencia es "lt" (less than). queryBuilder.andWhere(`${accessKey} < :${key}`, { [key]: value }); break; case "lte": // DOC: Si el modo de coincidencia es "lte" (less than or equal). queryBuilder.andWhere(`${accessKey} <= :${key}`, { [key]: value }); break; case "gt": // DOC: Si el modo de coincidencia es "gt" (greater than). queryBuilder.andWhere(`${accessKey} > :${key}`, { [key]: value }); break; case "gte": // DOC: Si el modo de coincidencia es "gte" (greater than or equal). queryBuilder.andWhere(`${accessKey} >= :${key}`, { [key]: value }); break; case "between": // DOC: Si el modo de coincidencia es "between". if (Array.isArray(value) && value.length === 2) { const [from, to] = value; queryBuilder.andWhere(`${accessKey} BETWEEN :from AND :to`, { from, to, }); } break; case "dateIs": { // DOC: Si el modo de coincidencia es "dateIs". Hay que tener en cuenta la zona horaria (timezone) const date = new Date(value); const start = new Date(date); start.setUTCHours(0, 0, 0, 0); const end = new Date(date); end.setUTCHours(23, 59, 59, 999); queryBuilder.andWhere(`${accessKey} BETWEEN :start AND :end`, { start, end, }); break; } case "dateIsNot": { // DOC: Si el modo de coincidencia es "dateIsNot". Hay que tener en cuenta la zona horaria (timezone) const date = new Date(value); const start = new Date(date); start.setUTCHours(0, 0, 0, 0); const end = new Date(date); end.setUTCHours(23, 59, 59, 999); queryBuilder.andWhere(`${accessKey} NOT BETWEEN :start AND :end`, { start, end, }); break; } case "dateBefore": // DOC: Si el modo de coincidencia es "dateBefore". Hay que tener en cuenta la zona horaria (timezone) queryBuilder.andWhere(`${accessKey} < :${key}`, { [key]: new Date(value), }); break; case "dateAfter": // DOC: Si el modo de coincidencia es "dateAfter". Hay que tener en cuenta la zona horaria (timezone) queryBuilder.andWhere(`${accessKey} > :${key}`, { [key]: new Date(value), }); break; default: break; } } }); // DOC: Ordenamiento if (lazyEvent.sortField) { const order = lazyEvent.sortOrder === 1 ? "ASC" : "DESC"; // if (lazyEvent.sortField === "local.name") { // queryBuilder.orderBy(`local.name`, order); // } else { // if (lazyEvent.sortField === "typeText") { // queryBuilder.orderBy(`discount_code_user.type`, order); // } else if (lazyEvent.sortField === "status") { // queryBuilder.orderBy(`discount_code_user.status`, order); // } else { // } // } queryBuilder.orderBy(`discount_code_user.${lazyEvent.sortField}`, order); } // DOC: Ejecutar la consulta const [data, totalRecords] = await queryBuilder.getManyAndCount(); return { data, totalRecords, }; } catch (error) { return { data: [], totalRecords: 0, }; } }