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%')