Advertisement
Valik888

Untitled

Feb 20th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 99.38 KB | None | 0 0
  1. CREATE OR REPLACE PROCEDURE Nachislenie(AccID k_Accounts.ID%TYPE, Data_Start n_Accruals.Data%TYPE, Prm NUMBER)
  2. -- Начисление для Л/С начиная с указанной даты.
  3. AS
  4. DebugModeEnabled CONSTANT BOOLEAN := FALSE;
  5.  
  6. -- Начисления и сверки.
  7. TYPE TAccrual IS RECORD (
  8. Data n_Accruals.Data%TYPE,
  9. Vid n_Accruals.Vid%TYPE,
  10. Service_ID n_Accruals.Service_ID%TYPE,
  11. Privil_ID n_Accruals.Privil_ID%TYPE,
  12. Peopl_ID n_Accruals.Peopl_ID%TYPE,
  13. Volume NUMBER,
  14. Summ NUMBER,
  15. Dotacya NUMBER,
  16. Volume100 NUMBER,
  17. Tarif NUMBER);
  18. TYPE TAccruals IS TABLE OF TAccrual INDEX BY BINARY_INTEGER;
  19. Accruals TAccruals;
  20. AccrualNo BINARY_INTEGER;
  21. SverkaNo BINARY_INTEGER;
  22.  
  23. -- Льготы.
  24. TYPE TPrivil IS RECORD (
  25. Privil_ID n_AccountPrivil.Privil_ID%TYPE,
  26. Peopl_ID n_AccountPrivil.Peopl_ID%TYPE,
  27. Count_Prvl n_AccountPrivil.Count_Prvl%TYPE);
  28. tmpPrivil TPrivil;
  29. TYPE TPrivils IS TABLE OF TPrivil INDEX BY BINARY_INTEGER;
  30. Privils TPrivils; -- Список льгот у Л/С.
  31. SortedPrivils TPrivils; -- Список льгот, отсортированных по % на нужную услугу.
  32. PrivilNo BINARY_INTEGER;
  33. -- Услуги.
  34. TYPE TService IS RECORD (Formula spr_Services.Formula%TYPE, Params n_AccountService.Params%TYPE, Norm_ID n_AccountService.Norm_ID%TYPE, State_Srv n_HouseService.State_Srv%TYPE);
  35. TYPE TServices IS TABLE OF TService INDEX BY BINARY_INTEGER;
  36. Services TServices;
  37. -- Нормы.
  38. TYPE TNorm IS RECORD (Norm spr_Norms.Norm%TYPE, Norm_Social spr_Norms.Norm_Social%TYPE, Norm_Slave_Persons spr_Norms.Norm_Slave_Persons%TYPE, Period spr_Norms.Period%TYPE);
  39. TYPE TNorms IS TABLE OF TNorm INDEX BY BINARY_INTEGER;
  40. Norms TNorms;
  41. -- Тарифы общие и домовые.
  42. TYPE TTarif IS RECORD (Tarif spr_Tarifs.Tarif%TYPE, Dotacya spr_Tarifs.Dotacya%TYPE);
  43. TYPE TTarifs IS TABLE OF TTarif INDEX BY BINARY_INTEGER;
  44. Tarifs TTarifs;
  45. TarifsH TTarifs;
  46. -- Тарифы на электричество.
  47. TYPE TTarifE IS RECORD (SrvNorm_ID NUMBER, Data DATE, Data_End DATE, Volume_Min NUMBER, Volume_Max NUMBER, Tarif NUMBER);
  48. TYPE TTarifsE IS TABLE OF TTarifE INDEX BY BINARY_INTEGER;
  49. TarifsE TTarifsE;
  50. -- Проценты льгот по услугам.
  51. TYPE TPrvlSrvPrc IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  52. PrvlSrvPrc TPrvlSrvPrc;
  53. -- Количество дней отключения тепла в месяце.
  54. TYPE TNoHeatDaysCount IS RECORD (NoHeatDays NUMBER, DaysInMonth NUMBER);
  55. TYPE TNoHeatDaysCounts IS TABLE OF TNoHeatDaysCount INDEX BY BINARY_INTEGER;
  56. NoHeatDaysCounts TNoHeatDaysCounts;
  57. -- Процент уменьшения отопительной площади.
  58. TYPE THeatedAreaDecreasePercent IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
  59. HeatedAreaDecreasePercent THeatedAreaDecreasePercent;
  60. -- Понижающие коэффициенты услуг (временные отключения, некачественные услуги, 10% скидка ГИОЦ и т.п.):
  61. TYPE TKoeff IS RECORD (Month n_Koeffs.Month%TYPE, Service_ID n_Koeffs.Service_ID%TYPE, Koeff n_Koeffs.Koeff%TYPE, Vid n_Koeffs.Vid%TYPE);
  62. TYPE TKoeffs IS TABLE OF TKoeff INDEX BY BINARY_INTEGER;
  63. Koeffs TKoeffs;
  64.  
  65. -- Переменные.
  66. tmp_data DATE;
  67. tmp_data2 DATE;
  68. tmp_numb NUMBER;
  69. tmp_numb2 NUMBER;
  70. tmp_numb3 NUMBER;
  71. FinMonth DATE;
  72. Data_Beg_Nach DATE;
  73. Data_End_Nach DATE;
  74. Data_Prev DATE;
  75. Month_Part NUMBER;
  76. CurrMonthNach DATE;
  77. DayInMonthNach INTEGER;
  78. Privil_ID spr_PrivilPrc.Privil_ID%TYPE;
  79. AccrualNo2 BINARY_INTEGER;
  80. PrvlSrvPrcNo BINARY_INTEGER;
  81. ServiceNo BINARY_INTEGER;
  82.  
  83. NormNo BINARY_INTEGER;
  84. NachislenyaNo BINARY_INTEGER;
  85. Volume_Nach NUMBER;
  86. Volume_Social_Nach NUMBER;
  87. Summ_Nach NUMBER;
  88. Volume_Prvl NUMBER;
  89. Volume_Prvl100 NUMBER;
  90. Dotac NUMBER;
  91. Summ_Prvl NUMBER;
  92. Area_Izl NUMBER;
  93. AddSanCharged NUMBER(1,0);
  94. Hs_ID k_House.ID%TYPE;
  95. Category k_House.Category%TYPE := 0;
  96. AccountState k_Accounts.Status_ID%TYPE := 0;
  97. Area_Polezn k_Accounts.Area_Polezn%TYPE := 0;
  98. Area_Obsch k_Accounts.Area_Polezn%TYPE := 0;
  99. Area_Gilay k_Accounts.Area_Gilay%TYPE := 0;
  100. Area_AddSan k_Accounts.Area_AddSan%TYPE := 0;
  101. Count_Inhabit k_Accounts.Count_Inhabit%TYPE := 0;
  102. Count_Wanting k_Accounts.Count_Wanting%TYPE := 0;
  103. ShortFamily k_Accounts.ShortFamily%TYPE := 'N';
  104. Surplus k_Accounts.Surplus%TYPE := 'N';
  105. Cgv k_Accounts.Cgv%TYPE := 'N';
  106. LInhabit NUMBER;
  107. LInhabitRest NUMBER;
  108. LVolumeRest NUMBER;
  109. IsCounter BOOLEAN;
  110. Curr_Tarif NUMBER;
  111. Old_SverkaSumm n_ConfirmSverka.Summ%TYPE;
  112. New_SverkaSumm n_ConfirmSverka.Summ%TYPE;
  113. LoggedUserID Users.ID%TYPE;
  114. DataChangeRow DATE;
  115. NoNachisl System.NoNachisl%TYPE;
  116.  
  117. -- Информация о состоянии счетчиков.
  118. TYPE TCAccount IS TABLE OF c_Account%ROWTYPE INDEX BY BINARY_INTEGER;
  119. CAccount TCAccount;
  120. -- Начисленый по счетчикам объем.
  121. TYPE TIndication IS RECORD (
  122. ServiceID NUMBER,
  123. Month DATE,
  124. Volume NUMBER,
  125. Data_prev DATE,
  126. Data_curr DATE,
  127. Vid_prev NUMBER(1,0));
  128. TYPE TIndications IS TABLE OF TIndication INDEX BY BINARY_INTEGER;
  129. Indications TIndications;
  130. IndicationNo BINARY_INTEGER;
  131. IndicationNo2 BINARY_INTEGER;
  132. TarifENo NUMBER;
  133. Prcnt NUMBER;
  134. Indication_No NUMBER;
  135. Indication_Part NUMBER;
  136. Indication_KolDay NUMBER;
  137. Indication_KolDayOut NUMBER;
  138. LastDayInCurrDiapason DATE;
  139. MonthNach_Sch DATE;
  140. Volume_Nach_Sch NUMBER;
  141. Summ_Nach_Sch NUMBER;
  142. LVolumeRest_Sch NUMBER;
  143.  
  144. AccrualsDescription27Str LONG := '';
  145.  
  146. PROCEDURE print(str VARCHAR2)
  147. AS
  148. BEGIN
  149. if DebugModeEnabled then
  150. dbms_output.put_line(CHR(9)||str);
  151. end if;
  152. END;
  153.  
  154. PROCEDURE AccrualsDescription27(str VARCHAR2)
  155. AS
  156. BEGIN
  157. AccrualsDescription27Str := AccrualsDescription27Str || str || chr(13)||chr(10);
  158. END;
  159.  
  160. FUNCTION ServiceIsCounter(Service_ID spr_Services.ID%TYPE) RETURN BOOLEAN
  161. AS
  162. BEGIN
  163. RETURN Service_ID IN (
  164. 10, -- Электроэнергия.
  165. 25, -- Газ.
  166. 44, -- Отопление.
  167. 28, -- Хол. вода.
  168. 35, -- Гор. вода.
  169. 53 -- Водоотведение гор. воды.
  170. );
  171. END ServiceIsCounter;
  172.  
  173. FUNCTION GetAccrualNo(AddNewRow BOOLEAN, Data n_Accruals.Data%TYPE, Vid n_Accruals.Vid%TYPE, Service_ID n_Accruals.Service_ID%TYPE, Privil_ID n_Accruals.Privil_ID%TYPE, Peopl_ID n_Accruals.Peopl_ID%TYPE) RETURN BINARY_INTEGER
  174. AS
  175. i BINARY_INTEGER;
  176. Result BINARY_INTEGER := NULL;
  177. BEGIN
  178. i := Accruals.FIRST;
  179. WHILE i IS NOT NULL LOOP
  180. IF (Accruals(i).Data = Data) AND (Accruals(i).Vid = Vid) AND (Accruals(i).Service_ID = Service_ID) AND (NVL(Accruals(i).Privil_ID,0) = NVL(Privil_ID,0)) AND (NVL(Accruals(i).Peopl_ID,0) = NVL(Peopl_ID,0)) THEN
  181. Result := i;
  182. EXIT;
  183. END IF;
  184. i := Accruals.NEXT(i);
  185. END LOOP;
  186. IF Result IS NULL AND AddNewRow THEN
  187. Result := NVL(Accruals.LAST,0) + 1;
  188. Accruals(Result).Data := Data;
  189. Accruals(Result).Vid := Vid;
  190. Accruals(Result).Service_ID := Service_ID;
  191. Accruals(Result).Privil_ID := Privil_ID;
  192. Accruals(Result).Peopl_ID := Peopl_ID;
  193. Accruals(Result).Volume := 0;
  194. IF Vid IN (2,4) THEN Accruals(Result).Volume100 := 0; ELSE Accruals(Result).Volume100 := NULL; END IF;
  195. Accruals(Result).Summ := 0;
  196. Accruals(Result).Dotacya := 0;
  197. END IF;
  198. RETURN Result;
  199. END GetAccrualNo;
  200.  
  201. FUNCTION GetIndicationNo(ServiceID NUMBER, Month DATE, Data_prev DATE, Data_curr DATE, Vid_prev NUMBER) RETURN BINARY_INTEGER
  202. AS
  203. i BINARY_INTEGER;
  204. PROCEDURE RaiseError(ErrMsg VARCHAR2)
  205. AS
  206. adres VARCHAR2(1000);
  207. BEGIN
  208. SELECT Street_Name||', '||House_FullNomer||', '||Apart_FullNomer INTO adres FROM vw_adresa WHERE Account_ID = lpad(AccID, 12, '0');
  209. RAISE_APPLICATION_ERROR(-20100, adres||' (ID='||AccID||'): '||ErrMsg);
  210. END;
  211. BEGIN
  212. i := Indications.FIRST;
  213. WHILE i IS NOT NULL LOOP
  214. IF Indications(i).ServiceID = ServiceID THEN
  215. IF Data_prev = Indications(i).Data_prev AND Data_curr = Indications(i).Data_curr THEN
  216. IF Indications(i).Month = Month THEN
  217. RETURN i;
  218. ELSE
  219. RaiseError('покази лiчильникiв з дiапазоном дат ['||Data_prev||' - '||Data_curr||'] мають рiзнi дати внесення: '||Indications(i).Month||' та '||Month||'!');
  220. END IF;
  221. ELSE
  222. IF Data_prev < Indications(i).Data_curr AND Data_curr > Indications(i).Data_prev THEN
  223. RaiseError('у показах лiчильникiв перетинаються дiапазони дат: ['||Indications(i).Data_prev||' - '||Indications(i).Data_curr||'] та ['||Data_prev||' - '||Data_curr||']!');
  224. END IF;
  225. END IF;
  226. END IF;
  227. i := Indications.NEXT(i);
  228. END LOOP;
  229. IF i IS NULL THEN
  230. i := NVL(Indications.LAST,0) + 1;
  231. Indications(i).ServiceID := ServiceID;
  232. Indications(i).Month := Month;
  233. Indications(i).Volume := 0;
  234. Indications(i).Data_prev := Data_prev;
  235. Indications(i).Data_curr := Data_curr;
  236. Indications(i).Vid_prev := Vid_prev;
  237. RETURN i;
  238. END IF;
  239. END GetIndicationNo;
  240.  
  241. PROCEDURE AddAccrual(AccrualNo BINARY_INTEGER, Volume NUMBER, Summ NUMBER, Dotacya NUMBER, Volume100 NUMBER)
  242. AS
  243. BEGIN
  244. Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume;
  245. Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ;
  246. Accruals(AccrualNo).Dotacya := Accruals(AccrualNo).Dotacya + Dotacya;
  247. Accruals(AccrualNo).Volume100 := Accruals(AccrualNo).Volume100 + Volume100;
  248. END AddAccrual;
  249.  
  250. PROCEDURE UpdateAccrual(
  251. Param /*ROWID<>NULL: 1-Values only, 2-rValues only, 3-all values; ROWID=NULL: 5-Update values, 6-Add values*/ NUMBER,
  252. RID ROWID, Account_ID n_Accruals.Account_ID%TYPE, Data n_Accruals.Data%TYPE, Vid n_Accruals.Vid%TYPE, Service_ID n_Accruals.Service_ID%TYPE, Privil_ID n_Accruals.Privil_ID%TYPE, Peopl_ID n_Accruals.Peopl_ID%TYPE,
  253. Volume n_Accruals.Volume%TYPE, Summ n_Accruals.Summ%TYPE, Dotacya n_Accruals.Dotacya%TYPE, Volume100 n_Accruals.Volume100%TYPE, DataBegRevis n_Accruals.DataBegRevis%TYPE, Tarif n_Accruals.Tarif%TYPE,
  254. RVolume n_Accruals.RVolume%TYPE, RSumm n_Accruals.RSumm%TYPE, RDotacya n_Accruals.RDotacya%TYPE, RVolume100 n_Accruals.RVolume100%TYPE)
  255. AS
  256. BEGIN
  257. IF RID IS NULL THEN
  258. IF Param = 5 THEN
  259. UPDATE n_Accruals SET
  260. Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
  261. RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
  262. UserID = LoggedUserID, DataChange = DataChangeRow
  263. WHERE Account_ID = UpdateAccrual.Account_ID
  264. AND Data = UpdateAccrual.Data
  265. AND Vid = UpdateAccrual.Vid
  266. AND Service_ID = UpdateAccrual.Service_ID
  267. AND NVL(Privil_ID,0) = NVL(UpdateAccrual.Privil_ID,0)
  268. AND NVL(Peopl_ID,0) = NVL(UpdateAccrual.Peopl_ID,0);
  269. ELSIF Param = 6 THEN
  270. UPDATE n_Accruals SET
  271. Volume = Volume + UpdateAccrual.Volume, Summ = Summ + UpdateAccrual.Summ, Dotacya = Dotacya + UpdateAccrual.Dotacya, Volume100 = Volume100 + UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis,
  272. RVolume = RVolume + UpdateAccrual.RVolume, RSumm = RSumm + UpdateAccrual.RSumm, RDotacya = RDotacya + UpdateAccrual.RDotacya, RVolume100 = RVolume100 + UpdateAccrual.RVolume100,
  273. UserID = LoggedUserID, DataChange = DataChangeRow
  274. WHERE Account_ID = UpdateAccrual.Account_ID
  275. AND Data = UpdateAccrual.Data
  276. AND Vid = UpdateAccrual.Vid
  277. AND Service_ID = UpdateAccrual.Service_ID
  278. AND NVL(Privil_ID,0) = NVL(UpdateAccrual.Privil_ID,0)
  279. AND NVL(Peopl_ID,0) = NVL(UpdateAccrual.Peopl_ID,0);
  280. END IF;
  281. IF SQL%NOTFOUND THEN
  282. IF NVL(Volume,0) <> 0 OR NVL(Summ,0) <> 0 OR NVL(Dotacya,0) <> 0 OR NVL(Volume100,0) <> 0 OR
  283. NVL(RVolume,0) <> 0 OR NVL(RSumm,0) <> 0 OR NVL(RDotacya,0) <> 0 OR NVL(RVolume100,0) <> 0 OR
  284. (ServiceIsCounter(Service_ID) AND Vid = 1 AND Data = FinMonth) -- нулевое показание в отчетном месяце по счетчику (может быть, если услуга включена, а показаний еще не было).
  285. THEN
  286. INSERT
  287. INTO n_Accruals (
  288. ID, Account_ID, Data, Vid, Service_ID, Privil_ID, Peopl_ID,
  289. Volume, Summ, Dotacya, Volume100, DataBegRevis, ByHouseCounter, Tarif,
  290. RVolume, RSumm, RDotacya, RVolume100,
  291. UserID, DataChange)
  292. VALUES (
  293. sAccruals.NEXTVAL, Account_ID, Data, Vid, Service_ID, Privil_ID, Peopl_ID,
  294. Volume, Summ, Dotacya, Volume100, DataBegRevis, NULL, Tarif,
  295. RVolume, RSumm, RDotacya, RVolume100,
  296. LoggedUserID, DataChangeRow);
  297. END IF;
  298. END IF;
  299. ELSE
  300. IF Param = 1 THEN
  301. UPDATE n_Accruals SET
  302. Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
  303. UserID = LoggedUserID, DataChange = DataChangeRow
  304. WHERE ROWID = UpdateAccrual.RID;
  305. ELSIF Param = 2 THEN
  306. UPDATE n_Accruals SET
  307. RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
  308. UserID = LoggedUserID, DataChange = DataChangeRow
  309. WHERE ROWID = UpdateAccrual.RID;
  310. ELSIF Param = 3 THEN
  311. UPDATE n_Accruals SET
  312. Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
  313. RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
  314. UserID = LoggedUserID, DataChange = DataChangeRow
  315. WHERE ROWID = UpdateAccrual.RID;
  316. END IF;
  317. END IF;
  318. END UpdateAccrual;
  319.  
  320. FUNCTION GetPrivilNo(AddNewRow BOOLEAN, Privil_ID n_AccountPrivil.Privil_ID%TYPE, Peopl_ID n_AccountPrivil.Peopl_ID%TYPE) RETURN BINARY_INTEGER
  321. AS
  322. i BINARY_INTEGER;
  323. Result BINARY_INTEGER := NULL;
  324. BEGIN
  325. i := Privils.FIRST;
  326. WHILE i IS NOT NULL LOOP
  327. IF (Privils(i).Privil_ID = Privil_ID) AND (Privils(i).Peopl_ID = NVL(Peopl_ID,Privils(i).Peopl_ID)) THEN
  328. Result := i;
  329. EXIT;
  330. END IF;
  331. i := Privils.NEXT(i);
  332. END LOOP;
  333. IF Result IS NULL AND AddNewRow THEN
  334. Result := NVL(Privils.LAST,0) + 1;
  335. Privils(Result).Privil_ID := Privil_ID;
  336. Privils(Result).Peopl_ID := Peopl_ID;
  337. END IF;
  338. RETURN Result;
  339. END GetPrivilNo;
  340.  
  341. FUNCTION Tarif(ServiceNo BINARY_INTEGER, SrvNorm_ID BINARY_INTEGER, OnlyHouseTarif BOOLEAN DEFAULT FALSE) RETURN spr_Tarifs.Tarif%TYPE -- Для услуги вернуть тариф (домовой или общий).
  342. AS Rslt NUMBER;
  343. BEGIN
  344. -- Взять тариф из домовых тарифов.
  345. BEGIN
  346. Rslt := TarifsH(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100).Tarif;
  347. EXCEPTION
  348. WHEN NO_DATA_FOUND THEN
  349. BEGIN
  350. IF NOT OnlyHouseTarif THEN
  351. Rslt := Tarifs(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100 + Category).Tarif;
  352. ELSE
  353. Rslt := 0;
  354. END IF;
  355. EXCEPTION
  356. WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди общегородских нет.
  357. Rslt := 0;
  358. END;
  359. END;
  360. RETURN Rslt;
  361. EXCEPTION
  362. WHEN NO_DATA_FOUND THEN RETURN 0;
  363. END;
  364.  
  365. FUNCTION Dotacya(ServiceNo BINARY_INTEGER, SrvNorm_ID BINARY_INTEGER, OnlyHouseTarif BOOLEAN DEFAULT FALSE) RETURN spr_Tarifs.Dotacya%TYPE -- Для услуги вернуть дотацию.
  366. AS Rslt NUMBER;
  367. BEGIN
  368. -- Взять тариф из домовых тарифов.
  369. BEGIN
  370. Rslt := NVL(TarifsH(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100).Dotacya,0);
  371. EXCEPTION
  372. WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди домовых нет.
  373. BEGIN
  374. IF NOT OnlyHouseTarif THEN
  375. Rslt := NVL(Tarifs(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100 + Category).Dotacya, 0);
  376. ELSE
  377. Rslt := 0;
  378. END IF;
  379. EXCEPTION
  380. WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди общегородских нет.
  381. Rslt := 0;
  382. END;
  383. END;
  384. RETURN Rslt;
  385. END;
  386.  
  387. FUNCTION CalcSummByTarifsE(Data DATE, NormNo NUMBER, Volume NUMBER, MonthsPart NUMBER) RETURN NUMBER
  388. AS
  389. Result NUMBER;
  390. No NUMBER;
  391. BEGIN
  392. Result := 0;
  393. No := TarifsE.FIRST;
  394. WHILE No IS NOT NULL LOOP
  395. IF TarifsE(No).SrvNorm_ID = NormNo AND
  396. TarifsE(No).Data <= Data AND Data <= TarifsE(No).Data_End AND
  397. Volume > TarifsE(No).Volume_Min*MonthsPart
  398. THEN
  399. IF Volume >= TarifsE(No).Volume_Max*MonthsPart THEN
  400. Result := Result + (TarifsE(No).Volume_Max - TarifsE(No).Volume_Min)*MonthsPart * TarifsE(No).Tarif;
  401. ELSE
  402. Result := Result + (Volume - TarifsE(No).Volume_Min*MonthsPart) * TarifsE(No).Tarif;
  403. END IF;
  404. END IF;
  405. No := TarifsE.NEXT(No);
  406. END LOOP;
  407. RETURN Result;
  408. END;
  409.  
  410. FUNCTION ServiceDependsOnHeat(Service_ID spr_Services.ID%TYPE) RETURN BOOLEAN
  411. AS
  412. BEGIN
  413. RETURN Service_ID IN (
  414. 27, -- Отопление
  415. 44 -- Тепло по счетчику
  416. );
  417. END ServiceDependsOnHeat;
  418.  
  419. PROCEDURE FillNoHeatDaysCountVariable(Hs_ID k_House.ID%TYPE)
  420. AS
  421. Indx BINARY_INTEGER;
  422. BEGIN
  423. FOR d IN (
  424. SELECT Month, SUM(DaysOff) NoHeatDaysTotalCount
  425. FROM n_NoHeatDaysCount
  426. WHERE CityStructure_ID IN
  427. (
  428. SELECT CityStructure_ID
  429. FROM spr_CityStructure
  430. START WITH ID IN
  431. (
  432. SELECT CityStructure_ID
  433. FROM k_House_CityStructure
  434. WHERE House_ID = Hs_ID
  435. )
  436. CONNECT BY PRIOR Parent_ID = ID
  437. )
  438. OR House_ID = Hs_ID
  439. GROUP BY Month
  440. ) LOOP
  441. Indx := CAST(TO_CHAR(d.Month, 'YYYYMM') AS INT);
  442. NoHeatDaysCounts(Indx).DaysInMonth := EXTRACT(DAY FROM LAST_DAY(d.Month));
  443.  
  444. IF d.NoHeatDaysTotalCount <= NoHeatDaysCounts(Indx).DaysInMonth THEN
  445. NoHeatDaysCounts(Indx).NoHeatDays := d.NoHeatDaysTotalCount;
  446. ELSE
  447. NoHeatDaysCounts(Indx).NoHeatDays := NoHeatDaysCounts(Indx).DaysInMonth;
  448. END IF;
  449. END LOOP;
  450. END;
  451.  
  452. FUNCTION GetHeatReductionFactor(Month DATE) RETURN NUMBER
  453. AS
  454. result NUMBER;
  455. Indx BINARY_INTEGER;
  456. BEGIN
  457. Indx := CAST(TO_CHAR(Month, 'YYYYMM') AS INT);
  458. IF NoHeatDaysCounts.EXISTS(Indx) THEN
  459. result := (NoHeatDaysCounts(Indx).DaysInMonth - NoHeatDaysCounts(Indx).NoHeatDays) / NoHeatDaysCounts(Indx).DaysInMonth;
  460. ELSE
  461. result := 1;
  462. END IF;
  463. RETURN result;
  464. END;
  465.  
  466. PROCEDURE FillHeatedAreaDecreasePercent
  467. AS
  468. Indx BINARY_INTEGER;
  469. BEGIN
  470. FOR d IN (
  471. SELECT Month, Percent
  472. FROM n_HeatedAreaDecreasePercents
  473. WHERE Account_ID = AccID
  474. ) LOOP
  475. Indx := CAST(TO_CHAR(d.Month, 'YYYYMM') AS INT);
  476. HeatedAreaDecreasePercent(Indx) := d.Percent/100;
  477. END LOOP;
  478. END;
  479.  
  480. FUNCTION GetHeatedAreaDecreasePercent(Month DATE) RETURN NUMBER
  481. AS
  482. result NUMBER;
  483. Indx BINARY_INTEGER;
  484. BEGIN
  485. Indx := CAST(TO_CHAR(Month, 'YYYYMM') AS INT);
  486. IF HeatedAreaDecreasePercent.EXISTS(Indx) THEN
  487. result := HeatedAreaDecreasePercent(Indx);
  488. ELSE
  489. result := 1;
  490. END IF;
  491. RETURN result;
  492. END;
  493.  
  494. FUNCTION GetTemperatKoeff(Month DATE) RETURN NUMBER
  495. AS
  496. result NUMBER;
  497. BEGIN
  498. SELECT Koeff INTO result
  499. FROM spr_Temperat_Koeff
  500. WHERE Month = TRUNC(GetTemperatKoeff.Month, 'MM');
  501. RETURN result;
  502. EXCEPTION
  503. WHEN NO_DATA_FOUND THEN
  504. RETURN 1;
  505. END;
  506.  
  507. PROCEDURE LoadKoeffs(date_from DATE, date_to DATE)
  508. AS
  509. BEGIN
  510. SELECT Month, Service_ID, Koeff, Vid
  511. BULK COLLECT INTO Koeffs
  512. FROM n_Koeffs
  513. WHERE Account_ID = AccID
  514. AND Month BETWEEN date_from AND date_to
  515. AND Koeff IS NOT NULL;
  516. END;
  517.  
  518. FUNCTION IndicationsPresentInMonth(ServiceNo INTEGER, Month DATE) RETURN BOOLEAN
  519. AS
  520. Indication_No INTEGER;
  521. BEGIN
  522. Indication_No := Indications.FIRST;
  523. WHILE Indication_No IS NOT NULL LOOP
  524. IF Indications(Indication_No).ServiceID = ServiceNo AND Indications(Indication_No).Month = Month THEN
  525. RETURN TRUE;
  526. END IF;
  527. Indication_No := Indications.NEXT(Indication_No);
  528. END LOOP;
  529. RETURN FALSE;
  530. END;
  531.  
  532. FUNCTION GetKoeff(data DATE, Service_ID INTEGER, Vid INTEGER) RETURN NUMBER
  533. AS
  534. KoeffNo INTEGER;
  535. result NUMBER;
  536. BEGIN
  537. result := 1;
  538. KoeffNo := Koeffs.FIRST;
  539. WHILE KoeffNo IS NOT NULL LOOP
  540. IF Koeffs(KoeffNo).Month = TRUNC(data, 'MM') AND Koeffs(KoeffNo).Service_ID = Service_ID AND Koeffs(KoeffNo).Vid = Vid THEN
  541. result := result * Koeffs(KoeffNo).Koeff;
  542. END IF;
  543. KoeffNo := Koeffs.NEXT(KoeffNo);
  544. END LOOP;
  545. RETURN result;
  546. END;
  547.  
  548. BEGIN
  549. print('Acc_ID = '||AccID||';');
  550. AccrualsDescription27('ID Л/С: '||AccID||';');
  551.  
  552. -- Некоторые участки всегда расчитываются, остальные - по признаку в таблице.
  553. SELECT District_ID INTO tmp_numb FROM k_Accounts WHERE ID = lpad(trim(AccID), 12, '0');
  554. IF tmp_numb NOT IN (112001,112002,112003) THEN
  555. -- Возможность отключить перерасчет.
  556. SELECT NoNachisl INTO NoNachisl FROM System;
  557. IF NVL(NoNachisl,0) = 1 THEN
  558.  
  559. RETURN;
  560. END IF;
  561. END IF;
  562.  
  563. --raise_application_error(-20100, 'Nicht arbeiten!');
  564.  
  565. LoggedUserID := LoggedUser();
  566. DataChangeRow := SYSDATE;
  567. SELECT FinMonth INTO FinMonth FROM System;
  568. print('FinMonth = '||FinMonth||';');
  569. AccrualsDescription27('Отчетный месяц: '||FinMonth||';');
  570.  
  571. -- Заполнение процентов льгот.
  572. FOR p IN (SELECT Privil_ID*100000+Service_ID PrvlSrvNo, Percent/100 Percent FROM spr_PrivilPrc) LOOP
  573. PrvlSrvPrc(p.PrvlSrvNo) := p.Percent;
  574. END LOOP;
  575. -- Даты начала/конца перерасчета.
  576. Data_Beg_Nach := TRUNC(Data_Start, 'MM');
  577. Data_End_Nach := LAST_DAY(FinMonth);
  578.  
  579. -- ИЗМЕНИТЬ ДАТУ НАЧАЛА ПЕРЕРАСЧЕТА: откатиться на более раннюю дату
  580. -- при наличии показаний счетчиков или
  581. -- если есть сверка с более ранней датой начала
  582. LOOP
  583. -- Минимальная дата по сверкам.
  584. SELECT MIN(DataBegRevis)
  585. INTO tmp_data
  586. FROM n_Accruals
  587. WHERE Account_ID = lpad(AccID, 12, '0')
  588. AND Data >= Data_Beg_Nach AND Data <= FinMonth
  589. AND Vid IN (3,4/*сверка по начислению/льготе*/);
  590. -- Минимальная дата по показаниям.
  591. SELECT MIN(TRUNC(i.Data_old+DECODE(i.Vid_old, 1,0, 1),'MM'))
  592. INTO tmp_data2
  593. FROM n_Indications i
  594. WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
  595. AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
  596. AND i.Vid IN (2/*ктр*/);
  597. -- Изменить дату.
  598. IF tmp_data < Data_Beg_Nach OR tmp_data2 < Data_Beg_Nach THEN
  599. IF tmp_data < Data_Beg_Nach THEN
  600. Data_Beg_Nach := tmp_data;
  601. END IF;
  602. IF tmp_data2 < Data_Beg_Nach THEN
  603. Data_Beg_Nach := tmp_data2;
  604. END IF;
  605. ELSE
  606. EXIT;
  607. END IF;
  608. END LOOP;
  609.  
  610. print('Data_Beg_Nach = '||Data_Beg_Nach||'; Data_End_Nach = '||Data_End_Nach||';');
  611. AccrualsDescription27('Дата начала расчета = '||Data_Beg_Nach||'; дата окончания расчета = '||Data_End_Nach||';');
  612.  
  613. -- Номер дома.
  614. SELECT k_Apart.House_ID
  615. INTO Hs_ID
  616. FROM k_Accounts, k_Apart
  617. WHERE k_Accounts.ID = lpad(AccID, 12, '0')
  618. AND k_Apart.ID = k_Accounts.Apart_ID;
  619. print('Hs_ID = '||Hs_ID||';');
  620. AccrualsDescription27('ID дома: '||Hs_ID||';');
  621.  
  622. -- Норма для нулевой услуги.
  623. Norms(0).Norm := 1;
  624. Norms(0).Norm_Social := Norms(0).Norm;
  625. Norms(0).Period := 2;
  626. -- Посчитать общее количество дней без тепла по дому помесячно.
  627. FillNoHeatDaysCountVariable(Hs_ID);
  628. -- Взять возможные проценты уменьшения площади отопления.
  629. FillHeatedAreaDecreasePercent();
  630. -- Загрузить уменьшающие коэффициенты.
  631. LoadKoeffs(Data_Beg_Nach, Data_End_Nach);
  632.  
  633. -------------------------------------------------------------------------------------------------------------
  634. -- /---\ /---\ | | /| /--\ /| | | | | /---\ /--\ | | |--\ /---\ | | | | | | /---\ |---\ --
  635. -- | | | | | / / | | / | | | | /| | | | | | | | | | | /| | / | | | | --
  636. -- | | | | |< | | -< | | |---| | / | \--> | \_| |-- | \_| | / | |< | | |--< --
  637. -- | | | | | \ |--| | |--| | | |/ | / | | | | | | |/ | | \ | | | | --
  638. -- | | \---/ | | | | \--/ | | | | | | / | \--/ | |--/ | | | | | | \---/ |---/ --
  639. -------------------------------------------------------------------------------------------------------------
  640.  
  641. -- Данные по счетчикам.
  642. SELECT * BULK COLLECT INTO CAccount FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0') ORDER BY Counter_ID, Data ASC;
  643. -- Показания по дате внесения.
  644. FOR i IN (
  645. SELECT i.Counter_ID, i.Data+1 Data, i.Data_ins, i.Data_old+DECODE(i.Vid_old, 1,0, 1) Data_old, i.Vid, i.Vid_old, i.Volume, DECODE(s.Vid, 1,28, 2,35, 3,44, 4,25, 5,10 ) Service
  646. FROM n_Indications i, k_Counters k, spr_Counters s
  647. WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
  648. AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach -- AND Data_Beg_Nach <= i.Data_old AND i.Data <= Data_End_Nach
  649. AND i.Vid IN (2/*ктр*/)
  650. AND k.ID = i.Counter_ID
  651. AND s.ID = k.Counter_ID
  652. )LOOP
  653. -- Определить процент и состояние счетчика на дату снятия показания.
  654. Prcnt := 0;
  655. FOR j IN REVERSE NVL(CAccount.FIRST,0)..NVL(CAccount.LAST,-1) LOOP
  656. IF CAccount(j).Counter_ID = i.Counter_ID THEN -- Отобрать нужный счетчик.
  657. IF CAccount(j).Data < i.Data THEN -- Дата ктр больше, чем текущая дата состояния...
  658. Prcnt := CAccount(j).Percent; -- ... значит для ктр действует это состояние счетчика (т.к. состояния отсортированы по возрастанию, а список просматривается от большего к меньшему).
  659. EXIT;
  660. ELSIF CAccount(j).Data = i.Data THEN -- Дата ктр совпадает с датой изменения счетчиков...
  661. IF CAccount.EXISTS(j-1) AND CAccount(j-1).Counter_ID = i.Counter_ID THEN -- ... и существует предыдущее (более раннее по дате) состояние счетчика...
  662. Prcnt := CAccount(j-1).Percent; -- ... значит для ктр действует предыдущее состояние счетчика.
  663. END IF;
  664. EXIT;
  665. END IF;
  666. END IF;
  667. END LOOP;
  668. -- Добавить показание в массив.
  669. IndicationNo := GetIndicationNo(i.Service, TRUNC(i.Data_ins,'MM'), i.Data_old, i.Data, i.Vid_old);
  670. Indications(IndicationNo).Volume := Indications(IndicationNo).Volume + i.Volume*(Prcnt/100);
  671. -- Продублировать гор.воду для водоотведения.
  672. IF i.Service = 35 THEN
  673. IndicationNo2 := GetIndicationNo(53, TRUNC(i.Data_ins,'MM'), i.Data_old, i.Data, i.Vid_old);
  674. Indications(IndicationNo2).Volume := Indications(IndicationNo).Volume;
  675. END IF;
  676. END LOOP;
  677.  
  678. /*
  679. Indication_No := Indications.FIRST;
  680. WHILE Indication_No IS NOT NULL LOOP
  681. print('Indications('||Indication_No||'): ServiceID = '||Indications(Indication_No).ServiceID||'; Month = '||Indications(Indication_No).Month||'; Data_prev = '||Indications(Indication_No).Data_prev||'; Data_curr = '||Indications(Indication_No).Data_curr||'; Volume = '||Indications(Indication_No).Volume);
  682. Indication_No := Indications.NEXT(Indication_No);
  683. END LOOP;
  684. */
  685.  
  686. ----------------------------------------------------------
  687. -- /---\ |--\ \ / |--\ /| /--\ | | |--\ /---\ --
  688. -- | | \ / | | / | | | | | | --
  689. -- | |-- | |--/ | | | \_| |-- | --
  690. -- | | / \ | |--| | | | | --
  691. -- | |--/ / \ * | | | \--/ | |--/ | --
  692. ----------------------------------------------------------
  693. Data_Prev := Data_Beg_Nach;
  694. -- РАСЧЕТ НАЧИСЛЕНИЙ - цикл по всем событиям в период начисления.
  695. FOR ist IN (
  696. SELECT *
  697. FROM
  698. (
  699. SELECT -- Изменения Л/С.
  700. 'L' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  701. Status_ID, Area_Obsch, Area_Polezn, Area_Gilay, Area_AddSan, Count_Inhabit, ShortFamily, Surplus, CGV,
  702. /*W*/TO_NUMBER(NULL)Count_W,
  703. /*H*/TO_NUMBER(NULL)Category,
  704. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  705. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  706. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  707. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  708. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  709. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  710. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  711. FROM a_Accounts a
  712. WHERE Account_ID = lpad(AccID, 12, '0')
  713. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM a_Accounts WHERE Account_ID = a.Account_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  714. UNION
  715. SELECT -- Отсутствующие.
  716. 'W' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  717. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  718. Count_W,
  719. /*H*/TO_NUMBER(NULL)Category,
  720. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  721. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  722. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  723. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  724. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  725. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  726. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  727. FROM n_AccountWanting w
  728. WHERE Account_ID = lpad(AccID, 12, '0')
  729. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountWanting WHERE Account_ID = w.Account_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  730. UNION
  731. SELECT -- Изменения дома.
  732. 'H' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  733. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  734. /*W*/TO_NUMBER(NULL)Count_W,
  735. Category,
  736. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  737. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  738. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  739. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  740. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  741. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  742. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  743. FROM a_House a
  744. WHERE House_ID = lpad(Hs_ID, 12, '0')
  745. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM a_House WHERE House_ID = a.House_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  746. UNION
  747. SELECT -- Изменения льгот Л/С.
  748. 'P' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  749. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  750. /*W*/TO_NUMBER(NULL)Count_W,
  751. /*H*/TO_NUMBER(NULL)Category,
  752. Privil_ID, Peopl_ID, Count_Prvl, State_Prvl,
  753. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  754. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  755. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  756. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  757. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  758. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  759. FROM n_AccountPrivil p, spr_Privils sp
  760. WHERE Account_ID = lpad(AccID, 12, '0')
  761. AND p.Privil_ID = sp.ID
  762. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountPrivil WHERE Account_ID = p.Account_ID AND Privil_ID = p.Privil_ID AND Peopl_ID = p.Peopl_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  763. UNION
  764. SELECT -- Изменения услуг.
  765. 'S' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  766. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  767. /*W*/TO_NUMBER(NULL)Count_W,
  768. /*H*/TO_NUMBER(NULL)Category,
  769. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  770. Service_ID, Formula, State_Srv, Params, Norm_ID,
  771. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  772. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  773. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  774. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  775. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  776. FROM n_AccountService s, spr_Services
  777. WHERE s.Account_ID = lpad(AccID, 12, '0')
  778. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountService WHERE Account_ID = s.Account_ID AND Service_ID = s.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  779. AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
  780. AND spr_Services.ID = Service_ID
  781. UNION
  782. SELECT -- Временное отключение услуг дому.
  783. 'O' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  784. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  785. /*W*/TO_NUMBER(NULL)Count_W,
  786. /*H*/TO_NUMBER(NULL)Category,
  787. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  788. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  789. Service_ID Service_ID_O, State_Srv State_Srv_O,
  790. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  791. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  792. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  793. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  794. FROM n_HouseService o
  795. WHERE House_ID = lpad(Hs_ID, 12 , '0')
  796. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_HouseService WHERE House_ID = o.House_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  797. UNION
  798. SELECT -- Изменения норм.
  799. 'N' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  800. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  801. /*W*/TO_NUMBER(NULL)Count_W,
  802. /*H*/TO_NUMBER(NULL)Category,
  803. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  804. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  805. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  806. SrvNorm_ID, Norm, Norm_Social, Norm_Slave_Persons, Period,
  807. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  808. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  809. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  810. FROM spr_Norms m
  811. WHERE SrvNorm_ID IN
  812. (
  813. SELECT Norm_ID
  814. FROM n_AccountService s
  815. WHERE s.Account_ID = lpad(AccID, 12, '0')
  816. AND s.Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountService WHERE Account_ID = s.Account_ID AND Service_ID = s.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  817. AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
  818. UNION
  819. SELECT ID
  820. FROM spr_SrvNorms
  821. WHERE Service_ID = 0
  822. )
  823. AND Data >= (SELECT NVL(MAX(Data),data_beg_nach) FROM spr_Norms WHERE SrvNorm_ID = m.SrvNorm_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  824. UNION
  825. SELECT -- Изменение общих тарифов.
  826. 'T' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  827. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  828. /*W*/TO_NUMBER(NULL)Count_W,
  829. /*H*/TO_NUMBER(NULL)Category,
  830. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  831. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  832. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  833. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  834. TrSchema, Service_ID Service_ID_T, NVL(SrvNorm_ID,0) SrvNorm_ID_T, Tarif, Dotacya,
  835. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  836. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  837. FROM spr_Tarifs t
  838. WHERE TrSchema IN
  839. (
  840. SELECT DISTINCT Category
  841. FROM a_House a
  842. WHERE House_ID = Hs_ID
  843. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM a_House WHERE House_ID = a.House_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  844. )
  845. AND Service_ID IN
  846. (
  847. SELECT Service_ID
  848. FROM n_AccountService s
  849. WHERE s.Account_ID = lpad(AccID, 12, '0')
  850. AND s.Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountService WHERE Account_ID = s.Account_ID AND Service_ID = s.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  851. AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
  852. )
  853. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM spr_Tarifs WHERE TrSchema = t.TrSchema AND Service_ID = t.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  854. UNION
  855. SELECT -- Изменение тарифов на электричество.
  856. 'E' Vid, GREATEST(NVL(Data, TO_DATE('01.01.0001','DD.MM.YYYY')), Data_Beg_Nach) Data,
  857. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  858. /*W*/TO_NUMBER(NULL)Count_W,
  859. /*H*/TO_NUMBER(NULL)Category,
  860. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  861. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  862. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  863. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  864. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  865. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  866. SrvNorm_ID SrvNorm_ID_E, NVL(Data_End, TO_DATE('31.12.9999','DD.MM.YYYY')) Data_End, NVL(Volume_Min, 0) Volume_Min, NVL(Volume_Max, 999999999999) Volume_Max, NVL(Tarif, 0) Tarif_E
  867. FROM spr_Tarifs_E
  868. WHERE SrvNorm_ID IN
  869. (
  870. SELECT s.Norm_ID
  871. FROM n_AccountService s
  872. WHERE s.Account_ID = lpad(AccID, 12, '0')
  873. AND Service_ID IN (10)
  874. AND s.Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountService WHERE Account_ID = s.Account_ID AND Service_ID = s.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  875. AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
  876. )
  877. AND Data_Beg_Nach <= NVL(Data_End, TO_DATE('31.12.9999','DD.MM.YYYY')) AND Data_End_Nach >= NVL(Data, TO_DATE('01.01.0001','DD.MM.YYYY'))
  878. UNION
  879. SELECT -- Изменение домовых тарифов.
  880. 'J' Vid, GREATEST(Data, Data_Beg_Nach) Data,
  881. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  882. /*W*/TO_NUMBER(NULL)Count_W,
  883. /*H*/TO_NUMBER(NULL)Category,
  884. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  885. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  886. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  887. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  888. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  889. Service_ID Service_ID_J, NVL(SrvNorm_ID,0) SrvNorm_ID_J, Tarif TarifH, Dotacya DotacyaH,
  890. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  891. FROM spr_TarifsH t
  892. WHERE House_ID = Hs_ID
  893. AND ( (Service_ID IN
  894. (
  895. SELECT Service_ID
  896. FROM n_AccountService s
  897. WHERE s.Account_ID = lpad(AccID, 12, '0')
  898. AND Service_ID NOT BETWEEN 101 AND 150
  899. AND s.Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM n_AccountService WHERE Account_ID = s.Account_ID AND Service_ID = s.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  900. AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
  901. )) OR (Service_ID BETWEEN 101 AND 150) )
  902. AND Data >= (SELECT NVL(MAX(Data),Data_Beg_Nach) FROM spr_TarifsH WHERE House_ID = t.House_ID AND Service_ID = t.Service_ID AND Data <= Data_Beg_Nach) AND Data <= Data_End_Nach
  903. UNION
  904. SELECT
  905. 'K' Vid, data_sch Data,
  906. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  907. /*W*/TO_NUMBER(NULL)Count_W,
  908. /*H*/TO_NUMBER(NULL)Category,
  909. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  910. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  911. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  912. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  913. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  914. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  915. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  916. FROM
  917. (
  918. SELECT i.Data_old+DECODE(i.Vid_old, 1,0, 1) data_sch
  919. FROM n_Indications i
  920. WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
  921. AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
  922. AND i.Vid IN (2/*ктр*/)
  923. UNION ALL
  924. SELECT i.Data+1 data_sch
  925. FROM n_Indications i
  926. WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
  927. AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
  928. AND i.Vid IN (2/*ктр*/)
  929. )
  930. UNION
  931. SELECT
  932. 'X' Vid, Data_End_Nach + 1 Data,
  933. /*L*/TO_NUMBER(NULL)Status_ID, TO_NUMBER(NULL)Area_Obsch, TO_NUMBER(NULL)Area_Polezn, TO_NUMBER(NULL)Area_Gilay, TO_NUMBER(NULL)Area_AddSan, TO_NUMBER(NULL)Count_Inhabit, TO_CHAR(NULL)ShortFamily, TO_CHAR(NULL)Surplus, TO_CHAR(NULL)Cgv,
  934. /*W*/TO_NUMBER(NULL)Count_W,
  935. /*H*/TO_NUMBER(NULL)Category,
  936. /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
  937. /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
  938. /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
  939. /*N*/TO_NUMBER(NULL)SrvNorm_ID, TO_NUMBER(NULL)Norm, TO_NUMBER(NULL)Norm_Social, TO_NUMBER(NULL) Norm_Slave_Persons, TO_NUMBER(NULL) Period,
  940. /*T*/TO_NUMBER(NULL)TrSchema, TO_NUMBER(NULL)Service_ID_T, TO_NUMBER(NULL) SrvNorm_ID_T, TO_NUMBER(NULL)Tarif, TO_NUMBER(NULL)Dotacya,
  941. /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
  942. /*E*/TO_NUMBER(NULL)SrvNorm_ID_E, TO_DATE(NULL)Data_End, TO_NUMBER(NULL)Volume_Min, TO_NUMBER(NULL)Volume_Max, TO_NUMBER(NULL)Tarif_E
  943. FROM DUAL
  944. )
  945. ORDER BY Data
  946. ) LOOP
  947. IF Data_Prev < ist.Data THEN
  948. WHILE Data_prev < ist.Data LOOP
  949. print('Data_prev = '||Data_prev||'; ist.Data = '||ist.Data||';');
  950. AccrualsDescription27('начало сегмента расчета = '||Data_prev||'; конец сегмента расчета = '||ist.Data||';');
  951.  
  952. CurrMonthNach := TRUNC(Data_Prev, 'MM');
  953. DayInMonthNach := EXTRACT(DAY FROM LAST_DAY(Data_Prev));
  954. -- Расчет части месяца, за которую проводится начисление.
  955. IF TRUNC(Data_prev, 'MM') < TRUNC(ist.Data, 'MM') THEN
  956. Month_Part := (TO_CHAR(LAST_DAY(Data_prev) - Data_prev) + 1) / TO_CHAR(LAST_DAY(Data_prev),'DD');
  957. ELSE
  958. Month_Part := (TO_CHAR(ist.Data - Data_prev)) / TO_CHAR(LAST_DAY(Data_prev),'DD');
  959. END IF;
  960. print(' Month_Part = '||Month_Part||';');
  961. AccrualsDescription27(' часть месяца в сегменте расчета = '||Month_Part||';');
  962. -- Начисление по всем услугам за промежуток.
  963. ServiceNo := Services.FIRST;
  964. WHILE ServiceNo IS NOT NULL LOOP
  965. print(' ServiceNo = '||ServiceNo||';');
  966. AccrualsDescription27(' код услуги = '||ServiceNo||';');
  967.  
  968. -- Тариф по услуге.
  969. Curr_Tarif := Tarif(ServiceNo, Services(ServiceNo).Norm_ID);
  970. print(' Curr_Tarif = '||Curr_Tarif||';');
  971. AccrualsDescription27(' тариф = '||Curr_Tarif||';');
  972. -- Для Тепла применить к тарифу Температурный коэффициент:
  973. IF ServiceNo = 27 THEN -- Тепло
  974. tmp_numb := GetTemperatKoeff(ist.Data-1);
  975. Curr_Tarif := Curr_Tarif * tmp_numb;
  976. print(' Curr_Tarif = [Curr_Tarif] * '||tmp_numb||'[TemperatKoeff] = '||Curr_Tarif||';');
  977. AccrualsDescription27(' тариф = [тариф] * '||tmp_numb||'[температурный коеффициент] = '||Curr_Tarif||';');
  978. END IF;
  979. -- Применить к тарифу понижающий коэффициент:
  980. tmp_numb3 := ServiceNo;
  981. IF tmp_numb3 BETWEEN 101 AND 126 THEN
  982. tmp_numb3 := 100;
  983. END IF;
  984. tmp_numb := GetKoeff(Data_prev, tmp_numb3, 1);
  985. IF tmp_numb < 1 THEN
  986. tmp_numb2 := Curr_Tarif;
  987. Curr_Tarif := tmp_numb2 * tmp_numb;
  988. print(' Curr_Tarif = '||tmp_numb2||'[Curr_Tarif] * '||tmp_numb||'[GetKoeff('||Data_prev||', '||tmp_numb3||', 1)] = '||Curr_Tarif);
  989. AccrualsDescription27(' тариф = '||tmp_numb2||'[тариф] * '||tmp_numb||'[коэффициент понижения тарифа] = '||Curr_Tarif);
  990. END IF;
  991.  
  992. -- ВЫЧИСЛЕНИЕ ОБЪЕМА УСЛУГИ.
  993. IF Services(ServiceNo).Formula = 0 THEN -- Услуга не подходит под формулу.
  994. IF ServiceNo = 4 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- АГВ.
  995. NormNo := NVL(Services(ServiceNo).Norm_ID,0);
  996. Volume_Nach := Area_Polezn * Norms(NormNo).Norm * Month_Part;
  997. Volume_Social_Nach := Area_Polezn * Norms(NormNo).Norm_Social * Month_Part;
  998. IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
  999. Volume_Nach := Volume_Nach * DayInMonthNach;
  1000. Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
  1001. END IF;
  1002. Summ_Nach := Volume_Nach * Curr_Tarif;
  1003. Area_Izl := Area_Polezn - (Count_Inhabit*Norms(1).Norm/*Норма площади на человека*/ + Area_AddSan + Norms(2).Norm/*Норма площади на семью*/);
  1004. IF Area_Izl > 0 AND Surplus = 'Y' THEN -- Есть излишки по площади и они учитываются.
  1005. IF Area_Polezn <> 0 THEN
  1006. tmp_numb := Summ_Nach*(Area_Izl/Area_Polezn);
  1007. ELSE
  1008. tmp_numb := 0;
  1009. END IF;
  1010. Summ_Nach := Summ_Nach - tmp_numb + tmp_numb * Norms(21).Norm;
  1011. END IF;
  1012. ELSIF ServiceNo = 41 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- ГАЗОВАЯ ПЛИТА.
  1013. IF Cgv = 'Y' /*AND Services.EXISTS(6) AND NVL(Services(6).State_Srv,1) = 1*/ THEN -- Есть неотключенное ЦГВ.
  1014. NormNo := 31;
  1015. ELSE -- ЦГВ нет или отключено.
  1016. NormNo := 32;
  1017. END IF;
  1018. Volume_Nach := Count_Inhabit * Norms(NormNo).Norm * Month_Part;
  1019. Volume_Social_Nach := Count_Inhabit * Norms(NormNo).Norm_Social * Month_Part;
  1020. Summ_Nach := Volume_Nach * Curr_Tarif;
  1021. ELSIF ServiceNo = 5 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- ХОЛОДНАЯ ВОДА И КАНАЛИЗАЦИЯ.
  1022. NormNo := NVL(Services(ServiceNo).Norm_ID,0);
  1023. Volume_Nach := GREATEST((Count_Inhabit - Count_Wanting),1) * Norms(NormNo).Norm * Month_Part;
  1024. Volume_Social_Nach := GREATEST((Count_Inhabit - Count_Wanting),1) * Norms(NormNo).Norm_Social * Month_Part;
  1025. IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
  1026. Volume_Nach := Volume_Nach * DayInMonthNach;
  1027. Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
  1028. END IF;
  1029. Summ_Nach := Volume_Nach * Curr_Tarif;
  1030. ELSE -- Неизвестная услуга.
  1031. Volume_Nach := 0;
  1032. Volume_Social_Nach := 0;
  1033. Summ_Nach := 0;
  1034. END IF;
  1035. ELSE -- Услуга подходит под одну из формул.
  1036. IF Services(ServiceNo).Formula = 10 THEN -- Количество - единица.
  1037. Volume_Nach := 1;
  1038. print(' Volume_Nach = '||Volume_Nach||'[const];');
  1039. ELSIF Services(ServiceNo).Formula = 11 THEN -- Количество - индивидуальное значение.
  1040. Volume_Nach := TO_NUMBER(Services(ServiceNo).Params);
  1041. print(' Volume_Nach = '||Volume_Nach||'[Services(ServiceNo).Params];');
  1042. ELSIF Services(ServiceNo).Formula = 20 THEN -- Люди - проживающие.
  1043. Volume_Nach := Count_Inhabit;
  1044. print(' Volume_Nach = '||Volume_Nach||'[Count_Inhabit];');
  1045. ELSIF Services(ServiceNo).Formula = 21 THEN -- Люди - проживающие минус отсутствующие.
  1046. Volume_Nach := GREATEST(Count_Inhabit - Count_Wanting,1);
  1047. print(' Volume_Nach = '||Volume_Nach||'[MAX(Count_Inhabit - Count_Wanting,1)];');
  1048. ELSIF Services(ServiceNo).Formula = 30 THEN -- Площадь - обшая.
  1049. Volume_Nach := Area_Obsch;
  1050. print(' Volume_Nach = '||Volume_Nach||'[Area_Obsch];');
  1051. ELSIF Services(ServiceNo).Formula = 31 THEN -- Площадь - полезная.
  1052. Volume_Nach := Area_Polezn;
  1053. print(' Volume_Nach = '||Volume_Nach||'[Area_Polezn];');
  1054. AccrualsDescription27(' объем услуги = '||Volume_Nach||'[отапливаемая площадь];');
  1055. ELSIF Services(ServiceNo).Formula = 32 THEN -- Площадь - жилая.
  1056. Volume_Nach := Area_Gilay;
  1057. print(' Volume_Nach = '||Volume_Nach||'[Area_Gilay];');
  1058. END IF;
  1059.  
  1060. -- Если услуга зависит от тепла, то учесть его возможное отключение и возможный коэффициент уменьшения отопительной площади:
  1061. IF ServiceDependsOnHeat(ServiceNo) THEN
  1062. tmp_numb2 := GetHeatReductionFactor(Data_prev);
  1063. tmp_numb3 := GetHeatedAreaDecreasePercent(Data_prev);
  1064. Volume_Nach := Volume_Nach * tmp_numb2 * tmp_numb3;
  1065. print(' Volume_Nach = [Volume_Nach] * '||tmp_numb2||'[HeatReductionFactor] * '||tmp_numb3||'[HeatedAreaDecreasePercent] = '||Volume_Nach||';');
  1066. AccrualsDescription27(' объем услуги = [объем услуги] * '||tmp_numb2||'[часть месяца подачи тепла] * '||tmp_numb3||'[коэффициент уменьшения отапливаемой площади] = '||Volume_Nach||';');
  1067. END IF;
  1068.  
  1069. -- Применить норму к вычисленному объему услуги.
  1070. NormNo := NVL(Services(ServiceNo).Norm_ID,0);
  1071. BEGIN
  1072. IF ServiceNo = 10 THEN -- Электричество: первому человеку одна норма, всем последующим - друая, но не больше социаьнгой норммы.
  1073. Volume_Social_Nach := (Norms(NormNo).Norm + CASE WHEN Volume_Nach > 1 THEN (Volume_Nach-1)*Norms(NormNo).Norm_Slave_Persons ELSE 0 END) * Month_Part;
  1074. IF Volume_Social_Nach > Norms(NormNo).Norm_Social * Month_Part THEN
  1075. Volume_Social_Nach := Norms(NormNo).Norm_Social * Month_Part;
  1076. END IF;
  1077. ELSIF ServiceNo = 27 THEN -- Тепло - не применять соц. норму по техрасчету.
  1078. Volume_Social_Nach := Volume_Nach * Month_Part;
  1079. print(' Volume_Social_Nach = '||Volume_Nach||'[Volume_Nach] * '||Month_Part||'[Month_Part] = '||Volume_Social_Nach||';');
  1080. AccrualsDescription27(' социальный объем = '||Volume_Nach||'[объем услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||Volume_Social_Nach||';');
  1081. ELSE
  1082. Volume_Social_Nach := Volume_Nach * Norms(NormNo).Norm_Social * Month_Part;
  1083. print(' Volume_Social_Nach = '||Volume_Nach||'[Volume_Nach] * '||Norms(NormNo).Norm_Social||'[Norm_Social] * '||Month_Part||'[Month_Part] = '||Volume_Social_Nach||';');
  1084. END IF;
  1085. Volume_Nach := Volume_Nach * Norms(NormNo).Norm * Month_Part;
  1086. print(' Volume_Nach = [Volume_Nach] * '||Norms(NormNo).Norm||'[Norm] * '||Month_Part||'[Month_Part] = '||Volume_Nach);
  1087. AccrualsDescription27(' объем услуги = [объем услуги] * '||Norms(NormNo).Norm||'[норма услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||Volume_Nach);
  1088.  
  1089. IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
  1090. Volume_Nach := Volume_Nach * DayInMonthNach;
  1091. Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
  1092. END IF;
  1093. EXCEPTION
  1094. WHEN NO_DATA_FOUND THEN
  1095. Volume_Nach := 0;
  1096. Volume_Social_Nach := 0;
  1097. END;
  1098.  
  1099. -- Расчет суммы.
  1100. IF ServiceNo = 10 THEN -- "Электроэнергия по счетчику".
  1101. Summ_Nach := CalcSummByTarifsE(ist.Data-1, NormNo, Volume_Nach, Month_Part);
  1102. IF Volume_Nach <> 0 THEN
  1103. Curr_Tarif := Summ_Nach / Volume_Nach;
  1104. ELSE
  1105. Curr_Tarif := 0;
  1106. END IF;
  1107. ELSIF ServiceNo = 17 THEN -- "Подсобка".
  1108. -- Для Подсобки тариф равен 50% от СДПТ в случае, если домовой тариф на подсобку <> 0 (Тоня, 18.10.2010).
  1109. Curr_Tarif := Tarif(ServiceNo, Services(ServiceNo).Norm_ID, TRUE);
  1110. IF Curr_Tarif = 0 THEN
  1111. Curr_Tarif := NULL;
  1112. -- Тариф на СДПТ.
  1113. FOR i IN 101..150 LOOP
  1114. IF Services.EXISTS(i) AND NVL(Services(i).State_Srv,1) = 1 THEN
  1115. Curr_Tarif := NVL(Curr_Tarif,0) + Tarif(i, Services(ServiceNo).Norm_ID) - Tarif(i, Services(ServiceNo).Norm_ID)*Dotacya(i, Services(ServiceNo).Norm_ID);
  1116. END IF;
  1117. END LOOP;
  1118. -- Если нет СДПТ - то ВЭР.
  1119. IF Curr_Tarif IS NULL AND (Services.EXISTS(11) AND NVL(Services(11).State_Srv,1) = 1) THEN
  1120. Curr_Tarif := Tarif(11, Services(ServiceNo).Norm_ID);
  1121. END IF;
  1122. -- Если и ВЭРа нет - то Квартплата.
  1123. IF Curr_Tarif IS NULL AND (Services.EXISTS(1) AND NVL(Services(1).State_Srv,1) = 1) THEN
  1124. Curr_Tarif := Tarif(1, Services(ServiceNo).Norm_ID);
  1125. END IF;
  1126. -- Если ничего нет - взять половину домового тарифа СДПТ.
  1127. IF Curr_Tarif IS NULL THEN
  1128. FOR i IN 101..150 LOOP
  1129. Curr_Tarif := NVL(Curr_Tarif,0) + Tarif(i, Services(ServiceNo).Norm_ID, TRUE) - Tarif(i, Services(ServiceNo).Norm_ID, TRUE)*Dotacya(i, Services(ServiceNo).Norm_ID, TRUE);
  1130. END LOOP;
  1131. END IF;
  1132. Curr_Tarif := Curr_Tarif * 0.5;
  1133. END IF;
  1134. Summ_Nach := Volume_Nach * Curr_Tarif;
  1135. ELSE
  1136. Summ_Nach := Volume_Nach * Curr_Tarif;
  1137. print(' Summ_Nach = '||Volume_Nach||'[Volume_Nach] * '||Curr_Tarif||'[Curr_Tarif] = '||Summ_Nach);
  1138. AccrualsDescription27(' сумма начисления = '||Volume_Nach||'[объем услуги] * '||Curr_Tarif||'[тариф] = '||Summ_Nach);
  1139. END IF;
  1140. END IF; -- Выбор формулы вычисления для услуги.
  1141.  
  1142. -- Применить к сумме понижающий стоимость коэффициент:
  1143. tmp_numb3 := ServiceNo;
  1144. IF tmp_numb3 BETWEEN 101 AND 126 THEN
  1145. tmp_numb3 := 100;
  1146. END IF;
  1147. tmp_numb := GetKoeff(Data_prev, tmp_numb3, 2);
  1148. IF tmp_numb < 1 THEN
  1149. tmp_numb2 := Summ_Nach;
  1150. Summ_Nach := tmp_numb2 * tmp_numb;
  1151. print(' Summ_Nach = '||tmp_numb2||'[Summ_Nach] * '||tmp_numb||'[GetKoeff('||Data_prev||', '||tmp_numb3||', 2)] = '||Summ_Nach);
  1152. AccrualsDescription27(' сумма начисления = '||tmp_numb2||'[сумма начисления] * '||tmp_numb||'[коэффициент понижения стоимости] = '||Summ_Nach);
  1153. END IF;
  1154.  
  1155.  
  1156. -- ДОТАЦИЯ.
  1157. tmp_numb := Dotacya(ServiceNo, Services(ServiceNo).Norm_ID)/100;
  1158. Dotac := Summ_Nach * tmp_numb;
  1159. print(' Dotac = '||Summ_Nach||'[Summ_Nach] * '||tmp_numb||'[Dotacya(ServiceNo,Norm_ID)/100] = '||Dotac);
  1160.  
  1161. -- ПОКАЗАНИЯ СЧЕТЧИКОВ.
  1162. MonthNach_Sch := NULL;
  1163. Volume_Nach_Sch := 0;
  1164. Summ_Nach_Sch := 0;
  1165. LastDayInCurrDiapason := LAST_DAY(data_prev) + 1;
  1166. IF LastDayInCurrDiapason > ist.Data THEN
  1167. LastDayInCurrDiapason := ist.Data;
  1168. END IF;
  1169. IF ServiceIsCounter(ServiceNo) THEN -- Счетчик.
  1170. Indication_No := Indications.FIRST;
  1171. WHILE Indication_No IS NOT NULL LOOP
  1172. IF Indications(Indication_No).ServiceID = ServiceNo AND
  1173. LastDayInCurrDiapason >= Indications(Indication_No).Data_prev AND
  1174. data_prev < Indications(Indication_No).Data_curr
  1175. THEN
  1176. -- Кол-во дней в показаниях.
  1177. Indication_KolDay := Indications(Indication_No).Data_curr - Indications(Indication_No).Data_prev;
  1178. -- Кол-во дней показаний, выходящих за границу текущего "окна" начислений.
  1179. Indication_KolDayOut := 0;
  1180. IF data_prev > Indications(Indication_No).Data_prev THEN
  1181. Indication_KolDayOut := Indication_KolDayOut + (data_prev - Indications(Indication_No).Data_prev);
  1182. END IF;
  1183. IF LastDayInCurrDiapason < Indications(Indication_No).Data_curr THEN
  1184. Indication_KolDayOut := Indication_KolDayOut + (Indications(Indication_No).Data_curr - LastDayInCurrDiapason);
  1185. END IF;
  1186. -- Часть объема счетчика, приходящаяся на текущее "окно" начисления.
  1187. IF Indication_KolDay <> 0 THEN
  1188. Indication_part := (Indication_KolDay - Indication_KolDayOut)/Indication_KolDay;
  1189. ELSE
  1190. Indication_part := 0;
  1191. END IF;
  1192. -- Месяц, в который запишутся показания (может не совпадать с текущим или отчетным!).
  1193. MonthNach_Sch := Indications(Indication_No).Month;
  1194. -- Объем.
  1195. Volume_Nach_Sch := Indications(Indication_No).Volume * Indication_part;
  1196. IF ServiceNo = 10 THEN -- Электричество.
  1197. Summ_Nach_Sch := CalcSummByTarifsE(LastDayInCurrDiapason-1, NormNo, Volume_Nach_Sch, Month_Part);
  1198. ELSE
  1199. Summ_Nach_Sch := Volume_Nach_Sch * Curr_Tarif;
  1200. END IF;
  1201. -- Добавить вычисленные значения в список.
  1202. AccrualNo := GetAccrualNo(TRUE, MonthNach_Sch, 1, ServiceNo, NULL, NULL);
  1203. Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach_Sch;
  1204. Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach_Sch;
  1205. Accruals(AccrualNo).Tarif := Curr_Tarif;
  1206. -- Прекратить перебор показаний, т.к. в один период по одной услуге могут быть только одни показания.
  1207. EXIT;
  1208. END IF;
  1209. Indication_No := Indications.NEXT(Indication_No);
  1210. END LOOP;
  1211. END IF;
  1212.  
  1213. -- Если Л/С открыт и услуга действительна.
  1214. IF AccountState = 1 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN
  1215. -- Добавить вычисленные значения в список.
  1216. IF NOT ServiceIsCounter(ServiceNo) THEN -- Техрасчет.
  1217. AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 1, ServiceNo, NULL, NULL);
  1218. Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach;
  1219. Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach;
  1220. Accruals(AccrualNo).Dotacya := Accruals(AccrualNo).Dotacya + Dotac;
  1221. Accruals(AccrualNo).Tarif := Curr_Tarif;
  1222. ELSE -- Счетчик.
  1223. -- Добавить нулевые значения для открытой услуги без показаний, чтобы выгружалось в ГЕРЦ.
  1224. AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 1, ServiceNo, NULL, NULL);
  1225. -- При отсутствии показаний счетчика в месяце - начислять по техрасчету (08.02.2018)
  1226. IF NOT IndicationsPresentInMonth(ServiceNo, CurrMonthNach) THEN
  1227. Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach;
  1228. Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach;
  1229. Accruals(AccrualNo).Tarif := Curr_Tarif;
  1230. END IF;
  1231. END IF;
  1232.  
  1233. -- ЛЬГОТЫ.
  1234. -- Отсортировать льготы по % для текущей услуги.
  1235. SortedPrivils.DELETE;
  1236. PrivilNo := Privils.FIRST;
  1237. WHILE PrivilNo IS NOT NULL LOOP
  1238. PrvlSrvPrcNo := Privils(PrivilNo).Privil_ID * 100000 + ServiceNo;
  1239. IF PrvlSrvPrc.EXISTS(PrvlSrvPrcNo) AND PrvlSrvPrc(PrvlSrvPrcNo) > 0 THEN
  1240. SortedPrivils(NVL(SortedPrivils.COUNT,0)+1) := Privils(PrivilNo);
  1241. FOR i IN REVERSE 2..SortedPrivils.COUNT LOOP
  1242. IF (PrvlSrvPrc(SortedPrivils(i).Privil_ID*100000+ServiceNo) > PrvlSrvPrc(SortedPrivils(i-1).Privil_ID*100000+ServiceNo)) OR
  1243. (PrvlSrvPrc(SortedPrivils(i).Privil_ID*100000+ServiceNo) = PrvlSrvPrc(SortedPrivils(i-1).Privil_ID*100000+ServiceNo) AND SortedPrivils(i).Count_Prvl > SortedPrivils(i-1).Count_Prvl) OR
  1244. (PrvlSrvPrc(SortedPrivils(i).Privil_ID*100000+ServiceNo) = PrvlSrvPrc(SortedPrivils(i-1).Privil_ID*100000+ServiceNo) AND SortedPrivils(i).Count_Prvl = SortedPrivils(i-1).Count_Prvl AND SortedPrivils(i).Peopl_ID < SortedPrivils(i-1).Peopl_ID)
  1245. THEN
  1246. tmpPrivil := SortedPrivils(i-1);
  1247. SortedPrivils(i-1) := SortedPrivils(i);
  1248. SortedPrivils(i) := tmpPrivil;
  1249. ELSE
  1250. EXIT;
  1251. END IF;
  1252. END LOOP;
  1253. END IF;
  1254. PrivilNo := Privils.NEXT(PrivilNo);
  1255. END LOOP;
  1256.  
  1257. Volume_Prvl := 0;
  1258. LInhabitRest := Count_Inhabit;
  1259. LVolumeRest := Volume_Social_Nach;
  1260. LVolumeRest_Sch := Volume_Social_Nach; --Volume_Nach_Sch;
  1261. AddSanCharged := 1;
  1262.  
  1263. print(' Volume_Prvl = '||Volume_Prvl||'[const]; LInhabitRest = '||LInhabitRest||'[Count_Inhabit]; LVolumeRest = '||LVolumeRest||'[Volume_Social_Nach];');
  1264. AccrualsDescription27(' объем по льготе = '||Volume_Prvl||'[const]; количество проживающих, для которых доступна льгота = '||LInhabitRest||'[количество проживающих]; объем, доступный для льготной компенсации = '||LVolumeRest||'[начисленный социальный объем];');
  1265.  
  1266. -- Перебрать уже отсортированные льготы.
  1267. PrivilNo := SortedPrivils.FIRST;
  1268. WHILE PrivilNo IS NOT NULL LOOP -- Цикл по всем льготам абонента.
  1269. print(' PrivilNo = '||PrivilNo||';');
  1270. AccrualsDescription27(' Номер льготы = '||PrivilNo||';');
  1271.  
  1272. PrvlSrvPrcNo := SortedPrivils(PrivilNo).Privil_ID * 100000 + ServiceNo;
  1273. -- Ограничить количество льготников при необходимости.
  1274. IF SortedPrivils(PrivilNo).Count_Prvl > LInhabitRest THEN
  1275. LInhabit := LInhabitRest;
  1276. LInhabitRest := 0;
  1277. ELSE
  1278. LInhabit := SortedPrivils(PrivilNo).Count_Prvl;
  1279. LInhabitRest := LInhabitRest - LInhabit;
  1280. END IF;
  1281. print(' LInhabit = '||LInhabit||'; LInhabitRest = '||LInhabitRest||';');
  1282. AccrualsDescription27(' количество льготников = '||LInhabit||'; остаток проживающих = '||LInhabitRest||';');
  1283.  
  1284. -- Вычисление льготного объема услуги.
  1285. IF ServiceIsCounter(ServiceNo) THEN
  1286. -- 23.05.2012 Для счетчиков не начислять льгот больше нормы.
  1287. --tmp_numb := Volume_Nach; -- Volume_Nach_Sch;
  1288. -- tmp_numb := Volume_Nach_Sch;
  1289. IF Volume_Nach > Volume_Nach_Sch THEN
  1290. tmp_numb := Volume_Nach_Sch;
  1291. print(' Volume_Prvl100 = [Volume_Nach_Sch] = '||tmp_numb||';');
  1292. ELSE
  1293. tmp_numb := Volume_Nach;
  1294. print(' Volume_Prvl100 = [Volume_Nach] = '||tmp_numb||';');
  1295. END IF;
  1296. ELSE
  1297. tmp_numb := Volume_Nach;
  1298. print(' Volume_Prvl100 = [Volume_Nach] = '||tmp_numb||';');
  1299. END IF;
  1300. IF ServiceNo = 10 THEN -- Электричество: первому человеку одна норма, всем последующим - друая, но не больше социаьнгой норммы.
  1301. tmp_numb :=
  1302. (
  1303. CASE WHEN PrivilNo = 1 THEN Norms(NormNo).Norm ELSE Norms(NormNo).Norm_Slave_Persons END +
  1304. CASE WHEN LInhabit > 1 THEN (LInhabit-1)*Norms(NormNo).Norm_Slave_Persons ELSE 0 END
  1305. ) * Month_Part;
  1306. IF Volume_Social_Nach > Norms(NormNo).Norm_Social * Month_Part THEN
  1307. Volume_Social_Nach := Norms(NormNo).Norm_Social * Month_Part;
  1308. END IF;
  1309. ELSIF Services(ServiceNo).Formula IN (20,21) OR ServiceNo IN (41,5,28,53) THEN -- Льгота зависит от льготников или это плита либо вода.
  1310. tmp_numb := tmp_numb / GREATEST((Count_Inhabit - Count_Wanting),1) * LInhabit;
  1311. print(' Volume_Prvl100 = [Volume_Prvl100]/MAX(('||Count_Inhabit||'[Count_Inhabit] - '||Count_Wanting||'[Count_Wanting]),1) * '||LInhabit||'[LInhabit] = '||tmp_numb||';');
  1312. tmp_numb2 := Volume_Social_Nach / GREATEST((Count_Inhabit - Count_Wanting),1) * LInhabit; -- Социальный объем с точностью до количества льготников
  1313. IF tmp_numb > tmp_numb2 THEN
  1314. print(' Volume_Social_Nach_by_Privil = '||Volume_Social_Nach||'[Volume_Social_Nach]/MAX(('||Count_Inhabit||'[Count_Inhabit] - '||Count_Wanting||'[Count_Wanting]),1) * '||LInhabit||'[LInhabit] = '||tmp_numb2||';');
  1315. print(' Volume_Prvl100 = '||tmp_numb2||'[Volume_Social_Nach_by_Privil] (поскольку '||tmp_numb||'[Volume_Prvl100] > '||tmp_numb2||'[Volume_Social_Nach_by_Privil]);');
  1316. tmp_numb := tmp_numb2;
  1317. END IF;
  1318. ELSIF Services(ServiceNo).Formula IN (30,31,32) OR ServiceNo IN (4) THEN -- Льгота зависит от сан.нормы площади или это АГВ.
  1319. --tmp_numb := (LInhabit*Norms(1).Norm_Social/*Норма площади на человека*/ + AddSanCharged*/*Учесть только для одной льготы*/(Area_AddSan + Norms(2).Norm_Social/*Норма площади на семью*/)) * Norms(NormNo).Norm_Social * Month_Part;
  1320. tmp_numb := (LInhabit*Norms(1).Norm_Social/*Норма площади на человека*/ + AddSanCharged*/*Учесть только для одной льготы*/(Area_AddSan + Norms(2).Norm_Social/*Норма площади на семью*/));
  1321. print(' Volume_Prvl100 = ('||LInhabit||'[LInhabit] * '||Norms(1).Norm_Social||'[Norms(1).Norm_Social] + '||AddSanCharged||'[AddSanCharged] * ('||Area_AddSan||'[Area_AddSan] + '||Norms(2).Norm_Social||'[Norms(2).Norm_Social])) = '||tmp_numb||';');
  1322. AccrualsDescription27(' объем по льготе = ('||LInhabit||'[количество льготников] * '||Norms(1).Norm_Social||'[социальная норма] + '||AddSanCharged||'[только на одну льготу] * ('||Area_AddSan||'[доп.сан.площадь] + '||Norms(2).Norm_Social||'[социальная норма])) = '||tmp_numb||';');
  1323. IF ServiceNo = 27 THEN
  1324. tmp_numb := LEAST(tmp_numb, Area_Obsch);
  1325. print(' Volume_Prvl100 = MIN([Volume_Prvl100], '||Area_Obsch||'[Area_Obsch]) = '||tmp_numb||';');
  1326. AccrualsDescription27(' объем по льготе = MIN([объем по льготе], '||Area_Obsch||'[общая площадь]) = '||tmp_numb||';');
  1327. tmp_numb := tmp_numb * Norms(NormNo).Norm * Month_Part; --LEAST(Norms(NormNo).Norm, Norms(NormNo).Norm_Social) * Month_Part;
  1328. print(' Volume_Prvl100 = [Volume_Prvl100] * '||Norms(NormNo).Norm||'[Norms(NormNo).Norm] * '||Month_Part||'[Month_Part] = '||tmp_numb||';');
  1329. AccrualsDescription27(' объем по льготе = [объем по льготе] * '||Norms(NormNo).Norm||'[норма услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||tmp_numb||';');
  1330. tmp_numb2 := GetHeatReductionFactor(Data_prev);
  1331. tmp_numb := tmp_numb * tmp_numb2;
  1332. print(' Volume_Prvl100 = [Volume_Prvl100] * '||tmp_numb2||'[HeatReductionFactor] = '||tmp_numb||';');
  1333. AccrualsDescription27(' объем по льготе = [объем по льготе] * '||tmp_numb2||'[часть месяца подачи тепла] = '||tmp_numb||';');
  1334. ELSE
  1335. tmp_numb := tmp_numb * Norms(NormNo).Norm_Social * Month_Part;
  1336. print(' Volume_Prvl100 = [Volume_Prvl100] * '||Norms(NormNo).Norm_Social||'[Norms(NormNo).Norm_Social] * '||Month_Part||'[Month_Part] = '||tmp_numb||';');
  1337. END IF;
  1338. AddSanCharged := 0;
  1339. END IF;
  1340. -- Ограничить льготный объем при необходимости.
  1341. IF ServiceIsCounter(ServiceNo) THEN
  1342. IF tmp_numb > LVolumeRest_Sch THEN
  1343. tmp_numb := LVolumeRest_Sch;
  1344. LVolumeRest_Sch := 0;
  1345. ELSE
  1346. LVolumeRest_Sch := LVolumeRest_Sch - tmp_numb;
  1347. END IF;
  1348. print(' LVolumeRest_Sch = '||LVolumeRest_Sch||';');
  1349. ELSE
  1350. IF tmp_numb > LVolumeRest THEN
  1351. tmp_numb := LVolumeRest;
  1352. print(' Volume_Prvl100 = '||LVolumeRest||'[LVolumeRest] (поскольку [Volume_Prvl100] > [LVolumeRest]);');
  1353. LVolumeRest := 0;
  1354. ELSE
  1355. LVolumeRest := LVolumeRest - tmp_numb;
  1356. END IF;
  1357. print(' LVolumeRest = '||LVolumeRest||';');
  1358. END IF;
  1359. AccrualsDescription27(' объем, доступный для льготной компенсации = '||LVolumeRest||';');
  1360.  
  1361. Volume_Prvl100 := tmp_numb; -- Льготный объем без процента льготы.
  1362. tmp_numb2 := PrvlSrvPrc(PrvlSrvPrcNo);
  1363. Volume_Prvl := tmp_numb * tmp_numb2;
  1364. print(' Volume_Prvl = '||tmp_numb||'[Volume_Prvl100] * '||tmp_numb2||'[PrvlSrvPrc] = '||Volume_Prvl||';');
  1365. AccrualsDescription27(' объем по льготе с учетом % = '||tmp_numb||'[объем по льготе] * '||tmp_numb2||'[процент льготы] = '||Volume_Prvl||';');
  1366.  
  1367. IF ServiceNo = 10 THEN -- Электричество.
  1368. Summ_Prvl := CalcSummByTarifsE(ist.Data-1, NormNo, Volume_Prvl, Month_Part);
  1369. ELSE
  1370. tmp_numb2 := Dotacya(ServiceNo, Services(ServiceNo).Norm_ID);
  1371. Summ_Prvl := Volume_Prvl * Curr_Tarif * (1 - tmp_numb2/100);
  1372. print(' Summ_Prvl = '||Volume_Prvl||'[Volume_Prvl] * '||Curr_Tarif||'[Curr_Tarif] * (1 - '||tmp_numb2||'[Dotacya]/100) = '||Summ_Prvl||';');
  1373. AccrualsDescription27(' сумма льготной компенсации = '||Volume_Prvl||'[объем по льготе с учетом %] * '||Curr_Tarif||'[тариф] * (1 - '||tmp_numb2||'[дотация])/100 = '||Summ_Prvl||';');
  1374. END IF;
  1375.  
  1376. -- Добавить вычисленную льготу в список.
  1377. IF ServiceIsCounter(ServiceNo) THEN
  1378. AccrualNo := GetAccrualNo(TRUE, MonthNach_Sch, 2, ServiceNo, SortedPrivils(PrivilNo).Privil_ID, SortedPrivils(PrivilNo).Peopl_ID);
  1379. ELSE
  1380. AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 2, ServiceNo, SortedPrivils(PrivilNo).Privil_ID, SortedPrivils(PrivilNo).Peopl_ID);
  1381. END IF;
  1382.  
  1383. Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Prvl;
  1384. Accruals(AccrualNo).Volume100 := Accruals(AccrualNo).Volume100 + Volume_Prvl100;
  1385. Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Prvl;
  1386. Accruals(AccrualNo).Tarif := Curr_Tarif;
  1387. PrivilNo := SortedPrivils.NEXT(PrivilNo);
  1388. END LOOP; -- Цикл по всем льготам абонента.
  1389. END IF; -- Л/С открыт и услуга действительна.
  1390. ServiceNo := Services.NEXT(ServiceNo);
  1391. END LOOP; -- Цикл по всем услугам.
  1392. -- Перейти к следующей дате.
  1393. IF TRUNC(Data_prev, 'MM') < TRUNC(ist.Data, 'MM') THEN
  1394. Data_prev := LAST_DAY(Data_prev) + 1;
  1395. ELSE
  1396. Data_Prev := ist.Data;
  1397. END IF;
  1398. END LOOP; -- Помесячный цикл в промежутке между двумя датами.
  1399. END IF; -- Если текущая дата больше предыдущей.
  1400. /* 04.11.2011 Вроде как лишняя строчка?
  1401. Data_Prev := ist.Data;
  1402. */
  1403. -- ИЗМЕНЕНИЕ ПАРАМЕТРОВ, ВЛИЯЮЩИХ НА НАЧИСЛЕНИЕ.
  1404. IF ist.Vid = 'L' THEN -- Изменение Л/С.
  1405. AccountState := NVL(ist.Status_ID,0);
  1406. Area_Obsch := NVL(ist.Area_Obsch ,0);
  1407. Area_Polezn := NVL(ist.Area_Polezn,0);
  1408. Area_Gilay := NVL(ist.Area_Gilay,0);
  1409. Area_AddSan := NVL(ist.Area_AddSan,0);
  1410. Count_Inhabit := GREATEST(NVL(ist.Count_Inhabit,0),1);
  1411. ShortFamily := NVL(ist.ShortFamily,'N');
  1412. Surplus := NVL(ist.Surplus,'N');
  1413. Cgv := NVL(ist.Cgv,'N');
  1414. ELSIF ist.Vid = 'W' THEN -- Отсутствующие.
  1415. Count_Wanting := NVL(ist.Count_W,0);
  1416. ELSIF ist.Vid = 'H' THEN -- Изменения дома.
  1417. Category := NVL(ist.Category, 0);
  1418. ELSIF ist.Vid = 'P' THEN -- Изменение льгот Л/С.
  1419. IF ist.State_Prvl = 1 THEN -- Активная льгота.
  1420. PrivilNo := GetPrivilNo(TRUE, ist.Privil_ID, ist.Peopl_ID);
  1421. Privils(PrivilNo).Count_Prvl := ist.Count_Prvl;
  1422. ELSE -- Закрытая льгота.
  1423. PrivilNo := GetPrivilNo(FALSE, ist.Privil_ID, ist.Peopl_ID);
  1424. IF PrivilNo IS NOT NULL THEN
  1425. Privils.DELETE(PrivilNo);
  1426. END IF;
  1427. END IF;
  1428. ELSIF ist.Vid = 'S' THEN -- Изменение услуг у Л/С.
  1429. IF ist.State_Srv = 1 THEN -- Открытие услуги.
  1430. Services(ist.Service_ID).Formula := ist.Formula;
  1431. Services(ist.Service_ID).Params := NVL(ist.Params,0);
  1432. Services(ist.Service_ID).Norm_ID := ist.Norm_ID;
  1433. ELSE -- Закрытие услуги.
  1434. Services.DELETE(ist.Service_ID);
  1435. END IF;
  1436. ELSIF ist.Vid = 'O' THEN -- Временное закрытие услуги у дома.
  1437. IF Services.EXISTS(ist.Service_ID_O) THEN
  1438. Services(ist.Service_ID_O).State_Srv := ist.State_Srv_O;
  1439. END IF;
  1440. ELSIF ist.Vid = 'N' THEN -- Изменение значений норм.
  1441. Norms(ist.SrvNorm_ID).Norm := ist.Norm;
  1442. Norms(ist.SrvNorm_ID).Norm_Social := ist.Norm_Social;
  1443. Norms(ist.SrvNorm_ID).Norm_Slave_Persons := ist.Norm_Slave_Persons;
  1444. Norms(ist.SrvNorm_ID).Period := ist.Period;
  1445. ELSIF ist.Vid = 'T' THEN -- Изменение значений общих тарифов.
  1446. Tarifs(ist.Service_ID_T*1000000 + ist.SrvNorm_ID_T*100 + ist.TrSchema).Tarif := NVL(ist.Tarif,0);
  1447. Tarifs(ist.Service_ID_T*1000000 + ist.SrvNorm_ID_T*100 + ist.TrSchema).Dotacya := NVL(ist.Dotacya,0);
  1448. ELSIF ist.Vid = 'E' THEN -- Изменение тарифов на электричество.
  1449. tmp_numb := NVL(TarifsE.LAST,0) + 1;
  1450. TarifsE(tmp_numb).SrvNorm_ID := ist.SrvNorm_ID_E;
  1451. TarifsE(tmp_numb).Data := ist.Data;
  1452. TarifsE(tmp_numb).Data_End := ist.Data_End;
  1453. TarifsE(tmp_numb).Volume_Min := ist.Volume_Min;
  1454. TarifsE(tmp_numb).Volume_Max := ist.Volume_Max;
  1455. TarifsE(tmp_numb).Tarif := ist.Tarif_E;
  1456. ELSIF ist.Vid = 'J' THEN -- Изменение значений домовых тарифов.
  1457. TarifsH(ist.Service_ID_J*1000000 + ist.SrvNorm_ID_J*100).Tarif := NVL(ist.TarifH,0);
  1458. TarifsH(ist.Service_ID_J*1000000 + ist.SrvNorm_ID_J*100).Dotacya := NVL(ist.DotacyaH,0);
  1459. END IF; -- Изменение параметров начисления.
  1460. END LOOP; -- Конец цикла по всем событиям в период начисления.
  1461.  
  1462. --------------------------------------------------------------------------------------
  1463. -- /--\ | / |--\ | | |--\ /| |--\ | | | | |--\ /--\ /--| |---| /---\ --
  1464. -- | | | / | | | | | / | | | | | | | | | | | | | --
  1465. -- | | |< |--/ \--| | | | |-- |--| | /| |-- | | | | | | --
  1466. -- | | | \ | | | | | | | | |/ | | | /----\ | | | --
  1467. -- \--/ | \ | \--/ | | | |--/ | | | | |--/ 9 \--/ | | | | | --
  1468. --------------------------------------------------------------------------------------
  1469. AccrualNo := Accruals.FIRST;
  1470. WHILE AccrualNo IS NOT NULL LOOP
  1471. IF Accruals(AccrualNo).Service_ID BETWEEN 101 AND 150 THEN -- ИД услуги между 101 и 150 (составляющие СДПТ).
  1472. Accruals(AccrualNo).Summ := TRUNC(Accruals(AccrualNo).Summ, 4);
  1473. Accruals(AccrualNo).Dotacya := TRUNC(Accruals(AccrualNo).Dotacya,4);
  1474. -- Составляющие СДПТ.
  1475. AccrualNo2 := GetAccrualNo(TRUE, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, 100, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID);
  1476. IF Accruals(AccrualNo).Volume <> 0 AND Accruals(AccrualNo2).Volume = 0 THEN -- Объем по 100 услуге равен объемы первой встреченной составляющей.
  1477. Accruals(AccrualNo2).Volume := Accruals(AccrualNo).Volume;
  1478. Accruals(AccrualNo2).Volume100 := Accruals(AccrualNo).Volume100;
  1479. END IF;
  1480. Accruals(AccrualNo2).Summ := Accruals(AccrualNo2).Summ + Accruals(AccrualNo).Summ;
  1481. Accruals(AccrualNo2).Dotacya := Accruals(AccrualNo2).Dotacya + Accruals(AccrualNo).Dotacya;
  1482. ELSIF Accruals(AccrualNo).Service_ID = 100 THEN -- СДПТ не трогать, т.к. это сумма уже усеченных составляющих.
  1483. NULL;
  1484. ELSIF Accruals(AccrualNo).Service_ID = 14 THEN -- Лифт также, как и СДПТ, усекать до 4-х знаков, а не округлять.
  1485. Accruals(AccrualNo).Summ := TRUNC(Accruals(AccrualNo).Summ, 4);
  1486. ELSE
  1487. Accruals(AccrualNo).Summ := ROUND(Accruals(AccrualNo).Summ, 2);
  1488. END IF;
  1489. AccrualNo := Accruals.NEXT(AccrualNo);
  1490. END LOOP;
  1491.  
  1492. -------------------------------------------------------------------------------------------------
  1493. -- /--\ /| |---| | | /--\ | | | /| | | | | /--\ /| |--\ | | | | - --
  1494. -- / / | | | | | | | | | / | | | | | | / | | | | | | | | --
  1495. -- - | | | | | /| | |--\ |--| | | \_| | /| | | | |-- |--| | /| | /| --
  1496. -- \ |--| | | |/ | | | | | | |--| | |/ | | | | | | | |/ | |/ | --
  1497. -- \--/ | | | | | | \--/ \--/ | | | | | | | \--/ | | |--/ | | | | | | --
  1498. -------------------------------------------------------------------------------------------------
  1499. /*
  1500. AccrualNo := Accruals.FIRST;
  1501. WHILE AccrualNo IS NOT NULL LOOP
  1502. if Accruals(AccrualNo).Service_ID = 28 then
  1503. dbms_output.put_line(AccrualNo||': Service_ID='||Accruals(AccrualNo).Service_ID||'; Data='||Accruals(AccrualNo).Data||'; Vid='||Accruals(AccrualNo).Vid||
  1504. '; Volume='||Accruals(AccrualNo).Volume||'; Summ='||Accruals(AccrualNo).Summ||'; Dotacya='||Accruals(AccrualNo).Dotacya||
  1505. '; Privil_ID='||Accruals(AccrualNo).Privil_ID||'; Peopl_ID='||Accruals(AccrualNo).Peopl_ID||'; Volume100='||Accruals(AccrualNo).Volume100);
  1506. end if;
  1507. AccrualNo := Accruals.NEXT(AccrualNo);
  1508. END LOOP;
  1509. */
  1510.  
  1511. Old_SverkaSumm := GetSverkaSumm(lpad(AccID, 12, '0')); -- Запомнить сумму сверок до перерасчета.
  1512.  
  1513. -- Перебрать все уже существующие в базе начисления.
  1514. FOR a IN (
  1515. SELECT ROWID, a.*
  1516. FROM n_Accruals a
  1517. WHERE Account_ID = lpad(AccID, 12, '0')
  1518. AND Data BETWEEN Data_Beg_Nach AND Data_End_Nach
  1519. AND Vid IN (1,2,3,4)
  1520. )LOOP
  1521. IF a.Data < FinMonth THEN -- Дата меньше отчетного месяца.
  1522. -- Для начисленного по домовым счетчикам сверки не формировать,
  1523. -- т.к. автоматический перерасчет задним числом по домовому счетчику невозможен!
  1524. IF NVL(a.ByHouseCounter,0) <> 1 THEN
  1525. IF a.Vid IN (1,2) THEN -- Начисление.
  1526. AccrualNo := GetAccrualNo(FALSE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
  1527. SverkaNo := GetAccrualNo(TRUE, FinMonth, a.Vid + 2, a.Service_ID, a.Privil_ID, a.Peopl_ID);
  1528. AddAccrual(SverkaNo, -NVL(a.Volume,0), -NVL(a.Summ,0), -NVL(a.Dotacya,0), -NVL(a.Volume100,0));
  1529. IF AccrualNo IS NOT NULL THEN
  1530. AddAccrual(SverkaNo, Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1531. UpdateAccrual(2/*обновить только реальную половину*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
  1532. NULL, NULL, NULL, NULL, NULL, NULL,
  1533. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1534. Accruals.DELETE(AccrualNo);
  1535. ELSE
  1536. UpdateAccrual(2/*обновить только реальную половину*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
  1537. NULL, NULL, NULL, NULL, NULL, NULL,
  1538. 0, 0, 0, 0);
  1539. END IF;
  1540. ELSIF a.Vid IN (3,4) THEN -- Сверка.
  1541. SverkaNo := GetAccrualNo(TRUE, FinMonth, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
  1542. AddAccrual(SverkaNo, -a.Volume, -a.Summ, -a.Dotacya, -a.Volume100);
  1543. END IF;
  1544. END IF;
  1545. ELSIF a.Data = FinMonth THEN -- Дата в отчетном месяце.
  1546. IF a.Vid IN (1,2) THEN -- Начисление.
  1547. AccrualNo := GetAccrualNo(FALSE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
  1548. IF AccrualNo IS NOT NULL THEN -- В списке есть начисление, соответствующее найденному в БД.
  1549. UpdateAccrual(3/*обновить все - и начислено, и реально*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
  1550. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100, NULL, Accruals(AccrualNo).Tarif,
  1551. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1552. Accruals.DELETE(AccrualNo);
  1553. ELSE -- В списке нет начисления, соответствующего найденному в БД.
  1554. DELETE FROM n_Accruals WHERE ROWID = a.ROWID;
  1555. END IF;
  1556. ELSIF a.Vid IN (3,4) THEN -- Сверка.
  1557. SverkaNo := GetAccrualNo(TRUE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
  1558. AddAccrual(SverkaNo, -a.Volume, -a.Summ, -a.Dotacya, -a.Volume100);
  1559. END IF;
  1560. END IF;
  1561. END LOOP;
  1562.  
  1563. -- Перебрать все оставшиеся начисления (для которых не было записей в базе).
  1564. AccrualNo := Accruals.FIRST;
  1565. WHILE AccrualNo IS NOT NULL LOOP
  1566. IF Accruals(AccrualNo).Vid IN (1,2) THEN -- Начисления.
  1567. IF Accruals(AccrualNo).Data < FinMonth THEN -- Неотчетный месяц.
  1568. SverkaNo := GetAccrualNo(TRUE, FinMonth, Accruals(AccrualNo).Vid + 2, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID);
  1569. AddAccrual(SverkaNo, Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1570. UpdateAccrual(5/*перезаписать, а не добавлять*/, NULL, AccID, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID,
  1571. NULL, NULL, NULL, NULL, NULL, NULL,
  1572. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1573. ELSIF Accruals(AccrualNo).Data = FinMonth THEN -- Отчетный период.
  1574. UpdateAccrual(5/*перезаписать, а не добавлять*/, NULL, AccID, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID,
  1575. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100, NULL, Accruals(AccrualNo).Tarif,
  1576. Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
  1577. END IF;
  1578. Accruals.DELETE(AccrualNo);
  1579. END IF;
  1580. AccrualNo := Accruals.NEXT(AccrualNo);
  1581. END LOOP;
  1582.  
  1583. -- ЗАПИСАТЬ РАССЧИТАННЫЕ СВЕРКИ.
  1584. SverkaNo := Accruals.FIRST;
  1585. WHILE SverkaNo IS NOT NULL LOOP
  1586. UpdateAccrual(6/*добавить, а не обновить*/, NULL, AccID, Accruals(SverkaNo).Data, Accruals(SverkaNo).Vid, Accruals(SverkaNo).Service_ID, Accruals(SverkaNo).Privil_ID, Accruals(SverkaNo).Peopl_ID,
  1587. Accruals(SverkaNo).Volume, Accruals(SverkaNo).Summ, Accruals(SverkaNo).Dotacya, Accruals(SverkaNo).Volume100, Data_Beg_Nach, Accruals(AccrualNo).Tarif,
  1588. NULL, NULL, NULL, NULL);
  1589. Accruals.DELETE(SverkaNo);
  1590. SverkaNo := Accruals.NEXT(SverkaNo);
  1591. END LOOP;
  1592.  
  1593. --------------------------------------------------------------------------
  1594. -- |--\ /| /--\ | | |--\ /---\ /--\ /| /| | |--| /--\ --
  1595. -- | | / | | | | | | | / | / | | | | | | --
  1596. -- |--/ / | | \--| |-- | | / | / | |--\ | | | | --
  1597. -- | |--| | | | | | |--| | | | | | | | | --
  1598. -- | | | \--/ | |--/ | \--/ | | | | |--/ /----\ \--/ --
  1599. ------------ ПЕРЕСЧИТАТЬ САЛЬДО С УЧЕТОМ ВНЕСЕННЫХ ИЗМЕНЕНИЙ -------------
  1600. RaschetSaldo(lpad(AccID, 12, '0'), FinMonth);
  1601.  
  1602. -- Записать при необходимости сумму изменения сверок для подтверждения.
  1603. New_SverkaSumm := GetSverkaSumm(lpad(AccID, 12, '0')); -- Сумма сверок после перерасчета.
  1604. IF New_SverkaSumm <> Old_SverkaSumm THEN
  1605. AddSverkaToConfirmation(AccID, New_SverkaSumm - Old_SverkaSumm);
  1606. END IF;
  1607.  
  1608. -- Записать подробности по начислению 27 услуги:
  1609. begin
  1610. insert into n_AccrualsDescr(Account_ID, Month, Description)
  1611. values (AccID, FinMonth, AccrualsDescription27Str);
  1612. exception
  1613. when dup_val_on_index then
  1614. update n_AccrualsDescr set Description = AccrualsDescription27Str
  1615. where Account_ID = AccID and Month = FinMonth;
  1616. end;
  1617.  
  1618. END Nachislenie;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement