diff --git a/BO/Views/cm/cmregest.cshtml b/BO/Views/cm/cmregest.cshtml index f207321..39a19e1 100644 --- a/BO/Views/cm/cmregest.cshtml +++ b/BO/Views/cm/cmregest.cshtml @@ -58,7 +58,7 @@ - + @* 환급 비율(점수) @@ -78,7 +78,7 @@ - + *@ @if (Model.CM.cshape == 2)//혼합유형 diff --git a/BO/Views/croom/gradeall0.cshtml b/BO/Views/croom/gradeall0.cshtml index 08fc316..da5c782 100644 --- a/BO/Views/croom/gradeall0.cshtml +++ b/BO/Views/croom/gradeall0.cshtml @@ -69,11 +69,11 @@ @d.userid @d.mobile @((d.cshape == 0 && d.isrebate == 0 ? d.payoktime : d.sdate).Value.ToShortDateString()) - @if (d.cshape == 2) + @if (d.cshape > 0) { if (d.iscomplete != 1) { - @d.eend.ToShortDateString() + @d.eend.ToShortDateString() } else { diff --git a/BO/Web.config b/BO/Web.config index 9b979cd..1e4dd1e 100644 --- a/BO/Web.config +++ b/BO/Web.config @@ -55,8 +55,8 @@ - - + + @@ -267,7 +267,7 @@ - + @@ -283,7 +283,7 @@ - + @@ -294,7 +294,7 @@ - + @@ -305,7 +305,7 @@ - + @@ -316,7 +316,7 @@ - + @@ -327,7 +327,7 @@ - + @@ -338,7 +338,7 @@ - + diff --git a/Base/Controller/FCommon.cs b/Base/Controller/FCommon.cs index ffb6e81..e22bfee 100644 --- a/Base/Controller/FCommon.cs +++ b/Base/Controller/FCommon.cs @@ -295,13 +295,23 @@ namespace NP.Base.Controllers #endregion #region 소속선택 - var isCompany = !string.IsNullOrEmpty(Request["isCompany1"]) ? Convert.ToInt32(Request["isCompany1"]) : (int?)null; - if (isCompany == 0) //개인 + int isCompany = 0; + if (!string.IsNullOrEmpty(Request["isCompany"])) + { + string[] strValue = Request["isCompany"].Split(','); + if(strValue[0] == "1") + { + isCompany = 1; + } + } + + //var isCompany = !string.IsNullOrEmpty(Request["isCompany1"]) ? Convert.ToInt32(Request["isCompany1"]) : (int?)null; + if (isCompany == 0 && pplog.isrebate != 1) //개인 { pplog.asno = null; vm.Assign = null; } - else if (isCompany == 1) //업체 + else if (isCompany == 1 || (isCompany == 0 && pplog.isrebate == 1)) //업체 { //업체인데 회사정보가 안넘어오면 에러처리 if (vm.Assign == null) diff --git a/Dao/MyBatis/Maps/CM.xml b/Dao/MyBatis/Maps/CM.xml index 7e483b1..eb5c7b6 100644 --- a/Dao/MyBatis/Maps/CM.xml +++ b/Dao/MyBatis/Maps/CM.xml @@ -1890,7 +1890,7 @@ select a.cmisno,a.cmino,a.estart,a.eend,a.quota,a.cdt,a.udt,a.studyplace,a.studyplacename,a.startmonth ,a.remainPeople - ,a.isselected + ,a.isselected, ,case when a.remainPeople <= 0 then 0 else 1 end isend from ( @@ -1919,31 +1919,32 @@ @*등급*@ @*직무분야*@ @*전문분야*@ + @*업체/개인 선택*@ @@ -188,145 +189,42 @@ @*@if (Model.CM.isrefund == 1) - {*@ -
-

회사정보 확인

-

*는 필수 입력사항입니다.

- @*

계산서 발급을 원할 경우 담당자성명, 담당자연락처를 제외한 모든 사항 필수 입력을 해주세요.

