Procedura-CalcAmountsByLimits

Parametry:

NázevPopisDatový typ
DocumentTypeChar(2)
Document_IDChar(10)
EndDateNumeric(15, 2)
DocLocalAmountNumeric(15, 2)
DueTermLimitSelIDChar(10)
DocDueDateFloat(0, 0)

Návratové hodnoty:

NázevPopisDatový typ
DT_IDChar(10)
LocalAmountNumeric(15, 2)
DT_DueTermLimitInteger

Závislosti:

NázevPopisTřída
PaymentsForDocumentVrací souhrn platících dokladů pro placený dokument (včetně zaplacených částek)Procedures

Tělo:

BEGIN
  /* u obou faktur je nutne brat ohled na dobropisy */
  CN_LocalAmount = 0;
  CN_PayLocalAmount = 0;
  CN_PartialPayLocalAmount = 0;
  CN_PartialLocalAmount = 0;
  if (DocumentType = '03') then begin
    for select CN.ID, CN.LocalAmount from IssuedCreditNotes CN where
      CN.Source_ID = :Document_ID and CN.DocDate$Date <= :EndDate
      into CN_ID, CN_PartialLocalAmount
    do begin
      if (CN_PartialLocalAmount is NULL) then
        CN_PartialLocalAmount = 0;
      select Sum(LocalPAmount) from PaymentsForDocument('60', :CN_ID, :EndDate)
        into CN_PartialPayLocalAmount;
      if (CN_PartialPayLocalAmount is NULL) then
        CN_PartialPayLocalAmount = 0;
      CN_PayLocalAmount = CN_PartialPayLocalAmount + CN_PayLocalAmount;
      CN_LocalAmount = CN_PartialLocalAmount + CN_LocalAmount;
    end
  end
  if (DocumentType = '04') then begin
    for select CN.ID, CN.LocalAmount from ReceivedCreditNotes CN where
      CN.Source_ID = :Document_ID and CN.DocDate$Date <= :EndDate
      into CN_ID, CN_PartialLocalAmount
    do begin
      if (CN_PartialLocalAmount is NULL) then
        CN_PartialLocalAmount = 0;
      select Sum(LocalPAmount) from PaymentsForDocument('61', :CN_ID, :EndDate)
        into CN_PartialPayLocalAmount;
      if (CN_PartialPayLocalAmount is NULL) then
        CN_PartialPayLocalAmount = 0;
      CN_PayLocalAmount = CN_PartialPayLocalAmount + CN_PayLocalAmount;
      CN_LocalAmount = CN_PartialLocalAmount + CN_LocalAmount;
    end
  end
  select Sum(LocalPAmount) from PaymentsForDocument(:DocumentType, :Document_ID, :EndDate)
    into :PayLocalAmount;
  if (PayLocalAmount is NULL) then
    PayLocalAmount = 0;
  ReceivableAmount = DocLocalAmount - PayLocalAmount - (CN_LocalAmount - CN_PayLocalAmount);
  for select DT.ID, DT.DueTermLimit from DueTermLimits DT where
    (:DueTermLimitSelID = '' or DT.ID in (select OBJ_ID from SELDAT where SEL_ID = :DueTermLimitSelID))
   order by DT.DueTermLimit
   into :DT_ID, :DT_DueTermLimit
  do begin
    /* zaplaceno */
    if (ReceivableAmount = 0.00) then begin
      LocalAmount = ReceivableAmount;
      Suspend;
    end
    if (ReceivableAmount <> 0.00) then
    begin
      ReceivableDate = EndDate - DocDueDate;
      select Max(A.DueTermLimit) from DueTermLimits A where
        (:DueTermLimitSelID = '' or A.ID in (select OBJ_ID from SELDAT where SEL_ID = :DueTermLimitSelID))
        into :NextLimit;
      /* musim dohledat nejblizsi nasledujici limit */
      if (NextLimit = DT_DueTermLimit) then begin
        NextLimit = 1000000;
      end
      else
      begin
        for select DueTermLimit from DueTermLimits where
          (:DueTermLimitSelID = '' or ID in (select OBJ_ID from SELDAT where SEL_ID = :DueTermLimitSelID))
          into :DLimit
        do begin
          if ((DLimit > DT_DueTermLimit) and (DLimit <= NextLimit)) then
            NextLimit = DLimit;
        end
      end
      if ((ReceivableDate >= DT_DueTermLimit) and (ReceivableDate < NextLimit)) then begin
        LocalAmount = ReceivableAmount;
        Suspend;
      end
      else
      begin
        LocalAmount = 0.00;
        Suspend;
      end
    end
  end
end;

Generated by ABRA Software a.s. 27.10.2021 16:34:12