Debe implementarse https://glovalanalytics.atlassian.net/browse/GLIT-4007 para solucionar de raiz


Solicitudes de agentes que van a facturar a través de terceros y se debe dar de alta la empresa a través de la que van a facturar:


Verificaciones previas

    Verificación 1.- Verificar si el usuario está asociado a una empresa (según PERSONAL.CONTRATO) 

select p.CODUSUA, p.NIF, p.CONTRATO, p.email, p.nombre from valtecnic2.personal P where codage=@Codigo_Agente


    Verificacion 2.- Verificar que el proveedor no exista ya, es posible que esté dado de alta para otro agente.

--Búsqueda por nombre
select * from PROVEEDOR  where UPPER(NOMBRE) LIKE UPPER('%NOMBRE_DEL_PROVEEDOR%');

--Búsqueda por CIF
select * from PROVEEDOR  where UPPER(NIF) LIKE UPPER(@CIF);



Secuencia a realizar (si se ejecutan los pasos B y C, éstos se deben realizar con el script definido más adelante)

    A) Si la empresa ya existe según Verificación 2, comprobar si todos los datos coinciden con los proporcionados por el usuario (si hay discrepancia, confirmar los cambios con el usuario), y bastaría con asignar al usuario en el campo CONTRATO con el valor de PROVEEDOR.CONTRATO.


    B) Si no está vinculado a ningún agente, se puede dar de alta en la tabla de PROVEEDOR (hacerlo con el script definido más abajo)

  • CONTRATO es la clave primaria, y su valor puede ser el MAX + 1, siempre que ese valor no esté vinculado a ningún registro de PERSONAL
    • Si ya está ocupado ir avanzando de uno en uno hasta encontrar el primero libre.
  • El campo TIPOSOC hace referencia al tipo de sociedad y según la retención puede tener los siguientes valores 
    • SL → Sociedad Limitada (por defecto poner éste)

    • P → Particular (si factura como persona física y no jurídica, aplicándose así el IRPF general del 15%)

    • P7 → Particular con retención específica del IRP al 7%

    • SC → Sociedad Cooperativa (no difiere en cuanto a retención de la SL)

    C) Una vez creada la nueva empresa, vincularlo con la tabla PERSONAL a través del campo CONTRATO


Cuando se informe al usuario del alta de un nuevo proveedor, se le debe indicar además del tipo de sociedad a efectos de retención y del tipo de IVA puesto.


Se puede emplear el siguiente script para la generación de un nuevo proveedor y asignación a un agente (puntos B y C), ¡¡pero hay que hacer la verificación 1 y 2!!:


SET SERVEROUTPUT ON

DECLARE 
sNOMBRE VARCHAR2(45) := ;
sTIPOSOC VARCHAR2(2):= ;    --POR DEFECTO SL. Si se le aplica retención IRPF porque facture como persona física, tendrá valor P o P7
sDIRECCION VARCHAR(40) := ; --
nCODPOS NUMBER(10, 0) :=  ;
sNIF VARCHAR2(12) := ;
nTIPIVA NUMBER(5,2) :=  ;   --POR DEFECTO 21
sIBAN VARCHAR2(4) := ;
nROCUENTACTE NUMBER(20, 0) := ;
sCODAGE VARCHAR2(10) := ; --Código del agente al que se asignará el proveedor
nCONTRATO NUMBER (5, 0) := NULL;
nAUX NUMBER (10, 0) := 0;

BEGIN 
    --Se obtiene el MAX + 1 si no está asociado a ningun registro de PERSONAL (si lo está, hacerlo del MAX + 2, +3, ...
    SELECT NVL(MAX(CONTRATO), 0) + 1 INTO nCONTRATO
    FROM PROVEEDOR;
    
    DBMS_OUTPUT.PUT_LINE('Nuevo contrato: ' || nContrato);

    SELECT COUNT(*) INTO nAUX FROM PERSONAL P WHERE CONTRATO = nContrato;
    IF nAUX > 0 THEN    
        DBMS_OUTPUT.PUT_LINE('ERROR: Hay que dar otro código al nuevo PROVEEDOR');
    ELSE
        INSERT INTO PROVEEDOR (CONTRATO, NOMBRE, TIPOSOC, DIRECCION, CODPOS, NIF, TIPIVA, IBAN, NROCUENTACTE)
        VALUES (nCONTRATO, sNOMBRE, sTIPOSOC, sDIRECCION, nCODPOS, sNIF, nTIPIVA, sIBAN, nROCUENTACTE);
    
        nAUX := SQL%rowcount;
        IF SQL%rowcount <> 1 THEN
            dbms_output.put_line('ERROR: Se tiene que sinsertar un solo proveedor y se han insertado ' || nAUX);            
        ELSE           
            --Asignación del  proveedor al agente.
            UPDATE PERSONAL SET CONTRATO = (SELECT CONTRATO FROM PROVEEDOR WHERE CONTRATO = nCONTRATO)
            WHERE CODAGE = sCODAGE;
    
            nAUX := SQL%rowcount;
            
            IF SQL%rowcount <> 1 THEN
                dbms_output.put_line('ERROR: Se tiene que actualizar un solo AGENTE y se han actualizado ' || nAUX);
            ELSE
              DBMS_OUTPUT.PUT_LINE ('¡¡CORRECTO!!! Puede lanzar el script con el COMMIT.');
            END IF;           
            
           -- COMMIT;
            
        END IF;           
    END IF;    
   
   ROLLBACK;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        dbms_output.put_line('Hecho rollback' );
        DBMS_OUTPUT.put_line('Error:'||TO_CHAR(SQLCODE));
        DBMS_OUTPUT.put_line(SQLERRM);
END;




Esta es una solución hasta que el usuario sea autónomo para gestionar esta tabla (PROVEEDOR) y su vinculación con PERSONAL, que se realizará en https://glovalanalytics.atlassian.net/browse/GLIT-1296


select * from PROVEEDOR  where UPPER(NOMBRE) LIKE UPPER('%NOMBRE_DEL_PROVEEDOR%')