create or replace package PACK_COMENZI is

  -- Author  : MARIUS.ATANASIU
  -- Created : 18/08/2006
  -- Purpose :

  -- 20.03.2026 - duplicate CODMAT pe comanda: discriminare pe PRET + SIGN(CANTITATE)

  id_comanda COMENZI.ID_COMANDA%TYPE;

  procedure adauga_masina(V_ID_MODEL_MASINA IN NUMBER,
                          V_NRINMAT         IN VARCHAR2,
                          V_CULOARE         IN VARCHAR2,
                          V_ID_UTIL         IN NUMBER);

  procedure modifica_masina(V_ID_MASINA       IN NUMBER,
                            V_ID_MODEL_MASINA IN NUMBER,
                            V_NRINMAT         IN VARCHAR2,
                            V_CULOARE         IN VARCHAR2,
                            V_ID_UTIL         IN NUMBER);

  procedure sterge_masina(V_ID_MASINA IN NUMBER, V_ID_UTIL IN NUMBER);

  procedure adauga_comanda(V_NR_COMANDA          IN VARCHAR2,
                           V_DATA_COMANDA        IN DATE,
                           V_ID                  IN NUMBER,
                           V_DATA_LIVRARE        IN DATE,
                           V_PROC_DISCOUNT       IN NUMBER,
                           V_INTERNA             IN NUMBER,
                           V_ID_UTIL             IN NUMBER,
                           V_ID_SECTIE           IN NUMBER,
                           V_ID_ADRESA_FACTURARE in NUMBER,
                           V_ID_ADRESA_LIVRARE   in NUMBER,
                           V_ID_CODCLIENT        in number,
                           V_COMANDA_EXTERNA     in varchar2,
                           V_ID_CTR              IN NUMBER);

  -- Versiune overloaded care returneaza ID_COMANDA prin OUT parameter
  procedure adauga_comanda(V_NR_COMANDA          IN VARCHAR2,
                           V_DATA_COMANDA        IN DATE,
                           V_ID                  IN NUMBER,
                           V_DATA_LIVRARE        IN DATE,
                           V_PROC_DISCOUNT       IN NUMBER,
                           V_INTERNA             IN NUMBER,
                           V_ID_UTIL             IN NUMBER,
                           V_ID_SECTIE           IN NUMBER,
                           V_ID_ADRESA_FACTURARE in NUMBER,
                           V_ID_ADRESA_LIVRARE   in NUMBER,
                           V_ID_CODCLIENT        in number,
                           V_COMANDA_EXTERNA     in varchar2,
                           V_ID_CTR              IN NUMBER,
                           V_ID_COMANDA          OUT NUMBER);

  procedure modifica_comanda(V_ID_COMANDA       IN NUMBER,
                             V_NR_COMANDA       IN VARCHAR2,
                             V_DATA_COMANDA     IN DATE,
                             V_ID               IN NUMBER,
                             V_DATA_LIVRARE     IN DATE,
                             V_PROC_DISCOUNT    IN NUMBER,
                             V_INTERNA          IN NUMBER,
                             V_ID_UTIL          IN NUMBER,
                             V_ADRESA_FACTURARE in number,
                             V_ADRESA_LIVRARE   in number,
                             V_ID_CODCLIENT     in number,
                             V_COMANDA_EXTERNA  in varchar2,
                             V_ID_CTR           IN NUMBER);

  procedure sterge_comanda(V_ID_COMANDA IN NUMBER, V_ID_UTIL IN NUMBER);

  procedure cauta_contract_comanda(V_DATA_COMANDA IN DATE,
                                   V_ID_PART      IN NUMBER,
                                   V_ID_SUCURSALA IN NUMBER,
                                   V_ID_CTR       OUT NUMBER,
                                   V_NUMAR_CTR    OUT VARCHAR2);

  procedure adauga_articol_comanda(V_ID_COMANDA IN NUMBER,
                                   V_ID_ARTICOL IN NUMBER,
                                   V_ID_POL     IN NUMBER,
                                   V_CANTITATE  IN NUMBER,
                                   V_ID_UTIL    IN NUMBER,
                                   V_ID_SECTIE  IN NUMBER);

  procedure adauga_articol_comanda(V_ID_COMANDA IN NUMBER,
                                   V_ID_ARTICOL IN NUMBER,
                                   V_ID_POL     IN NUMBER,
                                   V_CANTITATE  IN NUMBER,
                                   V_PRET       IN NUMBER,
                                   V_ID_UTIL    IN NUMBER,
                                   V_ID_SECTIE  IN NUMBER,
                                   V_PTVA       IN NUMBER DEFAULT NULL);

  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_ID_UTIL            IN NUMBER);

  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_PRET               IN NUMBER,
                                     V_ID_UTIL            IN NUMBER);

  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_PRET               IN NUMBER,
                                     V_PTVA               IN NUMBER,
                                     V_ID_UTIL            IN NUMBER);

  /*  procedure sterge_articol_comanda(V_ID_COMANDA IN NUMBER,
  V_ID_ARTICOL IN NUMBER,
  V_ID_POL     IN NUMBER,
  V_ID_UTIL    IN NUMBER);*/

  procedure sterge_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                   V_ID_UTIL            IN NUMBER);

  procedure adauga_lucrare_pe_comanda(V_ID_COMANDA IN NUMBER,
                                      V_ID_LUCRARE IN NUMBER,
                                      V_ID_UTIL    IN NUMBER,
                                      V_ID_SECTIE  IN NUMBER);

  procedure adauga_lucrare_pe_comenzi(V_SIR_COMENZI IN VARCHAR2,
                                      V_ID_LUCRARE  IN NUMBER,
                                      V_ID_UTIL     IN NUMBER,
                                      V_ID_SECTIE   IN NUMBER);

  procedure livreaza_comanda(V_ID_COMANDA  IN NUMBER,
                             V_ID_AGENT    IN NUMBER,
                             V_ID_DELEGAT  IN NUMBER,
                             V_ID_MASINA   IN NUMBER,
                             V_DATA_LIVRAT IN DATE,
                             V_ID_UTIL     IN NUMBER,
                             V_NR_LIVRARE  OUT VARCHAR2);

  procedure genereaza_lucrare(V_DATA_LUCRARE IN DATE,
                              V_ORE_EXECUTIE IN NUMBER,
                              V_ID_UTIL      IN NUMBER,
                              V_ID_SECTIE    IN NUMBER,
                              V_NRORD        OUT VARCHAR2,
                              V_ID_LUCRARE   OUT NUMBER);

  procedure adauga_lucrare(V_NRORD           IN VARCHAR2,
                           V_DATA_LUCRARE    IN DATE,
                           V_EXPLICATIE      IN VARCHAR2,
                           V_TERMEN_EXECUTIE IN DATE,
                           V_ID_UTIL         IN NUMBER,
                           V_ID_SECTIE       IN NUMBER);

  procedure modifica_lucrare(V_ID_LUCRARE      IN NUMBER,
                             V_NRORD           IN VARCHAR2,
                             V_DATA_LUCRARE    IN DATE,
                             V_EXPLICATIE      IN VARCHAR2,
                             V_TERMEN_EXECUTIE IN DATE,
                             V_ID_UTIL         IN NUMBER);

  procedure sterge_lucrare(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER);

  procedure actualizeaza_lucrare(V_ID_COMANDA IN NUMBER,
                                 V_ID_UTIL    IN NUMBER,
                                 V_ID_SECTIE  IN NUMBER);

  procedure actualizeaza_articole_lucrare(V_ID_LUCRARE IN NUMBER,
                                          V_ID_UTIL    IN NUMBER,
                                          V_ID_SECTIE  IN NUMBER);

  procedure adauga_loturi(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER);

  procedure sterge_loturi(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER);

  -- function citeste_ore_inchidere return number;

  function genereaza_nr_comanda return varchar2;

  function genereaza_nr_lucrare return varchar2;

  function genereaza_nr_livrare return varchar2;

  procedure copiaza_comanda(V_ID_COMANDA     IN NUMBER,
                            V_OPTIUNE_CANT   IN NUMBER,
                            V_ID_UTIL        IN NUMBER,
                            V_ID_COMANDA_NOU OUT NUMBER);

  procedure copiaza_comenzi(V_SIR_ID_COMANDA  IN VARCHAR2,
                            V_SEPARATOR_PARAM IN VARCHAR2,
                            V_ID_UTIL         IN NUMBER);
  procedure sectii_utilizator(V_ID_UTIL      IN NUMBER,
                              V_ID_SUCURSALA IN NUMBER,
                              p_cursor       OUT pack_types.tip_cursor);
  function extrage_optiuni(tcLista varchar2, tnId number) return varchar2;
  function citeste_ore_inchidere(tnId number) return number;

  procedure raport_proc_vanzari_sterge(V_ID_COMRAPVANZ IN NUMBER);
  procedure raport_proc_vanzari(V_DATAORA_I     IN TIMESTAMP,
                                V_DATAORA_S     IN TIMESTAMP,
                                V_ID_GRUPA_GEST IN NUMBER,
                                V_PROCENT       IN NUMBER,
                                V_ID_SECTIE     IN NUMBER,
                                V_ID_UTIL       IN NUMBER,
                                V_ID_SUCURSALA  IN NUMBER,
                                V_CURSOR        OUT pack_cursor.tip_ref_cursor);

  procedure completeaza_raport(V_ID_COMRAPVANZ  IN NUMBER,
                               V_LISTA_ARTICOLE IN VARCHAR,
                               V_LISTA_GESTIUNI IN VARCHAR,
                               V_CURSOR         OUT pack_cursor.tip_ref_cursor);

  procedure raport_proc_vanzari_viz(V_ID_COMRAPVANZ IN NUMBER,
                                    V_CURSOR        OUT pack_cursor.tip_ref_cursor);

  procedure actualizeaza_raport(V_ID_COMRAPVANZ       IN NUMBER,
                                V_LISTA_ACTUALIZARI   IN CLOB,
                                V_NR_COMENZI_GENERATE OUT NUMBER,
                                V_CURSOR              OUT pack_cursor.tip_ref_cursor);

  procedure centralizator_rapoarte(V_LUNA      IN NUMBER,
                                   V_AN        IN NUMBER,
                                   V_ID_SECTIE IN NUMBER,
                                   V_CURSOR    OUT pack_cursor.tip_ref_cursor);

  procedure listeaza_raport(V_ID_COMRAPVANZ IN NUMBER,
                            V_DATA          OUT DATE,
                            V_CURSOR        OUT pack_cursor.tip_ref_cursor);

  procedure listeaza_raport_vz_fz(V_ID_COMRAPVANZ IN NUMBER,
                                  V_CANTITATE     IN NUMBER,
                                  V_DATA          OUT DATE,
                                  V_DATAI         OUT DATE,
                                  V_DATAS         OUT DATE,
                                  V_CURSOR        OUT pack_cursor.tip_ref_cursor);

  procedure rap_vanz_per_detaliu(V_ID_COMRAPVANZELEM IN NUMBER,
                                 V_CURSOR            OUT pack_cursor.tip_ref_cursor);

  function verifica_acces_comanda(V_ID_COMANDA IN NUMBER) return varchar2;

  procedure deblocheaza_acces_comanda(V_ID_COMANDA IN NUMBER);

  procedure factureaza_comanda(tnIdComanda     IN comenzi.id_comanda%type,
                               tnAn            IN act.an%type DEFAULT EXTRACT(YEAR FROM
                                                                              SYSDATE),
                               tnLuna          IN act.luna%type DEFAULT EXTRACT(MONTH FROM
                                                                                SYSDATE),
                               tnNrAct         IN vanzari.numar_act%type DEFAULT NULL,
                               tdDataAct       IN vanzari.data_act%type DEFAULT TRUNC(SYSDATE),
                               tnIncasat       IN NUMBER DEFAULT 0,
                               tnSumaIncasat   IN NUMBER DEFAULT 0,
                               tcTipIncasare   IN VARCHAR2 DEFAULT 'CHITANTA',
                               tnIdDelegat     IN VANZARI.ID_DELEGAT%TYPE DEFAULT NULL,
                               tnIdMasina      IN vanzari.id_masina%type DEFAULT NULL,
                               tnIdAgent       IN vanzari.id_agent%type DEFAULT NULL,
                               tcTextAditional IN vanzari.text_aditional%type DEFAULT NULL,
                               tnIdUtil        IN vanzari.id_util%type DEFAULT -3,
                               tcMesaj         OUT VARCHAR2,
                               tnIdVanzare     OUT VANZARI.ID_VANZARE%TYPE);

