import { Repository } from "typeorm"; import { IBasicLazyEvent } from "../interfaces"; import { getSeverityNameDiscountType, getStatusBasic } from "../utils"; import { Partner } from "../entities.views.routes"; import { getTimeZone, getTimezoneOffset } from ".."; export async function getDiscountsCodeCompanyInformation( repository: Repository, { lazyEvent }: IBasicLazyEvent ) { try { const timezone = getTimezoneOffset(getTimeZone()); const queryBuilder = repository .createQueryBuilder("discount") .leftJoinAndSelect("discount.updated_by", "master") .skip(lazyEvent.first) .take(lazyEvent.rows); if (lazyEvent.filters["global"] && lazyEvent.filters["global"].value) { const globalValue = `%${lazyEvent.filters[ "global" ].value.toLowerCase()}%`; queryBuilder.andWhere( "LOWER(discount.code) LIKE :globalValue OR LOWER(discount.discount) LIKE :globalValue OR LOWER(discount.use_limit) LIKE :globalValue OR LOWER(discount.repeat_days) LIKE :globalValue OR LOWER(discount.updated) LIKE :globalValue OR LOWER(discount.start) LIKE :globalValue OR LOWER(discount.created) LIKE :globalValue OR LOWER(discount.expiration) LIKE :globalValue OR LOWER(master.name) LIKE :globalValue OR LOWER(master.surname) LIKE :globalValue", { globalValue: globalValue || getStatusBasic(lazyEvent.filters["global"].value.toLowerCase()) || getSeverityNameDiscountType( lazyEvent.filters["global"].value.toLowerCase() ), } ); } 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.${key}`; switch (matchMode) { case "custom": if ( (key === "number_of_times_used" || key === "use_limit") && matchMode === "custom" ) { const [from, to] = value || [null, null]; if (from !== null && to === null) { queryBuilder.andWhere(`discount.${key} >= :from`, { from, }); } else if (from === null && to !== null) { queryBuilder.andWhere(`discount.${key} <= :to`, { to, }); } else if (from !== null && to !== null) { queryBuilder.andWhere(`discount.${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("discount.status = :status", { status: getStatusBasic(filters[key].value ?? ""), }); } else if (key === "typeText") { queryBuilder.andWhere("discount.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.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 "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(`discount.${lazyEvent.sortField}`, order); } const [discountsCodeCompany, totalRecords] = await queryBuilder.getManyAndCount(); return { data: discountsCodeCompany, totalRecords, }; } catch (error) { return { data: [], totalRecords: 0, }; } }