????

Your IP : 18.227.72.114


Current Path : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/baocao/
Upload File :
Current File : C:/inetpub/vhost/sdoc.gdtsolutions.vn/package/app/controllers/baocao/ReportController.js

const Database = require('../../models/Database');
const queryBuilder = require('../../repositories/QueryBuilder');

class ReportController extends Database {
  constructor(params) {
    super(params);
  }
  static create(params) {
    return new ReportController(params);
  }
  //for report fonds
  async getFileGroup() {
    var query = 'SELECT Id, UPPER(GroupName) AS GroupName FROM [FileGroup]';
    return await this.select(query);
  }
  async getFondCode() {
    var query = 'SELECT DISTINCT FondCode FROM Fond';
    return await this.select(query);
  }
  async getFondName() {
    var query = 'SELECT DISTINCT FondCode, FondName FROM Fond';
    return await this.select(query);
  }
  async getFondToReport(group, fondCode) {
    const withQuery = queryBuilder.with('tkHoSo', qb => qb.columns([
      'File.UUID', 'File.FondCode',
      { startDate: queryBuilder.min('File.FileYear') },
      { endDate: queryBuilder.max('File.FileYear') },
      { soVanBan: queryBuilder.raw('COUNT(Document.UUID)') },
      { soTrang: queryBuilder.raw('SUM(Document.PageAmount)') },
    ]).select().from('File')
      .leftJoin('Document', 'Document.FileId', 'File.UUID')
      .whereNotNull('File.EditedBy').andWhere('File.State', 1)
      .andWhere(function () {
        if (group) this.where('File.GroupId', group);
        if (fondCode) this.where('File.FondCode', fondCode);
      })
      .groupBy('File.UUID', 'File.FondCode')
    )
    const query = withQuery.columns([
      'FondName', 'Fond.FondCode', 'Fond.FondNumber',
      { startYear: queryBuilder.min('tkHoSo.startDate') },
      { endYear: queryBuilder.max('tkHoSo.endDate') },
      { tongSoHS: queryBuilder.raw('COUNT(tkHoSo.UUID)') },
      { tongSoTrang: queryBuilder.raw('SUM(tkHoSo.soTrang)') },
      { tongSoVB: queryBuilder.raw('SUM(tkHoSo.soVanBan)') },
    ]).select().from('Fond')
      .rightJoin('tkHoSo', 'tkHoSo.FondCode', 'Fond.FondCode')
      .groupBy('FondName', 'Fond.FondCode', 'Fond.FondNumber')
      .orderBy('Fond.FondNumber')
    return await query;
  }
  async reportFiles(reqBody) {
    //#region rebuild query using knex
    const { start, length, jobState, fondCode,
      boxNumber1, boxNumber2, fileNumber1, fileNumber2,
      startDate1, startDate2, endDate1, endDate2
    } = reqBody;
    const withQuery = queryBuilder.with('ReportFile', qb => {
      qb.column(['File.UUID', 'File.FondCode', 'FondName',
        'File.FileCatalog', 'File.BoxNumber', 'File.FileNumber', 'File.Title',
        'File.StartDate', 'File.EndDate', 'File.SheetNumber', 'File.Maintenance',
        'File.Description', 'File.Format',
        { PageNumber: queryBuilder('Document').sum('PageAmount').whereRaw('Document.FileId = [File].UUID') },
        { totalDoc: queryBuilder('Document').count('UUID').whereRaw('Document.FileId = [File].UUID') },
        { EditedBy: 'editAcc.FullName' }
      ]).select()
        .rowNumber('RowNum', ['Fond.FondCode', 'File.FileCatalog', 'File.BoxNumber', 'File.FileNumber'])
        .from('File')
        .innerJoin('Fond', 'Fond.FondCode', 'File.FondCode')
        .leftJoin({ editAcc: 'Account' }, 'editAcc.UUID', 'File.EditedBy')
        .where('File.State', 1).whereRaw(`[File].EditedBy is ${jobState ? 'Not ' : ''}NULL`)
        .andWhere(b => {
          if (fondCode) b.where('File.FondCode', fondCode)
          if (boxNumber1) b.where('File.BoxNumber', '>=', boxNumber1)
          if (boxNumber2) b.where('File.BoxNumber', '<=', boxNumber2)
          if (fileNumber1) b.whereRaw('[dbo].getFileNumber([File].FileNumber) >= ?', fileNumber1)
          if (fileNumber2) b.whereRaw('[dbo].getFileNumber([File].FileNumber) <= ?', fileNumber2)
          if (startDate1) b.where('File.StartDate', '>=', startDate1)
          if (startDate2) b.where('File.StartDate', '<=', startDate2)
          if (endDate1) b.where('File.EndDate', '>=', endDate1)
          if (endDate2) b.where('File.EndDate', '<=', endDate2)
        })
    })
    const countQuery = withQuery.clone().count('UUID', { as: 'recordsTotal' }).from('ReportFile');
    const dataQuery = withQuery
      .column(['*',
        { docsTotal: queryBuilder.raw('SUM(totalDoc) OVER()') },
        { pagesTotal: queryBuilder.raw('SUM(PageNumber) OVER()') }]
      ).select().from('ReportFile').orderBy('RowNum').offset(+start).limit(+length || undefined)
    //#endregion
    return await Promise.all([dataQuery, countQuery])//this.select(query, reqBody);
  }
  async reportDocuments(reqBody) {
    var condition = ['[File].[State] = 1'];
    if (reqBody.state == 2) { condition.push('Document.PageAmount > 0'); }
    else if (reqBody['state'] == 1) { condition.push('(Document.PageAmount = 0 OR Document.PageAmount is null)'); }
    if (reqBody.fondCode) condition.push('Fond.FondCode = @fondCode');
    if (reqBody.boxNumber1) condition.push('[File].BoxNumber >= @boxNumber1');
    if (reqBody.boxNumber2) condition.push('[File].BoxNumber <= @boxNumber2');
    if (reqBody.fileNumber1) condition.push('[dbo].getFileNumber([File].FileNumber) >= @fileNumber1');
    if (reqBody.fileNumber2) condition.push('[dbo].getFileNumber([File].FileNumber) <= @fileNumber2');
    if (reqBody.issuedDate1) condition.push('[Document].IssuedDate >= @issuedDate1');
    if (reqBody.issuedDate2) condition.push('[Document].IssuedDate <= @issuedDate2');
    let docTable = 'SELECT ROW_NUMBER() OVER(ORDER BY Fond.FondCode,[File].FileCatalog,[File].BoxNumber,[File].FileNumber,Document.DocOrdinal) as RowNum,Document.UUID,Document.DocOrdinal,DocType.TypeName,Document.CodeNumber,Document.CodeNotation,Document.IssuedDate,Document.OrganName,Document.[Subject],Document.SheetIndex,Document.SheetAmount,Document.PageAmount,Mode.ModeName,Document.[Description],Fond.FondName,Fond.FondCode,[File].FileCatalog,[File].BoxNumber,[File].FileNumber,Document.[Format],Account.FullName as CreatedBy FROM Document ';
    docTable += 'LEFT JOIN Mode ON Document.ModeId = Mode.Id ';
    docTable += 'LEFT JOIN DocType ON DocType.Id = Document.DocType ';
    docTable += 'LEFT JOIN Account ON Account.UUID = Document.CreatedBy ';
    docTable += 'INNER JOIN [File] ON [File].UUID = Document.FileId ';
    docTable += 'INNER JOIN Fond ON Fond.FondCode = [File].FondCode ';
    docTable += `WHERE ${condition.join(' AND ')}`;
    var query = `WITH ReportDoc AS (${docTable}) SELECT *, COUNT(UUID) OVER() as recordsTotal, SUM(PageAmount) OVER() as tongSoTrang FROM ReportDoc ORDER BY RowNum`;
    if (reqBody.length) query += ' OFFSET @start rows FETCH NEXT @length rows only';
    return await this.select(query, reqBody);
  }
}
module.exports = ReportController;