end PACK_COMENZI;
/
create or replace package body PACK_COMENZI is
  -- ultima eroare atribuita : COM-001

  -- 18.10.2013
  -- marius.mutu
  -- raport_proc_vanzari
  -- se iau in considerare si articolele fara stoc initial, dar cu rulaje

  -- 13.08.2015
  -- marius.mutu
  -- centralizator_rapoarte - adaugare parametru V_TIP: 1/2 (completat/necompletat)
  -- raport_proc_vanzari: se iau in considerare articolele din urma cu 2 luni din rulaje. nu intrau in raport articolele care nu aveau stoc initial sau rulaje in perioada de 24 ore de ex.
  -- raport_proc_vanzari: adaugare coloana STOCDEP (stoc depozit pe articol - pentru raportul vanzari perioada pe furnizori + stoc depozit)
  -- completeaza_raport: adaugare coloana STOCDEP

  -- 22.10.2015
  -- marius.mutu
  -- + raport_proc_vanzari_viz - vizualizare raport comenzi din vanzari in perioada
  -- + raport_proc_vanzari_sterge - stergerea raport comenzi din vanzari in perioada
  -- raport_proc_vanzari - se iau toate articolele din rulajul ultimelor 3 luni, nu numai cele care au vanzari. nu se mai tine cont de procentul de vanzari
  -- nu se afisau articole care nu avusesera vanzari in perioada, desi aveau rulaje in ultimele 3 luni

  -- 27.10.2015
  -- marius.mutu
  -- raport_proc_vanzari - stocul din depozit se afiseaza pentru toate articolele din raport, nu numai pentru cele care au stoc final

  -- 21.12.2015
  -- marius.mutu
  -- raport_proc_vanzari - se iau numai gestiunile active. unele chioscuri nu au activitate si nu ar trebui sa intre in raport
  -- raport_proc_vanzari:  se iau toate articolele din rulajul ultimelor 1 luni, in loc de 3 luni

  --08.02.2016
  -- marius.mutu
  -- raport_proc_vanzari - se iau articolele din rulajul ultimelor 1 luni + articolele din stocul initial

  -- 11.03.2016
  -- marius.mutu
  -- PACK_COMENZI.raport_proc_vanzari - am corectat join-ul cu stoc depozit

  -- 28.03.2016
  -- marius.mutu
  -- factureaza_comanda - adaugare parametru "nract"

  -- 05.04.2016
  -- marius.mutu
  -- factureaza_comanda - tratare parametru nract 0

  -- 29.06.2018
  -- marius.mutu
  -- copiaza_comanda - corectare selectare optiune COPIECANTITATE

  -- 26.03.2021
  -- marius.mutu
  -- adauga_articol_comanda, modifica_articol_comanda - se poate modifica si pretul, in loc sa il ia din politica de preturi

  -- 11.09.2025
  -- marius.mutu
  -- adauga_articol_comanda, modifica_articol_comanda + se poate completa ptva (21,11) in loc sa il ia din politica de preturi

  -- 19.03.2026
  -- adauga_articol_comanda permite de 2 ori acelasi articol cu cote tva diferite (ex: discount 11% si discount 21%)

  ----------------------------------------------------------------------------------
  procedure adauga_masina(V_ID_MODEL_MASINA IN NUMBER,
                          V_NRINMAT         IN VARCHAR2,
                          V_CULOARE         IN VARCHAR2,
                          V_ID_UTIL         IN NUMBER) is
    V_EXISTA NUMBER(10);
  begin
    SELECT COUNT(*)
      INTO V_EXISTA
      FROM NOM_MASINI
     WHERE NRINMAT = V_NRINMAT
       AND STERS = 0;

    IF V_EXISTA > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o masina cu acest numar de inmatriculare!');
    ELSE
      INSERT INTO NOM_MASINI
        (ID_MODEL_MASINA, NRINMAT, CULOARE)
      VALUES
        (V_ID_MODEL_MASINA, V_NRINMAT, V_CULOARE);
    END IF;
  end adauga_masina;
  ----------------------------------------------------------------------------------
  procedure modifica_masina(V_ID_MASINA       IN NUMBER,
                            V_ID_MODEL_MASINA IN NUMBER,
                            V_NRINMAT         IN VARCHAR2,
                            V_CULOARE         IN VARCHAR2,
                            V_ID_UTIL         IN NUMBER) is
    V_EXISTA NUMBER(10);
  begin
    SELECT COUNT(*)
      INTO V_EXISTA
      FROM NOM_MASINI
     WHERE NRINMAT = V_NRINMAT
       AND STERS = 0
       AND ID_MASINA <> V_ID_MASINA;

    IF V_EXISTA > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o masina cu acest numar de inmatriculare!');
    ELSE
      UPDATE NOM_MASINI
         SET ID_MODEL_MASINA = V_ID_MODEL_MASINA,
             NRINMAT         = V_NRINMAT,
             CULOARE         = V_CULOARE
       WHERE ID_MASINA = V_ID_MASINA;
    END IF;
  end modifica_masina;
  ----------------------------------------------------------------------------------
  procedure sterge_masina(V_ID_MASINA IN NUMBER, V_ID_UTIL IN NUMBER) is
  begin
    -- de adaugat verificari
    UPDATE NOM_MASINI SET STERS = 1 WHERE ID_MASINA = V_ID_MASINA;
  end sterge_masina;
  ----------------------------------------------------------------------------------
  procedure adauga_comanda(V_NR_COMANDA          IN VARCHAR2,
                           V_DATA_COMANDA        IN DATE,
                           V_ID                  IN NUMBER,
                           V_DATA_LIVRARE        IN DATE,
                           V_PROC_DISCOUNT       IN NUMBER,
                           V_INTERNA             IN NUMBER,
                           V_ID_UTIL             IN NUMBER,
                           V_ID_SECTIE           IN NUMBER,
                           V_ID_ADRESA_FACTURARE in NUMBER,
                           V_ID_ADRESA_LIVRARE   in NUMBER,
                           V_ID_CODCLIENT        in number,
                           V_COMANDA_EXTERNA     in varchar2,
                           V_ID_CTR              IN NUMBER) is
    V_ID_COMANDA NUMBER;
  begin
    -- Wrapper pentru compatibilitate - apeleaza versiunea cu OUT parameter
    adauga_comanda(V_NR_COMANDA,
                   V_DATA_COMANDA,
                   V_ID,
                   V_DATA_LIVRARE,
                   V_PROC_DISCOUNT,
                   V_INTERNA,
                   V_ID_UTIL,
                   V_ID_SECTIE,
                   V_ID_ADRESA_FACTURARE,
                   V_ID_ADRESA_LIVRARE,
                   V_ID_CODCLIENT,
                   V_COMANDA_EXTERNA,
                   V_ID_CTR,
                   V_ID_COMANDA);
  end adauga_comanda;

  -- Versiune overloaded care returneaza ID_COMANDA prin OUT parameter (IMPLEMENTAREA PRINCIPALA)
  procedure adauga_comanda(V_NR_COMANDA          IN VARCHAR2,
                           V_DATA_COMANDA        IN DATE,
                           V_ID                  IN NUMBER,
                           V_DATA_LIVRARE        IN DATE,
                           V_PROC_DISCOUNT       IN NUMBER,
                           V_INTERNA             IN NUMBER,
                           V_ID_UTIL             IN NUMBER,
                           V_ID_SECTIE           IN NUMBER,
                           V_ID_ADRESA_FACTURARE in NUMBER,
                           V_ID_ADRESA_LIVRARE   in NUMBER,
                           V_ID_CODCLIENT        in number,
                           V_COMANDA_EXTERNA     in varchar2,
                           V_ID_CTR              IN NUMBER,
                           V_ID_COMANDA          OUT NUMBER) is
    V_NR_INREGISTRARI      NUMBER(10);
    V_NESTERS              NUMBER(1) := 0;
    V_ID_PART              NOM_PARTENERI.ID_PART%TYPE;
    V_ID_GESTIUNE          NOM_GESTIUNI.ID_GESTIUNE%TYPE;
    V_ID_SECTIE2           NOM_SECTII.ID_SECTIE%TYPE;
    V_DATA_LIVRARE2        DATE;
    V_ID_ADRESA_FACTURARE1 NUMBER(10);
    V_ID_ADRESA_LIVRARE1   NUMBER(10);
    V_ID_CODCLIENT1        comenzi.id_codclient%TYPE;
    V_COMANDA_EXTERNA1     comenzi.COMANDA_EXTERNA%TYPE;
    V_ID_SUCURSALA         NOM_SECTII.ID_SUCURSALA%TYPE;
  begin
    SELECT COUNT(*)
      INTO V_NR_INREGISTRARI
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND NR_COMANDA = V_NR_COMANDA;

    IF V_NR_INREGISTRARI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o comanda cu acest numar!');
    END IF;

    IF V_ID_CTR IS NOT NULL THEN
      SELECT COUNT(*)
        INTO V_NR_INREGISTRARI
        FROM CONTRACTE
       WHERE STERS = 0
         AND INCETAT = 0
         AND NVL(DATA_SFARSIT, V_DATA_COMANDA) < V_DATA_COMANDA
         AND ID_CTR = V_ID_CTR
         AND NVL(ID_SUCURSALA, -99) IN
             (SELECT NVL(ID_SUCURSALA, -99)
                FROM NOM_SECTII
               WHERE ID_SECTIE = V_ID_SECTIE);

      IF V_NR_INREGISTRARI > 0 THEN
        RAISE_APPLICATION_ERROR(-20000,
                                'Contractul ales nu este activ la data comenzii!');
      END IF;
    END IF;

    CASE
      WHEN V_INTERNA = 1 THEN
        V_ID_GESTIUNE          := NULL;
        V_ID_PART              := NULL;
        V_DATA_LIVRARE2        := NULL;
        V_ID_SECTIE2           := NULL;
        V_ID_ADRESA_FACTURARE1 := NULL;
        V_ID_ADRESA_LIVRARE1   := NULL;
        V_ID_CODCLIENT1        := 3;
        V_COMANDA_EXTERNA1     := '';
      WHEN V_INTERNA IN (2, 5) THEN
        V_ID_GESTIUNE          := NULL;
        V_ID_PART              := V_ID;
        V_DATA_LIVRARE2        := V_DATA_LIVRARE;
        V_ID_SECTIE2           := NULL;
        V_ID_ADRESA_FACTURARE1 := V_ID_ADRESA_FACTURARE;
        V_ID_ADRESA_LIVRARE1   := V_ID_ADRESA_LIVRARE;
        V_ID_CODCLIENT1        := V_ID_CODCLIENT;
        V_COMANDA_EXTERNA1     := V_COMANDA_EXTERNA;
      WHEN V_INTERNA = 3 THEN
        V_ID_GESTIUNE          := V_ID;
        V_ID_PART              := NULL;
        V_DATA_LIVRARE2        := V_DATA_LIVRARE;
        V_ID_SECTIE2           := NULL;
        V_ID_ADRESA_FACTURARE1 := NULL;
        V_ID_ADRESA_LIVRARE1   := NULL;
        V_ID_CODCLIENT1        := NULL;
        V_COMANDA_EXTERNA1     := '';
      WHEN V_INTERNA = 4 THEN
        V_ID_SECTIE2           := V_ID;
        V_ID_PART              := NULL;
        V_ID_GESTIUNE          := NULL;
        V_DATA_LIVRARE2        := V_DATA_LIVRARE;
        V_ID_ADRESA_FACTURARE1 := NULL;
        V_ID_ADRESA_LIVRARE1   := NULL;
        V_ID_CODCLIENT1        := NULL;
        V_COMANDA_EXTERNA1     := '';
    END CASE;

    SELECT MAX(ID_SUCURSALA)
      INTO V_ID_SUCURSALA
      FROM NOM_SECTII
     WHERE ID_SECTIE = V_ID_SECTIE;

    INSERT INTO COMENZI
      (NR_COMANDA,
       DATA_COMANDA,
       ID_GESTIUNE,
       ID_PART,
       DATA_LIVRARE,
       INTERNA,
       ID_UTIL,
       ID_SECTIE,
       ID_SECTIE2,
       ID_FACTURARE,
       ID_LIVRARE,
       ID_CODCLIENT,
       PROC_DISCOUNT,
       COMANDA_EXTERNA,
       ID_SUCURSALA,
       ID_CTR)
    VALUES
      (V_NR_COMANDA,
       V_DATA_COMANDA,
       V_ID_GESTIUNE,
       V_ID_PART,
       V_DATA_LIVRARE2,
       V_INTERNA,
       V_ID_UTIL,
       V_ID_SECTIE,
       V_ID_SECTIE2,
       V_ID_ADRESA_FACTURARE1,
       V_ID_ADRESA_LIVRARE1,
       V_ID_CODCLIENT1,
       V_PROC_DISCOUNT,
       V_COMANDA_EXTERNA1,
       V_ID_SUCURSALA,
       V_ID_CTR)
    RETURNING ID_COMANDA INTO V_ID_COMANDA;
  end adauga_comanda;
  ----------------------------------------------------------------------------------
  procedure modifica_comanda(V_ID_COMANDA       IN NUMBER,
                             V_NR_COMANDA       IN VARCHAR2,
                             V_DATA_COMANDA     IN DATE,
                             V_ID               IN NUMBER,
                             V_DATA_LIVRARE     IN DATE,
                             V_PROC_DISCOUNT    IN NUMBER,
                             V_INTERNA          IN NUMBER,
                             V_ID_UTIL          IN NUMBER,
                             V_ADRESA_FACTURARE in number,
                             V_ADRESA_LIVRARE   in number,
                             V_ID_CODCLIENT     in number,
                             V_COMANDA_EXTERNA  in varchar2,
                             V_ID_CTR           IN NUMBER) is
    V_NR_INREGISTRARI     NUMBER(10);
    V_NESTERS             NUMBER(1) := 0;
    V_ID_PART             NOM_PARTENERI.ID_PART%TYPE;
    V_ID_GESTIUNE         NOM_GESTIUNI.ID_GESTIUNE%TYPE;
    V_DATA_LIVRARE2       DATE;
    V_ID_SECTIE           NOM_SECTII.ID_SECTIE%TYPE;
    V_ID_SECTIE2          NOM_SECTII.ID_SECTIE%TYPE;
    V_ADRESA_FACTURARE1   number(5);
    V_ADRESA_LIVRARE1     number(5);
    V_ADRESA_FACTURAREold number(5);
    V_ADRESA_LIVRAREold   number(5);
    V_ID_CODCLIENT1       number(5);
    V_COMANDA_EXTERNA1    varchar(50);
  begin
    SELECT COUNT(*)
      INTO V_NR_INREGISTRARI
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND NR_COMANDA = V_NR_COMANDA
       AND ID_COMANDA <> V_ID_COMANDA;

    IF V_NR_INREGISTRARI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o comanda cu acest numar!');
    END IF;

    IF V_ID_CTR IS NOT NULL THEN
      SELECT COUNT(*)
        INTO V_NR_INREGISTRARI
        FROM CONTRACTE
       WHERE STERS = 0
         AND INCETAT = 0
         AND NVL(DATA_SFARSIT, V_DATA_COMANDA) < V_DATA_COMANDA
         AND ID_CTR = V_ID_CTR
         AND NVL(ID_SUCURSALA, -99) IN
             (SELECT NVL(ID_SUCURSALA, -99)
                FROM NOM_SECTII
               WHERE ID_SECTIE = V_ID_SECTIE);

      IF V_NR_INREGISTRARI > 0 THEN
        RAISE_APPLICATION_ERROR(-20000,
                                'Contractul ales nu este activ la data comenzii!');
      END IF;
    END IF;

    SELECT ID_SECTIE
      INTO V_ID_SECTIE
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND ID_COMANDA = V_ID_COMANDA;

    SELECT ID_FACTURARE, ID_LIVRARE, ID_CODCLIENT, COMANDA_EXTERNA
      INTO V_ADRESA_FACTURAREold,
           V_ADRESA_LIVRAREold,
           V_ID_CODCLIENT1,
           V_COMANDA_EXTERNA1
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND ID_COMANDA = V_ID_COMANDA;

    CASE
      WHEN V_INTERNA = 1 THEN
        V_ID_GESTIUNE       := NULL;
        V_ID_PART           := NULL;
        V_DATA_LIVRARE2     := NULL;
        V_ID_SECTIE2        := NULL;
        V_ADRESA_FACTURARE1 := V_ADRESA_FACTURAREold;
        V_ADRESA_LIVRARE1   := V_ADRESA_LIVRAREold;
      WHEN V_INTERNA IN (2, 5) THEN
        V_ID_GESTIUNE       := NULL;
        V_ID_PART           := V_ID;
        V_DATA_LIVRARE2     := V_DATA_LIVRARE;
        V_ID_SECTIE2        := NULL;
        V_ADRESA_FACTURARE1 := V_ADRESA_FACTURARE;
        V_ADRESA_LIVRARE1   := V_ADRESA_LIVRARE;
        V_ID_CODCLIENT1     := V_ID_CODCLIENT;
        V_COMANDA_EXTERNA1  := V_COMANDA_EXTERNA;

      WHEN V_INTERNA = 3 THEN
        V_ID_GESTIUNE       := V_ID;
        V_ID_PART           := NULL;
        V_DATA_LIVRARE2     := V_DATA_LIVRARE;
        V_ID_SECTIE2        := NULL;
        V_ADRESA_FACTURARE1 := V_ADRESA_FACTURAREold;
        V_ADRESA_LIVRARE1   := V_ADRESA_LIVRAREold;
      WHEN V_INTERNA = 4 THEN
        V_ID_SECTIE2        := V_ID;
        V_ID_PART           := NULL;
        V_ID_GESTIUNE       := NULL;
        V_DATA_LIVRARE2     := V_DATA_LIVRARE;
        V_ADRESA_FACTURARE1 := V_ADRESA_FACTURAREold;
        V_ADRESA_LIVRARE1   := V_ADRESA_LIVRAREold;
    END CASE;

    UPDATE COMENZI
       SET NR_COMANDA      = V_NR_COMANDA,
           DATA_COMANDA    = V_DATA_COMANDA,
           ID_PART         = V_ID_PART,
           ID_GESTIUNE     = V_ID_GESTIUNE,
           DATA_LIVRARE    = V_DATA_LIVRARE2,
           PROC_DISCOUNT   = V_PROC_DISCOUNT,
           INTERNA         = V_INTERNA,
           ID_SECTIE2      = V_ID_SECTIE2,
           ID_FACTURARE    = V_ADRESA_FACTURARE1,
           ID_LIVRARE      = V_ADRESA_LIVRARE1,
           ID_CODCLIENT    = V_ID_CODCLIENT1,
           COMANDA_EXTERNA = V_COMANDA_EXTERNA1,
           ID_CTR          = V_ID_CTR,
           ID_UTIL_UM      = V_ID_UTIL,
           DATAORA_UM      = SYSDATE
     WHERE ID_COMANDA = V_ID_COMANDA;

    UPDATE COMENZI_ELEMENTE
       SET DISCOUNT_UNITAR = ROUND(PRET * (V_PROC_DISCOUNT / 100),
                                   pack_sesiune.getoptiunefirma('PPRETV'))
     WHERE ID_COMANDA = V_ID_COMANDA;

    pack_comenzi.actualizeaza_lucrare(V_ID_COMANDA, V_ID_UTIL, V_ID_SECTIE);
  end modifica_comanda;
  ----------------------------------------------------------------------------------
  procedure sterge_comanda(V_ID_COMANDA IN NUMBER, V_ID_UTIL IN NUMBER) is
    V_DATAORAS  DATE := SYSDATE;
    V_STERS     NUMBER(1) := 1;
    V_NESTERS   NUMBER(1) := 0;
    V_ID_SECTIE NUMBER(5) := 0;
  begin
    UPDATE COMENZI_ELEMENTE
       SET STERS = V_STERS, ID_UTILS = V_ID_UTIL, DATAORAS = V_DATAORAS
     WHERE ID_COMANDA = V_ID_COMANDA
       AND STERS = V_NESTERS;

    SELECT ID_SECTIE
      INTO V_ID_SECTIE
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND ID_COMANDA = V_ID_COMANDA;

    UPDATE COMENZI
       SET STERS = V_STERS, ID_UTILS = V_ID_UTIL, DATAORAS = V_DATAORAS
     WHERE ID_COMANDA = V_ID_COMANDA
       AND STERS = V_NESTERS;

    pack_comenzi.actualizeaza_lucrare(V_ID_COMANDA, V_ID_UTIL, V_ID_SECTIE);
  end sterge_comanda;
  ----------------------------------------------------------------------------------
  procedure cauta_contract_comanda(V_DATA_COMANDA IN DATE,
                                   V_ID_PART      IN NUMBER,
                                   V_ID_SUCURSALA IN NUMBER,
                                   V_ID_CTR       OUT NUMBER,
                                   V_NUMAR_CTR    OUT VARCHAR2) is
  begin
    begin
      select id_ctr as id,
             numar || '/' || to_char(data, 'DD.MM.YYYY') as data
        into V_ID_CTR, V_NUMAR_CTR
        from contracte
       where id_part = V_ID_PART
         and incetat = 0
         and sters = 0
         and NVL(DATA_SFARSIT, V_DATA_COMANDA) >= V_DATA_COMANDA
         and tip_istoric = 'C'
         and NVL2(V_ID_SUCURSALA, ID_SUCURSALA, -99) =
             NVL(V_ID_SUCURSALA, -99);
    exception
      when NO_DATA_FOUND then
        V_NUMAR_CTR := NULL;
        V_ID_CTR    := NULL;
      when TOO_MANY_ROWS then
        V_NUMAR_CTR := NULL;
        V_ID_CTR    := NULL;
    end;

  end cauta_contract_comanda;
  ----------------------------------------------------------------------------------
  procedure adauga_articol_comanda(V_ID_COMANDA IN NUMBER,
                                   V_ID_ARTICOL IN NUMBER,
                                   V_ID_POL     IN NUMBER,
                                   V_CANTITATE  IN NUMBER,
                                   V_ID_UTIL    IN NUMBER,
                                   V_ID_SECTIE  IN NUMBER) is
    V_PRET CRM_POLITICI_PRET_ART.PRET%TYPE;
    V_PTVA COMENZI_ELEMENTE.PTVA%TYPE;
  begin
    adauga_articol_comanda(V_ID_COMANDA,
                           V_ID_ARTICOL,
                           V_ID_POL,
                           V_CANTITATE,
                           V_PRET,
                           V_ID_UTIL,
                           V_ID_SECTIE,
                           V_PTVA);
  end adauga_articol_comanda;

  procedure adauga_articol_comanda(V_ID_COMANDA IN NUMBER,
                                   V_ID_ARTICOL IN NUMBER,
                                   V_ID_POL     IN NUMBER,
                                   V_CANTITATE  IN NUMBER,
                                   V_PRET       IN NUMBER,
                                   V_ID_UTIL    IN NUMBER,
                                   V_ID_SECTIE  IN NUMBER,
                                   V_PTVA       IN NUMBER DEFAULT NULL) is
    V_PRET2           CRM_POLITICI_PRET_ART.PRET%TYPE;
    V_ID_VALUTA       NOM_VALUTE.ID_VALUTA%TYPE;
    V_PRET_CU_TVA     CRM_POLITICI_PRETURI.PRETURI_CU_TVA%TYPE;
    V_DISCOUNT_UNITAR COMENZI_ELEMENTE.DISCOUNT_UNITAR%TYPE := 0;

    V_NR_INREG NUMBER(2);
    V_DENUMIRE NOM_ARTICOLE.DENUMIRE%TYPE;
  begin
    begin
      SELECT A.PRET, A.ID_VALUTA, B.PRETURI_CU_TVA
        INTO V_PRET2, V_ID_VALUTA, V_PRET_CU_TVA
        FROM CRM_POLITICI_PRET_ART A
        LEFT JOIN CRM_POLITICI_PRETURI B
          ON A.ID_POL = B.ID_POL
       WHERE A.ID_POL = V_ID_POL
         AND A.ID_ARTICOL = V_ID_ARTICOL;
    exception
      when NO_DATA_FOUND then
        RAISE_APPLICATION_ERROR(-20000,
                                'Pretul pentru acest articol nu a fost gasit in lista de preturi! (COM-001)');
    end;

    IF V_PRET IS NOT NULL THEN
      V_PRET2 := V_PRET;
    END IF;

    SELECT COUNT(*)
      INTO V_NR_INREG
      FROM COMENZI_ELEMENTE
     WHERE ID_COMANDA = V_ID_COMANDA
       AND ID_ARTICOL = V_ID_ARTICOL
       AND NVL(PTVA,0) = NVL(V_PTVA,0)
       AND PRET = V_PRET2
       AND SIGN(CANTITATE) = SIGN(V_CANTITATE)
       AND STERS = 0;

    IF V_NR_INREG > 0 THEN
      SELECT DENUMIRE
        INTO V_DENUMIRE
        FROM NOM_ARTICOLE
       WHERE ID_ARTICOL = V_ID_ARTICOL;

      RAISE_APPLICATION_ERROR(-20000,
                              'Articolul ' || V_DENUMIRE ||
                              ' a fost deja introdus pe aceasta comanda! Deschideti o alta instanta a programului de comenzi si verificati inainte sa reincercati salvarea datelor actuale!');
    END IF;

    INSERT INTO COMENZI_ELEMENTE
      (ID_COMANDA,
       ID_ARTICOL,
       ID_POL,
       PRET,
       DISCOUNT_UNITAR,
       CANTITATE,
       ID_VALUTA,
       PRET_CU_TVA,
       ID_SECTIE,
       PTVA)
    VALUES
      (V_ID_COMANDA,
       V_ID_ARTICOL,
       V_ID_POL,
       V_PRET2,
       V_DISCOUNT_UNITAR,
       V_CANTITATE,
       V_ID_VALUTA,
       V_PRET_CU_TVA,
       V_ID_SECTIE,
       V_PTVA);

  end adauga_articol_comanda;
  ----------------------------------------------------------------------------------
  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_ID_UTIL            IN NUMBER) is
  begin
    UPDATE COMENZI_ELEMENTE
       SET CANTITATE = V_CANTITATE
     WHERE ID_COMANDA_ELEMENT = V_ID_COMANDA_ELEMENT;
  end modifica_articol_comanda;

  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_PRET               IN NUMBER,
                                     V_ID_UTIL            IN NUMBER) is
  begin
    UPDATE COMENZI_ELEMENTE
       SET CANTITATE = V_CANTITATE, PRET = V_PRET
     WHERE ID_COMANDA_ELEMENT = V_ID_COMANDA_ELEMENT;
  end modifica_articol_comanda;

  procedure modifica_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                     V_CANTITATE          IN NUMBER,
                                     V_PRET               IN NUMBER,
                                     V_PTVA               IN NUMBER,
                                     V_ID_UTIL            IN NUMBER) is
  begin
    UPDATE COMENZI_ELEMENTE
       SET CANTITATE = V_CANTITATE, PRET = V_PRET, PTVA = V_PTVA
     WHERE ID_COMANDA_ELEMENT = V_ID_COMANDA_ELEMENT;
  end modifica_articol_comanda;


  ----------------------------------------------------------------------------------
  /*  procedure sterge_articol_comanda(V_ID_COMANDA IN NUMBER,
                                   V_ID_ARTICOL IN NUMBER,
                                   V_ID_POL     IN NUMBER,
                                   V_ID_UTIL    IN NUMBER) is
    V_STERS    NUMBER(1) := 1;
    V_DATAORAS DATE := SYSDATE;
  begin
    UPDATE COMENZI_ELEMENTE
       SET STERS = V_STERS, DATAORAS = V_DATAORAS, ID_UTILS = V_ID_UTIL
     WHERE ID_COMANDA = V_ID_COMANDA
       AND ID_ARTICOL = V_ID_ARTICOL
       AND ID_POL = V_ID_POL
       AND STERS = 0;
  end sterge_articol_comanda;*/
  procedure sterge_articol_comanda(V_ID_COMANDA_ELEMENT IN NUMBER,
                                   V_ID_UTIL            IN NUMBER) is
    V_STERS    NUMBER(1) := 1;
    V_DATAORAS DATE := SYSDATE;
  begin
    UPDATE COMENZI_ELEMENTE
       SET STERS = V_STERS, DATAORAS = V_DATAORAS, ID_UTILS = V_ID_UTIL
     WHERE ID_COMANDA_ELEMENT = V_ID_COMANDA_ELEMENT
       AND STERS = 0;
  end sterge_articol_comanda;
  ----------------------------------------------------------------------------------
  procedure adauga_lucrare_pe_comanda(V_ID_COMANDA IN NUMBER,
                                      V_ID_LUCRARE IN NUMBER,
                                      V_ID_UTIL    IN NUMBER,
                                      V_ID_SECTIE  IN NUMBER) is
    V_ID_LUCRARE_VECHE NOM_LUCRARI.ID_LUCRARE%TYPE;
  begin
    SELECT ID_LUCRARE
      INTO V_ID_LUCRARE_VECHE
      FROM COMENZI
     WHERE ID_COMANDA = V_ID_COMANDA;

    UPDATE COMENZI
       SET ID_LUCRARE = V_ID_LUCRARE
     WHERE ID_COMANDA = V_ID_COMANDA;

    IF V_ID_LUCRARE_VECHE IS NOT NULL THEN
      pack_comenzi.actualizeaza_articole_lucrare(V_ID_LUCRARE_VECHE,
                                                 V_ID_UTIL,
                                                 V_ID_SECTIE);
    END IF;
  end;
  ----------------------------------------------------------------------------------
  procedure adauga_lucrare_pe_comenzi(V_SIR_COMENZI IN VARCHAR2,
                                      V_ID_LUCRARE  IN NUMBER,
                                      V_ID_UTIL     IN NUMBER,
                                      V_ID_SECTIE   IN NUMBER) is
    V_ID_COMANDA  COMENZI.ID_COMANDA%TYPE;
    V_LUNGIME_SIR NUMBER(10);
  begin
    V_LUNGIME_SIR := SIR_IN_SIR(V_SIR_COMENZI, ';');

    FOR i IN 1 .. V_LUNGIME_SIR LOOP
      V_ID_COMANDA := TO_NUMBER(ELEMENT_DIN_SIR(V_SIR_COMENZI, ';', i));
      pack_comenzi.adauga_lucrare_pe_comanda(V_ID_COMANDA,
                                             V_ID_LUCRARE,
                                             V_ID_UTIL,
                                             V_ID_SECTIE);
    END LOOP;

    pack_comenzi.actualizeaza_articole_lucrare(V_ID_LUCRARE,
                                               V_ID_UTIL,
                                               V_ID_SECTIE);
  end;
  ----------------------------------------------------------------------------------
  procedure livreaza_comanda(V_ID_COMANDA  IN NUMBER,
                             V_ID_AGENT    IN NUMBER,
                             V_ID_DELEGAT  IN NUMBER,
                             V_ID_MASINA   IN NUMBER,
                             V_DATA_LIVRAT IN DATE,
                             V_ID_UTIL     IN NUMBER,
                             V_NR_LIVRARE  OUT VARCHAR2) is
    V_ID_PART NOM_PARTENERI.ID_PART%TYPE;
  begin
    V_NR_LIVRARE := genereaza_nr_livrare();
    UPDATE COMENZI
       SET ID_AGENT    = V_ID_AGENT,
           ID_DELEGAT  = V_ID_DELEGAT,
           ID_MASINA   = V_ID_MASINA,
           DATA_LIVRAT = V_DATA_LIVRAT,
           NR_LIVRARE  = V_NR_LIVRARE
     WHERE ID_COMANDA = V_ID_COMANDA
    RETURNING ID_PART INTO V_ID_PART;

    IF V_ID_PART IS NOT NULL THEN
      MERGE INTO CORESP_DELEGATI_PART A
      USING dual
      ON (A.ID_PART = V_ID_PART AND A.ID_DELEGAT = V_ID_DELEGAT)
      WHEN NOT MATCHED THEN
        INSERT (ID_PART, ID_DELEGAT) VALUES (V_ID_PART, V_ID_DELEGAT);
    END IF;
  end;
  ----------------------------------------------------------------------------------
  procedure genereaza_lucrare(V_DATA_LUCRARE IN DATE,
                              V_ORE_EXECUTIE IN NUMBER,
                              V_ID_UTIL      IN NUMBER,
                              V_ID_SECTIE    IN NUMBER,
                              V_NRORD        OUT VARCHAR2,
                              V_ID_LUCRARE   OUT NUMBER) is
    V_DATAORA DATE;
  begin
    pack_sesiune.set_id_sectie_comenzi(V_ID_SECTIE);
    V_DATAORA := sysdate;

    begin
      select a.csectie || to_char(NVL(V_DATA_LUCRARE, V_DATAORA), 'DDMMYY') || '-' ||
             (select count(*) + 1 as nr
                from nom_lucrari
               where nrord like
                     a.csectie ||
                     to_char(NVL(V_DATA_LUCRARE, V_DATAORA), 'DDMMYY') || '%'
                 and sters = 0)
        INTO V_NRORD
        from nom_sectii a
       where a.id_sectie = V_ID_SECTIE;
    exception
      WHEN NO_DATA_FOUND THEN
        select to_char(NVL(V_DATA_LUCRARE, V_DATAORA), 'DDMMYY') || '-' ||
               (count(*) + 1)
          INTO V_NRORD
          from nom_lucrari
         where nrord like
               to_char(NVL(V_DATA_LUCRARE, V_DATAORA), 'DDMMYY') || '%'
           and sters = 0;
    end;

    INSERT INTO NOM_LUCRARI
      (NRORD)
    VALUES
      (V_NRORD)
    RETURNING ID_LUCRARE INTO V_ID_LUCRARE;

    INSERT INTO LUCRARI_DETALII
      (ID_LUCRARE, DATA_LUCRARE, TERMEN_EXECUTIE, ID_UTIL, ID_SECTIE)
    VALUES
      (V_ID_LUCRARE,
       NVL(V_DATA_LUCRARE, V_DATAORA),
       NVL(V_DATA_LUCRARE, V_DATAORA) +
       GREATEST((pack_comenzi.citeste_ore_inchidere(V_ID_SECTIE) / 24) + 0.5,
                NVL(V_ORE_EXECUTIE, 1),
                1),
       V_ID_UTIL,
       V_ID_SECTIE);

  end genereaza_lucrare;
  ----------------------------------------------------------------------------------
  procedure adauga_lucrare(V_NRORD           IN VARCHAR2,
                           V_DATA_LUCRARE    IN DATE,
                           V_EXPLICATIE      IN VARCHAR2,
                           V_TERMEN_EXECUTIE IN DATE,
                           V_ID_UTIL         IN NUMBER,
                           V_ID_SECTIE       IN NUMBER) is

    V_NR_LUCRARI           NUMBER(10);
    V_NESTERS              NUMBER := 0;
    V_ID_LUCRARE           NOM_LUCRARI.ID_LUCRARE%TYPE;
    V_DATA_LUCRARE_INCHISA DATE;
  begin
    pack_sesiune.set_id_sectie_comenzi(V_ID_SECTIE);

    SELECT COUNT(*)
      INTO V_NR_LUCRARI
      FROM NOM_LUCRARI
     WHERE STERS = V_NESTERS
       AND NRORD = V_NRORD;

    IF V_NR_LUCRARI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o lucrare cu acest numar!');
    END IF;

    V_DATA_LUCRARE_INCHISA := sysdate +
                              (pack_comenzi.citeste_ore_inchidere(V_ID_SECTIE) / 24);

    IF V_TERMEN_EXECUTIE <= V_DATA_LUCRARE_INCHISA THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Termenul de executie trebuie sa fie mai mare de ' ||
                              to_char(V_DATA_LUCRARE_INCHISA,
                                      'DD/MM/YYYY HH24:MI') ||
                              ' pentru ca sa puteti adauga comenzi pe aceasta lucrare!');
    END IF;

    INSERT INTO NOM_LUCRARI
      (NRORD)
    VALUES
      (V_NRORD)
    RETURNING ID_LUCRARE INTO V_ID_LUCRARE;

    INSERT INTO LUCRARI_DETALII
      (ID_LUCRARE,
       DATA_LUCRARE,
       EXPLICATIE,
       TERMEN_EXECUTIE,
       ID_UTIL,
       ID_SECTIE)
    VALUES
      (V_ID_LUCRARE,
       V_DATA_LUCRARE,
       V_EXPLICATIE,
       V_TERMEN_EXECUTIE,
       V_ID_UTIL,
       V_ID_SECTIE);
  end adauga_lucrare;
  ----------------------------------------------------------------------------------
  procedure modifica_lucrare(V_ID_LUCRARE      IN NUMBER,
                             V_NRORD           IN VARCHAR2,
                             V_DATA_LUCRARE    IN DATE,
                             V_EXPLICATIE      IN VARCHAR2,
                             V_TERMEN_EXECUTIE IN DATE,
                             V_ID_UTIL         IN NUMBER) is
    V_NR_LUCRARI NUMBER(10);
    V_NR_COMENZI NUMBER(10);
    V_NESTERS    NUMBER := 0;
  begin
    SELECT COUNT(*)
      INTO V_NR_LUCRARI
      FROM NOM_LUCRARI
     WHERE STERS = V_NESTERS
       AND NRORD = V_NRORD
       AND ID_LUCRARE <> V_ID_LUCRARE;

    IF V_NR_LUCRARI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Mai exista o lucrare cu acest numar!');
    END IF;

    SELECT COUNT(*)
      INTO V_NR_COMENZI
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND ID_LUCRARE = V_ID_LUCRARE
       AND DATA_COMANDA > V_TERMEN_EXECUTIE;

    IF V_NR_COMENZI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Exista ' || V_NR_COMENZI ||
                              ' comenzi cu data mai mare decat termenul de executie al lucrarii!');
    END IF;

    UPDATE NOM_LUCRARI SET NRORD = V_NRORD WHERE ID_LUCRARE = V_ID_LUCRARE;

    UPDATE LUCRARI_DETALII
       SET DATA_LUCRARE    = V_DATA_LUCRARE,
           EXPLICATIE      = V_EXPLICATIE,
           TERMEN_EXECUTIE = V_TERMEN_EXECUTIE
     WHERE ID_LUCRARE = V_ID_LUCRARE;
  end modifica_lucrare;
  ----------------------------------------------------------------------------------
  procedure sterge_lucrare(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER) is
    /*    V_NR_COMENZI NUMBER(10);
    V_STERS      NUMBER(1) := 1;
    V_NESTERS    NUMBER(1) := 0;*/
    V_STERS           NUMBER(1) := 1;
    V_LOOKUP          VARCHAR2(100);
    V_NR_INREGISTRARI NUMBER(5);
  begin
    /*    V_LOOKUP := 'COMENZI.ID_LUCRARE;RUL.ID_LUCRARE;';

    nomdelprocn(USER, 'NOM_LUCRARI', 'ID_LUCRARE', V_ID_LUCRARE, V_LOOKUP);*/

    SELECT SUM(NR)
      INTO V_NR_INREGISTRARI
      FROM (SELECT COUNT(*) AS NR
              FROM COMENZI
             WHERE ID_LUCRARE = V_ID_LUCRARE
               AND STERS = 0
            /* UNION ALL
            SELECT COUNT(*)
              FROM RUL
             WHERE ID_LUCRARE = V_ID_LUCRARE
               AND STERS = 0
            UNION ALL
            SELECT COUNT(*)
              FROM ACT
             WHERE ID_LUCRARE = V_ID_LUCRARE
               AND STERS = 0*/
            );

    IF V_NR_INREGISTRARI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Nu se pot sterge detaliile, deoarece mai exista comenzi pe lucrare!');
    END IF;

    UPDATE LUCRARI_DETALII
       SET STERS = V_STERS
     WHERE ID_LUCRARE = V_ID_LUCRARE;
    /*    SELECT COUNT(*)
      INTO V_NR_COMENZI
      FROM COMENZI
     WHERE STERS = V_NESTERS
       AND ID_LUCRARE = V_ID_LUCRARE;

    IF V_NR_COMENZI > 0 THEN
      RAISE_APPLICATION_ERROR(-20000, 'Pe aceasta lucrare exista comenzi!');
    END IF;

    UPDATE NOM_LUCRARI SET STERS = V_STERS WHERE ID_LUCRARE = V_ID_LUCRARE;

    UPDATE LUCRARI_DETALII
       SET STERS = V_STERS
     WHERE ID_LUCRARE = V_ID_LUCRARE;*/
  end sterge_lucrare;
  ----------------------------------------------------------------------------------
  procedure actualizeaza_lucrare(V_ID_COMANDA IN NUMBER,
                                 V_ID_UTIL    IN NUMBER,
                                 V_ID_SECTIE  IN NUMBER) is
    V_ID_LUCRARE NOM_LUCRARI.ID_LUCRARE%TYPE;
    V_NESTERS    NUMBER(1) := 0;
  begin
    SELECT ID_LUCRARE
      INTO V_ID_LUCRARE
      FROM COMENZI
     WHERE ID_COMANDA = V_ID_COMANDA;

    IF V_ID_LUCRARE IS NOT NULL THEN
      pack_comenzi.actualizeaza_articole_lucrare(V_ID_LUCRARE,
                                                 V_ID_UTIL,
                                                 V_ID_SECTIE);
    END IF;

  end actualizeaza_lucrare;
  ----------------------------------------------------------------------------------
  procedure actualizeaza_articole_lucrare(V_ID_LUCRARE IN NUMBER,
                                          V_ID_UTIL    IN NUMBER,
                                          V_ID_SECTIE  IN NUMBER) is
    V_NESTERS     NUMBER(1) := 0;
    V_ID_POL      NUMBER(10);
    V_ACTIVA      NUMBER(1);
    V_EXISTA      NUMBER(1);
    V_ACTIVA_UTIL NUMBER(1);
    V_OPTIUNE     VARCHAR2(100);
  begin
    V_OPTIUNE := 'ID_LISTA_PRETURI_PV';

    pack_preturi.optiune_polpret_utilizator_sec(V_ID_UTIL,
                                                V_ID_SECTIE,
                                                V_OPTIUNE,
                                                V_ID_POL);

    DELETE FROM LUCRARI_ELEMENTE WHERE ID_LUCRARE = V_ID_LUCRARE;

    INSERT INTO LUCRARI_ELEMENTE
      (ID_LUCRARE,
       ID_ARTICOL,
       ID_POL,
       PRET,
       DISCOUNT_UNITAR,
       CANTITATE,
       ID_SECTIE)
      SELECT V_ID_LUCRARE AS ID_LUCRARE,
             A.ID_ARTICOL,
             V_ID_POL AS ID_POL,
             B.PRET,
             A.DISCOUNT_UNITAR,
             SUM(A.CANTITATE) AS CANTITATE,
             V_ID_SECTIE AS ID_SECTIE
        FROM COMENZI_ELEMENTE A
        LEFT JOIN CRM_POLITICI_PRET_ART B
          ON A.ID_ARTICOL = B.ID_ARTICOL
         AND B.ID_POL = V_ID_POL
        LEFT JOIN NOM_ARTICOLE C
          ON B.ID_ARTICOL = C.ID_ARTICOL
       WHERE A.ID_COMANDA IN
             (SELECT ID_COMANDA
                FROM COMENZI
               WHERE ID_LUCRARE = V_ID_LUCRARE
                 AND STERS = V_NESTERS
                 AND ID_SECTIE = V_ID_SECTIE)
         AND A.STERS = V_NESTERS
         AND C.IN_STOC = 1
       GROUP BY A.ID_ARTICOL, B.ID_POL, B.PRET, A.DISCOUNT_UNITAR;
  end actualizeaza_articole_lucrare;
  ----------------------------------------------------------------------------------
  procedure adauga_loturi(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER) is
    cursor crs is
      SELECT A.ID_ARTICOL,
             A.CANTITATE,
             A.ID_POL,
             A.PRET,
             A.DISCOUNT_UNITAR,
             A.ID_SECTIE,
             B.CODMAT
        FROM LUCRARI_ELEMENTE A
        LEFT JOIN NOM_ARTICOLE B
          ON A.ID_ARTICOL = B.ID_ARTICOL
       WHERE A.ID_LUCRARE = V_ID_LUCRARE;

    crs_linie crs%rowtype;
    V_ID_LOT  NOM_LUCRARI.ID_LUCRARE%TYPE;
  begin
    UPDATE LUCRARI_ELEMENTE
       SET CANTITATE = 0
     WHERE ID_LUCRARE IN
           (SELECT ID_LUCRARE FROM NOM_LUCRARI WHERE ID_TATA = V_ID_LUCRARE);

    open crs;
    loop
      fetch crs
        into crs_linie;
      exit when crs%notfound;

      begin
        SELECT ID_LUCRARE
          INTO V_ID_LOT
          FROM NOM_LUCRARI
         WHERE ID_TATA = V_ID_LUCRARE
           AND NVL(NRORD, '~!') = NVL(crs_linie.codmat, '~!')
           AND STERS = 0;
      exception
        when NO_DATA_FOUND then
          INSERT INTO NOM_LUCRARI
            (NRORD, ID_TATA)
          VALUES
            (crs_linie.codmat, V_ID_LUCRARE)
          RETURNING ID_LUCRARE INTO V_ID_LOT;
      end;

      MERGE INTO LUCRARI_ELEMENTE A
      USING DUAL B
      ON (A.ID_LUCRARE = V_ID_LOT AND A.ID_ARTICOL = crs_linie.id_articol AND A.ID_POL = crs_linie.id_pol AND A.PRET = crs_linie.pret AND NVL(A.ID_SECTIE, -100) = NVL(crs_linie.id_sectie, -100))
      WHEN MATCHED THEN
        UPDATE SET CANTITATE = crs_linie.cantitate
      WHEN NOT MATCHED THEN
        INSERT
          (ID_LUCRARE,
           ID_ARTICOL,
           CANTITATE,
           ID_POL,
           PRET,
           DISCOUNT_UNITAR,
           ID_SECTIE)
        VALUES
          (V_ID_LOT,
           crs_linie.id_articol,
           crs_linie.cantitate,
           crs_linie.id_pol,
           crs_linie.pret,
           crs_linie.discount_unitar,
           crs_linie.id_sectie);

    end loop;

    close crs;
  end adauga_loturi;
  ----------------------------------------------------------------------------------
  procedure sterge_loturi(V_ID_LUCRARE IN NUMBER, V_ID_UTIL IN NUMBER) is
  begin
    DELETE FROM LUCRARI_ELEMENTE
     WHERE ID_LUCRARE IN
           (SELECT ID_LUCRARE FROM NOM_LUCRARI WHERE ID_TATA = V_ID_LUCRARE);

    UPDATE NOM_LUCRARI SET STERS = 1 WHERE ID_TATA = V_ID_LUCRARE;
  end sterge_loturi;
  ----------------------------------------------------------------------------------
  /*function citeste_ore_inchidere return number is
    V_NR_ORE NUMBER(2);
  begin
    begin
      SELECT TO_NUMBER(VARVALUE)
        INTO V_NR_ORE
        FROM OPTIUNI
       WHERE VARNAME = 'ORE_INCHIDERE';
    exception
      WHEN NO_DATA_FOUND THEN
        raise_application_error(-20000,
                                'Nu este setata perioada de dinaintea termenului de executie pentru care o lucrare este considerata inchisa!');
    end;
    return V_NR_ORE;
  end;*/
  ----------------------------------------------------------------------------------
  function genereaza_nr_comanda return varchar2 is
    V_NR_COMANDA COMENZI.NR_COMANDA%TYPE;
  begin
    SELECT TO_CHAR(SEQ_NR_COMANDA.NEXTVAL) INTO V_NR_COMANDA FROM DUAL;
    return V_NR_COMANDA;
  end;
  ----------------------------------------------------------------------------------
  function genereaza_nr_lucrare return varchar2 is
    V_NRORD      NOM_LUCRARI.NRORD%TYPE;
    V_VALIDAT    NUMBER(1);
    V_NESTERS    NUMBER(1) := 0;
    V_NR_LUCRARI NUMBER(10);
  begin
    V_VALIDAT := 1;
    LOOP
      SELECT TO_CHAR(SEQ_NR_LUCRARE.NEXTVAL) INTO V_NRORD FROM DUAL;

      SELECT COUNT(*)
        INTO V_NR_LUCRARI
        FROM NOM_LUCRARI
       WHERE STERS = V_NESTERS
         AND NRORD = V_NRORD;

      IF V_NR_LUCRARI > 0 THEN
        V_VALIDAT := 0;
      ELSE
        V_VALIDAT := 1;
      END IF;

      EXIT WHEN V_VALIDAT = 1;
    END LOOP;
    return V_NRORD;
  end;
  ----------------------------------------------------------------------------------
  function genereaza_nr_livrare return varchar2 is
    V_NR_LIVRARE NOM_LUCRARI.NRORD%TYPE;
  begin
    SELECT TO_CHAR(SEQ_NR_LIVRARE.NEXTVAL) INTO V_NR_LIVRARE FROM DUAL;
    return V_NR_LIVRARE;
  end;
  ----------------------------------------------------------------------------------
  procedure copiaza_comanda(V_ID_COMANDA     IN NUMBER,
                            V_OPTIUNE_CANT   IN NUMBER,
                            V_ID_UTIL        IN NUMBER,
                            V_ID_COMANDA_NOU OUT NUMBER) is

    V_NR_COMANDA       varchar2(100);
    V_DATA_COMANDA     date;
    V_ID_PART          NOM_PARTENERI.ID_PART%TYPE;
    V_ID_GESTIUNE      NOM_GESTIUNI.ID_GESTIUNE%TYPE;
    V_DATA_LIVRARE     date;
    V_INTERNA          number(1);
    V_OPTIUNE          OPTIUNI.VARNAME%TYPE;
    V_COPIERECANTITATE NUMBER(1);
    V_ID_POL           CRM_POLITICI_PRETURI.ID_POL%TYPE;
    V_ID_SECTIE        NOM_SECTII.ID_SECTIE%TYPE;
    V_ID_SECTIE2       NOM_SECTII.ID_SECTIE%TYPE;
    V_ID_LIVRARE       ADRESE_PARTENERI.ID_ADRESA%TYPE;
    V_ID_FACTURARE     ADRESE_PARTENERI.ID_ADRESA%TYPE;
    V_ID_CODCLIENT     COMENZI.ID_CODCLIENT%TYPE;
    V_ID_SUCURSALA     SYN_NOM_FIRME.ID_FIRMA%TYPE;
    V_PROC_DISCOUNT    COMENZI.PROC_DISCOUNT%TYPE;
  begin
    SELECT ID_PART,
           INTERNA,
           ID_GESTIUNE,
           ID_SECTIE,
           ID_SECTIE2,
           ID_LIVRARE,
           ID_FACTURARE,
           ID_CODCLIENT,
           ID_SUCURSALA,
           PROC_DISCOUNT
      INTO V_ID_PART,
           V_INTERNA,
           V_ID_GESTIUNE,
           V_ID_SECTIE,
           V_ID_SECTIE2,
           V_ID_LIVRARE,
           V_ID_FACTURARE,
           V_ID_CODCLIENT,
           V_ID_SUCURSALA,
           V_PROC_DISCOUNT
      FROM COMENZI
     WHERE ID_COMANDA = V_ID_COMANDA;

    V_NR_COMANDA   := pack_comenzi.genereaza_nr_comanda();
    V_DATA_COMANDA := SYSDATE;
    V_DATA_LIVRARE := V_DATA_COMANDA + NVL(to_number(pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('ORE_LIVRARE'),
                                                                                  V_ID_SECTIE)),
                                           0) / 24;

    IF V_OPTIUNE_CANT IS NULL THEN
      BEGIN
        SELECT NVL(to_number(pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('COPIERECANTITATE'),
                                                          V_ID_SECTIE)),
                   0)
          INTO V_COPIERECANTITATE
          FROM OPTIUNI
         WHERE VARNAME = 'COPIERECANTITATE';
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          RAISE_APPLICATION_ERROR(-20000,
                                  'Nu ati setat optiunea pentru copierea cantitatilor pe comenzi!');
      END;
    ELSE
      V_COPIERECANTITATE := V_OPTIUNE_CANT;
    END IF;

    CASE
      WHEN V_INTERNA = 1 THEN
        V_OPTIUNE := 'ID_LISTA_PRETURI_PV';
      WHEN V_INTERNA = 2 THEN
        V_OPTIUNE := 'IDPOLITICAPRETC';
      WHEN V_INTERNA = 3 THEN
        V_OPTIUNE := 'IDPOLITICAPRET';
    END CASE;

    pack_preturi.optiune_polpret_utilizator_sec(V_ID_UTIL,
                                                V_ID_SECTIE,
                                                V_OPTIUNE,
                                                V_ID_POL);

    INSERT INTO COMENZI
      (NR_COMANDA,
       DATA_COMANDA,
       ID_PART,
       ID_GESTIUNE,
       ID_SECTIE,
       DATA_LIVRARE,
       INTERNA,
       ID_UTIL,
       DATAORA,
       ID_SECTIE2,
       ID_LIVRARE,
       ID_FACTURARE,
       ID_CODCLIENT,
       ID_SUCURSALA,
       PROC_DISCOUNT)
    VALUES
      (V_NR_COMANDA,
       V_DATA_COMANDA,
       V_ID_PART,
       V_ID_GESTIUNE,
       V_ID_SECTIE,
       V_DATA_LIVRARE,
       V_INTERNA,
       V_ID_UTIL,
       SYSDATE,
       V_ID_SECTIE2,
       V_ID_LIVRARE,
       V_ID_FACTURARE,
       V_ID_CODCLIENT,
       V_ID_SUCURSALA,
       V_PROC_DISCOUNT)
    RETURNING id_comanda INTO V_ID_COMANDA_NOU;

    IF V_COPIERECANTITATE = 1 THEN
      INSERT INTO comenzi_elemente
        (id_comanda,
         id_articol,
         id_pol,
         pret,
         discount_unitar,
         cantitate,
         id_valuta,
         id_sectie,
         pret_cu_tva)
        SELECT V_ID_COMANDA_NOU  as id_comanda,
               A.ID_ARTICOL,
               V_ID_POL          AS ID_POL,
               B.PRET,
               A.DISCOUNT_UNITAR,
               A.CANTITATE,
               C.ID_VALUTA,
               V_ID_SECTIE,
               C.PRETURI_CU_TVA  AS PRET_CU_TVA
          FROM (SELECT A.ID_ARTICOL,
                       SUM(A.CANTITATE) AS CANTITATE,
                       A.DISCOUNT_UNITAR,
                       MIN(A.ID_COMANDA_ELEMENT) AS ID
                  FROM COMENZI_ELEMENTE A
                 WHERE A.ID_COMANDA = V_ID_COMANDA
                   AND A.STERS = 0
                 GROUP BY A.ID_ARTICOL, A.DISCOUNT_UNITAR
                 ORDER BY 4) A
          LEFT JOIN CRM_POLITICI_PRET_ART B
            ON A.ID_ARTICOL = B.ID_ARTICOL
          LEFT JOIN CRM_POLITICI_PRETURI C
            ON B.ID_POL = C.ID_POL
         WHERE A.CANTITATE > 0
           AND B.ID_POL = V_ID_POL;
    ELSE
      INSERT INTO comenzi_elemente
        (id_comanda,
         id_articol,
         id_pol,
         pret,
         discount_unitar,
         cantitate,
         id_valuta,
         id_sectie,
         pret_cu_tva)
        SELECT V_ID_COMANDA_NOU  as id_comanda,
               A.ID_ARTICOL,
               V_ID_POL          AS ID_POL,
               B.PRET,
               A.DISCOUNT_UNITAR,
               A.CANTITATE,
               C.ID_VALUTA,
               V_ID_SECTIE,
               C.PRETURI_CU_TVA  AS PRET_CU_TVA
          FROM (select ID_ARTICOL,
                       DISCOUNT_UNITAR,
                       CANTITATE,
                       ID_COMANDA_ELEMENT
                  from COMENZI_ELEMENTE
                 WHERE ID_COMANDA = V_ID_COMANDA
                   AND STERS = 0
                   AND CANTITATE > 0
                 order by ID_COMANDA_ELEMENT) A
          LEFT JOIN CRM_POLITICI_PRET_ART B
            ON A.ID_ARTICOL = B.ID_ARTICOL
          LEFT JOIN CRM_POLITICI_PRETURI C
            ON B.ID_POL = C.ID_POL
         where B.ID_POL = V_ID_POL;
    END IF;
  end copiaza_comanda;
  ----------------------------------------------------------------------------------
  procedure copiaza_comenzi(V_SIR_ID_COMANDA  IN VARCHAR2,
                            V_SEPARATOR_PARAM IN VARCHAR2,
                            V_ID_UTIL         IN NUMBER) is

    TYPE num_rec IS RECORD(
      id_comanda dbms_sql.Number_Table);
    numtab num_rec;

    V_ID_COMANDA_NOU   COMENZI.ID_COMANDA%TYPE;
    V_SEPARATOR        VARCHAR2(5);
    V_COPIERECANTITATE NUMBER(1);
  begin
    V_SEPARATOR := NVL(V_SEPARATOR_PARAM, ',');

    BEGIN
      SELECT TO_NUMBER(VARVALUE)
        INTO V_COPIERECANTITATE
        FROM OPTIUNI
       WHERE VARNAME = 'COPIERECANTITATE';
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20000,
                                'Nu ati setat optiunea pentru copierea cantitatilor pe comenzi!');
    END;

    SELECT TO_NUMBER(substr(V_SIR_ID_COMANDA,
                            decode(rownum,
                                   1,
                                   1,
                                   instr(V_SIR_ID_COMANDA,
                                         V_SEPARATOR,
                                         1,
                                         rownum - 1) + 1),
                            instr(V_SIR_ID_COMANDA, V_SEPARATOR, 1, rownum) -
                            decode(rownum,
                                   1,
                                   0,
                                   instr(V_SIR_ID_COMANDA,
                                         V_SEPARATOR,
                                         1,
                                         rownum - 1)) - 1)) AS ID_COMANDA
      BULK COLLECT
      INTO numtab
      FROM dual
    CONNECT BY level <= length(V_SIR_ID_COMANDA) -
               length(REPLACE(V_SIR_ID_COMANDA, V_SEPARATOR));

    FOR i IN 1 .. numtab.id_comanda.count LOOP
      pack_comenzi.copiaza_comanda(numtab.id_comanda(i),
                                   V_COPIERECANTITATE,
                                   V_ID_UTIL,
                                   V_ID_COMANDA_NOU);
    END LOOP;

  end copiaza_comenzi;
  ----------------------------------------------------------------------------------
  procedure sectii_utilizator(V_ID_UTIL      IN NUMBER,
                              V_ID_SUCURSALA IN NUMBER,
                              p_cursor       OUT pack_types.tip_cursor) IS
    -- sectiile la care este asociat partenerul legat de utilizator

  begin

    open p_cursor for
      select ps.id_sectie, s.sectie
        from asociere_parteneri_sectii ps
        left join nom_sectii s
          on ps.id_sectie = s.id_sectie
       where ps.id_part in (select id_partener
                              from vutilizatori_rol_intern
                             where id_util = V_ID_UTIL)
         and NVL2(V_ID_SUCURSALA, s.id_sucursala, -99) =
             NVL(V_ID_SUCURSALA, -99)
       order by s.sectie;

  end sectii_utilizator;
  ----------------------------------------------------------------------------------
  function extrage_optiuni(tcLista varchar2, tnId number) return varchar2 is

    lcLista       varchar2(1000);
    lnNrOptiuni   number(3) := 0;
    lcExtragOptId varchar2(500);
    lcId_extras   varchar2(10);
    lcReturn      varchar2(100);

  begin

    lcLista     := trim(tcLista);
    lnNrOptiuni := Getwordcount(lcLista, ';');
    for i in 1 .. lnNrOptiuni loop
      lcExtragOptId := Getwordnum(lcLista, i, ';');
      lcId_extras   := GETWORDNUM(lcExtragOptId, 1, '::');
      if lcId_extras = to_char(tnId) then
        lcReturn := GETWORDNUM(lcExtragOptId, 2, '::');
      end if;
    end loop;

    RETURN lcReturn;
  end extrage_optiuni;
  ----------------------------------------------------------------------------------
  function citeste_ore_inchidere(tnId number) return number is
    V_NR_ORE NUMBER(2);
    lcLista  varchar2(1000);
    lnId     number(5) := 0;
  begin

    lnId := tnId;
    begin
      SELECT VARVALUE
        INTO lcLista
        FROM OPTIUNI
       WHERE VARNAME = 'ORE_INCHIDERE';
    exception
      WHEN NO_DATA_FOUND THEN
        raise_application_error(-20000,
                                'Nu este setata perioada de dinaintea termenului de executie pentru care o lucrare este considerata inchisa!');
    end;

    V_NR_ORE := to_number(pack_comenzi.extrage_optiuni(lcLista, lnId));

    return V_NR_ORE;
  end;
  ----------------------------------------------------------------------------------
  procedure raport_proc_vanzari_sterge(V_ID_COMRAPVANZ IN NUMBER) is

  begin
    delete from comrapvanzelem where ID_COMRAPVANZ = V_ID_COMRAPVANZ;
    delete from comrapvanz where ID_COMRAPVANZ = V_ID_COMRAPVANZ;
  end;

  ----------------------------------------------------------------------------------
  procedure raport_proc_vanzari(V_DATAORA_I     IN TIMESTAMP,
                                V_DATAORA_S     IN TIMESTAMP,
                                V_ID_GRUPA_GEST IN NUMBER,
                                V_PROCENT       IN NUMBER,
                                V_ID_SECTIE     IN NUMBER,
                                V_ID_UTIL       IN NUMBER,
                                V_ID_SUCURSALA  IN NUMBER,
                                V_CURSOR        OUT pack_cursor.tip_ref_cursor) is
    V_AN_I          NUMBER(4);
    V_LUNA_I        NUMBER(2);
    V_AN_F          NUMBER(4);
    V_LUNA_F        NUMBER(2);
    V_PROCENT_BD    NUMBER(10, 4);
    V_TOATE_GRUPELE NUMBER(1);
    V_ID_GRUPA_ART  GEST_ART_GR.ID_GRUPA%TYPE;

    V_ID_COMRAPVANZ          COMRAPVANZ.ID_COMRAPVANZ%TYPE;
    V_LISTA_GESTIUNI_DEPOZIT VARCHAR2(1000);
    V_DATAORA_I0             DATE := TRUNC(V_DATAORA_I, 'MONTH'); -- 1 ale lunii de inceput;
    lnNrLuniPerioada         number(1) := 1; -- se selecteaza articolele din rulajul din urma cu 1 luni, nu numai cele din perioada, pentru cazul in care un articol nu a avut rulaj in perioada aleasa
  begin
    V_AN_I   := EXTRACT(YEAR FROM V_DATAORA_I);
    V_LUNA_I := EXTRACT(MONTH FROM V_DATAORA_I);

    V_AN_F          := EXTRACT(YEAR FROM V_DATAORA_S);
    V_LUNA_F        := EXTRACT(MONTH FROM V_DATAORA_S);
    V_PROCENT_BD    := to_number(nvl(pack_sesiune.getoptiunefirma('PROCVANZPER'),
                                     '0'));
    V_TOATE_GRUPELE := to_number(nvl(pack_sesiune.getoptiunefirma('TOATEGRUPELE'),
                                     '1'));
    IF V_TOATE_GRUPELE = 0 THEN
      V_ID_GRUPA_ART := to_number(pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('GRUPAARTSECTIE'),
                                                               V_ID_SECTIE));
    ELSE
      V_ID_GRUPA_ART := 0;
    END IF;

    V_LISTA_GESTIUNI_DEPOZIT := pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('LISTA_GESTIUNI_DEPOZIT'),
                                                             V_ID_SECTIE);

    IF V_PROCENT_BD <> V_PROCENT THEN
      UPDATE OPTIUNI
         SET VARVALUE = TO_CHAR(V_PROCENT)
       WHERE VARNAME = 'PROCVANZPER';

      V_PROCENT_BD := V_PROCENT;
    END IF;

    V_PROCENT_BD := V_PROCENT_BD / 100;

    INSERT INTO COMRAPVANZ
      (DATAI, DATAS, ID_GRUPE, PROCENT, ID_SECTIE, ID_UTIL, ID_SUCURSALA)
    VALUES
      (V_DATAORA_I,
       V_DATAORA_S,
       V_ID_GRUPA_GEST,
       V_PROCENT,
       V_ID_SECTIE,
       V_ID_UTIL,
       V_ID_SUCURSALA)
    RETURNING ID_COMRAPVANZ INTO V_ID_COMRAPVANZ;

    INSERT INTO COMRAPVANZELEM
      (ID_COMRAPVANZ,
       ID_GESTIUNE,
       ID_ARTICOL,
       STOCI,
       VANZARI,
       STOCF,
       STOCDEP,
       VALSTOCI,
       VALSTOCDEP,
       VALSTOCF)
      with crs as
       (select cgg.id_gestiune
          from gest_coresp_grupe_gestiuni cgg
          join nom_gestiuni g
            on cgg.id_gestiune = g.id_gestiune
         where cgg.sters = 0
           and g.inactiv = 0
           and g.sters = 0
           and cgg.id_grupe = V_ID_GRUPA_GEST),
      crsarticole as
       (select id_articol
          from nom_articole
         where id_subgrupa in (select id_subgrupa
                                 from gest_art_sbgr
                                where decode(V_ID_GRUPA_ART, 0, 0, id_grupa) =
                                      V_ID_GRUPA_ART)
           and sters = 0)
      select V_ID_COMRAPVANZ,
             nvl(a1.id_gestiune, b1.id_gestiune) as id_gestiune,
             nvl(a1.id_articol, b1.id_articol) as id_articol,
             nvl(a1.cants, 0) + nvl(b1.rulajei, 0) as stoci,
             b1.vanzari,
             nvl(a1.cants, 0) + nvl(b1.rulajei, 0) + nvl(b1.rulajep, 0) as stocf,
             nvl(c1.stocdep, 0) as stocdep,
             nvl(a1.valcants, 0) + nvl(b1.valrulajei, 0) as valstoci,
             nvl(c1.valstocdep, 0) as valstocdep,
             nvl(a1.valcants, 0) + nvl(b1.valrulajei, 0) +
             nvl(b1.valrulajep, 0) as valstocf
        from (select id_gestiune,
                     id_articol,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I0 and V_DATAORA_I - 1 / 24 / 60 / 60 then
                            cant - cante
                           else
                            0
                         end) as rulajei,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I0 and V_DATAORA_I - 1 / 24 / 60 / 60 then
                            (cant - cante) * pretvtva
                           else
                            0
                         end) as valrulajei,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I and V_DATAORA_S then
                            cant - cante
                           else
                            0
                         end) as rulajep,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I and V_DATAORA_S then
                            (cant - cante) * pretvtva
                           else
                            0
                         end) as valrulajep,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I and V_DATAORA_S and id_tip_rulaj = 0 then
                            cante
                           else
                            0
                         end) as vanzari,
                     sum(case
                           when decode(trunc(dataora), dataact, dataora, dataact) between
                                V_DATAORA_I and V_DATAORA_S and id_tip_rulaj = 0 then
                            cante * pretvtva
                           else
                            0
                         end) as valvanzari
                from rul
               where an * 12 + luna between
                     V_AN_I * 12 + V_LUNA_I - lnNrLuniPerioada and
                     V_AN_F * 12 + V_LUNA_F
                 and sters = 0
                 and id_gestiune in (select id_gestiune from crs)
                 and id_articol in (select id_articol from crsarticole)
               group by id_gestiune, id_articol) b1
        left join (select id_gestiune,
                          id_articol,
                          sum(cants) as cants,
                          sum(cants * (pretv + tvav)) as valcants
                     from stoc
                    where an = V_AN_I
                      and luna = V_LUNA_I
                      and id_gestiune in (select id_gestiune from crs)
                      and id_articol in (select id_articol from crsarticole)
                      and cants <> 0
                    group by id_gestiune, id_articol) a1
          on a1.id_articol = b1.id_articol
         and a1.id_gestiune = b1.id_gestiune
        left join (select id_articol,
                          sum(cants + cant - cante) as stocdep,
                          sum((cants + cant - cante) * (pretv + tvav)) as valstocdep
                     from stoc
                    where an = V_AN_F
                      and luna = V_LUNA_F
                      and id_gestiune in
                          (SELECT X
                             FROM table(charn2collection(V_LISTA_GESTIUNI_DEPOZIT,
                                                         ',')))
                      and id_articol in (select id_articol from crsarticole)
                    group by id_articol) c1
          on a1.id_articol = c1.id_articol;

    -- aceleasi coloane ca si cursorul din completeaza_raport
    OPEN V_CURSOR FOR
      SELECT A.ID_COMRAPVANZ,
             A.ID_COMRAPVANZELEM,
             A.ID_GESTIUNE,
             A.ID_ARTICOL,
             C.ID_SUBGRUPA,
             B.NUME_GESTIUNE,
             D.SUBGRUPA,
             C.DENUMIRE,
             A.STOCI,
             A.VANZARI,
             A.STOCF,
             A.CANTITATE,
             A.STOCDEP,
             a.valstoci,
             a.Valstocf,
             A.VALSTOCDEP,
             A.VALIDAT
        FROM COMRAPVANZELEM A
        LEFT JOIN NOM_GESTIUNI B
          ON A.ID_GESTIUNE = B.ID_GESTIUNE
        LEFT JOIN NOM_ARTICOLE C
          ON A.ID_ARTICOL = C.ID_ARTICOL
        LEFT JOIN GEST_ART_SBGR D
          ON C.ID_SUBGRUPA = D.ID_SUBGRUPA
       WHERE A.ID_COMRAPVANZ = V_ID_COMRAPVANZ
       ORDER BY B.NUME_GESTIUNE, D.SUBGRUPA, C.DENUMIRE;

  end raport_proc_vanzari;
  ----------------------------------------------------------------------------------
  procedure completeaza_raport(V_ID_COMRAPVANZ  IN NUMBER,
                               V_LISTA_ARTICOLE IN VARCHAR,
                               V_LISTA_GESTIUNI IN VARCHAR,
                               V_CURSOR         OUT pack_cursor.tip_ref_cursor) is
    V_AN_I      NUMBER(4);
    V_LUNA_I    NUMBER(2);
    V_AN_F      NUMBER(4);
    V_LUNA_F    NUMBER(2);
    V_DATAORA_I COMRAPVANZ.DATAI%TYPE;
    V_DATAORA_S COMRAPVANZ.DATAS%TYPE;
    V_SEPARATOR VARCHAR2(1) := ',';
    V_ID_MAX    COMRAPVANZELEM.ID_COMRAPVANZELEM%TYPE;
  begin
    SELECT A.ID_COMRAPVANZELEM, B.DATAI, B.DATAS
      INTO V_ID_MAX, V_DATAORA_I, V_DATAORA_S
      FROM (SELECT V_ID_COMRAPVANZ AS ID_COMRAPVANZ,
                   NVL(MAX(ID_COMRAPVANZELEM), 0) AS ID_COMRAPVANZELEM
              FROM COMRAPVANZELEM
             WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ) A
      LEFT JOIN COMRAPVANZ B
        ON A.ID_COMRAPVANZ = B.ID_COMRAPVANZ;

    V_AN_I   := EXTRACT(YEAR FROM V_DATAORA_I);
    V_LUNA_I := EXTRACT(MONTH FROM V_DATAORA_I);
    V_AN_F   := EXTRACT(YEAR FROM V_DATAORA_S);
    V_LUNA_F := EXTRACT(MONTH FROM V_DATAORA_S);

    MERGE INTO COMRAPVANZELEM A
    USING (
      WITH CRS_GESTIUNI AS
       (SELECT X as ID_GESTIUNE
          FROM table(charn2collection(V_LISTA_GESTIUNI, V_SEPARATOR))),
      CRS_ARTICOLE AS
       (SELECT X as ID_ARTICOL
          FROM table(charn2collection(V_LISTA_ARTICOLE, V_SEPARATOR)))
      SELECT V_ID_COMRAPVANZ AS ID_COMRAPVANZ,
             A1.ID_ARTICOL,
             B1.ID_GESTIUNE,
             NVL(C1.CANTS, 0) + NVL(D1.RULAJEI, 0) AS STOCI,
             NVL(D1.VANZARI, 0) AS VANZARI,
             NVL(C1.CANTS, 0) + NVL(D1.RULAJEI, 0) + NVL(D1.RULAJEP, 0) AS STOCF
        FROM CRS_ARTICOLE A1
        LEFT JOIN CRS_GESTIUNI B1
          ON 1 = 1
        LEFT JOIN (select id_gestiune, id_articol, sum(cants) as cants
                     from stoc
                    where an * 12 + luna = V_AN_I * 12 + V_LUNA_I
                      and id_gestiune in
                          (select id_gestiune from CRS_GESTIUNI)
                      and id_articol in
                          (select id_articol from CRS_ARTICOLE)
                      and cants >= 0
                    group by id_gestiune, id_articol) C1
          ON A1.ID_ARTICOL = C1.ID_ARTICOL
         AND B1.ID_GESTIUNE = C1.ID_GESTIUNE
        LEFT JOIN (select id_gestiune,
                          id_articol,
                          sum(case
                                when decode(trunc(dataora),
                                            dataact,
                                            dataora,
                                            dataact) < V_DATAORA_I then
                                 cant - cante
                                else
                                 0
                              end) as rulajei,
                          sum(case
                                when decode(trunc(dataora),
                                            dataact,
                                            dataora,
                                            dataact) between V_DATAORA_I and
                                     V_DATAORA_S then
                                 cant - cante
                                else
                                 0
                              end) as rulajep,
                          sum(case
                                when decode(trunc(dataora),
                                            dataact,
                                            dataora,
                                            dataact) between V_DATAORA_I and
                                     V_DATAORA_S and id_tip_rulaj = 0 then
                                 cante
                                else
                                 0
                              end) as vanzari
                     from rul
                    where an * 12 + luna between V_AN_I * 12 + V_LUNA_I and
                          V_AN_F * 12 + V_LUNA_F
                      and sters = 0
                      and id_gestiune in
                          (select id_gestiune from CRS_GESTIUNI)
                      and id_articol in
                          (select id_articol from CRS_ARTICOLE)
                    group by id_gestiune, id_articol) D1
          on A1.id_articol = D1.id_articol
         and C1.id_gestiune = D1.id_gestiune) B ON (A.ID_ARTICOL = B.ID_ARTICOL AND A.ID_GESTIUNE = B.ID_GESTIUNE AND A.ID_COMRAPVANZ = B.ID_COMRAPVANZ) WHEN NOT MATCHED THEN
        INSERT
          (ID_COMRAPVANZ, ID_GESTIUNE, ID_ARTICOL, STOCI, VANZARI, STOCF)
        VALUES
          (B.ID_COMRAPVANZ,
           B.ID_GESTIUNE,
           B.ID_ARTICOL,
           B.STOCI,
           B.VANZARI,
           B.STOCF);

    -- aceleasi coloane ca si cursorul din raport_proc_vanzari
    OPEN V_CURSOR FOR
      SELECT A.ID_COMRAPVANZ,
             A.ID_COMRAPVANZELEM,
             A.ID_GESTIUNE,
             A.ID_ARTICOL,
             C.ID_SUBGRUPA,
             B.NUME_GESTIUNE,
             D.SUBGRUPA,
             C.DENUMIRE,
             A.STOCI,
             A.VANZARI,
             A.STOCF,
             A.CANTITATE,
             A.STOCDEP,
             a.valstoci,
             a.Valstocf,
             A.VALSTOCDEP,
             A.VALIDAT
        FROM COMRAPVANZELEM A
        LEFT JOIN NOM_GESTIUNI B
          ON A.ID_GESTIUNE = B.ID_GESTIUNE
        LEFT JOIN NOM_ARTICOLE C
          ON A.ID_ARTICOL = C.ID_ARTICOL
        LEFT JOIN GEST_ART_SBGR D
          ON C.ID_SUBGRUPA = D.ID_SUBGRUPA
       WHERE A.ID_COMRAPVANZ = V_ID_COMRAPVANZ
         AND A.ID_COMRAPVANZELEM > V_ID_MAX
       ORDER BY B.NUME_GESTIUNE, D.SUBGRUPA, C.DENUMIRE;

  end completeaza_raport;

  -------------------------------------------------------------
  -- vizualizare / editare raport vanzari perioada
  -------------------------------------------------------------
  procedure raport_proc_vanzari_viz(V_ID_COMRAPVANZ IN NUMBER,
                                    V_CURSOR        OUT pack_cursor.tip_ref_cursor) is
  begin
    -- aceleasi coloane ca si cursorul din raport_proc_vanzari
    OPEN V_CURSOR FOR
      SELECT A.ID_COMRAPVANZ,
             A.ID_COMRAPVANZELEM,
             A.ID_GESTIUNE,
             A.ID_ARTICOL,
             C.ID_SUBGRUPA,
             B.NUME_GESTIUNE,
             D.SUBGRUPA,
             C.DENUMIRE,
             A.STOCI,
             A.VANZARI,
             A.STOCF,
             A.CANTITATE,
             A.STOCDEP,
             a.valstoci,
             a.Valstocf,
             A.VALSTOCDEP,
             A.VALIDAT
        FROM COMRAPVANZELEM A
        LEFT JOIN NOM_GESTIUNI B
          ON A.ID_GESTIUNE = B.ID_GESTIUNE
        LEFT JOIN NOM_ARTICOLE C
          ON A.ID_ARTICOL = C.ID_ARTICOL
        LEFT JOIN GEST_ART_SBGR D
          ON C.ID_SUBGRUPA = D.ID_SUBGRUPA
       WHERE A.ID_COMRAPVANZ = V_ID_COMRAPVANZ
       ORDER BY B.NUME_GESTIUNE, D.SUBGRUPA, C.DENUMIRE;

  end raport_proc_vanzari_viz;
  ----------------------------------------------------------------------------------
  procedure actualizeaza_raport(V_ID_COMRAPVANZ       IN NUMBER,
                                V_LISTA_ACTUALIZARI   IN CLOB,
                                V_NR_COMENZI_GENERATE OUT NUMBER,
                                V_CURSOR              OUT pack_cursor.tip_ref_cursor) is
    CURSOR CRS IS
      SELECT A.ID_GESTIUNE, B.NUME_GESTIUNE
        FROM (SELECT DISTINCT ID_GESTIUNE
                FROM COMRAPVANZELEM
               WHERE CANTITATE <> 0
                 AND ID_COMRAPVANZ = V_ID_COMRAPVANZ) A
        LEFT JOIN NOM_GESTIUNI B
          ON A.ID_GESTIUNE = B.ID_GESTIUNE
       ORDER BY B.NUME_GESTIUNE;
    CRS_LINIE         CRS%ROWTYPE;
    V_SEPARATOR       VARCHAR2(1) := '|';
    V_ID_COMANDA      COMENZI.ID_COMANDA%TYPE;
    V_ID_POL          CRM_POLITICI_PRETURI.ID_POL%TYPE;
    V_ID_SECTIE       COMRAPVANZ.ID_SECTIE%TYPE;
    V_ID_UTIL         COMRAPVANZ.ID_UTIL%TYPE;
    V_ID_SUCURSALA    COMRAPVANZ.ID_SUCURSALA%TYPE;
    V_DATA_COMANDA    COMRAPVANZ.DATAORA%TYPE;
    V_DATA_LIVRARE    COMENZI.DATA_LIVRARE%TYPE;
    V_NR_INREGISTRARI NUMBER(10);
    V_LISTA_ERORI     VARCHAR2(32000);
  begin
    V_NR_COMENZI_GENERATE := 0;

    -- generare comenzi
    SELECT ID_SECTIE, ID_UTIL, ID_SUCURSALA, DATAORA
      INTO V_ID_SECTIE, V_ID_UTIL, V_ID_SUCURSALA, V_DATA_COMANDA
      FROM COMRAPVANZ
     WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ;

    V_ID_POL := to_number(pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('IDPOLITICAPRET'),
                                                       V_ID_SECTIE));

    IF V_ID_POL IS NULL THEN
      RAISE_APPLICATION_ERROR(-20000,
                              'Nu este setata politica de preturi implicita pentru comenzile de la subunitati!');
    ELSE
      SELECT COUNT(*)
        INTO V_NR_INREGISTRARI
        FROM CRM_VPOLITICI_PRET_CURENTE
       WHERE ID_POL = V_ID_POL;
      IF V_NR_INREGISTRARI = 0 THEN
        RAISE_APPLICATION_ERROR(-20000,
                                'Politica de preturi implicita nu mai este valabila!');
      END IF;
    END IF;

    SELECT STRINGAGG(ID_ARTICOL)
      INTO V_LISTA_ERORI
      FROM (SELECT DISTINCT ID_ARTICOL
              FROM COMRAPVANZELEM
             WHERE ID_COMRAPVANZELEM IN
                   (select to_number(extractvalue(column_value,
                                                  '/crsraportvanzari/id')) as ID
                      from table(XMLSequence(extract(XMLType(V_LISTA_ACTUALIZARI),
                                                     '//VFPData/crsraportvanzari')))))
     WHERE ID_ARTICOL NOT IN (SELECT ID_ARTICOL
                                FROM CRM_POLITICI_PRET_ART
                               WHERE ID_POL = V_ID_POL
                                 AND PRET <> 0);

    IF V_LISTA_ERORI IS NOT NULL THEN
      OPEN V_CURSOR FOR
        SELECT DENUMIRE, CODMAT
          FROM NOM_ARTICOLE
         WHERE ID_ARTICOL IN
               (SELECT TO_NUMBER(X) AS ID
                  FROM table(charc2collection(V_LISTA_ERORI, ',')))
         ORDER BY DENUMIRE;

    ELSE
      UPDATE COMRAPVANZ
         SET COMPLETAT = 1
       WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ;

      MERGE INTO COMRAPVANZELEM A
      USING (select to_number(extractvalue(column_value,
                                           '/crsraportvanzari/id')) as ID,
                    to_number(extractvalue(column_value,
                                           '/crsraportvanzari/cantitate'),
                              '9G999D9999',
                              'nls_numeric_characters=.,') as CANTITATE
               from table(XMLSequence(extract(XMLType(V_LISTA_ACTUALIZARI),
                                              '//VFPData/crsraportvanzari')))) B
      ON (A.ID_COMRAPVANZELEM = B.ID)
      WHEN MATCHED THEN
        UPDATE SET CANTITATE = B.CANTITATE, VALIDAT = 1;

      V_DATA_LIVRARE := V_DATA_COMANDA + NVL(to_number(pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('ORE_LIVRARE'),
                                                                                    V_ID_SECTIE)),
                                             0) / 24;

      OPEN CRS;
      LOOP
        FETCH CRS
          INTO CRS_LINIE;
        EXIT WHEN CRS%NOTFOUND;

        INSERT INTO COMENZI
          (NR_COMANDA,
           DATA_COMANDA,
           DATA_LIVRARE,
           ID_GESTIUNE,
           INTERNA,
           ID_UTIL,
           ID_SECTIE,
           ID_SUCURSALA)
        VALUES
          (pack_comenzi.genereaza_nr_comanda(),
           V_DATA_COMANDA,
           V_DATA_LIVRARE,
           CRS_LINIE.ID_GESTIUNE,
           3,
           V_ID_UTIL,
           V_ID_SECTIE,
           V_ID_SUCURSALA)
        RETURNING ID_COMANDA INTO V_ID_COMANDA;

        V_NR_COMENZI_GENERATE := V_NR_COMENZI_GENERATE + 1;

        INSERT INTO COMENZI_ELEMENTE
          (ID_COMANDA,
           ID_ARTICOL,
           ID_POL,
           PRET,
           CANTITATE,
           ID_VALUTA,
           PRET_CU_TVA,
           ID_SECTIE)
          SELECT V_ID_COMANDA,
                 A.ID_ARTICOL,
                 B.ID_POL,
                 C.PRET,
                 A.CANTITATE,
                 B.ID_VALUTA,
                 B.PRETURI_CU_TVA,
                 V_ID_SECTIE
            FROM (SELECT sb.subgrupa,
                         art.denumire,
                         ve.ID_ARTICOL,
                         ve.CANTITATE
                    FROM COMRAPVANZELEM ve
                    left join nom_articole art
                      on ve.id_articol = art.id_articol
                    left join gest_art_sbgr sb
                      on art.id_subgrupa = sb.id_subgrupa
                   WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ
                     AND ID_GESTIUNE = CRS_LINIE.ID_GESTIUNE
                     AND CANTITATE <> 0) A
            LEFT JOIN (SELECT ID_POL, ID_VALUTA, PRETURI_CU_TVA
                         FROM CRM_POLITICI_PRETURI
                        WHERE ID_POL = V_ID_POL) B
              ON 1 = 1
            LEFT JOIN CRM_POLITICI_PRET_ART C
              ON B.ID_POL = C.ID_POL
             AND A.ID_ARTICOL = C.ID_ARTICOL
           ORDER BY A.SUBGRUPA, A.DENUMIRE;

      END LOOP;
      CLOSE CRS;

      OPEN V_CURSOR FOR
        SELECT DENUMIRE FROM NOM_ARTICOLE WHERE 1 = 2;
    END IF;
  end actualizeaza_raport;

  ----------------------------------------------------------------------------------
  -- Centralizator rapoarte vanzari: V_TIP = 1 cantitate completata de utilizatori; 2 = cantitate = vanzari, pentru listare pe furnizori
  ----------------------------------------------------------------------------------
  procedure centralizator_rapoarte(V_LUNA      IN NUMBER,
                                   V_AN        IN NUMBER,
                                   V_ID_SECTIE IN NUMBER,
                                   V_CURSOR    OUT pack_cursor.tip_ref_cursor) is
  begin
    OPEN V_CURSOR FOR
      SELECT A.ID_COMRAPVANZ,
             A.DATAI,
             A.DATAS,
             B.NUME_GRUPA,
             A.DATAORA,
             C.UTILIZATOR
        FROM COMRAPVANZ A
        LEFT JOIN GEST_NOM_GRUPE B
          ON A.ID_GRUPE = B.ID_GRUPE
        LEFT JOIN SYN_UTILIZATORI C
          ON A.ID_UTIL = C.ID_UTIL
       WHERE TO_DATE(TO_CHAR(A.DATAORA, 'MMYYYY'), 'MMYYYY') =
             TO_DATE(V_AN || V_LUNA, 'YYYYMM')
         AND NVL(A.ID_SECTIE, -99) = NVL(V_ID_SECTIE, -99)
       ORDER BY A.DATAORA DESC;

  end centralizator_rapoarte;
  ----------------------------------------------------------------------------------
  procedure listeaza_raport(V_ID_COMRAPVANZ IN NUMBER,
                            V_DATA          OUT DATE,
                            V_CURSOR        OUT pack_cursor.tip_ref_cursor) is
  begin
    SELECT DATAORA
      INTO V_DATA
      FROM COMRAPVANZ
     WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ;

    OPEN V_CURSOR FOR
      SELECT A.ID_COMRAPVANZ,
             A.ID_COMRAPVANZELEM,
             A.ID_GESTIUNE,
             A.ID_ARTICOL,
             B.NUME_GESTIUNE,
             C.DENUMIRE,
             C.CODMAT,
             C.UM,
             A.CANTITATE
        FROM COMRAPVANZELEM A
        LEFT JOIN NOM_GESTIUNI B
          ON A.ID_GESTIUNE = B.ID_GESTIUNE
        LEFT JOIN NOM_ARTICOLE C
          ON A.ID_ARTICOL = C.ID_ARTICOL
       WHERE A.ID_COMRAPVANZ = V_ID_COMRAPVANZ
         AND A.CANTITATE <> 0
       ORDER BY B.NUME_GESTIUNE, C.DENUMIRE, C.CODMAT;
  end listeaza_raport;

  ----------------------------------------------------------------------------------
  -- raport comenzi furnizori pe baza vanzarilor
  ----------------------------------------------------------------------------------
  procedure listeaza_raport_vz_fz(V_ID_COMRAPVANZ IN NUMBER,
                                  V_CANTITATE     IN NUMBER,
                                  V_DATA          OUT DATE,
                                  V_DATAI         OUT DATE,
                                  V_DATAS         OUT DATE,
                                  V_CURSOR        OUT pack_cursor.tip_ref_cursor) is
  begin
    -- V_CANTITATE: 1 = se foloseste coloana cantitate; 0 = se foloseste coloana vanzari
    SELECT DATAORA, DATAI, DATAS
      INTO V_DATA, V_DATAI, V_DATAS
      FROM COMRAPVANZ
     WHERE ID_COMRAPVANZ = V_ID_COMRAPVANZ;

    OPEN V_CURSOR FOR
      SELECT E.GRUPA,
             D.SUBGRUPA,
             B.DENUMIRE AS FURNIZOR,
             A.ID_ARTICOL,
             C.DENUMIRE,
             C.CODMAT,
             C.UM,
             SUM(DECODE(V_CANTITATE, 1, A.CANTITATE, A.VANZARI)) AS CANTITATE,
             MAX(A.STOCDEP) AS STOCDEP,
             sum(a.stoci) as stoci,
             sum(a.stocf) as stocf,
             sum(a.valstoci) as valstoci,
             sum(a.valstocf) as valstocf,
             max(a.valstocdep) as valstocdep
        FROM COMRAPVANZELEM A
        JOIN NOM_ARTICOLE C
          ON A.ID_ARTICOL = C.ID_ARTICOL
        LEFT JOIN NOM_PARTENERI B
          ON C.ID_PART = B.ID_PART
        LEFT JOIN GEST_ART_SBGR D
          ON C.ID_SUBGRUPA = D.ID_SUBGRUPA
        LEFT JOIN GEST_ART_GR E
          ON D.ID_GRUPA = E.ID_GRUPA
       WHERE A.ID_COMRAPVANZ = V_ID_COMRAPVANZ
       GROUP BY B.DENUMIRE,
                E.GRUPA,
                D.SUBGRUPA,
                A.ID_ARTICOL,
                C.DENUMIRE,
                C.CODMAT,
                C.UM
       ORDER BY E.GRUPA, D.SUBGRUPA, B.DENUMIRE, C.DENUMIRE, C.CODMAT;

  end listeaza_raport_vz_fz;

  ----------------------------------------------------------------------------------
  -- raport vanzari un articol, o gestiune pe o perioada - detaliu la raport_proc_vanzari
  ----------------------------------------------------------------------------------
  procedure rap_vanz_per_detaliu(V_ID_COMRAPVANZELEM IN NUMBER,
                                 V_CURSOR            OUT pack_cursor.tip_ref_cursor) is
    V_ID_ARTICOL    COMRAPVANZELEM.ID_ARTICOL%TYPE;
    V_ID_GESTIUNE   COMRAPVANZELEM.ID_GESTIUNE%TYPE;
    V_ID_COMRAPVANZ COMRAPVANZ.ID_COMRAPVANZ%TYPE;
    V_DATAI         COMRAPVANZ.DATAI%TYPE;
    V_DATAS         COMRAPVANZ.DATAS%TYPE;
  begin
    SELECT VE.ID_ARTICOL, VE.ID_GESTIUNE, V.ID_COMRAPVANZ, V.DATAI, V.DATAS
      INTO V_ID_ARTICOL, V_ID_GESTIUNE, V_ID_COMRAPVANZ, V_DATAI, V_DATAS
      FROM COMRAPVANZELEM VE
      JOIN COMRAPVANZ V
        ON VE.ID_COMRAPVANZ = V.ID_COMRAPVANZ
     WHERE ID_COMRAPVANZELEM = V_ID_COMRAPVANZELEM;

    OPEN V_CURSOR FOR
      SELECT R.ID_ARTICOL,
             G.GRUPA,
             SB.SUBGRUPA,
             A.DENUMIRE,
             A.CODMAT,
             A.UM,
             R.CANTE AS VANZARI,
             R.DATAORA,
             U.UTILIZATOR,
             GS.NUME_GESTIUNE
        FROM RUL R
        JOIN NOM_ARTICOLE A
          ON R.ID_ARTICOL = A.ID_ARTICOL
        LEFT JOIN GEST_ART_SBGR SB
          ON A.ID_SUBGRUPA = SB.ID_SUBGRUPA
        LEFT JOIN GEST_ART_GR G
          ON SB.ID_GRUPA = G.ID_GRUPA
        LEFT JOIN SYN_UTILIZATORI U
          ON R.ID_UTIL = U.ID_UTIL
        LEFT JOIN NOM_GESTIUNI GS
          ON R.ID_GESTIUNE = GS.ID_GESTIUNE
       WHERE R.ID_ARTICOL = V_ID_ARTICOL
         AND R.ID_GESTIUNE = V_ID_GESTIUNE
         AND R.DATAORA BETWEEN V_DATAI AND V_DATAS
         AND R.AN BETWEEN EXTRACT(YEAR FROM V_DATAI) AND
             EXTRACT(YEAR FROM V_DATAS)
         AND R.ID_TIP_RULAJ = 0
       ORDER BY R.DATAORA;

  end rap_vanz_per_detaliu;

  ----------------------------------------------------------------------------------
  function verifica_acces_comanda(V_ID_COMANDA IN NUMBER) return varchar2 is
    V_ID_SECTIE NOM_SECTII.ID_SECTIE%TYPE;
  begin
    SELECT ID_SECTIE
      INTO V_ID_SECTIE
      FROM COMENZI
     WHERE ID_COMANDA = V_ID_COMANDA;

    return pack_sesiune.verifica_acces('COMENZI_ELEMENTE',
                                       V_ID_COMANDA,
                                       pack_comenzi.extrage_optiuni(pack_sesiune.getoptiunefirma('MINSESCOMANDA'),
                                                                    V_ID_SECTIE));
  end;
  ----------------------------------------------------------------------------------
  procedure deblocheaza_acces_comanda(V_ID_COMANDA IN NUMBER) is
  begin
    pack_sesiune.deblocheaza_acces('COMENZI_ELEMENTE', V_ID_COMANDA);
  end;

  -----------------------------------------------------------------
  -- genereaza factura din comanda automat, fara interfata grafica
  -- fara scadere din gestiune!!!
  -----------------------------------------------------------------
  procedure factureaza_comanda(tnIdComanda     IN comenzi.id_comanda%type,
                               tnAn            IN act.an%type DEFAULT EXTRACT(YEAR FROM
                                                                              SYSDATE),
                               tnLuna          IN act.luna%type DEFAULT EXTRACT(MONTH FROM
                                                                                SYSDATE),
                               tnNrAct         IN vanzari.numar_act%type DEFAULT NULL,
                               tdDataAct       IN vanzari.data_act%type DEFAULT TRUNC(SYSDATE),
                               tnIncasat       IN NUMBER DEFAULT 0,
                               tnSumaIncasat   IN NUMBER DEFAULT 0,
                               tcTipIncasare   IN VARCHAR2 DEFAULT 'CHITANTA',
                               tnIdDelegat     IN VANZARI.ID_DELEGAT%TYPE DEFAULT NULL,
                               tnIdMasina      IN vanzari.id_masina%type DEFAULT NULL,
                               tnIdAgent       IN vanzari.id_agent%type DEFAULT NULL,
                               tcTextAditional IN vanzari.text_aditional%type DEFAULT NULL,
                               tnIdUtil        IN vanzari.id_util%type DEFAULT -3,
                               tcMesaj         OUT VARCHAR2,
                               tnIdVanzare     OUT VANZARI.ID_VANZARE%TYPE) IS

    -- tdDataAct - provizoriu pentru inregistrarea unor bonuri care nu s-au inregistrat in baza de date
    -- tnIncasat: 0 = neincasat; 1 = incasat total; 2 = incasat partial (avans)
    -- tcTipIncasare: BONFISCAL/CARD/TICHETE/CHITANTA
    lnTipIncasare number(2);

    nTipIncasareBonFiscal  NUMBER := 2;
    nTipIncasareCardBancar NUMBER := 3;
    nTipIncasareTichete    NUMBER := 5;
    nTipIncasareChitanta   NUMBER := 11;

    lnAn          calendar.anul%type := tnAn;
    lnLuna        calendar.luna%type := tnLuna;
    lnTvaIncasare calendar.tva_incasare%type;
    ldDataAct     act.dataact%type;
    ldDataIreg    act.dataireg%type;
    ldDataScad    act.datascad%type;
    ldDataCurs    act.dataact%type;

    lcSerieFactura  vanzari.serie_act%type;
    lnNrAct         vanzari.numar_act%type := tnNrAct;
    lnIdResponsabil act.id_responsabil%type;
    lcListaId       varchar2(100) := to_char(tnIdComanda);
    lcDescriere     varchar2(100);
    lnTip           vanzari.tip%type := 3; -- factura din comanda
    lnIdFdoc        act.id_fdoc%type;

    lnIdValuta act.id_valuta%type;
    lnInValuta number(1) := 0;
    lnIdUtil   vanzari.id_util%type := nvl(tnIdUtil, -3);

    lnTotftva act.suma%type;
    lnTotTva  act.suma%type;
    lnTotcTva act.suma%type;

    ldDataExp            vanzari.dataora_exp%type;
    lnDiscountFactura    vanzari.discount%type := 0;
    lnIdDelegat          vanzari.id_delegat%type := tnIdDelegat;
    lnIdMasina           vanzari.id_masina%type := tnIdMasina;
    lnIdAgent            vanzari.id_agent%type := tnIdAgent;
    lcTextAditional      varchar2(100) := tcTextAditional;
    lnDiscountEvidentiat vanzari.discount_evidentiat%type := 0;
    lnParametruAditional number(1);

    lcListaIncasare     varchar2(1000); -- V_LISTA_INCASARE : tip1|valoare1|id_bancasa1;tip2|valoare2|id_bancasa2 (pentru incasari cu mai multe tipuri ex: NUMERAR + CARD + TICHETE)
    V_CURSOR_VERIFICARE pack_facturare.cursor_facturare;

    lnIdSucursala  act.id_sucursala%type;
    lnIdSectie     act.id_sectie%type;
    lnIdVenChelt   act.id_venchelt%type;
    lnIdPartClient act.id_partd%type;
    lnIdPartCasa   act.id_partd%type;
    lnIdSet        act.Id_set%type := 25002;
    lnIdLucrare    act.id_lucrare%type;

    lnIdGestiune      stoc.id_gestiune%type;
    lnSumaIncasat     act.suma%type;
    lnIdTipDocFactura number(2) := pack_facturare.nid_tipfactura;
    lnIdSerieFactura  number(10);
    lnRec             number(10);
  BEGIN
    lnAn       := extract(year from sysdate);
    lnLuna     := extract(month from sysdate);
    ldDataAct := CASE
                   WHEN tdDataAct is not null then
                    tdDataAct
                   else
                    trunc(sysdate)
                 end;
    ldDataIreg := ldDataAct;
    ldDataScad := ldDataAct;
    ldDataCurs := ldDataAct;

    pack_sesiune.setAn(lnAn);
    pack_sesiune.setLuna(lnLuna);

    begin
      SELECT TVA_INCASARE
        INTO lnTvaIncasare
        FROM CALENDAR
       WHERE AN = lnAn
         AND LUNA = lnLuna;
    exception
      when NO_DATA_FOUND then
        RAISE_APPLICATION_ERROR(-20001,
                                'Nu s-a deschis luna ' ||
                                lpad(lnLuna, 2, '0') || '/' || lnAn || '!');
    end;

    lnTipIncasare := case
                       when tcTipIncasare = 'BONFISCAL' then
                        pack_facturare.nTipIncasareBonFiscal
                       when tcTipIncasare = 'CARD' then
                        pack_facturare.nTipIncasareCardBancar
                       when tcTipIncasare = 'TICHETE' then
                        pack_facturare.nTipIncasareTichete
                       when tcTipIncasare = 'CHITANTA' then
                        pack_facturare.nTipIncasareChitanta
                       else
                        pack_facturare.nTipIncasareChitanta
                     end;

    lnIdFdoc := TO_NUMBER(pack_sesiune.getoptiunefirma('ID_FDOC_FACT')); -- FEL DOCUMENT DIN OPTIUNI
    if lnIdFdoc is null then
      tcMesaj := 'Nu s-a configurat Tip Document Factura (ID_FDOC_FACT) in Optiuni!';
      RAISE_APPLICATION_ERROR(-20001, tcMesaj);
    end if;

    lnIdSerieFactura := to_number(pack_sesiune.getoptiunefirma('COM_ID_SERIE_FACT'));
    if lnIdSerieFactura is null then
      tcMesaj := 'Nu s-a configurat Serie Factura (COM_ID_SERIE_FACT) in Optiuni!';
      RAISE_APPLICATION_ERROR(-20001, tcMesaj);
    end if;

    -- obtin lcSerieFactura, lnNrAct
    lcSerieFactura := pack_serii_numere.citeste_serie(lnIdSerieFactura);
    if NVL(lnNrAct, 0) = 0 then
      pack_serii_numere.aloca_numar(lnIdTipDocFactura,
                                    lnIdSerieFactura,
                                    lnIdGestiune,
                                    lnIdUtil,
                                    lnIdSucursala,
                                    lnNrAct);
    end if;
    -- PENTRU FIECARE SUCURSALA,ID_SET(DIN POLITICA PRETURI) - FAC INREGISTRARI IN ACT, RUL, APOI IN VANZARI_DETALII
    select max(p.id_sucursala) as id_sucursala,
           MAX(c.id_part) as id_part_client
      into lnIdSucursala, lnIdPartClient
      FROM comenzi c
      join comenzi_elemente e
        on c.id_comanda = e.id_comanda
      join crm_politici_preturi p
        on e.id_pol = p.id_pol
     where c.id_comanda = tnIdComanda;

    pack_facturare.initializeaza_date_factura(ldDataIreg,
                                              lnIdFdoc,
                                              ldDataAct,
                                              ldDataScad,
                                              lcSerieFactura,
                                              lnNrAct,
                                              lnIdPartClient,
                                              lnIdLucrare,
                                              lnIdSectie,
                                              lnIdVenChelt,
                                              lnIdResponsabil,
                                              NULL, -- explicatia 4
                                              NULL, -- id_ordl
                                              lcListaId,
                                              lcDescriere,
                                              lnTIP,
                                              lnIdSet,
                                              ldDataCurs,
                                              lnIdValuta,
                                              lnInValuta,
                                              lnTvaIncasare,
                                              lnIdSucursala,
                                              lnIdUtil);

    insert into vanzari_detalii_temp
      (id_pol,
       id_articol,
       serie,
       id_gestiune,
       pret_achizitie,
       pretv_orig,
       pret,
       proc_tvav,
       pret_cu_tva,
       id_jtva_coloana,
       in_stoc,
       cont,
       id_valuta,
       id_valutad,
       pretd,
       cantitate)
      select e.id_pol,
             e.id_articol,
             '' as serie,
             -999 as id_gestiune,
             0 as pret_achizitie,
             e.pret as pretv_orig,
             e.pret as pret,
             ppa.proc_tvav,
             e.pret_cu_tva,
             case ppa.proc_tvav
               when 1.20 then
                27
               when 1.24 then
                15
               when 1.19 then
                1
               when 1.09 then
                3
               when 1.05 then
                13
               else
                8
             end as id_jtva_coloana,
             0 as in_stoc,
             '' as cont,
             p.id_valuta,
             p.id_valuta as id_valutad,
             0 as pretd,
             e.cantitate
        from comenzi_elemente e
        join comenzi c
          on c.id_comanda = e.id_comanda
        join vnom_articole a
          on e.id_articol = a.id_articol
        join crm_politici_preturi p
          on e.id_pol = p.id_pol
        join crm_politici_pret_art ppa
          on e.id_pol = ppa.id_pol
         and e.id_articol = ppa.id_articol
       where c.id_comanda = tnIdComanda;

    select count(*) into lnRec from vanzari_detalii_temp;

    -- totaluri pentru inregistrarea facturii si incasarii
    select sum(pack_sesiune.calculeaza_total_fara_tva(e.pret,
                                                      null,
                                                      null,
                                                      null,
                                                      null,
                                                      e.cantitate,
                                                      e.pret_cu_tva,
                                                      ppa.proc_tvav,
                                                      null,
                                                      null)),
           sum(pack_sesiune.calculeaza_total_tva(e.pret,
                                                 null,
                                                 null,
                                                 null,
                                                 null,
                                                 e.cantitate,
                                                 e.pret_cu_tva,
                                                 ppa.proc_tvav,
                                                 null,
                                                 null)),
           sum(pack_sesiune.calculeaza_total_cu_tva(e.pret,
                                                    null,
                                                    null,
                                                    null,
                                                    null,
                                                    e.cantitate,
                                                    e.pret_cu_tva,
                                                    ppa.proc_tvav,
                                                    null,
                                                    null))
      INTO lnTotftva, lnTotTva, lnTotcTva
      FROM comenzi_elemente e
      join crm_politici_preturi p
        on e.id_pol = p.id_pol
      join crm_politici_pret_art ppa
        on e.id_pol = ppa.id_pol
       and e.id_articol = ppa.id_articol
     WHERE e.id_comanda = tnIdComanda;

    if tnIncasat <> 0 then
      lnSumaIncasat := case
                         when tnIncasat = 1 then
                          lnTotcTVA
                         else
                          tnSumaIncasat
                       end;
      -- tip|valoare|id_bancasa|ascc|scd|ascd
      lnIdPartCasa := to_number(pack_sesiune.getoptiunefirma('ID_PART_CASA'));

      lcListaIncasare := lnTipIncasare || '|' || lnSumaIncasat || '|' ||
                         lnIdPartCasa || '|' || 'xxxx|5311|xxxx';
    end if;

    ldDataExp := SYSDATE;
    pack_facturare.scrie_factura2(lnTOTFTVA,
                                  lnTOTTVA,
                                  lnDiscountFactura,
                                  Null,
                                  lnNrAct,
                                  lcListaIncasare,
                                  lnIdDelegat,
                                  lnIdMasina,
                                  null,
                                  0,
                                  ldDataExp,
                                  lnIdAgent,
                                  lcTextAditional,
                                  lnDiscountEvidentiat,
                                  lnParametruAditional,
                                  tnIdVanzare,
                                  V_CURSOR_VERIFICARE);

    -- SCRIU VANZAREA CHIAR DACA NU SUNT COMPLETATE ANALITICELE/PARTENERII, SI INTORC MESAJ DE ATENTIONARE
    if tnIdVanzare is null then
      pack_facturare.finalizeaza_factura(NULL,
                                         lnIdDelegat, -- V_ID_DELEGAT,
                                         lnIdMasina, -- V_ID_MASINA,
                                         null, -- id_facturare
                                         0, -- listare detaliata
                                         ldDataExp,
                                         lnIdAgent, -- V_ID_AGENT,
                                         lcTextAditional, -- V_TEXT_ADITIONAL,
                                         0 -- V_PARAMETRU_ADITIONAL
                                         );
      tnIdVanzare := pack_facturare.nid_vanzare;
      tcMesaj     := 'Nu s-au configurat partenerii si/sau conturile analitice! Nu s-a inregistrat factura!';
      /*  RAISE_APPLICATION_ERROR(-20000,
      'Nu s-au configurat partenerii si/sau conturile analitice!');*/
    end if;

    <<SFARSIT>>
    null;
  end factureaza_comanda;
  ----------------------------------------------------------------------------------
