????

Your IP : 18.191.144.80


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/WordController.old.js

var { Document, Table, Paragraph, TextRun, AlignmentType, Packer, PageOrientation, WidthType } = require('docx');
var path = require('path');
var moment = require('moment');
var fsp = require('fs/promises');
var { exportPath } = require('../../appconfig');

async function createReport(name, heading, data, config) {
  var filename = `${name}_${moment().format('YYYYMMDD-hhmmss')}.docx`;
  var cellMargin = { top: 50, right: 50, bottom: 50, left: 50 };
  var doc = new Document({ author: 'GDT-AR', description: heading, title: 'Báo cáo' });
  doc.Styles.createParagraphStyle('Normal', 'Normal').basedOn('Normal')
    .next('Normal').font('Times New Roman').size(26).spacing({ line: 276 });
  var pHead = new Paragraph({
    children: [new TextRun({
      text: heading,
      size: 36,
      color: '#cce0ff',
      bold: true,
      allCaps: true
    })],
    alignment: AlignmentType.CENTER,
    spacing: { after: 240 }
  });
  var table = new Table({ columns: config.length, rows: data.length + 1 });
  for (var i = 0; i < config.length; i++) {
    table.getCell(0, i).add(new Paragraph({
      children: [new TextRun({ text: config[i]['text'], bold: true })],
      alignment: AlignmentType.CENTER,

    })).setShading({ fill: '#cce0ff' }).setMargins(cellMargin);
    for (var j = 0; j < data.length; j++) {
      table.getCell(j + 1, i).add(new Paragraph({
        children: [new TextRun({ text: data[j][config[i].column] })],
        alignment: config[i]['align']
      })).setMargins(cellMargin);
    }
  }
  doc.addSection({
    size: { orientation: PageOrientation.LANDSCAPE },
    children: [pHead, table]
  });
  var buffer = await Packer.toBuffer(doc);
  await fsp.writeFile(path.join(exportPath, filename), buffer);
  return filename;
}

module.exports.reportFond = function (data) {
  var config = [
    { text: 'Phông số', column: 'FondNumber', align: AlignmentType.CENTER },
    { text: 'Tên phông', column: 'FondName', align: AlignmentType.JUSTIFIED },
    { text: 'Số hồ sơ', column: 'tongSoHS', align: AlignmentType.CENTER },
    { text: 'Số văn bản', column: 'tongSoVB', align: AlignmentType.CENTER },
    { text: 'Số trang', column: 'tongSoTrang', align: AlignmentType.CENTER }
  ];
  return createReport('ReportFond', 'Báo cáo danh mục phông', data, config);
}

module.exports.reportFile = function (data) {
  var config = [
    { text: 'STT', column: 'RowNum', align: AlignmentType.CENTER },
    { text: 'Phông', column: 'FondName', align: AlignmentType.JUSTIFIED },
    { text: 'Mục lục', column: 'FileCatalog', align: AlignmentType.CENTER },
    { text: 'Hộp', column: 'BoxNumber', align: AlignmentType.CENTER },
    { text: 'Hồ sơ số', column: 'FileNumber', align: AlignmentType.CENTER },
    { text: 'Ký hiệu', column: 'FileNotation', align: AlignmentType.CENTER },
    { text: 'Tiêu đề', column: 'Title', align: AlignmentType.JUSTIFIED },
    { text: 'Thời gian', column: 'FileDate', align: AlignmentType.CENTER },
    { text: 'Thời hạn bảo quản', column: 'ThoiHanBQ', align: AlignmentType.CENTER },
    { text: 'Số trang', column: 'PageNumber', align: AlignmentType.CENTER },
    { text: 'Ghi chú', column: 'Description', align: AlignmentType.JUSTIFIED }
  ];
  for (var i = 0; i < data.length; i++) {
    var date = [];
    if (data[i].StartDate) date.push(moment(data[i].StartDate).format('DD/MM/YYYY'));
    if (data[i].EndDate) date.push(moment(data[i].EndDate).format('DD/MM/YYYY'));
    data[i].FileDate = date.join('\n');
    data[i].ThoiHanBQ = data[i].Maintenance ? `${data[i].Maintenance} năm` : 'Vĩnh viễn';
  }
  return createReport('ReportFile', 'Báo cáo danh mục hồ sơ', data, config);
}

