Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE PROCEDURE Nachislenie(AccID k_Accounts.ID%TYPE, Data_Start n_Accruals.Data%TYPE, Prm NUMBER)
- -- Начисление для Л/С начиная с указанной даты.
- AS
- DebugModeEnabled CONSTANT BOOLEAN := FALSE;
- -- Начисления и сверки.
- TYPE TAccrual IS RECORD (
- 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,
- Volume NUMBER,
- Summ NUMBER,
- Dotacya NUMBER,
- Volume100 NUMBER,
- Tarif NUMBER);
- TYPE TAccruals IS TABLE OF TAccrual INDEX BY BINARY_INTEGER;
- Accruals TAccruals;
- AccrualNo BINARY_INTEGER;
- SverkaNo BINARY_INTEGER;
- -- Льготы.
- TYPE TPrivil IS RECORD (
- Privil_ID n_AccountPrivil.Privil_ID%TYPE,
- Peopl_ID n_AccountPrivil.Peopl_ID%TYPE,
- Count_Prvl n_AccountPrivil.Count_Prvl%TYPE);
- tmpPrivil TPrivil;
- TYPE TPrivils IS TABLE OF TPrivil INDEX BY BINARY_INTEGER;
- Privils TPrivils; -- Список льгот у Л/С.
- SortedPrivils TPrivils; -- Список льгот, отсортированных по % на нужную услугу.
- PrivilNo BINARY_INTEGER;
- -- Услуги.
- 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);
- TYPE TServices IS TABLE OF TService INDEX BY BINARY_INTEGER;
- Services TServices;
- -- Нормы.
- 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);
- TYPE TNorms IS TABLE OF TNorm INDEX BY BINARY_INTEGER;
- Norms TNorms;
- -- Тарифы общие и домовые.
- TYPE TTarif IS RECORD (Tarif spr_Tarifs.Tarif%TYPE, Dotacya spr_Tarifs.Dotacya%TYPE);
- TYPE TTarifs IS TABLE OF TTarif INDEX BY BINARY_INTEGER;
- Tarifs TTarifs;
- TarifsH TTarifs;
- -- Тарифы на электричество.
- TYPE TTarifE IS RECORD (SrvNorm_ID NUMBER, Data DATE, Data_End DATE, Volume_Min NUMBER, Volume_Max NUMBER, Tarif NUMBER);
- TYPE TTarifsE IS TABLE OF TTarifE INDEX BY BINARY_INTEGER;
- TarifsE TTarifsE;
- -- Проценты льгот по услугам.
- TYPE TPrvlSrvPrc IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
- PrvlSrvPrc TPrvlSrvPrc;
- -- Количество дней отключения тепла в месяце.
- TYPE TNoHeatDaysCount IS RECORD (NoHeatDays NUMBER, DaysInMonth NUMBER);
- TYPE TNoHeatDaysCounts IS TABLE OF TNoHeatDaysCount INDEX BY BINARY_INTEGER;
- NoHeatDaysCounts TNoHeatDaysCounts;
- -- Процент уменьшения отопительной площади.
- TYPE THeatedAreaDecreasePercent IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
- HeatedAreaDecreasePercent THeatedAreaDecreasePercent;
- -- Понижающие коэффициенты услуг (временные отключения, некачественные услуги, 10% скидка ГИОЦ и т.п.):
- 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);
- TYPE TKoeffs IS TABLE OF TKoeff INDEX BY BINARY_INTEGER;
- Koeffs TKoeffs;
- -- Переменные.
- tmp_data DATE;
- tmp_data2 DATE;
- tmp_numb NUMBER;
- tmp_numb2 NUMBER;
- tmp_numb3 NUMBER;
- FinMonth DATE;
- Data_Beg_Nach DATE;
- Data_End_Nach DATE;
- Data_Prev DATE;
- Month_Part NUMBER;
- CurrMonthNach DATE;
- DayInMonthNach INTEGER;
- Privil_ID spr_PrivilPrc.Privil_ID%TYPE;
- AccrualNo2 BINARY_INTEGER;
- PrvlSrvPrcNo BINARY_INTEGER;
- ServiceNo BINARY_INTEGER;
- NormNo BINARY_INTEGER;
- NachislenyaNo BINARY_INTEGER;
- Volume_Nach NUMBER;
- Volume_Social_Nach NUMBER;
- Summ_Nach NUMBER;
- Volume_Prvl NUMBER;
- Volume_Prvl100 NUMBER;
- Dotac NUMBER;
- Summ_Prvl NUMBER;
- Area_Izl NUMBER;
- AddSanCharged NUMBER(1,0);
- Hs_ID k_House.ID%TYPE;
- Category k_House.Category%TYPE := 0;
- AccountState k_Accounts.Status_ID%TYPE := 0;
- Area_Polezn k_Accounts.Area_Polezn%TYPE := 0;
- Area_Obsch k_Accounts.Area_Polezn%TYPE := 0;
- Area_Gilay k_Accounts.Area_Gilay%TYPE := 0;
- Area_AddSan k_Accounts.Area_AddSan%TYPE := 0;
- Count_Inhabit k_Accounts.Count_Inhabit%TYPE := 0;
- Count_Wanting k_Accounts.Count_Wanting%TYPE := 0;
- ShortFamily k_Accounts.ShortFamily%TYPE := 'N';
- Surplus k_Accounts.Surplus%TYPE := 'N';
- Cgv k_Accounts.Cgv%TYPE := 'N';
- LInhabit NUMBER;
- LInhabitRest NUMBER;
- LVolumeRest NUMBER;
- IsCounter BOOLEAN;
- Curr_Tarif NUMBER;
- Old_SverkaSumm n_ConfirmSverka.Summ%TYPE;
- New_SverkaSumm n_ConfirmSverka.Summ%TYPE;
- LoggedUserID Users.ID%TYPE;
- DataChangeRow DATE;
- NoNachisl System.NoNachisl%TYPE;
- -- Информация о состоянии счетчиков.
- TYPE TCAccount IS TABLE OF c_Account%ROWTYPE INDEX BY BINARY_INTEGER;
- CAccount TCAccount;
- -- Начисленый по счетчикам объем.
- TYPE TIndication IS RECORD (
- ServiceID NUMBER,
- Month DATE,
- Volume NUMBER,
- Data_prev DATE,
- Data_curr DATE,
- Vid_prev NUMBER(1,0));
- TYPE TIndications IS TABLE OF TIndication INDEX BY BINARY_INTEGER;
- Indications TIndications;
- IndicationNo BINARY_INTEGER;
- IndicationNo2 BINARY_INTEGER;
- TarifENo NUMBER;
- Prcnt NUMBER;
- Indication_No NUMBER;
- Indication_Part NUMBER;
- Indication_KolDay NUMBER;
- Indication_KolDayOut NUMBER;
- LastDayInCurrDiapason DATE;
- MonthNach_Sch DATE;
- Volume_Nach_Sch NUMBER;
- Summ_Nach_Sch NUMBER;
- LVolumeRest_Sch NUMBER;
- AccrualsDescription27Str LONG := '';
- PROCEDURE print(str VARCHAR2)
- AS
- BEGIN
- if DebugModeEnabled then
- dbms_output.put_line(CHR(9)||str);
- end if;
- END;
- PROCEDURE AccrualsDescription27(str VARCHAR2)
- AS
- BEGIN
- AccrualsDescription27Str := AccrualsDescription27Str || str || chr(13)||chr(10);
- END;
- FUNCTION ServiceIsCounter(Service_ID spr_Services.ID%TYPE) RETURN BOOLEAN
- AS
- BEGIN
- RETURN Service_ID IN (
- 10, -- Электроэнергия.
- 25, -- Газ.
- 44, -- Отопление.
- 28, -- Хол. вода.
- 35, -- Гор. вода.
- 53 -- Водоотведение гор. воды.
- );
- END ServiceIsCounter;
- 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
- AS
- i BINARY_INTEGER;
- Result BINARY_INTEGER := NULL;
- BEGIN
- i := Accruals.FIRST;
- WHILE i IS NOT NULL LOOP
- 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
- Result := i;
- EXIT;
- END IF;
- i := Accruals.NEXT(i);
- END LOOP;
- IF Result IS NULL AND AddNewRow THEN
- Result := NVL(Accruals.LAST,0) + 1;
- Accruals(Result).Data := Data;
- Accruals(Result).Vid := Vid;
- Accruals(Result).Service_ID := Service_ID;
- Accruals(Result).Privil_ID := Privil_ID;
- Accruals(Result).Peopl_ID := Peopl_ID;
- Accruals(Result).Volume := 0;
- IF Vid IN (2,4) THEN Accruals(Result).Volume100 := 0; ELSE Accruals(Result).Volume100 := NULL; END IF;
- Accruals(Result).Summ := 0;
- Accruals(Result).Dotacya := 0;
- END IF;
- RETURN Result;
- END GetAccrualNo;
- FUNCTION GetIndicationNo(ServiceID NUMBER, Month DATE, Data_prev DATE, Data_curr DATE, Vid_prev NUMBER) RETURN BINARY_INTEGER
- AS
- i BINARY_INTEGER;
- PROCEDURE RaiseError(ErrMsg VARCHAR2)
- AS
- adres VARCHAR2(1000);
- BEGIN
- SELECT Street_Name||', '||House_FullNomer||', '||Apart_FullNomer INTO adres FROM vw_adresa WHERE Account_ID = lpad(AccID, 12, '0');
- RAISE_APPLICATION_ERROR(-20100, adres||' (ID='||AccID||'): '||ErrMsg);
- END;
- BEGIN
- i := Indications.FIRST;
- WHILE i IS NOT NULL LOOP
- IF Indications(i).ServiceID = ServiceID THEN
- IF Data_prev = Indications(i).Data_prev AND Data_curr = Indications(i).Data_curr THEN
- IF Indications(i).Month = Month THEN
- RETURN i;
- ELSE
- RaiseError('покази лiчильникiв з дiапазоном дат ['||Data_prev||' - '||Data_curr||'] мають рiзнi дати внесення: '||Indications(i).Month||' та '||Month||'!');
- END IF;
- ELSE
- IF Data_prev < Indications(i).Data_curr AND Data_curr > Indications(i).Data_prev THEN
- RaiseError('у показах лiчильникiв перетинаються дiапазони дат: ['||Indications(i).Data_prev||' - '||Indications(i).Data_curr||'] та ['||Data_prev||' - '||Data_curr||']!');
- END IF;
- END IF;
- END IF;
- i := Indications.NEXT(i);
- END LOOP;
- IF i IS NULL THEN
- i := NVL(Indications.LAST,0) + 1;
- Indications(i).ServiceID := ServiceID;
- Indications(i).Month := Month;
- Indications(i).Volume := 0;
- Indications(i).Data_prev := Data_prev;
- Indications(i).Data_curr := Data_curr;
- Indications(i).Vid_prev := Vid_prev;
- RETURN i;
- END IF;
- END GetIndicationNo;
- PROCEDURE AddAccrual(AccrualNo BINARY_INTEGER, Volume NUMBER, Summ NUMBER, Dotacya NUMBER, Volume100 NUMBER)
- AS
- BEGIN
- Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume;
- Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ;
- Accruals(AccrualNo).Dotacya := Accruals(AccrualNo).Dotacya + Dotacya;
- Accruals(AccrualNo).Volume100 := Accruals(AccrualNo).Volume100 + Volume100;
- END AddAccrual;
- PROCEDURE UpdateAccrual(
- Param /*ROWID<>NULL: 1-Values only, 2-rValues only, 3-all values; ROWID=NULL: 5-Update values, 6-Add values*/ NUMBER,
- 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,
- 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,
- RVolume n_Accruals.RVolume%TYPE, RSumm n_Accruals.RSumm%TYPE, RDotacya n_Accruals.RDotacya%TYPE, RVolume100 n_Accruals.RVolume100%TYPE)
- AS
- BEGIN
- IF RID IS NULL THEN
- IF Param = 5 THEN
- UPDATE n_Accruals SET
- Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
- RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
- UserID = LoggedUserID, DataChange = DataChangeRow
- WHERE Account_ID = UpdateAccrual.Account_ID
- AND Data = UpdateAccrual.Data
- AND Vid = UpdateAccrual.Vid
- AND Service_ID = UpdateAccrual.Service_ID
- AND NVL(Privil_ID,0) = NVL(UpdateAccrual.Privil_ID,0)
- AND NVL(Peopl_ID,0) = NVL(UpdateAccrual.Peopl_ID,0);
- ELSIF Param = 6 THEN
- UPDATE n_Accruals SET
- Volume = Volume + UpdateAccrual.Volume, Summ = Summ + UpdateAccrual.Summ, Dotacya = Dotacya + UpdateAccrual.Dotacya, Volume100 = Volume100 + UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis,
- RVolume = RVolume + UpdateAccrual.RVolume, RSumm = RSumm + UpdateAccrual.RSumm, RDotacya = RDotacya + UpdateAccrual.RDotacya, RVolume100 = RVolume100 + UpdateAccrual.RVolume100,
- UserID = LoggedUserID, DataChange = DataChangeRow
- WHERE Account_ID = UpdateAccrual.Account_ID
- AND Data = UpdateAccrual.Data
- AND Vid = UpdateAccrual.Vid
- AND Service_ID = UpdateAccrual.Service_ID
- AND NVL(Privil_ID,0) = NVL(UpdateAccrual.Privil_ID,0)
- AND NVL(Peopl_ID,0) = NVL(UpdateAccrual.Peopl_ID,0);
- END IF;
- IF SQL%NOTFOUND THEN
- IF NVL(Volume,0) <> 0 OR NVL(Summ,0) <> 0 OR NVL(Dotacya,0) <> 0 OR NVL(Volume100,0) <> 0 OR
- NVL(RVolume,0) <> 0 OR NVL(RSumm,0) <> 0 OR NVL(RDotacya,0) <> 0 OR NVL(RVolume100,0) <> 0 OR
- (ServiceIsCounter(Service_ID) AND Vid = 1 AND Data = FinMonth) -- нулевое показание в отчетном месяце по счетчику (может быть, если услуга включена, а показаний еще не было).
- THEN
- INSERT
- INTO n_Accruals (
- ID, Account_ID, Data, Vid, Service_ID, Privil_ID, Peopl_ID,
- Volume, Summ, Dotacya, Volume100, DataBegRevis, ByHouseCounter, Tarif,
- RVolume, RSumm, RDotacya, RVolume100,
- UserID, DataChange)
- VALUES (
- sAccruals.NEXTVAL, Account_ID, Data, Vid, Service_ID, Privil_ID, Peopl_ID,
- Volume, Summ, Dotacya, Volume100, DataBegRevis, NULL, Tarif,
- RVolume, RSumm, RDotacya, RVolume100,
- LoggedUserID, DataChangeRow);
- END IF;
- END IF;
- ELSE
- IF Param = 1 THEN
- UPDATE n_Accruals SET
- Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
- UserID = LoggedUserID, DataChange = DataChangeRow
- WHERE ROWID = UpdateAccrual.RID;
- ELSIF Param = 2 THEN
- UPDATE n_Accruals SET
- RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
- UserID = LoggedUserID, DataChange = DataChangeRow
- WHERE ROWID = UpdateAccrual.RID;
- ELSIF Param = 3 THEN
- UPDATE n_Accruals SET
- Volume = UpdateAccrual.Volume, Summ = UpdateAccrual.Summ, Dotacya = UpdateAccrual.Dotacya, Volume100 = UpdateAccrual.Volume100, DataBegRevis = UpdateAccrual.DataBegRevis, ByHouseCounter = NULL, Tarif = UpdateAccrual.Tarif,
- RVolume = UpdateAccrual.RVolume, RSumm = UpdateAccrual.RSumm, RDotacya = UpdateAccrual.RDotacya, RVolume100 = UpdateAccrual.RVolume100,
- UserID = LoggedUserID, DataChange = DataChangeRow
- WHERE ROWID = UpdateAccrual.RID;
- END IF;
- END IF;
- END UpdateAccrual;
- FUNCTION GetPrivilNo(AddNewRow BOOLEAN, Privil_ID n_AccountPrivil.Privil_ID%TYPE, Peopl_ID n_AccountPrivil.Peopl_ID%TYPE) RETURN BINARY_INTEGER
- AS
- i BINARY_INTEGER;
- Result BINARY_INTEGER := NULL;
- BEGIN
- i := Privils.FIRST;
- WHILE i IS NOT NULL LOOP
- IF (Privils(i).Privil_ID = Privil_ID) AND (Privils(i).Peopl_ID = NVL(Peopl_ID,Privils(i).Peopl_ID)) THEN
- Result := i;
- EXIT;
- END IF;
- i := Privils.NEXT(i);
- END LOOP;
- IF Result IS NULL AND AddNewRow THEN
- Result := NVL(Privils.LAST,0) + 1;
- Privils(Result).Privil_ID := Privil_ID;
- Privils(Result).Peopl_ID := Peopl_ID;
- END IF;
- RETURN Result;
- END GetPrivilNo;
- FUNCTION Tarif(ServiceNo BINARY_INTEGER, SrvNorm_ID BINARY_INTEGER, OnlyHouseTarif BOOLEAN DEFAULT FALSE) RETURN spr_Tarifs.Tarif%TYPE -- Для услуги вернуть тариф (домовой или общий).
- AS Rslt NUMBER;
- BEGIN
- -- Взять тариф из домовых тарифов.
- BEGIN
- Rslt := TarifsH(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100).Tarif;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- BEGIN
- IF NOT OnlyHouseTarif THEN
- Rslt := Tarifs(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100 + Category).Tarif;
- ELSE
- Rslt := 0;
- END IF;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди общегородских нет.
- Rslt := 0;
- END;
- END;
- RETURN Rslt;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN RETURN 0;
- END;
- FUNCTION Dotacya(ServiceNo BINARY_INTEGER, SrvNorm_ID BINARY_INTEGER, OnlyHouseTarif BOOLEAN DEFAULT FALSE) RETURN spr_Tarifs.Dotacya%TYPE -- Для услуги вернуть дотацию.
- AS Rslt NUMBER;
- BEGIN
- -- Взять тариф из домовых тарифов.
- BEGIN
- Rslt := NVL(TarifsH(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100).Dotacya,0);
- EXCEPTION
- WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди домовых нет.
- BEGIN
- IF NOT OnlyHouseTarif THEN
- Rslt := NVL(Tarifs(ServiceNo*1000000 + NVL(SrvNorm_ID,0)*100 + Category).Dotacya, 0);
- ELSE
- Rslt := 0;
- END IF;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN -- Если тарифа для услуги среди общегородских нет.
- Rslt := 0;
- END;
- END;
- RETURN Rslt;
- END;
- FUNCTION CalcSummByTarifsE(Data DATE, NormNo NUMBER, Volume NUMBER, MonthsPart NUMBER) RETURN NUMBER
- AS
- Result NUMBER;
- No NUMBER;
- BEGIN
- Result := 0;
- No := TarifsE.FIRST;
- WHILE No IS NOT NULL LOOP
- IF TarifsE(No).SrvNorm_ID = NormNo AND
- TarifsE(No).Data <= Data AND Data <= TarifsE(No).Data_End AND
- Volume > TarifsE(No).Volume_Min*MonthsPart
- THEN
- IF Volume >= TarifsE(No).Volume_Max*MonthsPart THEN
- Result := Result + (TarifsE(No).Volume_Max - TarifsE(No).Volume_Min)*MonthsPart * TarifsE(No).Tarif;
- ELSE
- Result := Result + (Volume - TarifsE(No).Volume_Min*MonthsPart) * TarifsE(No).Tarif;
- END IF;
- END IF;
- No := TarifsE.NEXT(No);
- END LOOP;
- RETURN Result;
- END;
- FUNCTION ServiceDependsOnHeat(Service_ID spr_Services.ID%TYPE) RETURN BOOLEAN
- AS
- BEGIN
- RETURN Service_ID IN (
- 27, -- Отопление
- 44 -- Тепло по счетчику
- );
- END ServiceDependsOnHeat;
- PROCEDURE FillNoHeatDaysCountVariable(Hs_ID k_House.ID%TYPE)
- AS
- Indx BINARY_INTEGER;
- BEGIN
- FOR d IN (
- SELECT Month, SUM(DaysOff) NoHeatDaysTotalCount
- FROM n_NoHeatDaysCount
- WHERE CityStructure_ID IN
- (
- SELECT CityStructure_ID
- FROM spr_CityStructure
- START WITH ID IN
- (
- SELECT CityStructure_ID
- FROM k_House_CityStructure
- WHERE House_ID = Hs_ID
- )
- CONNECT BY PRIOR Parent_ID = ID
- )
- OR House_ID = Hs_ID
- GROUP BY Month
- ) LOOP
- Indx := CAST(TO_CHAR(d.Month, 'YYYYMM') AS INT);
- NoHeatDaysCounts(Indx).DaysInMonth := EXTRACT(DAY FROM LAST_DAY(d.Month));
- IF d.NoHeatDaysTotalCount <= NoHeatDaysCounts(Indx).DaysInMonth THEN
- NoHeatDaysCounts(Indx).NoHeatDays := d.NoHeatDaysTotalCount;
- ELSE
- NoHeatDaysCounts(Indx).NoHeatDays := NoHeatDaysCounts(Indx).DaysInMonth;
- END IF;
- END LOOP;
- END;
- FUNCTION GetHeatReductionFactor(Month DATE) RETURN NUMBER
- AS
- result NUMBER;
- Indx BINARY_INTEGER;
- BEGIN
- Indx := CAST(TO_CHAR(Month, 'YYYYMM') AS INT);
- IF NoHeatDaysCounts.EXISTS(Indx) THEN
- result := (NoHeatDaysCounts(Indx).DaysInMonth - NoHeatDaysCounts(Indx).NoHeatDays) / NoHeatDaysCounts(Indx).DaysInMonth;
- ELSE
- result := 1;
- END IF;
- RETURN result;
- END;
- PROCEDURE FillHeatedAreaDecreasePercent
- AS
- Indx BINARY_INTEGER;
- BEGIN
- FOR d IN (
- SELECT Month, Percent
- FROM n_HeatedAreaDecreasePercents
- WHERE Account_ID = AccID
- ) LOOP
- Indx := CAST(TO_CHAR(d.Month, 'YYYYMM') AS INT);
- HeatedAreaDecreasePercent(Indx) := d.Percent/100;
- END LOOP;
- END;
- FUNCTION GetHeatedAreaDecreasePercent(Month DATE) RETURN NUMBER
- AS
- result NUMBER;
- Indx BINARY_INTEGER;
- BEGIN
- Indx := CAST(TO_CHAR(Month, 'YYYYMM') AS INT);
- IF HeatedAreaDecreasePercent.EXISTS(Indx) THEN
- result := HeatedAreaDecreasePercent(Indx);
- ELSE
- result := 1;
- END IF;
- RETURN result;
- END;
- FUNCTION GetTemperatKoeff(Month DATE) RETURN NUMBER
- AS
- result NUMBER;
- BEGIN
- SELECT Koeff INTO result
- FROM spr_Temperat_Koeff
- WHERE Month = TRUNC(GetTemperatKoeff.Month, 'MM');
- RETURN result;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- RETURN 1;
- END;
- PROCEDURE LoadKoeffs(date_from DATE, date_to DATE)
- AS
- BEGIN
- SELECT Month, Service_ID, Koeff, Vid
- BULK COLLECT INTO Koeffs
- FROM n_Koeffs
- WHERE Account_ID = AccID
- AND Month BETWEEN date_from AND date_to
- AND Koeff IS NOT NULL;
- END;
- FUNCTION IndicationsPresentInMonth(ServiceNo INTEGER, Month DATE) RETURN BOOLEAN
- AS
- Indication_No INTEGER;
- BEGIN
- Indication_No := Indications.FIRST;
- WHILE Indication_No IS NOT NULL LOOP
- IF Indications(Indication_No).ServiceID = ServiceNo AND Indications(Indication_No).Month = Month THEN
- RETURN TRUE;
- END IF;
- Indication_No := Indications.NEXT(Indication_No);
- END LOOP;
- RETURN FALSE;
- END;
- FUNCTION GetKoeff(data DATE, Service_ID INTEGER, Vid INTEGER) RETURN NUMBER
- AS
- KoeffNo INTEGER;
- result NUMBER;
- BEGIN
- result := 1;
- KoeffNo := Koeffs.FIRST;
- WHILE KoeffNo IS NOT NULL LOOP
- IF Koeffs(KoeffNo).Month = TRUNC(data, 'MM') AND Koeffs(KoeffNo).Service_ID = Service_ID AND Koeffs(KoeffNo).Vid = Vid THEN
- result := result * Koeffs(KoeffNo).Koeff;
- END IF;
- KoeffNo := Koeffs.NEXT(KoeffNo);
- END LOOP;
- RETURN result;
- END;
- BEGIN
- print('Acc_ID = '||AccID||';');
- AccrualsDescription27('ID Л/С: '||AccID||';');
- -- Некоторые участки всегда расчитываются, остальные - по признаку в таблице.
- SELECT District_ID INTO tmp_numb FROM k_Accounts WHERE ID = lpad(trim(AccID), 12, '0');
- IF tmp_numb NOT IN (112001,112002,112003) THEN
- -- Возможность отключить перерасчет.
- SELECT NoNachisl INTO NoNachisl FROM System;
- IF NVL(NoNachisl,0) = 1 THEN
- RETURN;
- END IF;
- END IF;
- --raise_application_error(-20100, 'Nicht arbeiten!');
- LoggedUserID := LoggedUser();
- DataChangeRow := SYSDATE;
- SELECT FinMonth INTO FinMonth FROM System;
- print('FinMonth = '||FinMonth||';');
- AccrualsDescription27('Отчетный месяц: '||FinMonth||';');
- -- Заполнение процентов льгот.
- FOR p IN (SELECT Privil_ID*100000+Service_ID PrvlSrvNo, Percent/100 Percent FROM spr_PrivilPrc) LOOP
- PrvlSrvPrc(p.PrvlSrvNo) := p.Percent;
- END LOOP;
- -- Даты начала/конца перерасчета.
- Data_Beg_Nach := TRUNC(Data_Start, 'MM');
- Data_End_Nach := LAST_DAY(FinMonth);
- -- ИЗМЕНИТЬ ДАТУ НАЧАЛА ПЕРЕРАСЧЕТА: откатиться на более раннюю дату
- -- при наличии показаний счетчиков или
- -- если есть сверка с более ранней датой начала
- LOOP
- -- Минимальная дата по сверкам.
- SELECT MIN(DataBegRevis)
- INTO tmp_data
- FROM n_Accruals
- WHERE Account_ID = lpad(AccID, 12, '0')
- AND Data >= Data_Beg_Nach AND Data <= FinMonth
- AND Vid IN (3,4/*сверка по начислению/льготе*/);
- -- Минимальная дата по показаниям.
- SELECT MIN(TRUNC(i.Data_old+DECODE(i.Vid_old, 1,0, 1),'MM'))
- INTO tmp_data2
- FROM n_Indications i
- WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
- AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
- AND i.Vid IN (2/*ктр*/);
- -- Изменить дату.
- IF tmp_data < Data_Beg_Nach OR tmp_data2 < Data_Beg_Nach THEN
- IF tmp_data < Data_Beg_Nach THEN
- Data_Beg_Nach := tmp_data;
- END IF;
- IF tmp_data2 < Data_Beg_Nach THEN
- Data_Beg_Nach := tmp_data2;
- END IF;
- ELSE
- EXIT;
- END IF;
- END LOOP;
- print('Data_Beg_Nach = '||Data_Beg_Nach||'; Data_End_Nach = '||Data_End_Nach||';');
- AccrualsDescription27('Дата начала расчета = '||Data_Beg_Nach||'; дата окончания расчета = '||Data_End_Nach||';');
- -- Номер дома.
- SELECT k_Apart.House_ID
- INTO Hs_ID
- FROM k_Accounts, k_Apart
- WHERE k_Accounts.ID = lpad(AccID, 12, '0')
- AND k_Apart.ID = k_Accounts.Apart_ID;
- print('Hs_ID = '||Hs_ID||';');
- AccrualsDescription27('ID дома: '||Hs_ID||';');
- -- Норма для нулевой услуги.
- Norms(0).Norm := 1;
- Norms(0).Norm_Social := Norms(0).Norm;
- Norms(0).Period := 2;
- -- Посчитать общее количество дней без тепла по дому помесячно.
- FillNoHeatDaysCountVariable(Hs_ID);
- -- Взять возможные проценты уменьшения площади отопления.
- FillHeatedAreaDecreasePercent();
- -- Загрузить уменьшающие коэффициенты.
- LoadKoeffs(Data_Beg_Nach, Data_End_Nach);
- -------------------------------------------------------------------------------------------------------------
- -- /---\ /---\ | | /| /--\ /| | | | | /---\ /--\ | | |--\ /---\ | | | | | | /---\ |---\ --
- -- | | | | | / / | | / | | | | /| | | | | | | | | | | /| | / | | | | --
- -- | | | | |< | | -< | | |---| | / | \--> | \_| |-- | \_| | / | |< | | |--< --
- -- | | | | | \ |--| | |--| | | |/ | / | | | | | | |/ | | \ | | | | --
- -- | | \---/ | | | | \--/ | | | | | | / | \--/ | |--/ | | | | | | \---/ |---/ --
- -------------------------------------------------------------------------------------------------------------
- -- Данные по счетчикам.
- SELECT * BULK COLLECT INTO CAccount FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0') ORDER BY Counter_ID, Data ASC;
- -- Показания по дате внесения.
- FOR i IN (
- 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
- FROM n_Indications i, k_Counters k, spr_Counters s
- WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
- 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
- AND i.Vid IN (2/*ктр*/)
- AND k.ID = i.Counter_ID
- AND s.ID = k.Counter_ID
- )LOOP
- -- Определить процент и состояние счетчика на дату снятия показания.
- Prcnt := 0;
- FOR j IN REVERSE NVL(CAccount.FIRST,0)..NVL(CAccount.LAST,-1) LOOP
- IF CAccount(j).Counter_ID = i.Counter_ID THEN -- Отобрать нужный счетчик.
- IF CAccount(j).Data < i.Data THEN -- Дата ктр больше, чем текущая дата состояния...
- Prcnt := CAccount(j).Percent; -- ... значит для ктр действует это состояние счетчика (т.к. состояния отсортированы по возрастанию, а список просматривается от большего к меньшему).
- EXIT;
- ELSIF CAccount(j).Data = i.Data THEN -- Дата ктр совпадает с датой изменения счетчиков...
- IF CAccount.EXISTS(j-1) AND CAccount(j-1).Counter_ID = i.Counter_ID THEN -- ... и существует предыдущее (более раннее по дате) состояние счетчика...
- Prcnt := CAccount(j-1).Percent; -- ... значит для ктр действует предыдущее состояние счетчика.
- END IF;
- EXIT;
- END IF;
- END IF;
- END LOOP;
- -- Добавить показание в массив.
- IndicationNo := GetIndicationNo(i.Service, TRUNC(i.Data_ins,'MM'), i.Data_old, i.Data, i.Vid_old);
- Indications(IndicationNo).Volume := Indications(IndicationNo).Volume + i.Volume*(Prcnt/100);
- -- Продублировать гор.воду для водоотведения.
- IF i.Service = 35 THEN
- IndicationNo2 := GetIndicationNo(53, TRUNC(i.Data_ins,'MM'), i.Data_old, i.Data, i.Vid_old);
- Indications(IndicationNo2).Volume := Indications(IndicationNo).Volume;
- END IF;
- END LOOP;
- /*
- Indication_No := Indications.FIRST;
- WHILE Indication_No IS NOT NULL LOOP
- 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);
- Indication_No := Indications.NEXT(Indication_No);
- END LOOP;
- */
- ----------------------------------------------------------
- -- /---\ |--\ \ / |--\ /| /--\ | | |--\ /---\ --
- -- | | \ / | | / | | | | | | --
- -- | |-- | |--/ | | | \_| |-- | --
- -- | | / \ | |--| | | | | --
- -- | |--/ / \ * | | | \--/ | |--/ | --
- ----------------------------------------------------------
- Data_Prev := Data_Beg_Nach;
- -- РАСЧЕТ НАЧИСЛЕНИЙ - цикл по всем событиям в период начисления.
- FOR ist IN (
- SELECT *
- FROM
- (
- SELECT -- Изменения Л/С.
- 'L' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- Status_ID, Area_Obsch, Area_Polezn, Area_Gilay, Area_AddSan, Count_Inhabit, ShortFamily, Surplus, CGV,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM a_Accounts a
- WHERE Account_ID = lpad(AccID, 12, '0')
- 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
- UNION
- SELECT -- Отсутствующие.
- 'W' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM n_AccountWanting w
- WHERE Account_ID = lpad(AccID, 12, '0')
- 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
- UNION
- SELECT -- Изменения дома.
- 'H' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM a_House a
- WHERE House_ID = lpad(Hs_ID, 12, '0')
- 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
- UNION
- SELECT -- Изменения льгот Л/С.
- 'P' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- Privil_ID, Peopl_ID, Count_Prvl, State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM n_AccountPrivil p, spr_Privils sp
- WHERE Account_ID = lpad(AccID, 12, '0')
- AND p.Privil_ID = sp.ID
- 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
- UNION
- SELECT -- Изменения услуг.
- 'S' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- Service_ID, Formula, State_Srv, Params, Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM n_AccountService s, spr_Services
- WHERE s.Account_ID = lpad(AccID, 12, '0')
- 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
- AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
- AND spr_Services.ID = Service_ID
- UNION
- SELECT -- Временное отключение услуг дому.
- 'O' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- Service_ID Service_ID_O, State_Srv State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM n_HouseService o
- WHERE House_ID = lpad(Hs_ID, 12 , '0')
- 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
- UNION
- SELECT -- Изменения норм.
- 'N' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- SrvNorm_ID, Norm, Norm_Social, Norm_Slave_Persons, Period,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM spr_Norms m
- WHERE SrvNorm_ID IN
- (
- SELECT Norm_ID
- FROM n_AccountService s
- WHERE s.Account_ID = lpad(AccID, 12, '0')
- 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
- AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
- UNION
- SELECT ID
- FROM spr_SrvNorms
- WHERE Service_ID = 0
- )
- 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
- UNION
- SELECT -- Изменение общих тарифов.
- 'T' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- TrSchema, Service_ID Service_ID_T, NVL(SrvNorm_ID,0) SrvNorm_ID_T, Tarif, Dotacya,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM spr_Tarifs t
- WHERE TrSchema IN
- (
- SELECT DISTINCT Category
- FROM a_House a
- WHERE House_ID = Hs_ID
- 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
- )
- AND Service_ID IN
- (
- SELECT Service_ID
- FROM n_AccountService s
- WHERE s.Account_ID = lpad(AccID, 12, '0')
- 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
- AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
- )
- 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
- UNION
- SELECT -- Изменение тарифов на электричество.
- 'E' Vid, GREATEST(NVL(Data, TO_DATE('01.01.0001','DD.MM.YYYY')), Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- 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
- FROM spr_Tarifs_E
- WHERE SrvNorm_ID IN
- (
- SELECT s.Norm_ID
- FROM n_AccountService s
- WHERE s.Account_ID = lpad(AccID, 12, '0')
- AND Service_ID IN (10)
- 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
- AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
- )
- 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'))
- UNION
- SELECT -- Изменение домовых тарифов.
- 'J' Vid, GREATEST(Data, Data_Beg_Nach) Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- Service_ID Service_ID_J, NVL(SrvNorm_ID,0) SrvNorm_ID_J, Tarif TarifH, Dotacya DotacyaH,
- /*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
- FROM spr_TarifsH t
- WHERE House_ID = Hs_ID
- AND ( (Service_ID IN
- (
- SELECT Service_ID
- FROM n_AccountService s
- WHERE s.Account_ID = lpad(AccID, 12, '0')
- AND Service_ID NOT BETWEEN 101 AND 150
- 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
- AND (Data > Data_Beg_Nach OR s.State_Srv = 1) -- Отбросить закрытые на начало расчета услуги.
- )) OR (Service_ID BETWEEN 101 AND 150) )
- 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
- UNION
- SELECT
- 'K' Vid, data_sch Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM
- (
- SELECT i.Data_old+DECODE(i.Vid_old, 1,0, 1) data_sch
- FROM n_Indications i
- WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
- AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
- AND i.Vid IN (2/*ктр*/)
- UNION ALL
- SELECT i.Data+1 data_sch
- FROM n_Indications i
- WHERE i.Counter_ID IN (SELECT DISTINCT Counter_ID FROM c_Account WHERE Account_ID = lpad(AccID, 12, '0'))
- AND i.Data_ins BETWEEN Data_Beg_Nach AND Data_End_Nach
- AND i.Vid IN (2/*ктр*/)
- )
- UNION
- SELECT
- 'X' Vid, Data_End_Nach + 1 Data,
- /*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,
- /*W*/TO_NUMBER(NULL)Count_W,
- /*H*/TO_NUMBER(NULL)Category,
- /*P*/TO_NUMBER(NULL)Privil_ID, TO_CHAR(NULL)Peopl_ID, TO_NUMBER(NULL)Count_Prvl, TO_NUMBER(NULL)State_Prvl,
- /*S*/TO_NUMBER(NULL)Service_ID, TO_NUMBER(NULL)Formula, TO_NUMBER(NULL)State_Srv, TO_NUMBER(NULL)Params, TO_NUMBER(NULL)Norm_ID,
- /*O*/TO_NUMBER(NULL)Service_ID_O, TO_NUMBER(NULL)State_Srv_O,
- /*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,
- /*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,
- /*J*/TO_NUMBER(NULL)Service_ID_J, TO_NUMBER(NULL)SrvNorm_ID_J, TO_NUMBER(NULL)TarifH, TO_NUMBER(NULL)DotacyaH,
- /*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
- FROM DUAL
- )
- ORDER BY Data
- ) LOOP
- IF Data_Prev < ist.Data THEN
- WHILE Data_prev < ist.Data LOOP
- print('Data_prev = '||Data_prev||'; ist.Data = '||ist.Data||';');
- AccrualsDescription27('начало сегмента расчета = '||Data_prev||'; конец сегмента расчета = '||ist.Data||';');
- CurrMonthNach := TRUNC(Data_Prev, 'MM');
- DayInMonthNach := EXTRACT(DAY FROM LAST_DAY(Data_Prev));
- -- Расчет части месяца, за которую проводится начисление.
- IF TRUNC(Data_prev, 'MM') < TRUNC(ist.Data, 'MM') THEN
- Month_Part := (TO_CHAR(LAST_DAY(Data_prev) - Data_prev) + 1) / TO_CHAR(LAST_DAY(Data_prev),'DD');
- ELSE
- Month_Part := (TO_CHAR(ist.Data - Data_prev)) / TO_CHAR(LAST_DAY(Data_prev),'DD');
- END IF;
- print(' Month_Part = '||Month_Part||';');
- AccrualsDescription27(' часть месяца в сегменте расчета = '||Month_Part||';');
- -- Начисление по всем услугам за промежуток.
- ServiceNo := Services.FIRST;
- WHILE ServiceNo IS NOT NULL LOOP
- print(' ServiceNo = '||ServiceNo||';');
- AccrualsDescription27(' код услуги = '||ServiceNo||';');
- -- Тариф по услуге.
- Curr_Tarif := Tarif(ServiceNo, Services(ServiceNo).Norm_ID);
- print(' Curr_Tarif = '||Curr_Tarif||';');
- AccrualsDescription27(' тариф = '||Curr_Tarif||';');
- -- Для Тепла применить к тарифу Температурный коэффициент:
- IF ServiceNo = 27 THEN -- Тепло
- tmp_numb := GetTemperatKoeff(ist.Data-1);
- Curr_Tarif := Curr_Tarif * tmp_numb;
- print(' Curr_Tarif = [Curr_Tarif] * '||tmp_numb||'[TemperatKoeff] = '||Curr_Tarif||';');
- AccrualsDescription27(' тариф = [тариф] * '||tmp_numb||'[температурный коеффициент] = '||Curr_Tarif||';');
- END IF;
- -- Применить к тарифу понижающий коэффициент:
- tmp_numb3 := ServiceNo;
- IF tmp_numb3 BETWEEN 101 AND 126 THEN
- tmp_numb3 := 100;
- END IF;
- tmp_numb := GetKoeff(Data_prev, tmp_numb3, 1);
- IF tmp_numb < 1 THEN
- tmp_numb2 := Curr_Tarif;
- Curr_Tarif := tmp_numb2 * tmp_numb;
- print(' Curr_Tarif = '||tmp_numb2||'[Curr_Tarif] * '||tmp_numb||'[GetKoeff('||Data_prev||', '||tmp_numb3||', 1)] = '||Curr_Tarif);
- AccrualsDescription27(' тариф = '||tmp_numb2||'[тариф] * '||tmp_numb||'[коэффициент понижения тарифа] = '||Curr_Tarif);
- END IF;
- -- ВЫЧИСЛЕНИЕ ОБЪЕМА УСЛУГИ.
- IF Services(ServiceNo).Formula = 0 THEN -- Услуга не подходит под формулу.
- IF ServiceNo = 4 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- АГВ.
- NormNo := NVL(Services(ServiceNo).Norm_ID,0);
- Volume_Nach := Area_Polezn * Norms(NormNo).Norm * Month_Part;
- Volume_Social_Nach := Area_Polezn * Norms(NormNo).Norm_Social * Month_Part;
- IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
- Volume_Nach := Volume_Nach * DayInMonthNach;
- Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
- END IF;
- Summ_Nach := Volume_Nach * Curr_Tarif;
- Area_Izl := Area_Polezn - (Count_Inhabit*Norms(1).Norm/*Норма площади на человека*/ + Area_AddSan + Norms(2).Norm/*Норма площади на семью*/);
- IF Area_Izl > 0 AND Surplus = 'Y' THEN -- Есть излишки по площади и они учитываются.
- IF Area_Polezn <> 0 THEN
- tmp_numb := Summ_Nach*(Area_Izl/Area_Polezn);
- ELSE
- tmp_numb := 0;
- END IF;
- Summ_Nach := Summ_Nach - tmp_numb + tmp_numb * Norms(21).Norm;
- END IF;
- ELSIF ServiceNo = 41 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- ГАЗОВАЯ ПЛИТА.
- IF Cgv = 'Y' /*AND Services.EXISTS(6) AND NVL(Services(6).State_Srv,1) = 1*/ THEN -- Есть неотключенное ЦГВ.
- NormNo := 31;
- ELSE -- ЦГВ нет или отключено.
- NormNo := 32;
- END IF;
- Volume_Nach := Count_Inhabit * Norms(NormNo).Norm * Month_Part;
- Volume_Social_Nach := Count_Inhabit * Norms(NormNo).Norm_Social * Month_Part;
- Summ_Nach := Volume_Nach * Curr_Tarif;
- ELSIF ServiceNo = 5 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN -- ХОЛОДНАЯ ВОДА И КАНАЛИЗАЦИЯ.
- NormNo := NVL(Services(ServiceNo).Norm_ID,0);
- Volume_Nach := GREATEST((Count_Inhabit - Count_Wanting),1) * Norms(NormNo).Norm * Month_Part;
- Volume_Social_Nach := GREATEST((Count_Inhabit - Count_Wanting),1) * Norms(NormNo).Norm_Social * Month_Part;
- IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
- Volume_Nach := Volume_Nach * DayInMonthNach;
- Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
- END IF;
- Summ_Nach := Volume_Nach * Curr_Tarif;
- ELSE -- Неизвестная услуга.
- Volume_Nach := 0;
- Volume_Social_Nach := 0;
- Summ_Nach := 0;
- END IF;
- ELSE -- Услуга подходит под одну из формул.
- IF Services(ServiceNo).Formula = 10 THEN -- Количество - единица.
- Volume_Nach := 1;
- print(' Volume_Nach = '||Volume_Nach||'[const];');
- ELSIF Services(ServiceNo).Formula = 11 THEN -- Количество - индивидуальное значение.
- Volume_Nach := TO_NUMBER(Services(ServiceNo).Params);
- print(' Volume_Nach = '||Volume_Nach||'[Services(ServiceNo).Params];');
- ELSIF Services(ServiceNo).Formula = 20 THEN -- Люди - проживающие.
- Volume_Nach := Count_Inhabit;
- print(' Volume_Nach = '||Volume_Nach||'[Count_Inhabit];');
- ELSIF Services(ServiceNo).Formula = 21 THEN -- Люди - проживающие минус отсутствующие.
- Volume_Nach := GREATEST(Count_Inhabit - Count_Wanting,1);
- print(' Volume_Nach = '||Volume_Nach||'[MAX(Count_Inhabit - Count_Wanting,1)];');
- ELSIF Services(ServiceNo).Formula = 30 THEN -- Площадь - обшая.
- Volume_Nach := Area_Obsch;
- print(' Volume_Nach = '||Volume_Nach||'[Area_Obsch];');
- ELSIF Services(ServiceNo).Formula = 31 THEN -- Площадь - полезная.
- Volume_Nach := Area_Polezn;
- print(' Volume_Nach = '||Volume_Nach||'[Area_Polezn];');
- AccrualsDescription27(' объем услуги = '||Volume_Nach||'[отапливаемая площадь];');
- ELSIF Services(ServiceNo).Formula = 32 THEN -- Площадь - жилая.
- Volume_Nach := Area_Gilay;
- print(' Volume_Nach = '||Volume_Nach||'[Area_Gilay];');
- END IF;
- -- Если услуга зависит от тепла, то учесть его возможное отключение и возможный коэффициент уменьшения отопительной площади:
- IF ServiceDependsOnHeat(ServiceNo) THEN
- tmp_numb2 := GetHeatReductionFactor(Data_prev);
- tmp_numb3 := GetHeatedAreaDecreasePercent(Data_prev);
- Volume_Nach := Volume_Nach * tmp_numb2 * tmp_numb3;
- print(' Volume_Nach = [Volume_Nach] * '||tmp_numb2||'[HeatReductionFactor] * '||tmp_numb3||'[HeatedAreaDecreasePercent] = '||Volume_Nach||';');
- AccrualsDescription27(' объем услуги = [объем услуги] * '||tmp_numb2||'[часть месяца подачи тепла] * '||tmp_numb3||'[коэффициент уменьшения отапливаемой площади] = '||Volume_Nach||';');
- END IF;
- -- Применить норму к вычисленному объему услуги.
- NormNo := NVL(Services(ServiceNo).Norm_ID,0);
- BEGIN
- IF ServiceNo = 10 THEN -- Электричество: первому человеку одна норма, всем последующим - друая, но не больше социаьнгой норммы.
- 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;
- IF Volume_Social_Nach > Norms(NormNo).Norm_Social * Month_Part THEN
- Volume_Social_Nach := Norms(NormNo).Norm_Social * Month_Part;
- END IF;
- ELSIF ServiceNo = 27 THEN -- Тепло - не применять соц. норму по техрасчету.
- Volume_Social_Nach := Volume_Nach * Month_Part;
- print(' Volume_Social_Nach = '||Volume_Nach||'[Volume_Nach] * '||Month_Part||'[Month_Part] = '||Volume_Social_Nach||';');
- AccrualsDescription27(' социальный объем = '||Volume_Nach||'[объем услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||Volume_Social_Nach||';');
- ELSE
- Volume_Social_Nach := Volume_Nach * Norms(NormNo).Norm_Social * Month_Part;
- print(' Volume_Social_Nach = '||Volume_Nach||'[Volume_Nach] * '||Norms(NormNo).Norm_Social||'[Norm_Social] * '||Month_Part||'[Month_Part] = '||Volume_Social_Nach||';');
- END IF;
- Volume_Nach := Volume_Nach * Norms(NormNo).Norm * Month_Part;
- print(' Volume_Nach = [Volume_Nach] * '||Norms(NormNo).Norm||'[Norm] * '||Month_Part||'[Month_Part] = '||Volume_Nach);
- AccrualsDescription27(' объем услуги = [объем услуги] * '||Norms(NormNo).Norm||'[норма услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||Volume_Nach);
- IF Norms(NormNo).Period = 1 THEN -- Норма в сутки, а не в месяц.
- Volume_Nach := Volume_Nach * DayInMonthNach;
- Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
- END IF;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- Volume_Nach := 0;
- Volume_Social_Nach := 0;
- END;
- -- Расчет суммы.
- IF ServiceNo = 10 THEN -- "Электроэнергия по счетчику".
- Summ_Nach := CalcSummByTarifsE(ist.Data-1, NormNo, Volume_Nach, Month_Part);
- IF Volume_Nach <> 0 THEN
- Curr_Tarif := Summ_Nach / Volume_Nach;
- ELSE
- Curr_Tarif := 0;
- END IF;
- ELSIF ServiceNo = 17 THEN -- "Подсобка".
- -- Для Подсобки тариф равен 50% от СДПТ в случае, если домовой тариф на подсобку <> 0 (Тоня, 18.10.2010).
- Curr_Tarif := Tarif(ServiceNo, Services(ServiceNo).Norm_ID, TRUE);
- IF Curr_Tarif = 0 THEN
- Curr_Tarif := NULL;
- -- Тариф на СДПТ.
- FOR i IN 101..150 LOOP
- IF Services.EXISTS(i) AND NVL(Services(i).State_Srv,1) = 1 THEN
- Curr_Tarif := NVL(Curr_Tarif,0) + Tarif(i, Services(ServiceNo).Norm_ID) - Tarif(i, Services(ServiceNo).Norm_ID)*Dotacya(i, Services(ServiceNo).Norm_ID);
- END IF;
- END LOOP;
- -- Если нет СДПТ - то ВЭР.
- IF Curr_Tarif IS NULL AND (Services.EXISTS(11) AND NVL(Services(11).State_Srv,1) = 1) THEN
- Curr_Tarif := Tarif(11, Services(ServiceNo).Norm_ID);
- END IF;
- -- Если и ВЭРа нет - то Квартплата.
- IF Curr_Tarif IS NULL AND (Services.EXISTS(1) AND NVL(Services(1).State_Srv,1) = 1) THEN
- Curr_Tarif := Tarif(1, Services(ServiceNo).Norm_ID);
- END IF;
- -- Если ничего нет - взять половину домового тарифа СДПТ.
- IF Curr_Tarif IS NULL THEN
- FOR i IN 101..150 LOOP
- 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);
- END LOOP;
- END IF;
- Curr_Tarif := Curr_Tarif * 0.5;
- END IF;
- Summ_Nach := Volume_Nach * Curr_Tarif;
- ELSE
- Summ_Nach := Volume_Nach * Curr_Tarif;
- print(' Summ_Nach = '||Volume_Nach||'[Volume_Nach] * '||Curr_Tarif||'[Curr_Tarif] = '||Summ_Nach);
- AccrualsDescription27(' сумма начисления = '||Volume_Nach||'[объем услуги] * '||Curr_Tarif||'[тариф] = '||Summ_Nach);
- END IF;
- END IF; -- Выбор формулы вычисления для услуги.
- -- Применить к сумме понижающий стоимость коэффициент:
- tmp_numb3 := ServiceNo;
- IF tmp_numb3 BETWEEN 101 AND 126 THEN
- tmp_numb3 := 100;
- END IF;
- tmp_numb := GetKoeff(Data_prev, tmp_numb3, 2);
- IF tmp_numb < 1 THEN
- tmp_numb2 := Summ_Nach;
- Summ_Nach := tmp_numb2 * tmp_numb;
- print(' Summ_Nach = '||tmp_numb2||'[Summ_Nach] * '||tmp_numb||'[GetKoeff('||Data_prev||', '||tmp_numb3||', 2)] = '||Summ_Nach);
- AccrualsDescription27(' сумма начисления = '||tmp_numb2||'[сумма начисления] * '||tmp_numb||'[коэффициент понижения стоимости] = '||Summ_Nach);
- END IF;
- -- ДОТАЦИЯ.
- tmp_numb := Dotacya(ServiceNo, Services(ServiceNo).Norm_ID)/100;
- Dotac := Summ_Nach * tmp_numb;
- print(' Dotac = '||Summ_Nach||'[Summ_Nach] * '||tmp_numb||'[Dotacya(ServiceNo,Norm_ID)/100] = '||Dotac);
- -- ПОКАЗАНИЯ СЧЕТЧИКОВ.
- MonthNach_Sch := NULL;
- Volume_Nach_Sch := 0;
- Summ_Nach_Sch := 0;
- LastDayInCurrDiapason := LAST_DAY(data_prev) + 1;
- IF LastDayInCurrDiapason > ist.Data THEN
- LastDayInCurrDiapason := ist.Data;
- END IF;
- IF ServiceIsCounter(ServiceNo) THEN -- Счетчик.
- Indication_No := Indications.FIRST;
- WHILE Indication_No IS NOT NULL LOOP
- IF Indications(Indication_No).ServiceID = ServiceNo AND
- LastDayInCurrDiapason >= Indications(Indication_No).Data_prev AND
- data_prev < Indications(Indication_No).Data_curr
- THEN
- -- Кол-во дней в показаниях.
- Indication_KolDay := Indications(Indication_No).Data_curr - Indications(Indication_No).Data_prev;
- -- Кол-во дней показаний, выходящих за границу текущего "окна" начислений.
- Indication_KolDayOut := 0;
- IF data_prev > Indications(Indication_No).Data_prev THEN
- Indication_KolDayOut := Indication_KolDayOut + (data_prev - Indications(Indication_No).Data_prev);
- END IF;
- IF LastDayInCurrDiapason < Indications(Indication_No).Data_curr THEN
- Indication_KolDayOut := Indication_KolDayOut + (Indications(Indication_No).Data_curr - LastDayInCurrDiapason);
- END IF;
- -- Часть объема счетчика, приходящаяся на текущее "окно" начисления.
- IF Indication_KolDay <> 0 THEN
- Indication_part := (Indication_KolDay - Indication_KolDayOut)/Indication_KolDay;
- ELSE
- Indication_part := 0;
- END IF;
- -- Месяц, в который запишутся показания (может не совпадать с текущим или отчетным!).
- MonthNach_Sch := Indications(Indication_No).Month;
- -- Объем.
- Volume_Nach_Sch := Indications(Indication_No).Volume * Indication_part;
- IF ServiceNo = 10 THEN -- Электричество.
- Summ_Nach_Sch := CalcSummByTarifsE(LastDayInCurrDiapason-1, NormNo, Volume_Nach_Sch, Month_Part);
- ELSE
- Summ_Nach_Sch := Volume_Nach_Sch * Curr_Tarif;
- END IF;
- -- Добавить вычисленные значения в список.
- AccrualNo := GetAccrualNo(TRUE, MonthNach_Sch, 1, ServiceNo, NULL, NULL);
- Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach_Sch;
- Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach_Sch;
- Accruals(AccrualNo).Tarif := Curr_Tarif;
- -- Прекратить перебор показаний, т.к. в один период по одной услуге могут быть только одни показания.
- EXIT;
- END IF;
- Indication_No := Indications.NEXT(Indication_No);
- END LOOP;
- END IF;
- -- Если Л/С открыт и услуга действительна.
- IF AccountState = 1 AND NVL(Services(ServiceNo).State_Srv,1) = 1 THEN
- -- Добавить вычисленные значения в список.
- IF NOT ServiceIsCounter(ServiceNo) THEN -- Техрасчет.
- AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 1, ServiceNo, NULL, NULL);
- Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach;
- Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach;
- Accruals(AccrualNo).Dotacya := Accruals(AccrualNo).Dotacya + Dotac;
- Accruals(AccrualNo).Tarif := Curr_Tarif;
- ELSE -- Счетчик.
- -- Добавить нулевые значения для открытой услуги без показаний, чтобы выгружалось в ГЕРЦ.
- AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 1, ServiceNo, NULL, NULL);
- -- При отсутствии показаний счетчика в месяце - начислять по техрасчету (08.02.2018)
- IF NOT IndicationsPresentInMonth(ServiceNo, CurrMonthNach) THEN
- Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Nach;
- Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Nach;
- Accruals(AccrualNo).Tarif := Curr_Tarif;
- END IF;
- END IF;
- -- ЛЬГОТЫ.
- -- Отсортировать льготы по % для текущей услуги.
- SortedPrivils.DELETE;
- PrivilNo := Privils.FIRST;
- WHILE PrivilNo IS NOT NULL LOOP
- PrvlSrvPrcNo := Privils(PrivilNo).Privil_ID * 100000 + ServiceNo;
- IF PrvlSrvPrc.EXISTS(PrvlSrvPrcNo) AND PrvlSrvPrc(PrvlSrvPrcNo) > 0 THEN
- SortedPrivils(NVL(SortedPrivils.COUNT,0)+1) := Privils(PrivilNo);
- FOR i IN REVERSE 2..SortedPrivils.COUNT LOOP
- IF (PrvlSrvPrc(SortedPrivils(i).Privil_ID*100000+ServiceNo) > PrvlSrvPrc(SortedPrivils(i-1).Privil_ID*100000+ServiceNo)) OR
- (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
- (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)
- THEN
- tmpPrivil := SortedPrivils(i-1);
- SortedPrivils(i-1) := SortedPrivils(i);
- SortedPrivils(i) := tmpPrivil;
- ELSE
- EXIT;
- END IF;
- END LOOP;
- END IF;
- PrivilNo := Privils.NEXT(PrivilNo);
- END LOOP;
- Volume_Prvl := 0;
- LInhabitRest := Count_Inhabit;
- LVolumeRest := Volume_Social_Nach;
- LVolumeRest_Sch := Volume_Social_Nach; --Volume_Nach_Sch;
- AddSanCharged := 1;
- print(' Volume_Prvl = '||Volume_Prvl||'[const]; LInhabitRest = '||LInhabitRest||'[Count_Inhabit]; LVolumeRest = '||LVolumeRest||'[Volume_Social_Nach];');
- AccrualsDescription27(' объем по льготе = '||Volume_Prvl||'[const]; количество проживающих, для которых доступна льгота = '||LInhabitRest||'[количество проживающих]; объем, доступный для льготной компенсации = '||LVolumeRest||'[начисленный социальный объем];');
- -- Перебрать уже отсортированные льготы.
- PrivilNo := SortedPrivils.FIRST;
- WHILE PrivilNo IS NOT NULL LOOP -- Цикл по всем льготам абонента.
- print(' PrivilNo = '||PrivilNo||';');
- AccrualsDescription27(' Номер льготы = '||PrivilNo||';');
- PrvlSrvPrcNo := SortedPrivils(PrivilNo).Privil_ID * 100000 + ServiceNo;
- -- Ограничить количество льготников при необходимости.
- IF SortedPrivils(PrivilNo).Count_Prvl > LInhabitRest THEN
- LInhabit := LInhabitRest;
- LInhabitRest := 0;
- ELSE
- LInhabit := SortedPrivils(PrivilNo).Count_Prvl;
- LInhabitRest := LInhabitRest - LInhabit;
- END IF;
- print(' LInhabit = '||LInhabit||'; LInhabitRest = '||LInhabitRest||';');
- AccrualsDescription27(' количество льготников = '||LInhabit||'; остаток проживающих = '||LInhabitRest||';');
- -- Вычисление льготного объема услуги.
- IF ServiceIsCounter(ServiceNo) THEN
- -- 23.05.2012 Для счетчиков не начислять льгот больше нормы.
- --tmp_numb := Volume_Nach; -- Volume_Nach_Sch;
- -- tmp_numb := Volume_Nach_Sch;
- IF Volume_Nach > Volume_Nach_Sch THEN
- tmp_numb := Volume_Nach_Sch;
- print(' Volume_Prvl100 = [Volume_Nach_Sch] = '||tmp_numb||';');
- ELSE
- tmp_numb := Volume_Nach;
- print(' Volume_Prvl100 = [Volume_Nach] = '||tmp_numb||';');
- END IF;
- ELSE
- tmp_numb := Volume_Nach;
- print(' Volume_Prvl100 = [Volume_Nach] = '||tmp_numb||';');
- END IF;
- IF ServiceNo = 10 THEN -- Электричество: первому человеку одна норма, всем последующим - друая, но не больше социаьнгой норммы.
- tmp_numb :=
- (
- CASE WHEN PrivilNo = 1 THEN Norms(NormNo).Norm ELSE Norms(NormNo).Norm_Slave_Persons END +
- CASE WHEN LInhabit > 1 THEN (LInhabit-1)*Norms(NormNo).Norm_Slave_Persons ELSE 0 END
- ) * Month_Part;
- IF Volume_Social_Nach > Norms(NormNo).Norm_Social * Month_Part THEN
- Volume_Social_Nach := Norms(NormNo).Norm_Social * Month_Part;
- END IF;
- ELSIF Services(ServiceNo).Formula IN (20,21) OR ServiceNo IN (41,5,28,53) THEN -- Льгота зависит от льготников или это плита либо вода.
- tmp_numb := tmp_numb / GREATEST((Count_Inhabit - Count_Wanting),1) * LInhabit;
- print(' Volume_Prvl100 = [Volume_Prvl100]/MAX(('||Count_Inhabit||'[Count_Inhabit] - '||Count_Wanting||'[Count_Wanting]),1) * '||LInhabit||'[LInhabit] = '||tmp_numb||';');
- tmp_numb2 := Volume_Social_Nach / GREATEST((Count_Inhabit - Count_Wanting),1) * LInhabit; -- Социальный объем с точностью до количества льготников
- IF tmp_numb > tmp_numb2 THEN
- 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||';');
- print(' Volume_Prvl100 = '||tmp_numb2||'[Volume_Social_Nach_by_Privil] (поскольку '||tmp_numb||'[Volume_Prvl100] > '||tmp_numb2||'[Volume_Social_Nach_by_Privil]);');
- tmp_numb := tmp_numb2;
- END IF;
- ELSIF Services(ServiceNo).Formula IN (30,31,32) OR ServiceNo IN (4) THEN -- Льгота зависит от сан.нормы площади или это АГВ.
- --tmp_numb := (LInhabit*Norms(1).Norm_Social/*Норма площади на человека*/ + AddSanCharged*/*Учесть только для одной льготы*/(Area_AddSan + Norms(2).Norm_Social/*Норма площади на семью*/)) * Norms(NormNo).Norm_Social * Month_Part;
- tmp_numb := (LInhabit*Norms(1).Norm_Social/*Норма площади на человека*/ + AddSanCharged*/*Учесть только для одной льготы*/(Area_AddSan + Norms(2).Norm_Social/*Норма площади на семью*/));
- 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||';');
- AccrualsDescription27(' объем по льготе = ('||LInhabit||'[количество льготников] * '||Norms(1).Norm_Social||'[социальная норма] + '||AddSanCharged||'[только на одну льготу] * ('||Area_AddSan||'[доп.сан.площадь] + '||Norms(2).Norm_Social||'[социальная норма])) = '||tmp_numb||';');
- IF ServiceNo = 27 THEN
- tmp_numb := LEAST(tmp_numb, Area_Obsch);
- print(' Volume_Prvl100 = MIN([Volume_Prvl100], '||Area_Obsch||'[Area_Obsch]) = '||tmp_numb||';');
- AccrualsDescription27(' объем по льготе = MIN([объем по льготе], '||Area_Obsch||'[общая площадь]) = '||tmp_numb||';');
- tmp_numb := tmp_numb * Norms(NormNo).Norm * Month_Part; --LEAST(Norms(NormNo).Norm, Norms(NormNo).Norm_Social) * Month_Part;
- print(' Volume_Prvl100 = [Volume_Prvl100] * '||Norms(NormNo).Norm||'[Norms(NormNo).Norm] * '||Month_Part||'[Month_Part] = '||tmp_numb||';');
- AccrualsDescription27(' объем по льготе = [объем по льготе] * '||Norms(NormNo).Norm||'[норма услуги] * '||Month_Part||'[часть месяца в сегменте расчета] = '||tmp_numb||';');
- tmp_numb2 := GetHeatReductionFactor(Data_prev);
- tmp_numb := tmp_numb * tmp_numb2;
- print(' Volume_Prvl100 = [Volume_Prvl100] * '||tmp_numb2||'[HeatReductionFactor] = '||tmp_numb||';');
- AccrualsDescription27(' объем по льготе = [объем по льготе] * '||tmp_numb2||'[часть месяца подачи тепла] = '||tmp_numb||';');
- ELSE
- tmp_numb := tmp_numb * Norms(NormNo).Norm_Social * Month_Part;
- print(' Volume_Prvl100 = [Volume_Prvl100] * '||Norms(NormNo).Norm_Social||'[Norms(NormNo).Norm_Social] * '||Month_Part||'[Month_Part] = '||tmp_numb||';');
- END IF;
- AddSanCharged := 0;
- END IF;
- -- Ограничить льготный объем при необходимости.
- IF ServiceIsCounter(ServiceNo) THEN
- IF tmp_numb > LVolumeRest_Sch THEN
- tmp_numb := LVolumeRest_Sch;
- LVolumeRest_Sch := 0;
- ELSE
- LVolumeRest_Sch := LVolumeRest_Sch - tmp_numb;
- END IF;
- print(' LVolumeRest_Sch = '||LVolumeRest_Sch||';');
- ELSE
- IF tmp_numb > LVolumeRest THEN
- tmp_numb := LVolumeRest;
- print(' Volume_Prvl100 = '||LVolumeRest||'[LVolumeRest] (поскольку [Volume_Prvl100] > [LVolumeRest]);');
- LVolumeRest := 0;
- ELSE
- LVolumeRest := LVolumeRest - tmp_numb;
- END IF;
- print(' LVolumeRest = '||LVolumeRest||';');
- END IF;
- AccrualsDescription27(' объем, доступный для льготной компенсации = '||LVolumeRest||';');
- Volume_Prvl100 := tmp_numb; -- Льготный объем без процента льготы.
- tmp_numb2 := PrvlSrvPrc(PrvlSrvPrcNo);
- Volume_Prvl := tmp_numb * tmp_numb2;
- print(' Volume_Prvl = '||tmp_numb||'[Volume_Prvl100] * '||tmp_numb2||'[PrvlSrvPrc] = '||Volume_Prvl||';');
- AccrualsDescription27(' объем по льготе с учетом % = '||tmp_numb||'[объем по льготе] * '||tmp_numb2||'[процент льготы] = '||Volume_Prvl||';');
- IF ServiceNo = 10 THEN -- Электричество.
- Summ_Prvl := CalcSummByTarifsE(ist.Data-1, NormNo, Volume_Prvl, Month_Part);
- ELSE
- tmp_numb2 := Dotacya(ServiceNo, Services(ServiceNo).Norm_ID);
- Summ_Prvl := Volume_Prvl * Curr_Tarif * (1 - tmp_numb2/100);
- print(' Summ_Prvl = '||Volume_Prvl||'[Volume_Prvl] * '||Curr_Tarif||'[Curr_Tarif] * (1 - '||tmp_numb2||'[Dotacya]/100) = '||Summ_Prvl||';');
- AccrualsDescription27(' сумма льготной компенсации = '||Volume_Prvl||'[объем по льготе с учетом %] * '||Curr_Tarif||'[тариф] * (1 - '||tmp_numb2||'[дотация])/100 = '||Summ_Prvl||';');
- END IF;
- -- Добавить вычисленную льготу в список.
- IF ServiceIsCounter(ServiceNo) THEN
- AccrualNo := GetAccrualNo(TRUE, MonthNach_Sch, 2, ServiceNo, SortedPrivils(PrivilNo).Privil_ID, SortedPrivils(PrivilNo).Peopl_ID);
- ELSE
- AccrualNo := GetAccrualNo(TRUE, CurrMonthNach, 2, ServiceNo, SortedPrivils(PrivilNo).Privil_ID, SortedPrivils(PrivilNo).Peopl_ID);
- END IF;
- Accruals(AccrualNo).Volume := Accruals(AccrualNo).Volume + Volume_Prvl;
- Accruals(AccrualNo).Volume100 := Accruals(AccrualNo).Volume100 + Volume_Prvl100;
- Accruals(AccrualNo).Summ := Accruals(AccrualNo).Summ + Summ_Prvl;
- Accruals(AccrualNo).Tarif := Curr_Tarif;
- PrivilNo := SortedPrivils.NEXT(PrivilNo);
- END LOOP; -- Цикл по всем льготам абонента.
- END IF; -- Л/С открыт и услуга действительна.
- ServiceNo := Services.NEXT(ServiceNo);
- END LOOP; -- Цикл по всем услугам.
- -- Перейти к следующей дате.
- IF TRUNC(Data_prev, 'MM') < TRUNC(ist.Data, 'MM') THEN
- Data_prev := LAST_DAY(Data_prev) + 1;
- ELSE
- Data_Prev := ist.Data;
- END IF;
- END LOOP; -- Помесячный цикл в промежутке между двумя датами.
- END IF; -- Если текущая дата больше предыдущей.
- /* 04.11.2011 Вроде как лишняя строчка?
- Data_Prev := ist.Data;
- */
- -- ИЗМЕНЕНИЕ ПАРАМЕТРОВ, ВЛИЯЮЩИХ НА НАЧИСЛЕНИЕ.
- IF ist.Vid = 'L' THEN -- Изменение Л/С.
- AccountState := NVL(ist.Status_ID,0);
- Area_Obsch := NVL(ist.Area_Obsch ,0);
- Area_Polezn := NVL(ist.Area_Polezn,0);
- Area_Gilay := NVL(ist.Area_Gilay,0);
- Area_AddSan := NVL(ist.Area_AddSan,0);
- Count_Inhabit := GREATEST(NVL(ist.Count_Inhabit,0),1);
- ShortFamily := NVL(ist.ShortFamily,'N');
- Surplus := NVL(ist.Surplus,'N');
- Cgv := NVL(ist.Cgv,'N');
- ELSIF ist.Vid = 'W' THEN -- Отсутствующие.
- Count_Wanting := NVL(ist.Count_W,0);
- ELSIF ist.Vid = 'H' THEN -- Изменения дома.
- Category := NVL(ist.Category, 0);
- ELSIF ist.Vid = 'P' THEN -- Изменение льгот Л/С.
- IF ist.State_Prvl = 1 THEN -- Активная льгота.
- PrivilNo := GetPrivilNo(TRUE, ist.Privil_ID, ist.Peopl_ID);
- Privils(PrivilNo).Count_Prvl := ist.Count_Prvl;
- ELSE -- Закрытая льгота.
- PrivilNo := GetPrivilNo(FALSE, ist.Privil_ID, ist.Peopl_ID);
- IF PrivilNo IS NOT NULL THEN
- Privils.DELETE(PrivilNo);
- END IF;
- END IF;
- ELSIF ist.Vid = 'S' THEN -- Изменение услуг у Л/С.
- IF ist.State_Srv = 1 THEN -- Открытие услуги.
- Services(ist.Service_ID).Formula := ist.Formula;
- Services(ist.Service_ID).Params := NVL(ist.Params,0);
- Services(ist.Service_ID).Norm_ID := ist.Norm_ID;
- ELSE -- Закрытие услуги.
- Services.DELETE(ist.Service_ID);
- END IF;
- ELSIF ist.Vid = 'O' THEN -- Временное закрытие услуги у дома.
- IF Services.EXISTS(ist.Service_ID_O) THEN
- Services(ist.Service_ID_O).State_Srv := ist.State_Srv_O;
- END IF;
- ELSIF ist.Vid = 'N' THEN -- Изменение значений норм.
- Norms(ist.SrvNorm_ID).Norm := ist.Norm;
- Norms(ist.SrvNorm_ID).Norm_Social := ist.Norm_Social;
- Norms(ist.SrvNorm_ID).Norm_Slave_Persons := ist.Norm_Slave_Persons;
- Norms(ist.SrvNorm_ID).Period := ist.Period;
- ELSIF ist.Vid = 'T' THEN -- Изменение значений общих тарифов.
- Tarifs(ist.Service_ID_T*1000000 + ist.SrvNorm_ID_T*100 + ist.TrSchema).Tarif := NVL(ist.Tarif,0);
- Tarifs(ist.Service_ID_T*1000000 + ist.SrvNorm_ID_T*100 + ist.TrSchema).Dotacya := NVL(ist.Dotacya,0);
- ELSIF ist.Vid = 'E' THEN -- Изменение тарифов на электричество.
- tmp_numb := NVL(TarifsE.LAST,0) + 1;
- TarifsE(tmp_numb).SrvNorm_ID := ist.SrvNorm_ID_E;
- TarifsE(tmp_numb).Data := ist.Data;
- TarifsE(tmp_numb).Data_End := ist.Data_End;
- TarifsE(tmp_numb).Volume_Min := ist.Volume_Min;
- TarifsE(tmp_numb).Volume_Max := ist.Volume_Max;
- TarifsE(tmp_numb).Tarif := ist.Tarif_E;
- ELSIF ist.Vid = 'J' THEN -- Изменение значений домовых тарифов.
- TarifsH(ist.Service_ID_J*1000000 + ist.SrvNorm_ID_J*100).Tarif := NVL(ist.TarifH,0);
- TarifsH(ist.Service_ID_J*1000000 + ist.SrvNorm_ID_J*100).Dotacya := NVL(ist.DotacyaH,0);
- END IF; -- Изменение параметров начисления.
- END LOOP; -- Конец цикла по всем событиям в период начисления.
- --------------------------------------------------------------------------------------
- -- /--\ | / |--\ | | |--\ /| |--\ | | | | |--\ /--\ /--| |---| /---\ --
- -- | | | / | | | | | / | | | | | | | | | | | | | --
- -- | | |< |--/ \--| | | | |-- |--| | /| |-- | | | | | | --
- -- | | | \ | | | | | | | | |/ | | | /----\ | | | --
- -- \--/ | \ | \--/ | | | |--/ | | | | |--/ 9 \--/ | | | | | --
- --------------------------------------------------------------------------------------
- AccrualNo := Accruals.FIRST;
- WHILE AccrualNo IS NOT NULL LOOP
- IF Accruals(AccrualNo).Service_ID BETWEEN 101 AND 150 THEN -- ИД услуги между 101 и 150 (составляющие СДПТ).
- Accruals(AccrualNo).Summ := TRUNC(Accruals(AccrualNo).Summ, 4);
- Accruals(AccrualNo).Dotacya := TRUNC(Accruals(AccrualNo).Dotacya,4);
- -- Составляющие СДПТ.
- AccrualNo2 := GetAccrualNo(TRUE, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, 100, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID);
- IF Accruals(AccrualNo).Volume <> 0 AND Accruals(AccrualNo2).Volume = 0 THEN -- Объем по 100 услуге равен объемы первой встреченной составляющей.
- Accruals(AccrualNo2).Volume := Accruals(AccrualNo).Volume;
- Accruals(AccrualNo2).Volume100 := Accruals(AccrualNo).Volume100;
- END IF;
- Accruals(AccrualNo2).Summ := Accruals(AccrualNo2).Summ + Accruals(AccrualNo).Summ;
- Accruals(AccrualNo2).Dotacya := Accruals(AccrualNo2).Dotacya + Accruals(AccrualNo).Dotacya;
- ELSIF Accruals(AccrualNo).Service_ID = 100 THEN -- СДПТ не трогать, т.к. это сумма уже усеченных составляющих.
- NULL;
- ELSIF Accruals(AccrualNo).Service_ID = 14 THEN -- Лифт также, как и СДПТ, усекать до 4-х знаков, а не округлять.
- Accruals(AccrualNo).Summ := TRUNC(Accruals(AccrualNo).Summ, 4);
- ELSE
- Accruals(AccrualNo).Summ := ROUND(Accruals(AccrualNo).Summ, 2);
- END IF;
- AccrualNo := Accruals.NEXT(AccrualNo);
- END LOOP;
- -------------------------------------------------------------------------------------------------
- -- /--\ /| |---| | | /--\ | | | /| | | | | /--\ /| |--\ | | | | - --
- -- / / | | | | | | | | | / | | | | | | / | | | | | | | | --
- -- - | | | | | /| | |--\ |--| | | \_| | /| | | | |-- |--| | /| | /| --
- -- \ |--| | | |/ | | | | | | |--| | |/ | | | | | | | |/ | |/ | --
- -- \--/ | | | | | | \--/ \--/ | | | | | | | \--/ | | |--/ | | | | | | --
- -------------------------------------------------------------------------------------------------
- /*
- AccrualNo := Accruals.FIRST;
- WHILE AccrualNo IS NOT NULL LOOP
- if Accruals(AccrualNo).Service_ID = 28 then
- dbms_output.put_line(AccrualNo||': Service_ID='||Accruals(AccrualNo).Service_ID||'; Data='||Accruals(AccrualNo).Data||'; Vid='||Accruals(AccrualNo).Vid||
- '; Volume='||Accruals(AccrualNo).Volume||'; Summ='||Accruals(AccrualNo).Summ||'; Dotacya='||Accruals(AccrualNo).Dotacya||
- '; Privil_ID='||Accruals(AccrualNo).Privil_ID||'; Peopl_ID='||Accruals(AccrualNo).Peopl_ID||'; Volume100='||Accruals(AccrualNo).Volume100);
- end if;
- AccrualNo := Accruals.NEXT(AccrualNo);
- END LOOP;
- */
- Old_SverkaSumm := GetSverkaSumm(lpad(AccID, 12, '0')); -- Запомнить сумму сверок до перерасчета.
- -- Перебрать все уже существующие в базе начисления.
- FOR a IN (
- SELECT ROWID, a.*
- FROM n_Accruals a
- WHERE Account_ID = lpad(AccID, 12, '0')
- AND Data BETWEEN Data_Beg_Nach AND Data_End_Nach
- AND Vid IN (1,2,3,4)
- )LOOP
- IF a.Data < FinMonth THEN -- Дата меньше отчетного месяца.
- -- Для начисленного по домовым счетчикам сверки не формировать,
- -- т.к. автоматический перерасчет задним числом по домовому счетчику невозможен!
- IF NVL(a.ByHouseCounter,0) <> 1 THEN
- IF a.Vid IN (1,2) THEN -- Начисление.
- AccrualNo := GetAccrualNo(FALSE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
- SverkaNo := GetAccrualNo(TRUE, FinMonth, a.Vid + 2, a.Service_ID, a.Privil_ID, a.Peopl_ID);
- AddAccrual(SverkaNo, -NVL(a.Volume,0), -NVL(a.Summ,0), -NVL(a.Dotacya,0), -NVL(a.Volume100,0));
- IF AccrualNo IS NOT NULL THEN
- AddAccrual(SverkaNo, Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- UpdateAccrual(2/*обновить только реальную половину*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- Accruals.DELETE(AccrualNo);
- ELSE
- UpdateAccrual(2/*обновить только реальную половину*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL,
- 0, 0, 0, 0);
- END IF;
- ELSIF a.Vid IN (3,4) THEN -- Сверка.
- SverkaNo := GetAccrualNo(TRUE, FinMonth, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
- AddAccrual(SverkaNo, -a.Volume, -a.Summ, -a.Dotacya, -a.Volume100);
- END IF;
- END IF;
- ELSIF a.Data = FinMonth THEN -- Дата в отчетном месяце.
- IF a.Vid IN (1,2) THEN -- Начисление.
- AccrualNo := GetAccrualNo(FALSE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
- IF AccrualNo IS NOT NULL THEN -- В списке есть начисление, соответствующее найденному в БД.
- UpdateAccrual(3/*обновить все - и начислено, и реально*/, a.ROWID, NULL, NULL, NULL, NULL, NULL, NULL,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100, NULL, Accruals(AccrualNo).Tarif,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- Accruals.DELETE(AccrualNo);
- ELSE -- В списке нет начисления, соответствующего найденному в БД.
- DELETE FROM n_Accruals WHERE ROWID = a.ROWID;
- END IF;
- ELSIF a.Vid IN (3,4) THEN -- Сверка.
- SverkaNo := GetAccrualNo(TRUE, a.Data, a.Vid, a.Service_ID, a.Privil_ID, a.Peopl_ID);
- AddAccrual(SverkaNo, -a.Volume, -a.Summ, -a.Dotacya, -a.Volume100);
- END IF;
- END IF;
- END LOOP;
- -- Перебрать все оставшиеся начисления (для которых не было записей в базе).
- AccrualNo := Accruals.FIRST;
- WHILE AccrualNo IS NOT NULL LOOP
- IF Accruals(AccrualNo).Vid IN (1,2) THEN -- Начисления.
- IF Accruals(AccrualNo).Data < FinMonth THEN -- Неотчетный месяц.
- SverkaNo := GetAccrualNo(TRUE, FinMonth, Accruals(AccrualNo).Vid + 2, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID);
- AddAccrual(SverkaNo, Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- UpdateAccrual(5/*перезаписать, а не добавлять*/, NULL, AccID, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID,
- NULL, NULL, NULL, NULL, NULL, NULL,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- ELSIF Accruals(AccrualNo).Data = FinMonth THEN -- Отчетный период.
- UpdateAccrual(5/*перезаписать, а не добавлять*/, NULL, AccID, Accruals(AccrualNo).Data, Accruals(AccrualNo).Vid, Accruals(AccrualNo).Service_ID, Accruals(AccrualNo).Privil_ID, Accruals(AccrualNo).Peopl_ID,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100, NULL, Accruals(AccrualNo).Tarif,
- Accruals(AccrualNo).Volume, Accruals(AccrualNo).Summ, Accruals(AccrualNo).Dotacya, Accruals(AccrualNo).Volume100);
- END IF;
- Accruals.DELETE(AccrualNo);
- END IF;
- AccrualNo := Accruals.NEXT(AccrualNo);
- END LOOP;
- -- ЗАПИСАТЬ РАССЧИТАННЫЕ СВЕРКИ.
- SverkaNo := Accruals.FIRST;
- WHILE SverkaNo IS NOT NULL LOOP
- UpdateAccrual(6/*добавить, а не обновить*/, NULL, AccID, Accruals(SverkaNo).Data, Accruals(SverkaNo).Vid, Accruals(SverkaNo).Service_ID, Accruals(SverkaNo).Privil_ID, Accruals(SverkaNo).Peopl_ID,
- Accruals(SverkaNo).Volume, Accruals(SverkaNo).Summ, Accruals(SverkaNo).Dotacya, Accruals(SverkaNo).Volume100, Data_Beg_Nach, Accruals(AccrualNo).Tarif,
- NULL, NULL, NULL, NULL);
- Accruals.DELETE(SverkaNo);
- SverkaNo := Accruals.NEXT(SverkaNo);
- END LOOP;
- --------------------------------------------------------------------------
- -- |--\ /| /--\ | | |--\ /---\ /--\ /| /| | |--| /--\ --
- -- | | / | | | | | | | / | / | | | | | | --
- -- |--/ / | | \--| |-- | | / | / | |--\ | | | | --
- -- | |--| | | | | | |--| | | | | | | | | --
- -- | | | \--/ | |--/ | \--/ | | | | |--/ /----\ \--/ --
- ------------ ПЕРЕСЧИТАТЬ САЛЬДО С УЧЕТОМ ВНЕСЕННЫХ ИЗМЕНЕНИЙ -------------
- RaschetSaldo(lpad(AccID, 12, '0'), FinMonth);
- -- Записать при необходимости сумму изменения сверок для подтверждения.
- New_SverkaSumm := GetSverkaSumm(lpad(AccID, 12, '0')); -- Сумма сверок после перерасчета.
- IF New_SverkaSumm <> Old_SverkaSumm THEN
- AddSverkaToConfirmation(AccID, New_SverkaSumm - Old_SverkaSumm);
- END IF;
- -- Записать подробности по начислению 27 услуги:
- begin
- insert into n_AccrualsDescr(Account_ID, Month, Description)
- values (AccID, FinMonth, AccrualsDescription27Str);
- exception
- when dup_val_on_index then
- update n_AccrualsDescr set Description = AccrualsDescription27Str
- where Account_ID = AccID and Month = FinMonth;
- end;
- END Nachislenie;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement