
CREATE GENERATOR GTBAGRUPAMENTO_CARGA_SKU_UP;

CREATE TABLE TBAGRUPAMENTO_CARGA_SKU_UP (
    AGRUPAMENTO_ID  INTEGER NOT NULL,
    AGRUP_PED_ID    INTEGER NOT NULL,
    AGRUP_UP_ID     INTEGER NOT NULL,
    ID              INTEGER NOT NULL,
    QUANTIDADE      NUMERIC(15,4) DEFAULT 0,
    NECESSIDADE     NUMERIC(15,4) DEFAULT 0
);

ALTER TABLE TBAGRUPAMENTO_CARGA_SKU_UP ADD PRIMARY KEY (AGRUPAMENTO_ID, AGRUP_PED_ID, AGRUP_UP_ID, ID);


SET TERM ^ ;

CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B0I FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gTBAGRUPAMENTO_CARGA_SKU_UP,1);
end
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1D_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1D_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE DELETE POSITION 1
AS
begin

    UPDATE tbagrupamento_carga_up set
    Quantidade = Quantidade - OLD.Quantidade,
    Saldo = Saldo + OLD.Necessidade
      Where AGRUPAMENTO_ID = OLD.Agrupamento_Id
        and ID = OLD.AGRUP_UP_ID;

End
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1I_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1I_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE INSERT POSITION 1
AS
Begin

  UPDATE tbagrupamento_carga_up set
  Quantidade = Quantidade + NEW.Quantidade,
  Saldo = Saldo - NEW.Necessidade
  Where AGRUPAMENTO_ID = New.Agrupamento_Id
    and ID = New.AGRUP_UP_ID;

End
^


/* Trigger: TTBAGRUP_CARGA_SKU_UP_B1U_01 */
CREATE OR ALTER TRIGGER TTBAGRUP_CARGA_SKU_UP_B1U_01 FOR TBAGRUPAMENTO_CARGA_SKU_UP
ACTIVE BEFORE UPDATE POSITION 1
AS
declare variable vUP_id integer;
declare variable vSubUP_id integer;
declare variable vPerfil varchar(10);

declare variable vMinutos integer;
declare variable vAGRUP_UP_ID  integer;
Begin
  if (NEW.Agrupamento_Id = OLD.Agrupamento_Id) then
      Begin
      if (NEW.Quantidade < OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_up set
           Quantidade = Quantidade - (Old.Quantidade - New.Quantidade),
           Saldo = Saldo + Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.AGRUP_UP_ID;
          End else
      if (NEW.Quantidade > OLD.Quantidade) then
          Begin
           UPDATE tbagrupamento_carga_up set
           Quantidade = Quantidade + (New.Quantidade - Old.Quantidade),
           Saldo = Saldo - Abs(New.Necessidade - Old.Necessidade)
           Where AGRUPAMENTO_ID = New.Agrupamento_Id
             and ID = New.AGRUP_UP_ID;
          End
      End else
  if (NEW.Agrupamento_Id <> OLD.Agrupamento_Id) then
      Begin

      For
      Select First 1 F1.UP_ID, F1.subup_id, F1.perfil
        From tbagrupamento_carga_up F1
       Where F1.agrupamento_id = Old.Agrupamento_Id
         and F1.id = Old.AGRUP_UP_ID
      Into :vUP_id, :vsubup_id, :vPerfil
      Do Begin

           For
           Select First 1 A.minutos_produtivos, Coalesce(F2.ID,0) as AGRUP_UP_ID from TbAgrupamento A
             Left Join tbagrupamento_carga_up F2 ON F2.agrupamento_id = A.ID and F2.UP_ID = :vUP_id and F2.Subup_id = :vsubup_id and F2.Perfil = :vPerfil
            Where A.ID = New.Agrupamento_Id
            Into :vMinutos, :vAGRUP_UP_ID
            Do Begin
               if (:vAGRUP_UP_ID = 0) then
                   Begin
                   vAGRUP_UP_ID = gen_id(gtbagrupamento_carga_up,1);
                   Insert into tbagrupamento_carga_up
                   (AGRUPAMENTO_ID,UP_ID,SUBUP_ID, PERFIL,ID,CAP_PRODUTIVA,QUANTIDADE,SALDO)
                    values (New.Agrupamento_Id,:vUP_id,:vSUBUP_ID,:vPERFIL,:vAGRUP_UP_ID,:vMinutos,0,:vMinutos);
                   End
               End

         End

       UPDATE tbagrupamento_carga_up set
       Quantidade = Quantidade - Old.Quantidade,
       Saldo = Saldo + Old.Necessidade
       Where AGRUPAMENTO_ID = Old.Agrupamento_Id
         and ID = Old.AGRUP_UP_ID;

       UPDATE tbagrupamento_carga_up set
       Quantidade = Quantidade + New.Quantidade,
       Saldo = Saldo - New.Necessidade
       Where AGRUPAMENTO_ID = New.Agrupamento_Id
         and ID = :vAGRUP_UP_ID;

       New.AGRUP_UP_ID = :vAGRUP_UP_ID;
      End
End
^

SET TERM ; ^

ALTER TABLE TBAGRUPAMENTO_CARGA_SKU_UP
    ADD TIPO INTEGER;

COMMENT ON COLUMN TBAGRUPAMENTO_CARGA_SKU_UP.TIPO IS
'1 - pedido
2 - remessa';

CREATE INDEX ITBREMESSA_ITEM_ALOCACAO_12 ON TBREMESSA_ITEM_ALOCACAO (AGRUP_PED_ID);

ALTER TABLE TBREMESSA_ITEM_ALOCACAO ADD TEMPO NUMERIC(15,4);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_03
ON TBAGRUPAMENTO_CARGA_SKU_UP (AGRUP_PED_ID,TIPO);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_02
ON TBAGRUPAMENTO_CARGA_SKU_UP (AGRUP_PED_ID);

CREATE INDEX ITBAGRUPAMENTO_CARGA_SKU_UP_01
ON TBAGRUPAMENTO_CARGA_SKU_UP (TIPO);

ALTER TABLE TBAGRUPAMENTO_CARGA_UP
    ADD UTILIZADO COMPUTED BY (cap_produtiva - saldo);