module.exports.reportDoc = function (data) {
  var config = [
    { text: 'STT', column: 'RowNum', align: AlignmentType.CENTER },
    { text: 'Phông', column: 'FondName', align: AlignmentType.JUSTIFIED },
    { text: 'Mục lục', column: 'FileCatalog', align: AlignmentType.CENTER },
    { text: 'Hộp', column: 'BoxNumber', align: AlignmentType.CENTER },
    { text: 'Hồ sơ số', column: 'FileNumber', align: AlignmentType.CENTER },
    { text: 'Số, ký hiệu', column: 'Code', align: AlignmentType.CENTER },
    { text: 'Ngày ban hành', column: 'NgayBanHanh', align: AlignmentType.CENTER },
    { text: 'Tên loại', column: 'TypeName', align: AlignmentType.CENTER },
    { text: 'Trích yếu', column: 'Subject', align: AlignmentType.JUSTIFIED },
    { text: 'Số trang', column: 'PageAmount', align: AlignmentType.CENTER },
    { text: 'Ghi chú', column: 'Description', align: AlignmentType.JUSTIFIED }
  ];
  for (var i = 0; i < data.length; i++) {
    var code = [];
    if (data[i].CodeNumber) code.push(data[i].CodeNumber);
    if (data[i].CodeNotation) code.push(data[i].CodeNotation);
    data[i].Code = code.join('/');
    data[i].NgayBanHanh = data[i].IssuedDate ? moment(data[i].IssuedDate).format('DD/MM/YYYY') : '';
  }
  return createReport('ReportDoc', 'Báo cáo danh mục văn bản', data, config);
}

// Xuất chi tiết yêu cầu tài liệu
module.exports.exportRequest = async function (data) {
  let doc = new Document({
    creator: 'GDT-AR',
    description: 'Thông tin chi tiết yêu cầu sử dụng tài liệu',
    title: 'Khai thác tài liệu'
  });
  let pageMargins = { top: 1134, right: 1134, bottom: 1134, left: 1701 };
  doc.Styles.createParagraphStyle('Normal', 'Normal').basedOn('Normal').next('Normal')
    .font('Times New Roman').size(24).justified();
  doc.Styles.createParagraphStyle('PageHeader', 'Page Header').basedOn('Normal').next('Normal')
    .size(28).spacing({ before: 0, after: 0 }).center().allCaps();
  doc.Styles.createParagraphStyle('Indent', 'Indent').basedOn('Normal').next('Normal')
    .indent({ firstLine: 720 }).size(28).spacing({ before: 120, after: 120, lineRule: 'Single' });
  doc.Styles.createParagraphStyle('TableHeader', 'Table Header').basedOn('Normal').next('Normal').bold().center();
  let signTable = new Table({ rows: 2, columns: 3 });
  signTable.properties.root[1] = [];
  signTable.getRow(0).mergeCells(0,2).add(new Paragraph({
    children: [new TextRun({ text: `Bình Định, ngày ${data['DateCreated'].getDate()} tháng ${data['DateCreated'].getMonth() + 1} năm ${data['DateCreated'].getFullYear()}`, italics: true })],
    alignment: AlignmentType.RIGHT
  }));
  signTable.getCell(1, 0).add(new Paragraph({
    children: [new TextRun({ text: 'Xét duyệt của người đứng đầu lưu trữ lịch sử', bold: true, allCaps: true })],
    alignment: AlignmentType.CENTER
  })).Properties.setWidth('30%');
  signTable.getCell(1, 1).add(new Paragraph({
    children: [new TextRun({ text: 'Ý kiến của phòng đọc', bold: true })],
    alignment: AlignmentType.CENTER
  })).Properties.setWidth('30%');
  signTable.getCell(1, 2).add(new Paragraph({
    children: [new TextRun({ text: 'Người đăng ký', bold: true })],
    alignment: AlignmentType.CENTER
  })).add(new Paragraph({
    children: [new TextRun({ text: '(Ký, họ và tên)', bold: true })],
    alignment: AlignmentType.CENTER
  }));
  doc.addSection({
    children: [
      new Paragraph({ text: 'Sở Nội vụ tỉnh Bình Định', style: 'PageHeader', pageBreakBefore: false }),
      new Paragraph({
        children: [new TextRun({ text: 'Chi cục Văn thư - Lưu trữ', bold: true })],
        style: 'PageHeader',
        thematicBreak: true
      }),
      new Paragraph({ text: '' }),
      new Paragraph({
        children: [new TextRun({ text: 'Phiếu đăng ký sử dụng tài liệu', bold: true })],
        style: 'PageHeader'
      }),
      new Paragraph({
        children: [new TextRun({ text: 'Số:', bold: true }), new TextRun(' '), new TextRun(data['ReqNumber'].toString())],
        style: 'PageHeader'
      }),
      new Paragraph({ text: '', style: 'Indent' }),
      new Paragraph({ text: '   Kính gửi: Chi cục Văn thư - Lưu trữ tỉnh Bình Định', style: 'Indent' }),
      new Paragraph({ text: '', style: 'Indent' }),
      new Paragraph({ text: 'Họ và tên độc giả: ' + data['FullName'], style: 'Indent' }),
      new Paragraph({ text: 'Ngày, tháng, năm sinh: ' + (data['Birthday'] || ''), style: 'Indent' }),
      new Paragraph({ text: 'Quốc tịch: ' + data['Nationality'], style: 'Indent' }),
      new Paragraph({ text: 'Số Chứng minh nhân dân/Số Hộ chiếu: ' + data['IdNumber'], style: 'Indent' }),
      new Paragraph({ text: 'Cơ quan công tác: ' + (data['OrganName'] || '......'), style: 'Indent' }),
      new Paragraph({ text: 'Địa chỉ liên hệ: ' + (data['Address'] || '......'), style: 'Indent' }),
      new Paragraph({ text: 'Số điện thoại: ' + data['Telephone'], style: 'Indent' }),
      new Paragraph({ text: 'Mục đích sử dụng, khai thác tài liệu: ' + (data['Uses'] || '......'), style: 'Indent' }),
      new Paragraph({ text: 'Tôi xin thực hiện nghiêm túc nội quy, quy chế của cơ quan lưu trữ và những quy định của pháp luật hiện hành về bảo vệ, khai thác, sử dụng tài liệu lưu trữ.', style: 'Indent' }),
      new Paragraph({ text: '', style: 'Indent' }),
      signTable
    ],
    margins: pageMargins,
    properties: {}
  });
  let tableMargin = { marginUnitType: WidthType.DXA, top: 40, right: 40, bottom: 40, left: 40 };
  let table = new Table({ rows: data['Content'].length + 2, columns: 9, width: 100, widthUnitType: WidthType.PERCENTAGE, margins: tableMargin });
  table.getRow(0).setTableHeader();
  table.getCell(0, 0).add(new Paragraph({ text: 'STT', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 1).add(new Paragraph({ text: 'Tên phông', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 2).add(new Paragraph({ text: 'Số, ký hiệu', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 3).add(new Paragraph({ text: 'Trích yếu', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 4).add(new Paragraph({ text: 'Số trang', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 5).add(new Paragraph({ text: 'Số bản sao lưu', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 6).add(new Paragraph({ text: 'Số bản chứng thực', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 7).add(new Paragraph({ text: 'Giá tiền', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  table.getCell(0, 8).add(new Paragraph({ text: 'Ghi chú', style: 'TableHeader' })).setShading({ fill: '#cce0ff' });
  for (let i = 0; i < data['Content'].length; i++) {
    let docInfo = data['Content'][i];
    let code = [];
    if (docInfo['CodeNumber']) code.push(docInfo['CodeNumber']);
    if (docInfo['CodeNotation']) code.push(docInfo['CodeNotation']);
    table.getCell(i + 1, 0).add(new Paragraph({ text: docInfo['rowNum'].toString(), alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 1).add(new Paragraph({ text: docInfo['FondName'], alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 2).add(new Paragraph({ text: code.join('/'), alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 3).add(new Paragraph({ text: docInfo['Subject'], alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 4).add(new Paragraph({ text: docInfo['PageAmount'].toString(), alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 5).add(new Paragraph({ text: docInfo['CopiedNumber'].toString(), alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 6).add(new Paragraph({ text: docInfo['CertifiedNumber'].toString(), alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 7).add(new Paragraph({ text: docInfo['Price'].toLocaleString('vi-VN') + ' đồng', alignment: AlignmentType.CENTER }));
    table.getCell(i + 1, 8).add(new Paragraph({ text: docInfo['Description'] || '', alignment: AlignmentType.CENTER }));
  }
  table.getRow(data['Content'].length + 1).mergeCells(0, 6).add(new Paragraph({
    text: 'Tổng chi phí: ', alignment: AlignmentType.RIGHT, style: 'TableHeader'
  }));
  table.getCell(data['Content'].length + 1, 1).add(new Paragraph({
    text: data['Content'].map(x => x['Price']).reduce((a, b) => a + b , 0).toLocaleString('vi-VN') + ' đồng'
  }));
  doc.addSection({
    size: { orientation: PageOrientation.PORTRAIT },
    children: [
      new Paragraph({ children: [new TextRun({ text: 'Danh sách văn bản đăng ký sử dụng', bold: true, allCaps: true })], alignment: AlignmentType.CENTER }),
      new Paragraph({ text: '' }),
      table
    ],
    margins: pageMargins
  })
  let buffer = await Packer.toBuffer(doc, true);
  await fsp.writeFile(path.join(exportPath, data['UUID'] + '.docx'), buffer, { overwrite: true });
}