Commit 49b94055 by chenjinjing

no message

parent 1d9debb5
......@@ -3,17 +3,17 @@
*/
import moment = require("moment");
import { OPERATIONALDATATYPE, TABLEID, TABLENAME } from "../config/enum/dbEnum";
import { BUILDING, CHANGESTATE, CHANGETYPE, DEGREE, EMIGRATIONTYPE, FUHUASTATE, INCOME, INDUSTRY, OFFLINEPROMOTION, ONLINEPROMOTION, PROMOTIONTYPE, STATE } from "../config/enum/enum";
import { OPERATIONALDATATYPE, TABLENAME } from "../config/enum/dbEnum";
import { BUILDING, CHANGESTATE, EMIGRATIONTYPE, FUHUASTATE, INDUSTRY, OFFLINEPROMOTION, ONLINEPROMOTION, PROMOTIONTYPE } from "../config/enum/enum";
import { operationalData, selectData, selectManyTableData } from "../data/operationalData";
import { getIntervalYear, getMySqlMs, randomId } from "../tools/system";
import { changeEnumValue } from "../util/verificationEnum";
import { eccFormParam } from "../util/verificationParam";
import { AdminRegisterAddConfig, YuYiBaseDataUpdateConfig } from "../config/eccParam/enterprise";
import { YuYiBaseDataUpdateConfig } from "../config/eccParam/enterprise";
import { ERRORENUM } from "../config/enum/errorEnum";
import { BizError } from "../util/bizError";
import { extractData } from "../util/piecemeal";
import { EnterpriseApplyForConfig, YuYiBaseDataConfig } from "../config/splitResult/enterprise";
import { YuYiBaseDataConfig } from "../config/splitResult/enterprise";
/**
......@@ -63,9 +63,10 @@ export async function getBaseData() {
zaifuResList.forEach(info => {
info.enterprise_leases.forEach(lease => {
// 确认租赁时间在有效范围内
if (nowTime >= lease.startTime && nowTime <= lease.endTime) {
baseData.fuhuaData["在孵面积"] += parseFloat(lease.area);
}
// if (nowTime >= lease.startTime && nowTime <= lease.endTime) {
// baseData.fuhuaData["在孵面积"] += parseFloat(lease.area);
// }
});
});
// baseData.fuhuaData["在孵面积占比"] = ((baseData.fuhuaData["在孵面积(㎡)"] / baseData.fuhuaData["总面积(㎡)"])*100).toFixed(2) + "%";
......@@ -76,7 +77,8 @@ export async function getBaseData() {
/**毕业企业 */
// let biyeList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业孵化信息, {graduationTime:{"%ne%":null}}, {});
let biyeList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业孵化信息, {moveOutType:EMIGRATIONTYPE.毕业迁出}, {});
// let biyeList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业孵化信息, {moveOutType:EMIGRATIONTYPE.毕业迁出}, {});
let biyeList = await selectData(OPERATIONALDATATYPE.查询多个, TABLENAME.企业孵化信息, {"%or%":[{moveOutType:EMIGRATIONTYPE.毕业迁出}, {moveOutType:EMIGRATIONTYPE.毕业未迁出}]}, {});
if (biyeList) baseData.fuhuaData["毕业企业"] = biyeList.length;
/**孵化器信息 */
......@@ -123,7 +125,7 @@ export async function getBaseData() {
"4":{"入驻率":"", "入驻企业":入驻企业[BUILDING["4号楼"]].length}};
if (entryList.length) {
entryList.forEach( info => {
// let building = changeEnumValue(BUILDING, info.building);
// let = changeEnumValue(BUILDING, info.building);
let building = info.building;
if (!entryInfo[building]) {
entryInfo[building] = { "入驻率": "", "入驻企业": "" };
......@@ -247,7 +249,7 @@ export async function getOperateData(year) {
let biyeList = await selectData(
OPERATIONALDATATYPE.查询多个,
TABLENAME.企业孵化信息,
{ moveOutType: EMIGRATIONTYPE.毕业迁出 }, {}); // 只查毕业迁出的企业
{"%or%":[{ moveOutType:EMIGRATIONTYPE.毕业迁出 }, { moveOutType:EMIGRATIONTYPE.毕业未迁出 }]}, {}); // 只查毕业迁出的企业
let biyeInfo = { ...qushiConf }; // 每月初始化为0
......@@ -270,7 +272,7 @@ export async function getOperateData(year) {
//将 industry 字符串转换为数组
let manyTableInfo: any = {}
manyTableInfo[TABLENAME.企业孵化信息] = { column: ["fId", "eId", "startTime", "endTime", "state"], where: {} };
manyTableInfo[TABLENAME.企业孵化信息] = { column: ["fId", "eId", "startTime", "endTime", "state"], where: {state: { "%between%": [FUHUASTATE.实体孵化, FUHUASTATE.虚拟孵化] }} };
manyTableInfo[TABLENAME.租赁信息] = { column: ["area", "startTime", "endTime"], where: {} };
let fhdbList = await selectManyTableData(OPERATIONALDATATYPE.多表联查, TABLENAME.企业基础信息表, { state: CHANGESTATE.已通过 }, ["industry", "eId"], manyTableInfo);
......@@ -383,7 +385,7 @@ export async function getRiskData() {
fhdbList.forEach(info => {
let riskLevel = "";
if (info.enterprise_fuhuas[0].moveOutType == EMIGRATIONTYPE.违约退租 || info.enterprise_fuhuas[0].moveOutType == EMIGRATIONTYPE.到期退租) {
if (info.enterprise_fuhuas[0].moveOutType == EMIGRATIONTYPE.违约退租) {
yj.高风险 += 1;
riskLevel = "高风险";
riskEnterprises.push([info.enterpriseName, riskLevel]);
......@@ -391,6 +393,10 @@ export async function getRiskData() {
yj.中低风险 += 1;
riskLevel = "中低风险";
riskEnterprises.push([info.enterpriseName, riskLevel]);
} else if (info.enterprise_fuhuas[0].moveOutType == EMIGRATIONTYPE.到期退租) {
yj.关注 += 1;
riskLevel = "关注";
riskEnterprises.push([info.enterpriseName, riskLevel]);
}
});
......
......@@ -96,7 +96,15 @@ export async function getRuFuState(uId) {
if (enterpriseInfo.state == CHANGESTATE.未审核 && enterpriseInfo.register == CHANGESTATE.已通过) {
let leaseInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.租赁信息, {eId:enterpriseUserInfo.eId}, []);
//如果入孵申请已通过,并且入孵材料还未上传,进入材料上传界面
if (!leaseInfo.leaseContract && !leaseInfo.entryPlan || !leaseInfo.businessLicense || !leaseInfo.agreement) {
let leaseConf = ["sanFangXieYi", "fuHuaXieYi", "fangWuZuLing", "fuHuaXieYiBuChong", "chengXinChengNuoHan", "yingYeZhiZhao", "ruFuZiLiao", "ruZhuJiHua", "cardCopy"];
// ruFuState = RUFUSTATE.入孵材料审核中;
// if (leaseConf.some(key => !(key in leaseInfo))) {
// ruFuState = RUFUSTATE.入孵材料填写;
// }
if (!leaseInfo.sanFangXieYi || !leaseInfo.fuHuaXieYi || !leaseInfo.fangWuZuLing || !leaseInfo.fuHuaXieYiBuChong || !leaseInfo.chengXinChengNuoHan ||
!leaseInfo.yingYeZhiZhao || !leaseInfo.ruFuZiLiao || !leaseInfo.ruZhuJiHua || !leaseInfo.cardCopy) {
ruFuState = RUFUSTATE.入孵材料填写;
} else {
ruFuState = RUFUSTATE.入孵材料审核中;
......@@ -148,7 +156,7 @@ export async function createRuFu(uId, param) {
};
await operationalData(OPERATIONALDATATYPE.增加, TABLENAME.企业基础信息表, addEInfo, {});
await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.企业用户表, {eId:addEInfo.eId}, {uId});
await operationalData(OPERATIONALDATATYPE.修改, TABLENAME.企业用户表, {eId:addEInfo.eId, uscc:addEInfo.uscc}, {uId});
let fuHuaInfo = {
eId:addEInfo.eId,
......@@ -257,7 +265,8 @@ export async function getRuFu(eId:string) {
if (!enterpriseUserInfo || !enterpriseUserInfo.eId) {
throw new BizError(ERRORENUM.请先申请入孵);
}
let leaseFilesList = ["leaseId", "area", "leaseContract", "entryPlan", "businessLicense", "agreement"];
let leaseFilesList = ["leaseId", "area",
"sanFangXieYi", "fuHuaXieYi", "fangWuZuLing", "fuHuaXieYiBuChong", "chengXinChengNuoHan", "yingYeZhiZhao", "ruFuZiLiao", "ruZhuJiHua", "yaJinZhiFu", "cardCopy"];
let leaseInfo = await selectData(OPERATIONALDATATYPE.查询单个, TABLENAME.租赁信息, {eId}, leaseFilesList);
enterpriseUserInfo.logonAddress = JSON.parse(enterpriseUserInfo.logonAddress);
......@@ -273,20 +282,39 @@ export async function getRuFu(eId:string) {
dataInfo.area = leaseInfo.area;
/**跳转用 */
dataInfo.leaseContractUrl = leaseInfo.leaseContract;
dataInfo.entryPlanUrl = leaseInfo.entryPlan;
dataInfo.businessLicenseUrl = leaseInfo.businessLicense;
dataInfo.agreementUrl = leaseInfo.agreement;
dataInfo.area = leaseInfo.area;
dataInfo.sanFangXieYiUrl = leaseInfo.sanFangXieYi;
dataInfo.fuHuaXieYiUrl = leaseInfo.fuHuaXieYi;
dataInfo.fangWuZuLingUrl = leaseInfo.fangWuZuLing;
dataInfo.fuHuaXieYiBuChongUrl = leaseInfo.fuHuaXieYiBuChong;
dataInfo.chengXinChengNuoHanUrl = leaseInfo.chengXinChengNuoHan;
dataInfo.yingYeZhiZhaoUrl = leaseInfo.yingYeZhiZhao;
dataInfo.ruFuZiLiaoUrl = leaseInfo.ruFuZiLiao;
dataInfo.ruZhuJiHuaUrl = leaseInfo.ruZhuJiHua;
dataInfo.yaJinZhiFuUrl = leaseInfo.yaJinZhiFu;
dataInfo.cardCopy = leaseInfo.cardCopy;
/**显示用:名称 */
dataInfo.leaseContract = getFileNameAndFormat(leaseInfo.leaseContract);
dataInfo.entryPlan = getFileNameAndFormat(leaseInfo.entryPlan);
dataInfo.businessLicense = getFileNameAndFormat(leaseInfo.businessLicense);
dataInfo.agreement = getFileNameAndFormat(leaseInfo.agreement);
dataInfo.leaseContractModelUrl = "/yuyi/files/房屋租赁合同模板.docx";
dataInfo.entryPlanModelUrl = "/yuyi/files/孵化企业入驻计划.xlsx";
dataInfo.businessLicenseUrl = "/yuyi/files/营业执照复印件.docx";
dataInfo.agreementModelUrl = "/yuyi/files/孵化协议模板.docx";
dataInfo.sanFangXieYi = getFileNameAndFormat(leaseInfo.sanFangXieYi);
dataInfo.fuHuaXieYi = getFileNameAndFormat(leaseInfo.fuHuaXieYi);
dataInfo.fangWuZuLing = getFileNameAndFormat(leaseInfo.fangWuZuLing);
dataInfo.fuHuaXieYiBuChong = getFileNameAndFormat(leaseInfo.fuHuaXieYiBuChong);
dataInfo.chengXinChengNuoHan = getFileNameAndFormat(leaseInfo.chengXinChengNuoHan);
dataInfo.yingYeZhiZhao = getFileNameAndFormat(leaseInfo.yingYeZhiZhao);
dataInfo.ruFuZiLiao = getFileNameAndFormat(leaseInfo.ruFuZiLiao);
dataInfo.ruZhuJiHua = getFileNameAndFormat(leaseInfo.ruZhuJiHua);
dataInfo.yaJinZhiFu = getFileNameAndFormat(leaseInfo.yaJinZhiFu);
dataInfo.cardCopy = getFileNameAndFormat(leaseInfo.cardCopy);
/**下载用:模板 */
dataInfo.sanFangXieYiModelUrl = "/yuyi/files/三方协议.docx"
dataInfo.fuHuaXieYiModelUrl = "/yuyi/files/孵化协议最新版.docx"
// dataInfo.fangWuZuLingModelUrl = ""
dataInfo.fuHuaXieYiBuChongModelUrl = "/yuyi/files/孵化协议补充协议书.docx"
dataInfo.chengXinChengNuoHanModelUrl = "/yuyi/files/诚信承诺函.docx"
// dataInfo.yingYeZhiZhaoModelUrl = ""
dataInfo.ruFuZiLiaoModelUrl = "/yuyi/files/入孵资料明细.xls"
dataInfo.ruZhuJiHuaModelUrl = "/yuyi/files/孵化企业入驻计划.xlsx"
// dataInfo.yaJinZhiFuModelUrl = ""
// dataInfo.cardCopyModelUrl = ""
return {dataInfo};
}
......
......@@ -29,10 +29,22 @@ export const PolicyUpdateConfig = {
export const ApplyForUpdateConfig = {
leaseContract:{type:"String"},// 房屋租赁合同链接
entryPlan:{type:"String"},// 入驻计划复印件链接
businessLicense:{type:"String"},// 营业执照复印件链接
agreement:{type:"String"},// 孵化协议链接
sanFangXieYi:{type:"String"}, //三方协议链接
fuHuaXieYi:{type:"String"}, //孵化协议链接
fangWuZuLing:{type:"String"}, //房屋租赁合同链接
fuHuaXieYiBuChong:{type:"String"}, //孵化协议补充协议书链接
chengXinChengNuoHan:{type:"String"}, //诚信承诺函链接
yingYeZhiZhao:{type:"String"}, //营业执照复印件链接
ruFuZiLiao:{type:"String"}, //入孵资料明细链接
ruZhuJiHua:{type:"String"}, //入驻计划复印件链接
yaJinZhiFu:{type:"String"}, //押金支付凭证链接
cardCopy:{type:"String"}, //身份证复印件地址链接
// leaseContract:{type:"String"},// 房屋租赁合同链接
// entryPlan:{type:"String"},// 入驻计划复印件链接
// businessLicense:{type:"String"},// 营业执照复印件链接
// agreement:{type:"String"},// 孵化协议链接
// tripartiteAgreement:{type:"String"},// 三方协议链接
}
export const SettleInForUpdateConfig = {
......@@ -61,8 +73,8 @@ export const RegisterUpdateConfig = {
enterpriseName:{type:"String"},//企业名称
logonAddress:{type:"String"},//注册地址
uscc:{type:"String"},//统一信用代码
leaseTimeStart:{type:"Number"},//租赁开始时间
leaseTimeEnd:{type:"Number"},//租赁结束时间
// leaseTimeStart:{type:"Number"},//租赁开始时间
// leaseTimeEnd:{type:"Number"},//租赁结束时间
logonTime:{type:"Number"},//注册时间
area:{type:"Number"},//面积
}
......@@ -90,10 +102,22 @@ export const AdminRegisterAddConfig = {
export const AdminRegisterUpdateConfig = {
leaseContract:{type:"String",required: true, message: '房屋租赁合同不能为空' },// 房屋租赁合同链接
entryPlan:{type:"String",required: true, message: '入驻计划复印件不能为空'},// 入驻计划复印件链接
businessLicense:{type:"String",required: true, message: '营业执照复印件不能为空'},// 营业执照复印件链接
agreement:{type:"String",required: true, message: '孵化协议不能为空'},// 孵化协议链接
sanFangXieYi:{type:"String", required:true, message: '三方协议不能为空'}, //三方协议链接
fuHuaXieYi:{type:"String", required:true, message: '孵化协议不能为空'}, //孵化协议链接
fangWuZuLing:{type:"String", required:true, message: '房屋租赁合同不能为空'}, //房屋租赁合同链接
fuHuaXieYiBuChong:{type:"String", required:true, message: '孵化协议补充协议书不能为空'}, //孵化协议补充协议书链接
chengXinChengNuoHan:{type:"String", required:true, message: '诚信承诺函不能为空'}, //诚信承诺函链接
yingYeZhiZhao:{type:"String", required:true, message: '营业执照复印件不能为空'}, //营业执照复印件链接
ruFuZiLiao:{type:"String", required:true, message: '入孵资料明细不能为空'}, //入孵资料明细链接
ruZhuJiHua:{type:"String", required:true, message: '入驻计划复印件不能为空'}, //入驻计划复印件链接
cardCopy:{type:"String", required:true, message: '身份证复印件地址不能为空'}, //身份证复印件地址链接
yaJinZhiFu:{type:"String", required:false}, //押金支付凭证链接
// leaseContract:{type:"String",required: true, message: '房屋租赁合同不能为空' },// 房屋租赁合同链接
// entryPlan:{type:"String",required: true, message: '入驻计划复印件不能为空'},// 入驻计划复印件链接
// businessLicense:{type:"String",required: true, message: '营业执照复印件不能为空'},// 营业执照复印件链接
// agreement:{type:"String",required: true, message: '孵化协议不能为空'},// 孵化协议链接
// tripartiteAgreement:{type:"String",required: true, message: '三方协议不能为空'},// 三方协议链接
}
......
......@@ -59,6 +59,13 @@ export enum TABLENAME {
作品著作权 = "copy_right",
软件著作权 = "software_copyright",
专利 = "patent",
高新企业创新能力评价答题="gaoxin_answer",
高新企业创新能力评价选项="gaoxin_option",
答题记录="gaoxin_answerrecord",
答题记录明细="gaoxin_answerdetail",
租房补贴企业自评="zufang_answer",
租房补贴答题记录="zufang_answerrecord",
租房补贴答题记录明细="zufang_answerdetail",
}
......@@ -102,6 +109,11 @@ export enum TABLEID {
商标 = "trm",
作品著作权= "cr",
软件著作权 = "sc",
专利="patent"
专利="patent",
高新企业创新能力评价答题="ga",
高新企业创新能力评价选项="go",
答题记录="gar",
答题记录明细="gad",
租房补贴企业自评="zaId",
租房补贴答题记录="zarId",
}
\ No newline at end of file
......@@ -2,15 +2,22 @@
* 行业领域
*/
export enum INDUSTRY{
集成电路 = 1,
生物医药,
人工智能及智能制造,
航空航天,
汽车产业,
软件和信息服务业,
低碳环保及新材料,
综合,
文化创意
"信息传输、软件和信息技术服务业" = 1,
科学研究和技术服务业,
制造业,
建筑业,
租赁和商务服务业,
批发和零售业
// 集成电路 = 1,
// 生物医药,
// 人工智能及智能制造,
// 航空航天,
// 汽车产业,
// 软件和信息服务业,
// 低碳环保及新材料,
// 综合,
// 文化创意
}
......@@ -72,6 +79,7 @@ export enum FUHUASTATE {
*/
export enum EMIGRATIONTYPE {
毕业迁出 = 1,
毕业未迁出, //新加状态
到期退租,
违约退租
}
......@@ -112,8 +120,8 @@ export enum SEX {
* 创始团队
*/
export enum ENTERPRISETEAM {
国际一流人才=2,
国内一流人才
海外人才 = 2,
国内人才
}
......@@ -304,6 +312,12 @@ export enum QUARTER {
}
export enum IPRTYPE {
软件著作权 = 1,
专利 = 100,
其他 = 200
}
/**
* 知识产权 全类型
......@@ -336,10 +350,14 @@ export enum IPRALLTYPE {
}
export enum IPRTYPE {
软件著作权 = 1,
专利 = 100,
其他 = 200
/**
* 租房补贴题目
*/
export enum ANSWERTYPE {
是否有研发费用 = 1,
是否有缴纳社保,
是否有软著等知识产权,
是否认定科小或创新型中小企业
}
......
......@@ -8,7 +8,7 @@ export enum ENTERPRISEBASE {
注册地址 = "logonAddress",
企业规模 = "qiYeGuiMo",
孵化时间 = "fuHuaTime",
租赁时间 = "startTime",
// 租赁时间 = "startTime",
租赁面积 = "area",
楼号 = "building",
室号 = "roomNumber"
......@@ -62,7 +62,7 @@ export enum ENTERPRISEBASEMOVEOUT {
注册地址 = "logonAddress",
企业规模 = "qiYeGuiMo",
孵化时间 = "fuHuaTime",
租赁时间 = "startTime",
// 租赁时间 = "startTime",
租赁面积 = "area",
楼号 = "building",
室号 = "roomNumber"
......
import { updateItemQCCData } from "./biz/qccInit";
import { initConfig, systemConfig } from "./config/serverConfig";
import { initApiDataStorage } from "./data/dataInterfaceWithCache";
import { httpServer } from "./net/http_server";
......@@ -9,6 +10,7 @@ async function lanuch() {
console.log('This indicates that the server is started successfully.');
await initApiDataStorage();
}
......
......@@ -64,6 +64,7 @@ export function setRouter(httpServer) {
httpServer.post('/admin/library/manage/list', checkUser, asyncHandler(manageList));
httpServer.post('/admin/library/dw/manage/list', checkUser, asyncHandler(outPutManageList));
httpServer.post('/admin/library/manage/update', checkUser, asyncHandler(updateManage));
httpServer.post('/admin/library/manage/pass', checkUser, asyncHandler(managePass));
httpServer.post('/admin/library/financing/list', checkUser, asyncHandler(financingList));
......@@ -523,6 +524,14 @@ async function outPutManageList(req, res) {
res.success(result);
}
async function updateManage(req, res) {
const UserInfo = req.userInfo;
let {mId, BI, TXP, RD } = req.body
let result = await enterpriseInfoBiz.updateManage(mId, BI, TXP, RD);
res.success(result);
}
async function managePass(req, res) {
const UserInfo = req.userInfo;
......
/**
* 管理后台-企业自评
*/
import * as asyncHandler from 'express-async-handler';
import * as answerBiz from '../biz/answer';
import { checkUser } from '../middleware/user';
export function setRouter(httpServer) {
httpServer.post('/admin/answer/gaoxin/list', checkUser, asyncHandler(enterpriseResults));
httpServer.post('/admin/answer/gaoxin/details', checkUser, asyncHandler(getAnswerDetails));
httpServer.post('/admin/answer/zufang/list', checkUser, asyncHandler(getHousingSubsidy));
}
/**
* 高新-企业自评结果列表
* @param req
* @param res
*/
async function enterpriseResults(req, res) {
const UserInfo = req.userInfo;
let {enterpriseName, page } = req.body
let result = await answerBiz.enterpriseResults(enterpriseName, page);
res.success(result);
}
/**
* 高新-企业自评结果列表
* @param req
* @param res
*/
async function getAnswerDetails(req, res) {
const UserInfo = req.userInfo;
let {garId, answerType } = req.body
let result = await answerBiz.getAnswerDetails(garId, answerType);
res.success(result);
}
/**
* 高新-企业自评结果列表
* @param req
* @param res
*/
async function getHousingSubsidy(req, res) {
const UserInfo = req.userInfo;
let { enterpriseName, page } = req.body
let result = await answerBiz.getHousingSubsidyEligibilityList(enterpriseName, page);
res.success(result);
}
......@@ -7,6 +7,7 @@ import * as enterpriseInfoRouters from './admin';
import * as fuhuaRouters from './fuhua';
import * as dbInitRouters from './dbinit';
import * as userRuFuRouters from './userRuFu';
import * as answerRouters from './answer';
export function setRouter(httpServer){
/**下拉框等公用 路由 */
publicRouters.setRouter(httpServer);
......@@ -18,4 +19,5 @@ export function setRouter(httpServer){
dbInitRouters.setRouter(httpServer);
userRuFuRouters.setRouter(httpServer);
answerRouters.setRouter(httpServer);
}
\ No newline at end of file
......@@ -164,6 +164,22 @@ export function getIntervalYear(startTime, endTime) {
}
/**
* 去除地址包含相同上海市上海市问题
* @param address
*/
export function getAddresList(address) {
let logonAddress = [];
if (address) {
let logonAddressList = JSON.parse(address || '[]')
for (let i = 0; i < logonAddressList.length; i++) {
if (logonAddressList[i] != logonAddressList[i+1]) logonAddress.push(logonAddressList[i]);
}
}
return logonAddress;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment