SET DATEFORMAT YMD;
DROP PROCEDURE IF EXISTS SP_ADM_CIERREMENSUAL
GO
CREATE PROCEDURE SP_ADM_CIERREMENSUAL
 (@CodSucu VARCHAR(5), @Fecha DATETIME, @PerOLD VARCHAR(10),@PerNEW VARCHAR(10))
WITH ENCRYPTION AS
BEGIN
 SET NOCOUNT ON;
 SET DATEFORMAT YMD;
DECLARE
  @FechaUC DATETIME,
  @MESESPTOS INT,
  @MesPrf INT,
  @MesOC INT,
  @MesTran INT;
BEGIN TRANSACTION
  SELECT @MesPrf=MesPrf, @MesOC=MesOC, @MesTran=MesTran,
         @FECHAUC=FECHAUC, @MESESPTOS=MESESPTOS
    FROM SACONF WITH (NOLOCK)
   WHERE CODSUCU=@CODSUCU;
  UPDATE SACLIE
     SET SALDOPTOS=(CASE WHEN CONVERT(INT,@FECHA-@FECHAUC)/30>=@MESESPTOS THEN 0 ELSE SALDOPTOS END);
  UPDATE SACONF 
     SET FECHAUC=(CASE WHEN CONVERT(INT,@FECHA-@FECHAUC)/30>=@MESESPTOS THEN @FECHA ELSE FECHAUC END)
   WHERE CODSUCU=@CODSUCU;
UPDATE SAEXIS
   SET Existen =IIF(R.DEsSeri>0 or R.DEsLote>0,R.Existen,SAEXIS.Existen)
      ,ExUnidad=IIF(R.DEsSeri>0 or R.DEsLote>0,R.ExUnidad,SAEXIS.ExUnidad)
  FROM (SELECT E.CODSUCU, E.CODPROD, E.CodUbic, P.DEsSeri, P.DESLOTE,
               SUM(E.TEXISTEN) AS EXISTEN,
               SUM(E.TEXUNIDAD) AS EXUNIDAD
          FROM (SELECT CODSUCU, CODPROD, CODUBIC,
                       SUM(CANTIDAD) AS TEXISTEN,
                       SUM(CANTIDADU) AS TEXUNIDAD
                  FROM SALOTE WITH (NOLOCK) 
                 GROUP BY CODSUCU, CODPROD, CODUBIC
                 UNION
                SELECT CODSUCU, CODPROD, CODUBIC,
                       COUNT(CodProd) AS TEXISTEN,
                       0 AS TEXUNIDAD
                  FROM SASERI WITH (NOLOCK) 
                 GROUP BY CODSUCU, CODPROD, CODUBIC) E
               INNER JOIN SAPROD P ON
                     (P.CODPROD=E.CodProd)
         GROUP BY E.CODSUCU, E.CODPROD, E.CODUBIC, P.DEsSeri, P.DESLOTE) R
 WHERE     (R.CODSUCU=SAEXIS.CODSUCU)
       AND (R.CODPROD=SAEXIS.CODPROD)
       AND (R.CODUBIC=SAEXIS.CODUBIC);
UPDATE SAINITI SET
       COSTOFINAL= ISNULL(prd.COSTPRO,0),
       EXFINAL= ISNULL(ex.Existen,0),
       EXUNDFINAL= ISNULL(ex.EXUNIDAD,0)
  FROM SAINITI as INI WITH (NOLOCK)
       INNER JOIN SAEXIS AS EX ON
         INI.CODSUCU=EX.CODSUCU AND
         INI.CODUBIC=EX.CODUBIC AND
         INI.CODPROD=EX.CODPROD
       INNER JOIN SAPROD AS PRD ON
         INI.CODPROD=PRD.CODPROD
 WHERE INI.CODSUCU=@CODSUCU AND PERIODO=@PerOLD
DELETE SAINITI WHERE CODSUCU=@CODSUCU AND PERIODO=@PerNEW;
INSERT INTO SAINITI (CODSUCU,CODPROD, CODUBIC, PERIODO, EXINICIAL, EXUNDINI, COSTO)
       SELECT @CODSUCU, PR.CODPROD, DP.CODUBIC, @PerNEW,
              ISNULL(EX.EXISTEN,0), ISNULL(EX.EXUNIDAD,0), ISNULL(PR.COSTPRO,0)
         FROM SAPROD AS PR WITH (NOLOCK)
              CROSS JOIN SADEPO DP
              LEFT JOIN SAEXIS EX
              ON EX.CODSUCU=@CODSUCU AND EX.CODPROD=PR.CODPROD AND EX.CODUBIC=DP.CODUBIC;
DELETE SAITEMFAC
 WHERE (CONVERT(INT,(@Fecha-FechaE))/30>=@MesPrf) And (TipoFac='F')
DELETE SAFACT 
 WHERE CONVERT(INT,(@Fecha-FechaE))/30>=@MesPrf And (TipoFac='F')
DELETE SAITEMCOM
 WHERE CONVERT(INT,(@Fecha-FechaE))/30>=@MesOC And (TipoCom='S')
DELETE SACOMP
 WHERE CONVERT(INT,(@Fecha-FechaE))/30>=@MesOC And (TipoCom='S')
UPDATE SACONF SET MesCurso=@PerNEW
 WHERE CODSUCU=@CODSUCU;
COMMIT TRANSACTION;
END
GO
DROP PROCEDURE IF EXISTS TR_ADM_UPDATE_EXISTENCIAS
GO
CREATE PROCEDURE TR_ADM_UPDATE_EXISTENCIAS
( @CodSucu varchar(5), 
  @CodProd varchar(15),
  @CodUbic varchar(10), 
  @Cantidad Decimal(28,4), 
  @EsUnidad SmallInt,
  @FECHAE   DATETIME)
WITH ENCRYPTION AS 
BEGIN
 SET NOCOUNT ON;
  DECLARE
     @ESLOTE    SMALLINT=0,
     @PERIODO   VARCHAR(  10),
     @MAXEMPAQ  DECIMAL(28,4),
     @UNDEMPAQ  DECIMAL(28,4),
     @CANTEMPAQ DECIMAL(28,4);
  SET @PERIODO=FORMAT(@FECHAE,'yyyyMM');
  SELECT @CANTEMPAQ=IIF(CANTEMPAQ=0,1,CANTEMPAQ),
         @ESLOTE=DESLOTE
    FROM SAPROD WITH (NOLOCK)
   WHERE CODPROD=@CODPROD
  IF NOT EXISTS(SELECT CODPROD FROM SAINITI WITH (NOLOCK)
                 WHERE (CODSUCU=@CODSUCU) AND
                       (CODPROD=@CODPROD) AND
                       (CODUBIC=@CODUBIC) AND
                       (PERIODO=@PERIODO))
     INSERT INTO SAINITI
            (CodSucu,CodProd,CodUbic,Periodo,ExInicial,ExUndIni)
            SELECT @CodSucu,CodProd,@CodUbic,@Periodo,0,0
              FROM SAEXIS WITH (NOLOCK)
             WHERE (CODSUCU=@CODSUCU) AND (CodProd=@CodProd) AND (CodUbic=@CodUbic);
  UPDATE SAEXIS
     SET EXUNIDAD=EXUNIDAD+ IIF(@ESUNIDAD=1,@CANTIDAD,0),
         EXISTEN =EXISTEN+  IIF(@ESUNIDAD=0,@CANTIDAD,0)
   WHERE (CODSUCU=@CODSUCU) AND (CodProd=@CodProd) AND (CodUbic=@CodUbic);
  IF (@@ROWCOUNT=0)
     INSERT SAEXIS (CODSUCU,CODPROD, CODUBIC, EXISTEN, EXUNIDAD)
            VALUES (@CODSUCU,@CODPROD,@CODUBIC,
                    IIF(@ESUNIDAD=0,@CANTIDAD,0),
                    IIF(@ESUNIDAD=1,@CANTIDAD,0));
  IF (@CANTEMPAQ>1)
     BEGIN
       UPDATE SAEXIS
          SET EXUNIDAD=EXUNIDAD-FLOOR(EXUNIDAD/@CANTEMPAQ)*@CANTEMPAQ,
              EXISTEN=EXISTEN+FLOOR(EXUNIDAD/@CANTEMPAQ)
        WHERE (CODSUCU=@CODSUCU) AND (CodProd=@CodProd) AND (CodUbic=@CodUbic);
       IF @ESLOTE=1
          UPDATE SALOTE
             SET CANTIDADU=CANTIDADU-FLOOR(CANTIDADU/@CANTEMPAQ)*@CANTEMPAQ,
                 CANTIDAD=CANTIDAD+FLOOR(CANTIDADU/@CANTEMPAQ)
           WHERE (CODSUCU=@CODSUCU) AND (CodProd=@CodProd) AND (CodUbic=@CodUbic);
     END;
  UPDATE SAPROD SET
         EXISTEN =EX.EXISTEN,
         EXUNIDAD=EX.EXUNIDAD
    FROM (SELECT SUM(EXISTEN)  AS EXISTEN,
                 SUM(EXUNIDAD) AS EXUNIDAD
            FROM SAEXIS WITH (NOLOCK)
           WHERE (CODSUCU=@CODSUCU) AND (CODPROD=@CODPROD)) AS EX
   WHERE (CodProd=@CodProd);
