﻿CREATE OR REPLACE
PACKAGE P_PACKAGE AS
PROCEDURE ACTION(П_СОТРУДНИК_ИД IN NUMBER,
                        П_ОТДЕЛ_ИД IN NUMBER,
                        П_ДОЛЖНОСТЬ_ИД IN NUMBER,
                        П_СОСТОЯНИЕ_ИД IN NUMBER,
                        П_ДАТА IN DATE, 
                        П_КОММЕНТАРИЙ IN LONG); 
                        PROCEDURE HIRING;
                        PROCEDURE TRANSFER_POST;
                        FUNCTION GET_COUNT_BY_DATE(П_ОТДЕЛ_ИД IN NUMBER, П_ДАТА IN DATE) RETURN NUMBER;
END P_PACKAGE;
/

CREATE OR REPLACE PACKAGE BODY P_PACKAGE AS

  PROCEDURE ACTION(П_СОТРУДНИК_ИД IN NUMBER, 
                        П_ОТДЕЛ_ИД IN NUMBER,
                        П_ДОЛЖНОСТЬ_ИД IN NUMBER,
                        П_СОСТОЯНИЕ_ИД IN NUMBER,
                        П_ДАТА IN DATE,
                        П_КОММЕНТАРИЙ IN LONG)

AS                    
С_ПРИНЯТ_ИД NUMBER;
С_ПЕРЕВЕДЕН_ОТД_ИД NUMBER;
С_ПЕРЕВЕДЕН_ДОЛЖН_ИД NUMBER;

АВТО_К_ПЕРЕВЕДЕН_ОТД LONG;
АВТО_К_ПЕРЕВЕДЕН_ДОЛЖН LONG;
  
BEGIN
  С_ПРИНЯТ_ИД:=1;
  С_ПЕРЕВЕДЕН_ОТД_ИД:=2;
  С_ПЕРЕВЕДЕН_ДОЛЖН_ИД:=3;
  
  АВТО_К_ПЕРЕВЕДЕН_ОТД:='Авто: перевод в отдел. ' || П_КОММЕНТАРИЙ;
  АВТО_К_ПЕРЕВЕДЕН_ДОЛЖН:='Авто: перевод на должность. ' || П_КОММЕНТАРИЙ;

  INSERT INTO T_HISTORY (ЛЮДИ_ИД, ОТДЕЛ_ИД, ДОЛЖН_ИД, СОСТ_ИД, ДАТА, КОММЕНТАРИЙ)
          values (П_СОТРУДНИК_ИД, П_ОТДЕЛ_ИД, П_ДОЛЖНОСТЬ_ИД, П_СОСТОЯНИЕ_ИД, П_ДАТА, П_КОММЕНТАРИЙ);
  
  IF (П_СОСТОЯНИЕ_ИД = С_ПРИНЯТ_ИД)
      THEN
          INSERT INTO T_HISTORY (ЛЮДИ_ИД, ОТДЕЛ_ИД, ДОЛЖН_ИД, СОСТ_ИД, ДАТА, КОММЕНТАРИЙ)
            values (П_СОТРУДНИК_ИД, П_ОТДЕЛ_ИД, П_ДОЛЖНОСТЬ_ИД, С_ПЕРЕВЕДЕН_ОТД_ИД, П_ДАТА, АВТО_К_ПЕРЕВЕДЕН_ОТД);
          INSERT INTO T_HISTORY (ЛЮДИ_ИД, ОТДЕЛ_ИД, ДОЛЖН_ИД, СОСТ_ИД, ДАТА, КОММЕНТАРИЙ)
            values (П_СОТРУДНИК_ИД, П_ОТДЕЛ_ИД, П_ДОЛЖНОСТЬ_ИД, С_ПЕРЕВЕДЕН_ДОЛЖН_ИД, П_ДАТА, АВТО_К_ПЕРЕВЕДЕН_ДОЛЖН);                        
  END IF;    
END ACTION;


  PROCEDURE HIRING AS
  BEGIN
    ACTION(1, 1, 1, 1, TO_DATE('01.01.14', 'dd.mm.yy'), 'Создание компании');
    ACTION(2, 1, 2, 1, TO_DATE('01.01.14', 'dd.mm.yy'), 'Создание компании');
    ACTION(11, 2, 15, 1,  TO_DATE('02.01.14', 'dd.mm.yy'), 'Новый мастер боевых исскусств');
    ACTION(16, 2, 14, 1,  TO_DATE('02.01.14', 'dd.mm.yy'), 'Новый мастер по по укладке плитки');
    ACTION(6, 3, 12, 1,  TO_DATE('05.01.14', 'dd.mm.yy'), 'Новый водитель');
    ACTION(10, 4, 6, 1,  TO_DATE('04.01.14', 'dd.mm.yy'), 'Новый главный охранник');
    ACTION(12, 4, 4, 1,  TO_DATE('06.01.14', 'dd.mm.yy'), 'Новый охранник');
    ACTION(13, 4, 4, 1,  TO_DATE('12.01.14', 'dd.mm.yy'), 'Новый охранник');
    ACTION(3, 6, 5, 1,  TO_DATE('12.01.14', 'dd.mm.yy'), 'Новый тестировщик');
    ACTION(4, 6, 5, 1,  TO_DATE('24.01.14', 'dd.mm.yy'), 'Новый тестировщик');
    ACTION(5, 6, 5, 1,  TO_DATE('02.02.14', 'dd.mm.yy'), 'Новый тестировщик');                                  
  END HIRING;
  
  PROCEDURE TRANSFER_POST AS
  BEGIN
  /* Тестировщик -> Охранник */
    ACTION(3,4,4,3, TO_DATE('26.03.14', 'dd.mm.yy'), 'Разжалован в должность охранника');
    ACTION(3,4,4,2, TO_DATE('26.03.14', 'dd.mm.yy'), 'После разжалования переведен в отдел охранников');
    /* Увольнение */
    ACTION(13, 10, 4, 4,  TO_DATE('16.08.14', 'dd.mm.yy'), 'Украл всю плитку, уволен!');
    /* Мастер из мастеров в отдел Штукатуров-моляров*/
    ACTION(16,7,7,3, TO_DATE('01.04.14', 'dd.mm.yy'), 'Плитки пока нет, пусть красит стены');
  END;
  
FUNCTION GET_COUNT_BY_DATE(П_ОТДЕЛ_ИД IN NUMBER, П_ДАТА IN DATE) RETURN NUMBER
AS
people_count number;
department_id number;

  BEGIN
    people_count:=0;
    FOR rec IN (SELECT * FROM 
                          (SELECT ИД AS p_id, ДАТА AS p_date, ROW_NUMBER() OVER (PARTITION BY ЛЮДИ_ИД ORDER BY ДАТА DESC) AS rownumber
                                 FROM T_HISTORY WHERE ДАТА <= П_ДАТА)
                        WHERE rownumber = 1)
    LOOP        
      SELECT ОТДЕЛ_ИД into department_id FROM T_HISTORY WHERE T_HISTORY.ИД = rec.p_id;                 
      IF (department_id = П_ОТДЕЛ_ИД)
        THEN
          people_count := people_count + 1;
      END IF;    
    END LOOP;  
    RETURN people_count; 
  END;

END P_PACKAGE;

--SELECT COUNT(DISTINCT ЛЮДИ_ИД) IN people_count
--FROM HISTORY
--WHERE ДАТА<=