"localhost:/firebird/data/ILICHEVSK2.FDB". ��������� Previous topic Chapter index Next topic

COSTSCALCULATION

 

������� ���������

��������

���

��������

OWNERID

INTEGER

 

ACLASSID

INTEGER

 

DATE1

DATE

 

DATE2

DATE

 

CONTRACTID

INTEGER

 

PARTYID

INTEGER

 

DOCROP

INTEGER

 

ACROPID

INTEGER

 

PARTYDATE

DATE

 

ISWEIGHT

INTEGER

 

PRICEPERMONTH

INTEGER

 

 

�������� ���������

��������

���

��������

REINCOME

INTEGER

 

INCOME

INTEGER

 

INITIAL_REMINDER

INTEGER

 

REOUTCOME

INTEGER

 

OUTCOME

INTEGER

 

TEMPDATE

DATE

 

RESTS

INTEGER

 

STORAGECOST

DECIMAL(15,2)

 

CONTRACTCOSTDATE

DATE

 

RESTCALCULATION

INTEGER

 

STORINGWEIGHT

DECIMAL(15,9)

 

STORING_WEIGHT

DECIMAL(15,3)

 

TEMPMONTH

INTEGER

 

CROPID

INTEGER

 

CLASSID

INTEGER

 

 

��������

������ ��������� �������� �����

 

�����������

CREATE PROCEDURE COSTSCALCULATION(
    OWNERID INTEGER,
    ACLASSID INTEGER,
    DATE1 DATE,
    DATE2 DATE,
    CONTRACTID INTEGER,
    PARTYID INTEGER,
    DOCROP INTEGER,
    ACROPID INTEGER,
    PARTYDATE DATE,
    ISWEIGHT INTEGER,
    PRICEPERMONTH INTEGER)
RETURNS (
    REINCOME INTEGER,
    INCOME INTEGER,
    INITIAL_REMINDER INTEGER,
    REOUTCOME INTEGER,
    OUTCOME INTEGER,
    TEMPDATE DATE,
    RESTS INTEGER,
    STORAGECOST DECIMAL(15,2),
    CONTRACTCOSTDATE DATE,
    RESTCALCULATION INTEGER,
    STORINGWEIGHT DECIMAL(15,9),
    STORING_WEIGHT DECIMAL(15,3),
    TEMPMONTH INTEGER,
    CROPID INTEGER,
    CLASSID INTEGER)
AS
declare variable REGDATE date;
declare variable OPERATIONID integer;
declare variable OPERATIONSUBTYPE smallint;
declare variable NET integer;
declare variable WEIGHT integer;
declare variable INVOICEID integer;
declare variable ASTORINGWEIGHT decimal(18,9) = 0;
declare variable DAYCOUNT integer;
declare variable TEMP_MONTH integer;
begin

  if (DATE2 > current_date) then
    PARTYDATE = current_date;

  STORINGWEIGHT = 0;
  TEMPDATE = :DATE1;
  TEMPMONTH = extract(month from :TEMPDATE);
  STORING_WEIGHT = 0;

  while (TEMPDATE <= DATE2) do begin

    INITIAL_REMINDER = 0;
--    OUTCOMEbefore = 0;
--    INCOMEbefore = 0;
    INCOME = 0;
    OUTCOME = 0;
    REINCOME = 0;
    REOUTCOME = 0;

    for

      select
          coalesce(sum(IT.NET), 0), coalesce(sum(IT.WEIGHT), 0), OPERATION.OPERATIONSUBTYPE,
          IT.OPERATIONID, IT.REGDATE, IT.INVOICEID, QUALITY.CROPID, QUALITY.CLASSID
        from IT
          join GETWORKPARTIES(:PARTYID, :PARTYDATE, null, null, null) on (GETWORKPARTIES.PARTYID = IT.PARTYID)
          inner join QUALITY  on (QUALITY.QUALITYID = IT.BUHQUALITYID)
          inner join OPERATION on (OPERATION.OPERATIONID = IT.OPERATIONID)
        where (IT.STATE >= 0)
          and (IT.PARENTID >= 0)
          and (OPERATIONSUBTYPE in (0,1,3,4))
          and ((((QUALITY.CLASSID = :ACLASSID) and (:DOCROP = 0))
               or ((QUALITY.CROPID = :ACROPID) and (:DOCROP = 1))
               or ((coalesce(:ACROPID,0) = 0) and (coalesce(:ACLASSID,0) = 0))))
          and (IT.OWNERID = :OWNERID)
          and ((IT.CONTRACTID = :CONTRACTID) or (:CONTRACTID = 0))
      group by IT.REGDATE, OPERATION.OPERATIONSUBTYPE, IT.OPERATIONID, IT.INVOICEID, QUALITY.CROPID, QUALITY.CLASSID
      into :NET, :WEIGHT, :OPERATIONSUBTYPE, :OPERATIONID, :REGDATE, :INVOICEID, :CROPID, :CLASSID

    do begin

      if (:OPERATIONSUBTYPE = 0) then begin
        if (:REGDATE = :TEMPDATE) then begin
          if (:OPERATIONID = 17) then begin
            if (:NET > 0) then
              if (:ISWEIGHT = 0) then
                REINCOME = :REINCOME + :NET;
              else REINCOME = :REINCOME + :WEIGHT;
            else
              if (:ISWEIGHT = 0) then
                REOUTCOME = :REOUTCOME - :NET;
              else REOUTCOME = :REOUTCOME - :WEIGHT;
          end
          else begin
            if (:ISWEIGHT = 0) then
              INCOME = :INCOME + :NET;
            else INCOME = :INCOME + :WEIGHT;
          end
        end
        if (:REGDATE < :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            INITIAL_REMINDER = :INITIAL_REMINDER + :NET;
          else INITIAL_REMINDER = :INITIAL_REMINDER + :WEIGHT;
        end
      end

      if (:OPERATIONSUBTYPE in (1,4)) then begin
        if (:ISWEIGHT = 0) then begin
          if (:REGDATE < :TEMPDATE) then
            INITIAL_REMINDER = :INITIAL_REMINDER - :NET;

          if (:REGDATE = :TEMPDATE) then
            OUTCOME = :OUTCOME + :NET;
        end
        else begin
          if (not (:OPERATIONID in (9,13,22,24,25))) then begin
            if (:REGDATE < :TEMPDATE) then
              INITIAL_REMINDER = :INITIAL_REMINDER - :WEIGHT;

            if (:REGDATE = :TEMPDATE) then
              OUTCOME = :OUTCOME + :WEIGHT;
          end
        end
      end
/*
      if (:OPERATIONSUBTYPE = 1) then begin
        if (:REGDATE < :TEMPDATE) then begin
          if ((not OPERATIONID in (9, 24, 25, 64, 65)) and (:ISWEIGHT = 0)) then
            INITIAL_REMINDER = :INITIAL_REMINDER - :NET;
          else INITIAL_REMINDER = :INITIAL_REMINDER - WEIGHT;
--          OUTCOMEbefore = :OUTCOMEbefore + :NET;
        end
        if (:REGDATE = :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            OUTCOME = :OUTCOME + :NET;
          else OUTCOME = :OUTCOME + :WEIGHT;
        end
      end

      if (:OPERATIONID in (9, 13, 24, 25)) then begin
        if (:REGDATE = :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            OUTCOME = :OUTCOME + (:WEIGHT * -1);
          else OUTCOME = :OUTCOME + (:WEIGHT * -1);
        end
        if (:REGDATE < :TEMPDATE) then begin
          INITIAL_REMINDER = :INITIAL_REMINDER + (:WEIGHT * -1);
--          OUTCOMEbefore = :OUTCOMEbefore + :WEIGHT*-1;
        end
      end
*/
    end

    RESTS = INITIAL_REMINDER + INCOME + REINCOME - OUTCOME - REOUTCOME;

    select distinct GET_CONTRACT_COSTS.COST, GET_CONTRACT_COSTS.CONTRACTCOSTDATE
      from GET_CONTRACT_COSTS(:TEMPDATE, :CONTRACTID, 1, :CROPID, :CLASSID)
    into :STORAGECOST, :CONTRACTCOSTDATE;

    if (STORAGECOST > 0) then
      RESTCALCULATION = RESTS;
    else RESTCALCULATION = 0;

/*
    if ((TEMPDATE = DATE2) or (TEMPMONTH <> extract(month from :TEMPDATE))) then begin
      if (TEMPDATE = DATE2) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;
        ASTORINGWEIGHT = ASTORINGWEIGHT + RESTS;
      end
      else
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE - 1)
        into DAYCOUNT;

      if (PRICEPERMONTH = 0) then
        STORING_WEIGHT = STORING_WEIGHT + (:ASTORINGWEIGHT / 1000);
      else
        if (PRICEPERMONTH = 1) then
          ASTORINGWEIGHT = ASTORINGWEIGHT + cast(:RESTS as numeric(18,9)) / 1000 / DAYCOUNT;
        else STORING_WEIGHT = STORING_WEIGHT + (:ASTORINGWEIGHT / 1000 / 30);
      ASTORINGWEIGHT = 0;
    end
*/

    if (PRICEPERMONTH = 0) then
      ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000);
    else
      if (PRICEPERMONTH = 1) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;

        ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000 / DAYCOUNT);
      end
      else ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000 / 30);

    STORING_WEIGHT = cast(cast(ASTORINGWEIGHT as numeric(15,4)) as numeric(15,3));
    TEMPMONTH = extract(month from :TEMPDATE);

    if (PRICEPERMONTH = 0) then
      STORINGWEIGHT = RESTS / 1000;
    else
      if (PRICEPERMONTH = 1) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;

        STORINGWEIGHT = cast(RESTS as decimal(15,9)) / 1000 / DAYCOUNT;
      end
      else STORINGWEIGHT = RESTS / 1000 / 30;

/*
      if (abs(STORINGWEIGHT) < 0.1) then
        STORINGWEIGHT = STORINGWEIGHT * 6;
*/
    if ((STORINGWEIGHT <= -0.019) and (STORINGWEIGHT <= -0.019)) then
      STORINGWEIGHT = -0.1;

    suspend;

    TEMPDATE = :TEMPDATE + 1;
  end
end

 

     Previous topic Chapter index Next topic