import { Repository } from "typeorm"; import { getTimeZone, getTimezoneOffset } from ".."; import { IBasicCompany } from "../interfaces"; import { getSeverityNameDiscountType, getStatusBasic } from "../utils"; export async function getLocalsCompanyInformation( repository: Repository, { company, status, visible, lazyEvent }: IBasicCompany ) { try { const timezone = getTimezoneOffset(getTimeZone()); const queryBuilder = repository .createQueryBuilder("view_locals_companies") .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(view_locals_companies.name_local) LIKE :globalValue OR LOWER(view_locals_companies.country_name) LIKE :globalValue OR LOWER(view_locals_companies.city_name) LIKE :globalValue OR LOWER(view_locals_companies.address) LIKE :globalValue OR LOWER(view_locals_companies.cellphone) LIKE :globalValue OR LOWER(view_locals_companies.email) LIKE :globalValue OR LOWER(view_locals_companies.pos_system_name) LIKE :globalValue OR LOWER(view_locals_companies.created_local) LIKE :globalValue OR LOWER(view_locals_companies.updated_local) LIKE :globalValue)", { globalValue: globalValue || getStatusBasic(lazyEvent.filters["global"].value.toLowerCase()), } ); } // DOC: Filtro por estado FILTRO POR DEFECTO if (status !== null && status >= 0) { queryBuilder.andWhere("view_locals_companies.status = :status", { status: status, }); } // DOC: Filtro por company FILTRO POR DEFECTO if (company !== null && company >= 0) { queryBuilder.andWhere("view_locals_companies.company = :company", { company: company, }); } if (visible !== null) { queryBuilder.andWhere("view_locals_companies.visible = :visible", { visible: visible, }); } 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}` : `view_locals_companies.${key}`; switch (matchMode) { case "custom": if (key === "total_partners" && matchMode === "custom") { const [from, to] = value || [null, null]; if (from !== null && to === null) { queryBuilder.andWhere(`view_locals_companies.${key} >= :from`, { from, }); } else if (from === null && to !== null) { queryBuilder.andWhere(`view_locals_companies.${key} <= :to`, { to, }); } else if (from !== null && to !== null) { queryBuilder.andWhere( `view_locals_companies.${key} BETWEEN :from AND :to`, { from, to } ); } } 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("view_locals_companies.status = :status", { status: getStatusBasic(filters[key].value ?? ""), }); } else if (key === "typeText") { queryBuilder.andWhere("view_locals_companies.type = :type", { type: getSeverityNameDiscountType(filters[key].value ?? ""), }); } else if (key === "has_square") { const hasSI = filters[key].value.includes("SI"); const hasNO = filters[key].value.includes("NO"); const queryPlazolet = hasSI && hasNO ? "" : hasSI ? "view_locals_companies.has_square IS NOT NULL" : hasNO ? "view_locals_companies.has_square IS NULL" : ""; if (queryPlazolet !== "") { queryBuilder.andWhere(queryPlazolet); } } 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 "dateIs": queryBuilder.andWhere( `${ key !== "expiration" && key !== "start" ? "DATE(CONVERT_TZ(" : "" } ${accessKey} ${ key !== "expiration" && key !== "start" ? `, '+00:00', '${timezone}'))` : "" } = :${key}`, { [key]: value.split("T")[0], } ); break; case "dateIsNot": queryBuilder.andWhere( `${ key !== "expiration" && key !== "start" ? "DATE(CONVERT_TZ(" : "" } ${accessKey} ${ key !== "expiration" && key !== "start" ? `, '+00:00', '${timezone}'))` : "" } != :${key}`, { [key]: value.split("T")[0], } ); break; case "dateBefore": queryBuilder.andWhere( `${ key !== "expiration" && key !== "start" ? "DATE(CONVERT_TZ(" : "" } ${accessKey} ${ key !== "expiration" && key !== "start" ? `, '+00:00', '${timezone}'))` : "" } < :${key}`, { [key]: value.split("T")[0], } ); break; case "dateAfter": queryBuilder.andWhere( `${ key !== "expiration" && key !== "start" ? "DATE(CONVERT_TZ(" : "" } ${accessKey} ${ key !== "expiration" && key !== "start" ? `, '+00:00', '${timezone}'))` : "" } > :${key}`, { [key]: value.split("T")[0], } ); break; default: break; } } }); if (lazyEvent.sortField) { const order = lazyEvent.sortOrder === 1 ? "ASC" : "DESC"; queryBuilder.orderBy( `view_locals_companies.${lazyEvent.sortField}`, order ); } const [locals, totalRecords] = await queryBuilder.getManyAndCount(); return { data: locals, totalRecords, }; } catch (error) { return { data: [], totalRecords: 0, } } }