Project

Profile

Help

Bug #4792 » func_call_with_non_empty_param.xquery

Anton Shchetikhin, 2020-10-08 19:44

 
declare default element namespace 'http://пф.рф/ВС/СЗВ-М/2017-01-01';
declare namespace УТ = "http://пф.рф/унифицированныеТипы/2014-01-01";
declare namespace АФ = "http://пф.рф/АФ";
declare namespace АФ3 = "http://пф.рф/АФ/2017-01-01";
declare variable $document as document-node() external;
declare variable $root := $document/ЭДПФР;
declare variable $szv:=$root/СЗВ-М;
declare variable $innArray:=$root/СЗВ-М/СписокЗЛ//ИНН;
declare function local:result($path as xs:string, $expected as xs:anyAtomicType, $objectName as xs:string, $objectValue as xs:anyAtomicType) as node()
{

if ($path = '0') then
element {xs:QName("Результат")}
{
$path
}
else
element {xs:QName("Результат")}
{
element {xs:QName("ПутьДоЭлемента")}
{
$path
},
element {xs:QName("ОжидаемоеЗначение")}
{
$expected
},
element {xs:QName("Объект")}
{
element {xs:QName("Наименование")}
{
$objectName
},
element {xs:QName("Значение")}
{
$objectValue
}
}
}
};
declare function local:all-whitespace($arg as xs:string?) as xs:boolean
{

normalize-space($arg) = ''
};
declare function local:isEmpty($element) as xs:boolean
{

local:all-whitespace(string($element))
};
declare function local:notExistsOrEmpty($element) as xs:boolean
{

not(exists($element)) or local:isEmpty($element)
};
declare function local:repeat-string($stringToRepeat as xs:string?, $count as xs:integer) as xs:string
{

string-join((for $i in 1 to $count return $stringToRepeat),'')
};
declare function local:pad-integer-to-length($integerToPad as xs:anyAtomicType?, $length as xs:integer) as xs:string
{

concat(local:repeat-string('0',$length - string-length(string($integerToPad))),string($integerToPad))
};
declare function local:createDate($year as xs:anyAtomicType?, $month as xs:anyAtomicType?, $day as xs:anyAtomicType?) as xs:date
{

xs:date(format-number(number($year),'0000')||'-'||format-number(number($month),'00')||'-'||format-number(number($day),'00'))
};
declare function local:getResult($res as item()*) as item()*
{
if (exists($res)) then $res else local:result('0','','','')
};
<БлокПроверок ID="ВСЗЛ.СЗВ-М.1" name="Блок проверок сведений о застрахованных лицах">
<Проверка ID="2">
<Описание>Элемент ИНН застрахованного лица должен быть заполнен</Описание>
<РезультатЗапроса>
{
local:getResult(
for $zl at $idx in $szv/СписокЗЛ/ЗЛ
return if (not(local:notExistsOrEmpty($zl/ИНН))) then ()
else local:result(concat('ЭДПФР/СЗВ-М/СписокЗЛ/ЗЛ[',$idx,']'),'','','')
)}
</РезультатЗапроса>
<КодРезультата>20</КодРезультата>
</Проверка>
<Проверка ID="3">
<Описание>Период представления СЗВ-М должен быть не ранее апреля 2016 года</Описание>
<РезультатЗапроса>
{
local:getResult(
let $dt := local:createDate($szv/ОтчетныйПериод/КалендарныйГод, $szv/ОтчетныйПериод/Месяц, 1)
let $limitDate := xs:date('2016-04-01')
return if ($dt < $limitDate) then local:result('ЭДПФР/СЗВ-М/ОтчетныйПериод','','','')
else ()
)}
</РезультатЗапроса>
<КодРезультата>50</КодРезультата>
</Проверка>
<Проверка ID="4">
<Описание>Для всех типов форм СЗВ-М отчетный период, за который подается форма, должен быть меньше либо равен месяцу, в котором проводится проверка</Описание>
<РезультатЗапроса>
{
local:getResult(
let $month := xs:integer($szv/ОтчетныйПериод/Месяц)
let $year := xs:integer($szv/ОтчетныйПериод/КалендарныйГод)
let $limitDate := xs:date(current-dateTime() + xs:dayTimeDuration('PT9H'))
let $limitMonth := month-from-date($limitDate)
let $limitYear := year-from-date($limitDate)
return if ($year < $limitYear or ($year = $limitYear and $month <= $limitMonth)) then ()
else local:result('ЭДПФР/СЗВ-М/ОтчетныйПериод','','','')
)}
</РезультатЗапроса>
<КодРезультата>50</КодРезультата>
</Проверка>
</БлокПроверок>

(2-2/7)