*@ - @Html.HiddenFor(x => x.Assign.asno) - @Html.HiddenFor(x => x.Assign.eino) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @* - - - *@ - -
회사명 - @Html.TextBoxFor(x => x.Assign.asname, new { @class = "apylpt", @maxlength = "100", @style = "background-color:#ddd;", @readonly = true }) - 검색 -
사업자등록번호@Html.TextBoxFor(x => x.Assign.brno, new { @class = "apylpt", @maxlength = "10" })
대표자성명@Html.TextBoxFor(x => x.Assign.ceoname, new { @class = "apylpt", @maxlength = "50" })
주소 -
    -
  • - @Html.TextBoxFor(x => x.Assign.post, new { @class = "postno", @style = "background-color:#ddd;" }) -
  • -
  • - @Html.TextBoxFor(x => x.Assign.address1, new { @class = "postadr", @style = "background-color:#ddd;", @placeholder = "주소입력" }) -
  • -
  • - @Html.TextBoxFor(x => x.Assign.address2, new { @class = "postadrsub", @placeholder = "나머지 주소입력", @maxlength = "200" }) -
  • -
  • - 우편번호검색 -
  • -
-
업태@Html.TextBoxFor(x => x.Assign.btype, new { @class = "apylpt", @maxlength = "50" })
종목@Html.TextBoxFor(x => x.Assign.bkind, new { @class = "apylpt", @maxlength = "50" })
담당자성명@Html.TextBoxFor(x => x.Assign.mname, new { @class = "apylpt", @maxlength = "30" })
담당자연락처 -
    -
  • @Html.TextBoxFor(x => x.Assign.mphone1, new { @maxlength = "3" })
  • -
  • -
  • -
  • @Html.TextBoxFor(x => x.Assign.mphone2, new { @maxlength = "4" })
  • -
  • -
  • -
  • @Html.TextBoxFor(x => x.Assign.mphone3, new { @maxlength = "4" })
  • -
-
계산서받을 이메일 -
    -
  • @Html.TextBoxFor(x => x.Assign.taxemail1, new { @maxlength = "100" })
  • -
  • -
  • @Html.TextBoxFor(x => x.Assign.taxemail2, new { @maxlength = "30" })
  • -
-
사업자등록증 (선택) - @Html.Partial("./Partial/file", Model.FileList, new ViewDataDictionary { { "fgn", "fgnobno" }, { "fgv", Model.Assign.fgnobno ?? 0 }, { "filename", "file1" }, { "filecount", 1 }, { "fileext", "png,jpg,gif,pdf" }, { "datakey", "assign.fgnobno" } }) -
-
- @*}*@ -

개인정보 확인

+ {*@ +
+

회사정보 확인

*는 필수 입력사항입니다.

- @Html.HiddenFor(x => x.User.userno) + @*

계산서 발급을 원할 경우 담당자성명, 담당자연락처를 제외한 모든 사항 필수 입력을 해주세요.

*@ + @Html.HiddenFor(x => x.Assign.asno) + @Html.HiddenFor(x => x.Assign.eino) - - - - - + - - + + - - + + - + - - - - - - - + + + - + + + + + + + + + + + + + + @* + + + *@
이름

@Html.TextBoxFor(x => x.User.username, new { @class = "apylpt", @maxlength = "10", @style = "background-color:#ddd;", @readonly = true })

주민등록번호회사명 -
    -
  • @Html.TextBoxFor(x => x.User.userpno1, new { @maxlength = "6", @readonly = "readonly", @style = "background-color:#ddd;" })
  • -
  • -
  • -
  • @Html.TextBoxFor(x => x.User.userpno2, new { @maxlength = "7", @readonly = "readonly", @style = "background-color:#ddd;" })
  • -
+ @Html.TextBoxFor(x => x.Assign.asname, new { @class = "apylpt", @maxlength = "100", @style = "background-color:#ddd;", @readonly = true }) + 검색
휴대전화 -
    -
  • @Html.TextBoxFor(x => x.User.mobile1, new { @maxlength = "3", @readonly = "readonly", @style = "background-color:#ddd;" })
  • -
  • -
  • -
  • @Html.TextBoxFor(x => x.User.mobile2, new { @maxlength = "4", @readonly = "readonly", @style = "background-color:#ddd;" })
  • -
  • -
  • -
  • @Html.TextBoxFor(x => x.User.mobile3, new { @maxlength = "4", @readonly = "readonly", @style = "background-color:#ddd;" })
  • -
-
사업자등록번호@Html.TextBoxFor(x => x.Assign.brno, new { @class = "apylpt", @maxlength = "10" })
이메일 -
    -
  • @Html.TextBoxFor(x => x.User.email1, new { @maxlength = "100" })
  • -
  • -
  • @Html.TextBoxFor(x => x.User.email2, new { @maxlength = "30" })
  • -
-
대표자성명@Html.TextBoxFor(x => x.Assign.ceoname, new { @class = "apylpt", @maxlength = "50" })
주소주소
  • - @Html.TextBoxFor(x => x.User.post, new { @class = "postno", @style = "background-color:#ddd;", @readonly = true }) + @Html.TextBoxFor(x => x.Assign.post, new { @class = "postno", @style = "background-color:#ddd;" })
  • - @Html.TextBoxFor(x => x.User.address1, new { @class = "postadr", @style = "background-color:#ddd;", @readonly = true, @placeholder = "주소입력" }) + @Html.TextBoxFor(x => x.Assign.address1, new { @class = "postadr", @style = "background-color:#ddd;", @placeholder = "주소입력" })
  • - @Html.TextBoxFor(x => x.User.address2, new { @class = "postadrsub", @placeholder = "나머지 주소입력", @maxlength = "200" }) + @Html.TextBoxFor(x => x.Assign.address2, new { @class = "postadrsub", @placeholder = "나머지 주소입력", @maxlength = "200" })
  • 우편번호검색 @@ -334,63 +232,167 @@
채용형태 -
    -
  • - @Html.RadioButtonFor(model => model.User.isassignuser, "1", new { @name = "recruit", @checked = "checked" })정규직 -
  • -
  • - @Html.RadioButtonFor(model => model.User.isassignuser, "0", new { @name = "recruit" })비정규직 -
  • -
-
직위 - @Html.TextBoxFor(x => x.User.uduty, new { @class = "apylpt", @maxlength = "20" }) -
업태@Html.TextBoxFor(x => x.Assign.btype, new { @class = "apylpt", @maxlength = "50" })
학력종목@Html.TextBoxFor(x => x.Assign.bkind, new { @class = "apylpt", @maxlength = "50" })
담당자성명@Html.TextBoxFor(x => x.Assign.mname, new { @class = "apylpt", @maxlength = "30" })
담당자연락처 -
    -
  • - @Html.RadioButtonFor(model => model.User.slevel, "0", new { @name = "eduGrade", @checked = "checked" })기타 -
  • -
  • - @Html.RadioButtonFor(model => model.User.slevel, "1", new { @name = "eduGrade" })고졸 -
  • -
  • - @Html.RadioButtonFor(model => model.User.slevel, "2", new { @name = "eduGrade" })학사 -
  • -
  • - @Html.RadioButtonFor(model => model.User.slevel, "3", new { @name = "eduGrade" })석사 -
  • -
  • - @Html.RadioButtonFor(model => model.User.slevel, "4", new { @name = "eduGrade" })박사 -
  • +
      +
    • @Html.TextBoxFor(x => x.Assign.mphone1, new { @maxlength = "3" })
    • +
    • -
    • +
    • @Html.TextBoxFor(x => x.Assign.mphone2, new { @maxlength = "4" })
    • +
    • -
    • +
    • @Html.TextBoxFor(x => x.Assign.mphone3, new { @maxlength = "4" })
    • +
    +
계산서받을 이메일 +
    +
  • @Html.TextBoxFor(x => x.Assign.taxemail1, new { @maxlength = "100" })
  • +
  • +
  • @Html.TextBoxFor(x => x.Assign.taxemail2, new { @maxlength = "30" })
사업자등록증 (선택) + @Html.Partial("./Partial/file", Model.FileList, new ViewDataDictionary { { "fgn", "fgnobno" }, { "fgv", Model.Assign.fgnobno ?? 0 }, { "filename", "file1" }, { "filecount", 1 }, { "fileext", "png,jpg,gif,pdf" }, { "datakey", "assign.fgnobno" } }) +
+
+ @*}*@ +

개인정보 확인

+

*는 필수 입력사항입니다.

+ @Html.HiddenFor(x => x.User.userno) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
이름

@Html.TextBoxFor(x => x.User.username, new { @class = "apylpt", @maxlength = "10", @style = "background-color:#ddd;", @readonly = true })

주민등록번호 +
    +
  • @Html.TextBoxFor(x => x.User.userpno1, new { @maxlength = "6", @readonly = "readonly", @style = "background-color:#ddd;" })
  • +
  • -
  • +
  • @Html.TextBoxFor(x => x.User.userpno2, new { @maxlength = "7", @readonly = "readonly", @style = "background-color:#ddd;" })
  • +
+
휴대전화 +
    +
  • @Html.TextBoxFor(x => x.User.mobile1, new { @maxlength = "3", @readonly = "readonly", @style = "background-color:#ddd;" })
  • +
  • -
  • +
  • @Html.TextBoxFor(x => x.User.mobile2, new { @maxlength = "4", @readonly = "readonly", @style = "background-color:#ddd;" })
  • +
  • -
  • +
  • @Html.TextBoxFor(x => x.User.mobile3, new { @maxlength = "4", @readonly = "readonly", @style = "background-color:#ddd;" })
  • +
+
이메일 +
    +
  • @Html.TextBoxFor(x => x.User.email1, new { @maxlength = "100" })
  • +
  • +
  • @Html.TextBoxFor(x => x.User.email2, new { @maxlength = "30" })
  • +
+
주소 +
    +
  • + @Html.TextBoxFor(x => x.User.post, new { @class = "postno", @style = "background-color:#ddd;", @readonly = true }) +
  • +
  • + @Html.TextBoxFor(x => x.User.address1, new { @class = "postadr", @style = "background-color:#ddd;", @readonly = true, @placeholder = "주소입력" }) +
  • +
  • + @Html.TextBoxFor(x => x.User.address2, new { @class = "postadrsub", @placeholder = "나머지 주소입력", @maxlength = "200" }) +
  • +
  • + 우편번호검색 +
  • +
+
채용형태 +
    +
  • + @Html.RadioButtonFor(model => model.User.isassignuser, "1", new { @name = "recruit", @checked = "checked" })정규직 +
  • +
  • + @Html.RadioButtonFor(model => model.User.isassignuser, "0", new { @name = "recruit" })비정규직 +
  • +
+
직위 + @Html.TextBoxFor(x => x.User.uduty, new { @class = "apylpt", @maxlength = "20" }) +
학력 +
    +
  • + @Html.RadioButtonFor(model => model.User.slevel, "0", new { @name = "eduGrade", @checked = "checked" })기타 +
  • +
  • + @Html.RadioButtonFor(model => model.User.slevel, "1", new { @name = "eduGrade" })고졸 +
  • +
  • + @Html.RadioButtonFor(model => model.User.slevel, "2", new { @name = "eduGrade" })학사 +
  • +
  • + @Html.RadioButtonFor(model => model.User.slevel, "3", new { @name = "eduGrade" })석사 +
  • +
  • + @Html.RadioButtonFor(model => model.User.slevel, "4", new { @name = "eduGrade" })박사 +
  • +
+
- + - + @Html.Partial("./Partial/BoxAssign", null, new ViewDataDictionary { { "bindmethod", "bindassign" } }) @section styles{ - @Html.Partial("./Partial/ScriptDate") -} - + function cbsave() { + if (capResult.code == 1000) { + if (capResult.obj == 0) { + var resultmsg = capResult.msg; + if (resultmsg.indexOf("buyertel")) { + //msg("개인정보에 휴대폰 번호를 입력해주세요."); + msg(capResult.msg || "이미 신청한 강좌인지 확인해주세요."); + } else { + msg(capResult.msg); + } + } + else { + if (capResult.obj.ptype == 6 || capResult.obj.ptype == 7) { + location.href = "@Model.viewname4?payno=" + capResult.obj.payno + "&absptype=" + capResult.obj.ptype; + return; + } + else { + setv("LGD_OID", capResult.obj.oid2 + capResult.obj.payno); + setv("LGD_CLOSEDATE", capResult.obj.paylimityyyyMMddHHmmss); + setv("LGD_AMOUNT", capResult.obj.payamt); + + setv("LGD_OSTYPE_CHECK", ismobile() ? "M" : "P"); + setv("LGD_CUSTOM_SWITCHINGTYPE", ismobile() ? "SUBMIT" : "IFRAME"); + setv("LGD_VERSION", ismobile() ? "ASPNET_Non-ActiveX_SmartXPay" : "ASPNET_Non-ActiveX_Standard"); + setv("LGD_CUSTOM_SKIN", ismobile() ? "SMART_XPAY2" : "red"); + var paymentMethod = $(':radio[name="ptype"]:checked').val() == 1 ? "SC0010" : $(':radio[name="ptype"]:checked').val() == 2 ? "SC0030" : $(':radio[name="ptype"]:checked').val() == 3 ? "SC0040" : "-"; + if (ismobile()) { + setv("CST_WINDOW_TYPE", "submit"); + setv("LGD_PCVIEWYN", "N"); + setv("LGD_CUSTOM_FIRSTPAY", paymentMethod); + setv("LGD_KVPMISPAUTOAPPYN", checkMobile()); + setv("LGD_MTRANSFERAUTOAPPYN", checkMobile()); + } else { + setv("LGD_WINDOW_TYPE", "iframe"); + setv("LGD_CUSTOM_USABLEPAY", paymentMethod); + } + + document.getElementById('mform').submit(); + } + } + } else { + msgadmin(); + } + } + + function checkMobile() { + var varUA = navigator.userAgent.toLowerCase(); + if (varUA.indexOf('android') > -1) { + return "A"; + } else if (varUA.indexOf("iphone") > -1 || varUA.indexOf("ipad") > -1 || varUA.indexOf("ipod") > -1) { + return "N"; + } + } + diff --git a/FO/Views/Course/SmartSearch.cshtml b/FO/Views/Course/SmartSearch.cshtml index 73d1777..353840d 100644 --- a/FO/Views/Course/SmartSearch.cshtml +++ b/FO/Views/Course/SmartSearch.cshtml @@ -94,7 +94,7 @@
  • - 강좌소개 + 강좌소개
  • @*
  • 강좌소개
  • *@
  • @@ -164,7 +164,7 @@

    교육분류 :

    인정시간 : 시간

    -

    수료기준 : 진도 % 이상, 시험 점 이상, 과제 점 이상

    + @*@if (Model.CM.cshape != 1) {

    수료기준 : 진도 % 이상, 시험 점 이상, 과제 점 이상

    @@ -292,10 +292,10 @@ $.each(capResult.obj, function (i, d) { //20220729 온라인인경우 수료기준을 보여준다. - if (d.cshape == 1) { + if (@(Model.stringval2) == 1) { $("#completeStd").hide(); } - else { + else if (@(Model.stringval2) == 2) { $("#completeStd").show(); } @@ -444,10 +444,15 @@ //var seq = 0; if (capResult.obj.length < 1) { var li = $("
  • "); - li.append(""); + if (cshape == 1) { + li.append(""); + } else if (cshape == 2) { + li.append(""); + } ulScd.append(li); } + $.each(capResult.obj, function (i, d) { var li = $("
  • "); var pData = $("

    "); @@ -470,7 +475,7 @@ if (d.remainPeople <= 0) { spanApplyClassN.text("수강신청"); aApplyClass.append(spanApplyClassN); - pData.html("" + radioEduDay + " disabled> " + d.scdInfoSummary + ""); + pData.html(""); + pData.append(aApplyClass); + } } } } li.append(pData); + li.append(''); ulScd.append(li); }); } diff --git a/FO/Views/Home/Index.cshtml b/FO/Views/Home/Index.cshtml index c1367f6..66dd2a3 100644 --- a/FO/Views/Home/Index.cshtml +++ b/FO/Views/Home/Index.cshtml @@ -330,7 +330,7 @@ } if ($("#msSel2 > span").text() != "품질관리기술인" && $("#sch6").val() == "") { - msg("전문분야을 입력하세요."); $("#stringval2").focus(); return; + @*msg("전문분야을 입력하세요.");*@ $("#stringval2").focus(); return; } diff --git a/FO/Views/My/Document.cshtml b/FO/Views/My/Document.cshtml index bebd402..3ff1ba6 100644 --- a/FO/Views/My/Document.cshtml +++ b/FO/Views/My/Document.cshtml @@ -144,14 +144,15 @@ - @if ((item.pstatus == 1 || item.pstatus == 22)&& item.isrebate == 1 && (item.status == 1 || item.status == 2)) - { -
    인쇄
    - } - else - { - @Html.Raw("-") - } + @* @if ((item.pstatus == 1 || item.pstatus == 22) && item.isrebate == 1 && (item.status == 1 || item.status == 2))*@ + @if (item.cshape == 1) + { +
    인쇄
    + } + else + { + @Html.Raw("-") + } @if (item.status == 1 || item.status == 2) diff --git a/FO/Views/My/Index.cshtml b/FO/Views/My/Index.cshtml index 7b9c3b1..96f9c0e 100644 --- a/FO/Views/My/Index.cshtml +++ b/FO/Views/My/Index.cshtml @@ -54,7 +54,7 @@ @foreach (var d in Model.Datas.Where(w => w.dtype == 2)) { - if (status0CNT < 3) + if (status0CNT < 3 || (d.intval3 == 1 && d.intval4 == 1)) {

  • diff --git a/FO/Views/My/Lecture.cshtml b/FO/Views/My/Lecture.cshtml index d7db506..69e6103 100644 --- a/FO/Views/My/Lecture.cshtml +++ b/FO/Views/My/Lecture.cshtml @@ -96,7 +96,7 @@ } else if (Model.Lects.Where(w => w.payno == d.payno && w.userno == ViewBag.SSUserNo).Count() > 0) { - 입장 + 입장 } else { diff --git a/FO/Views/My/PayInfo.cshtml b/FO/Views/My/PayInfo.cshtml index f426f44..b48a6ec 100644 --- a/FO/Views/My/PayInfo.cshtml +++ b/FO/Views/My/PayInfo.cshtml @@ -60,11 +60,11 @@ { if (Convert.ToDateTime(Model.Pay.paylimit.Value.ToString("yyyy-MM-dd HH:mm")) >= Convert.ToDateTime(Model.PayItem.retime.Value.ToString("yyyy-MM-dd HH:mm"))) { - @Model.Pay.cdt.ToString("yyyy-MM-dd HH:mm") @(Model.Pay.ptype == 3 ? string.Format("(만료일 : {0})", (Model.PayItem.retime.Value.ToString("yyyy-MM-dd HH:mm"))) : "") + @Model.Pay.cdt.ToString("yyyy-MM-dd HH:mm") @*@(Model.Pay.ptype == 3 ? string.Format("(만료일 : {0})", (Model.PayItem.retime.Value.ToString("yyyy-MM-dd HH:mm"))) : "")*@ } else { - @Model.Pay.cdt.ToString("yyyy-MM-dd HH:mm") @(Model.Pay.ptype == 3 ? string.Format("(만료일 : {0})", (Model.Pay.paylimit.Value.ToString("yyyy-MM-dd HH:mm"))) : "") + @Model.Pay.cdt.ToString("yyyy-MM-dd HH:mm") @*@(Model.Pay.ptype == 3 ? string.Format("(만료일 : {0})", (Model.Pay.paylimit.Value.ToString("yyyy-MM-dd HH:mm"))) : "")*@ } } else diff --git a/FO/Views/Shared/Partial/PayReturn.cshtml b/FO/Views/Shared/Partial/PayReturn.cshtml index 322db0c..0721780 100644 --- a/FO/Views/Shared/Partial/PayReturn.cshtml +++ b/FO/Views/Shared/Partial/PayReturn.cshtml @@ -178,7 +178,7 @@
      -
    • 결제현황 이동
    • +
    • 결제관리 이동
    • @if (pay.ptype != 6) {
    • 계산서요청
    • diff --git a/FO/Web.config b/FO/Web.config index 29ca27e..fbd1839 100644 --- a/FO/Web.config +++ b/FO/Web.config @@ -315,7 +315,7 @@ - + @@ -331,7 +331,7 @@ - + @@ -342,7 +342,7 @@ - + @@ -353,7 +353,7 @@ - + @@ -364,7 +364,7 @@ - + @@ -375,7 +375,7 @@ - + @@ -386,7 +386,7 @@ - + diff --git a/Model/CM.cs b/Model/CM.cs index d7d1940..27e3bcb 100644 --- a/Model/CM.cs +++ b/Model/CM.cs @@ -4105,6 +4105,7 @@ namespace NP.Model /// 과정키 /// public Int64 pcmno { get; set; } + public Int64 cgcode { get; set; } } ///