/*procedure recompune_optiuni
declare
  -- Local variables here
  lcLista             varchar2(1000);
  lcIdCautat          varchar2(100);
  lnPoz               number(4);
  lnPozIncepeValVeche number(4);
  lnx                 number(4);
  lcValoare           varchar2(100);
  lcValNou            varchar2(100);
begin
  -- Test statements here
  lcLista    := '1001::3;2::777;1003::5';
  lcIdCautat := '2' || '::';
  lcValNou   := '9';
  lnPoz      := instr(lcLista, lcIdCautat);
  dbms_output.put_line('Lista initiala = ' || lcLista);
  if lnPoz > 0 then
    lnPozIncepeValVeche := lnPoz + length(lcIdCautat);
    dbms_output.put_line('Unde incepe valoarea veche = ' ||
                         lnPozIncepeValVeche);
    lnPoz := instr(lcLista, ';', lnPozIncepeValVeche);
    dbms_output.put_line('Urmatoarea aparitie a lui ; = ' || lnPoz);
    lcValoare := substr(lcLista,
                        lnPozIncepeValVeche,
                        lnPoz - lnPozIncepeValVeche);
                        dbms_output.put_line('lcValoare= ' || lcValoare);
    lcLista := substr(lcLista, 1, lnPozIncepeValVeche - 1) || lcValNou ||
               substr(lcLista, lnPozIncepeValVeche + length(lcValoare));
    dbms_output.put_line('Lista finala= ' || lcLista);

  end if;

end;*/
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
-- raport comenzi furnizori pe baza vanzarilor
----------------------------------------------------------------------------------
end PACK_COMENZI;
/
