Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.99 KB | None | 0 0
  1.         /**
  2.     * Gets a resultset for populating a grid
  3.     * @param SortDetails sortDetails Details about sorting
  4.     * @param PaginationDetail paginationDetail Page and limit for paginating
  5.     * @param string[] relations List of relations to return
  6.     * @param string search text string to search for. Blank for no search.#
  7.     * @param fitlers filters to be used to filter the grid
  8.     * 
  9.     * @returns any[] - array of DTO objects
  10.     */
  11.    async getCustomersGrid(sortDetails, paginationDetail, relations, search = '', filters=[]) {
  12.     const model = use(this.entity);
  13.  
  14.     const query = model.query().select(this.getTableName() + '.*', 'invoices.id as invoiceId');
  15.  
  16.     // TODO: refactor and move this block of code
  17.     if (relations.length > 0) {
  18.         //inner join relation in order to allow for sorting and ordering on relation
  19.         for (let relation of relations) {
  20.             const relationRepoName = use('App/Repository/' + relation + 'Repository');
  21.             const relationRepo = new relationRepoName();
  22.  
  23.             query.leftJoin(relationRepo.getTableName(),
  24.                 model.table + '.' + this.toCamelCase(relation) + 'Id',
  25.                 relationRepo.getTableName() + '.' + relationRepo.key);
  26.  
  27.             //check sort details
  28.             if (sortDetails.sort !== null) {
  29.                 if (sortDetails.sort.indexOf(this.toCamelCase(relation)) !== -1) {
  30.                     sortDetails.sort = sortDetails.sort.replace(this.toCamelCase(relation), relationRepo.getTableName());
  31.                 }
  32.  
  33.                 else if (sortDetails.sort.indexOf('.') === -1) {
  34.                     sortDetails.sort = this.getTableName() + '.' + sortDetails.sort;
  35.                 }
  36.             }
  37.         }
  38.  
  39.     }
  40.  
  41.     if (sortDetails.sort !== null) {
  42.         query.orderBy(sortDetails.sort, sortDetails.direction);
  43.     }
  44.  
  45.     if (search !== '') {
  46.         const DTOName = use(this.dto);
  47.         const DTO = new DTOName();
  48.  
  49.         let searchQuery = '';
  50.  
  51.         this.searchFields.forEach((field) => {
  52.             searchQuery += field + ' LIKE :term OR ';
  53.         });
  54.  
  55.         searchQuery = searchQuery.substring(0, searchQuery.length - 3);
  56.  
  57.         query.whereRaw(searchQuery, { term: '%' + search + '%' });
  58.     }
  59.  
  60.     const startDateFilter = filters['startDate'] === null ? '' : filters['startDate'];
  61.     const endDateFilter = filters['endDate'] === null ? '' : filters['endDate'];
  62.     const poNumberFilter = filters['poNumber'] === null ? '' : filters['poNumber'];
  63.     const customerIdFilter = filters['customerId'] === null ? '' : filters['customerId'];
  64.     const siteNameFilter = filters['siteName'] === null ? '' : filters['siteName'];
  65.     const invoiceNumberFilter = filters['invoiceNumber'] === null ? '' : filters['invoiceNumber'];
  66.     let postedFilter = filters['posted'] === null || filters['posted'] === 'all' ? '' : filters['posted'];
  67.     let regNumberFilter = filters['regNumber'] === null ? '' : filters['regNumber'];
  68.  
  69.     if(poNumberFilter.trim() !== '') {
  70.         query.whereRaw('invoices.poNumber LIKE ?', ['%' + poNumberFilter + '%']);
  71.     }
  72.  
  73.     if(customerIdFilter !== '' && customerIdFilter !== -1 && customerIdFilter !== null) {
  74.         query.whereRaw('customers.id = ?', [customerIdFilter]);
  75.     } else {
  76.  
  77.         // If no customer id don't return any records
  78.         query.whereRaw('customers.id = -1');
  79.     }
  80.  
  81.     if(siteNameFilter.trim() !== '') {
  82.         query.whereRaw('invoices.siteName LIKE ?', ['%' +  siteNameFilter + '%']);
  83.     }
  84.  
  85.     if(invoiceNumberFilter.trim() !== '') {
  86.         query.whereRaw('invoices.invoiceNumber LIKE ?', ['%' +  invoiceNumberFilter + '%']);
  87.     }
  88.  
  89.  
  90.  
  91.     if(postedFilter.trim() !== '') {
  92.         
  93.         let postedValue = '';
  94.         if(postedFilter === 'posted') {
  95.             postedValue = 1;
  96.         } else if(postedFilter === 'unposted') {
  97.             postedFilter = 0;
  98.         }
  99.  
  100.         query.whereRaw('invoices.posted = ?', [postedValue]);
  101.     }
  102.  
  103.     if(startDateFilter.trim() !== '' && endDateFilter.trim() !== '') {
  104.         query.whereRaw('DATE(invoices.created_at) >= ?', [startDateFilter]);
  105.         query.whereRaw('DATE(invoices.created_at) <= ?', [endDateFilter]);
  106.     }
  107.  
  108.     if(startDateFilter.trim() !== '' && endDateFilter.trim() !== '') {
  109.         query.whereRaw('DATE(invoices.created_at) >= ?', [startDateFilter]);
  110.         query.whereRaw('DATE(invoices.created_at) <= ?', [endDateFilter]);
  111.     }
  112.  
  113.     
  114.     let results = await query.paginate(paginationDetail.page, paginationDetail.limit);
  115.  
  116.     let paginationTotal = results.pages.total;
  117.  
  118.     results = await results.rows;
  119.  
  120.     let dtoResults = this.fillAll(results);
  121.     let index = 0;
  122.  
  123.     if (relations.length > 0) {
  124.         for (let dto of dtoResults) {
  125.             dtoResults[index] = await this.withAll(relations, results[index], dto);
  126.             index++;
  127.         }
  128.     }
  129.     return { data: dtoResults, total: paginationTotal };
  130.  
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement