????

Your IP : 18.191.5.237


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

var Database = require('../../models/Database');
var mailCtrl = require('./mail');
var { exportRequest } = require('../baocao/WordController');
var moment = require('moment');
class RequestController extends Database {
  constructor(params) {
    super(params);
  }
  static create(params) {
    return new RequestController(params);
  }
  // Kiểm tra thông tin người yêu cầu
  async checkInfo(user, idnumber) {
    if (user) {
      return {
        IdNumber: user['IdNumber'],
        FullName: user['FullName'],
        Birthday: user['Birthday'],
        login: true
      }
    } else if (idnumber) {
      let reqInfo = (await this.select('SELECT Top 1 FullName,IdNumber,Birthday FROM DocReq WHERE IdNumber = @idnumber ORDER BY DateCreated desc', { idnumber: idnumber }))[0];
      return reqInfo || null;
    } else { return null }
  }
  // Xử lý yêu cầu tài liệu
  async checkout(reqInfo, user) {
    let input = {
      createdBy: user ? user.UUID : null,
      fullname: reqInfo['fullname'],
      idnumber: reqInfo['idnumber'],
      birthday: moment.utc(reqInfo['birthday'], 'DD/MM/YYYY').isValid() ? moment.utc(reqInfo['birthday'], 'DD/MM/YYYY').toDate() : null,
      phone: reqInfo['phone'],
      address: reqInfo['address'] || null,
      // email: reqInfo['email'] || null,
      organ: reqInfo['organ'] || null,
      uses: reqInfo['uses']
    }
    let reqId = (await this.select('INSERT INTO DocReq(FullName,IdNumber,Birthday,Telephone,Address,OrganName,Uses,CreatedBy) OUTPUT inserted.UUID VALUES (@fullname,@idnumber,@birthday,@phone,@address,@organ,@uses,@createdBy)', input))[0]['UUID'];
    let cart = JSON.parse(reqInfo['cart']);
    for (let i = 0; i < cart.length; i++) {
      var reqItem = cart[i];
      reqItem.reqId = reqId;
      await this.query('INSERT INTO ReqContent(ReqId,DocId,CopiedNumber,CertifiedNumber,Description,Price) VALUES (@reqId,@docId,@copiedNum,@certifiedNum,@desc,@price)', reqItem);
    }
    await this.exportPDF(reqId);
    return reqId;
  }
  getRequests(reqInfo) {
    let condition = [];
    if (typeof reqInfo['account'] != 'undefined') condition.push('DocReq.CreatedBy = @account');
    if (typeof reqInfo['approved'] != 'undefined') condition.push(`DocReq.ApprovedBy is ${reqInfo['approved'] ? 'not ' : ''}NULL`);
    let query = 'SELECT DocReq.UUID,DocReq.FullName,DocReq.Telephone,DocReq.CreatedBy,DocReq.ApprovedBy,DocReq.IdNumber,DocReq.DateCreated,DocReq.[State],ReqNumber,aAcc.FullName as aAccName,bAcc.FullName as bAccName, (SELECT SUM(Price) FROM ReqContent WHERE ReqContent.ReqId = DocReq.UUID) totalPrice FROM DocReq LEFT JOIN Account aAcc ON DocReq.CreatedBy = aAcc.UUID LEFT JOIN Account bAcc ON DocReq.ApprovedBy = bAcc.UUID' + (condition.length ? ' WHERE ' + condition.join(' AND ') : '');
    return this.select(query, { account: reqInfo['account'] })
  }
  async getReqInfo(reqId, isDetail) {
    let info = (await this.select("SELECT UUID,FullName,IdNumber,FORMAT(Birthday, 'dd/MM/yyyy') Birthday,Telephone,Address,N'Việt Nam' as Nationality,OrganName,DateCreated,Uses,ReqNumber FROM DocReq WHERE UUID = @id", { id: reqId }))[0];
    if (info && isDetail) info['Content'] = await this.getRequestDetail(reqId);
    return info;
  }
  getRequestDetail(reqId) {
    return this.select('SELECT ROW_NUMBER() OVER(ORDER BY Document.IssuedDate) as rowNum,Document.UUID,Fond.FondName,Document.CodeNumber,Document.CodeNotation,Document.Subject,Document.IssuedDate,Document.PageAmount,ReqContent.CopiedNumber,ReqContent.CertifiedNumber,ReqContent.Price,ReqContent.Description FROM ReqContent INNER JOIN Document INNER JOIN [File] ON [File].UUID = Document.FileId INNER JOIN Fond ON Fond.FondCode = [File].FondCode ON ReqContent.DocId = Document.UUID WHERE ReqContent.ReqId = @reqId', { reqId: reqId })
  }
  async approveReq(reqId, approvedId, state) {
    let input = {
      approvedId: approvedId,
      state: state,
      reqId: reqId
    };
    let result = await this.query('UPDATE DocReq SET ApprovedBy = @approvedId, ApprovedDate = GETDATE(), [State] = @state WHERE UUID = @reqId', input);
    if (result.rowsAffected[0]) {
      let req = (await this.select('SELECT FullName,Telephone,IdNumber,DateCreated,ApprovedDate,ReqNumber,COUNT(DocId) countDoc, SUM(Price) totalPrice FROM DocReq LEFT JOIN ReqContent ON DocReq.UUID = ReqContent.ReqId WHERE UUID = @reqId GROUP BY FullName,Telephone,IdNumber,DateCreated,ApprovedDate,ReqNumber', { reqId: reqId }))[0];
      mailCtrl.sendApprovedReq(req, state);
    }
    return result;
  }
  getPrices() {
    var query = 'SELECT Code, Name, Price, Unit FROM ReqType';
    return this.select(query);
  }
  updatePrice(reqInfo) {
    let updates = [];
    if (typeof reqInfo['reqname'] != 'undefined') updates.push('Name = @reqname')
    if (typeof reqInfo['price'] != 'undefined') updates.push('Price = @price');
    if (typeof reqInfo['unit'] != 'undefined') updates.push('Unit = @unit');
    return this.query(`UPDATE ReqType SET ${updates.join(',')} WHERE Code = @code`, reqInfo);
  }
  async exportPDF(reqId) {
    let req = await this.getReqInfo(reqId, true);
    if (!req) throw new Error('Mã yêu cầu hồ sơ không tồn tại');
    await exportRequest(req);
  }
}

module.exports = RequestController;