END;
GO
DROP PROCEDURE IF EXISTS SP_ADM_PROXCORREL
GO
CREATE PROCEDURE SP_ADM_PROXCORREL
(@CODSUCU  VARCHAR(10), @CODESTA  VARCHAR(10),
 @PRXFIELD VARCHAR(20), @NUMERO   VARCHAR(25) OUTPUT)
WITH ENCRYPTION AS
BEGIN
 SET NOCOUNT ON;
 DECLARE
   @CHARFILL   VARCHAR(1)='0',
   @PREFIX     VARCHAR(15)=NULL,
   @NUMTEMP    VARCHAR(25),
   @LENCORREL  INT=8,
   @OKUPDATE   INT=-1,
   @PROXNUMBER INT=1;
 SET @CHARFILL=(SELECT TOP 1 (CASE WHEN FILLCORREL=0 THEN '' 
                             WHEN FILLCORREL=1 THEN '0' 
                             WHEN FILLCORREL=2 THEN ' ' 
                        END)  
                  FROM SACONF WITH (NOLOCK)
                 WHERE (CODSUCU=@CODSUCU));
 UPDATE SACORRELSIS  
    SET @OKUPDATE=0,@LENCORREL=LENCORREL, @PREFIX=PREFIJO,
        @PROXNUMBER=VALUEINT, VALUEINT=VALUEINT+1 
  WHERE (CODSUCU=@CODSUCU) AND (FIELDNAME=@PRXFIELD) AND
        (ISNULL(CODESTA,'')=ISNULL(@CODESTA,''));
 IF @OKUPDATE=-1
    INSERT INTO SACORRELSIS
           (CODSUCU,CODESTA,FIELDNAME,LENCORREL,PREFIJO,VALUEINT)
           VALUES
           (@CODSUCU,@CODESTA,@PRXFIELD,@LENCORREL,@PREFIX,@PROXNUMBER)
 SET @NUMTEMP=CONVERT(VARCHAR,@PROXNUMBER);
 SET @NUMERO=ISNULL(@PREFIX,'')+REPLICATE(@CHARFILL,@LENCORREL-LEN(@NUMTEMP))+@NUMTEMP;
END;
GO
