 /*!40101 SET NAMES utf8 */;
DELIMITER $$

/*
procedura generujaca tabele salda i salda_pop na potrzeby zestawien typu bilans i RZiS,
w planach także dla zestawienia jpk_kr
tabele z nazwami salda i salda_pop są używane w bardzo wielu miejscach (definicje zestawień ips) i zmiana ich nazw bylaby upierdliwa
nazwy dat w parametrach sa historyczne, zgodne z ips-em
*/

DROP PROCEDURE IF EXISTS `fk_salda_zest`$$
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `fk_salda_zest`(
 IN MODE VARCHAR(50),
 IN _DATABO VARCHAR(10),
 IN _DATADO VARCHAR(10),
 IN _Param_A VARCHAR(50), IN _Param_B VARCHAR(50), IN _Param_C VARCHAR(50)
 )

SPROC: BEGIN
 DECLARE _rok, _rokpop int;

 SET @session.globals.Owner=IFNULL(@session.globals.Owner,(SELECT value FROM _db_globals g WHERE g.key='Owner'));
 /*
 mode podstawowy i na razie jedyny, moze z czasem bedzie ich wiecej
 w mpgk dla rzis jest tylko pytanie o datedo - data bo jest z automatu znajdowana
 warto procedure zoptymalizowac - zamiast zmiennych malpa wstawic zmienne deklarowane
 UWAGA: wywoałnie w init_sql musi byc z podwojnymi uszami!!!
 call fk_salda_zest("PODST","#databo#","#datado#","","","");
 databo nie jest potrzebna w nowszej wersji
 call fk_salda_zest("PODST","","#datado#","","","");
 call fk_salda_zest('PODST','2024-01-01','2024-12-31','','','');
 */

 IF MODE='PODST' THEN
  DROP TABLE IF EXISTS salda;
  DROP TABLE IF EXISTS salda_pop;

  -- SET @databo = "#databo#";
  -- SET @datado = "#datado#";
  -- SET @databo = '2024-01-01';
  -- SET @datado = '2024-06-30'; -- tak akurat robili w mpgk

  -- SET @databo = _DATABO;
  -- wersja tylko z datą do, data bo jest wyliczana
  SET @databo = (SELECT DataBo FROM lata_obrachunkowe WHERE DataBo<= _DATADO ORDER BY DataBo DESC LIMIT 1);
  SET @datado = _DATADO;

  SET @databopop = (SELECT DataBO FROM lata_obrachunkowe WHERE idn=YEAR(@databo - INTERVAL 1 YEAR));
  SET @datadopop = (SELECT DataBZ FROM lata_obrachunkowe WHERE idn=YEAR(@databo - INTERVAL 1 YEAR));
  SET _rok= YEAR(@databo);
  SET _rokpop= _rok-1;

  CREATE TABLE salda
  SELECT P.symbol_fmt AS konto, P.symbol AS SymbolKonta,
  SUM(IF((Z.rodzaj_fk IN (1,2)) AND (Z.stronaWN),Z.kwota,0)) AS BO_WN, SUM(IF((Z.rodzaj_fk IN (1,2)) AND NOT (Z.stronaWN),Z.kwota,0)) AS BO_MA,
  SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) AS OBR_OKR_WN,
  SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) AS OBR_OKR_MA,
  SUM(IF( (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_WN, SUM(IF(NOT (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_MA,
  ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))>ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,Z.kwota,-Z.kwota)),0),4) AS SALDO_WN,
  ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))<=ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,-Z.kwota,Z.kwota)),0),4) AS SALDO_MA,
  SUM(IF(Z.stronaWN,Z.kwota,0)) AS SALDO_WN_Strony, SUM(IF(NOT Z.stronaWN,Z.kwota,0)) AS SALDO_MA_Strony,
  IF(SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) >SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND
  (Z.data_dowodu>=@databo), Z.kwota,0)) ,SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) -SUM(IF((Z.rodzaj_fk IN (3,4))
  AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) ,0) AS SALDO_OKR_WN,
  IF(SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) >SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND
  (Z.data_dowodu>=@databo), Z.kwota,0)) ,SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) -SUM(IF((Z.rodzaj_fk IN (3,4))
   AND (Z.stronaWN) AND (Z.data_dowodu>=@databo), Z.kwota,0)) ,0) AS SALDO_OKR_MA
  FROM  zapisy Z
  LEFT JOIN plankont P ON SUBSTRING_INDEX(Z.konto,"|",4+1) = P.symbol AND P.rok=Z.rok
  WHERE  (Z.pozabilans = 0) AND (Z.data_dowodu<=@datado) AND (Z.data_dowodu>=@databo)
  AND Z.rok = _rok
  GROUP BY P.symbol_fmt
  ;

  CREATE TABLE salda_pop
  SELECT P.symbol_fmt AS konto, P.symbol AS SymbolKonta,
  SUM(IF((Z.rodzaj_fk IN (1,2)) AND (Z.stronaWN),Z.kwota,0)) AS BO_WN, SUM(IF((Z.rodzaj_fk IN (1,2)) AND NOT (Z.stronaWN),Z.kwota,0)) AS BO_MA,
  SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) AS OBR_OKR_WN,
  SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) AS OBR_OKR_MA,
  SUM(IF( (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_WN, SUM(IF(NOT (Z.stronaWN) ,Z.kwota,0)) AS OBR_NAR_MA,
  ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))>ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,Z.kwota,-Z.kwota)),0),4) AS SALDO_WN,
  ROUND(IF(ABS(SUM(IF(Z.stronaWN,Z.kwota,0)))<=ABS(SUM(IF(Z.stronaWN,0,Z.kwota))) ,SUM(IF(Z.stronaWN,-Z.kwota,Z.kwota)),0),4) AS SALDO_MA,
  SUM(IF(Z.stronaWN,Z.kwota,0)) AS SALDO_WN_Strony, SUM(IF(NOT Z.stronaWN,Z.kwota,0)) AS SALDO_MA_Strony,
  IF(SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) >SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND
  (Z.data_dowodu>=@databopop), Z.kwota,0)) ,SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) -SUM(IF((Z.rodzaj_fk IN (3,4))
  AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) ,0) AS SALDO_OKR_WN,
  IF(SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) >SUM(IF((Z.rodzaj_fk IN (3,4)) AND (Z.stronaWN) AND
  (Z.data_dowodu>=@databopop), Z.kwota,0)) ,SUM(IF((Z.rodzaj_fk IN (3,4)) AND NOT (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) -SUM(IF((Z.rodzaj_fk IN (3,4))
   AND (Z.stronaWN) AND (Z.data_dowodu>=@databopop), Z.kwota,0)) ,0) AS SALDO_OKR_MA
  FROM  zapisy Z
  LEFT JOIN plankont P ON SUBSTRING_INDEX(Z.konto,"|",4+1) = P.symbol AND P.rok=Z.rok
  WHERE  (Z.pozabilans = 0) AND (Z.data_dowodu<=@datadopop) AND (Z.data_dowodu>=@databopop)
  AND Z.rok = _rokpop
  GROUP BY  P.symbol_fmt
  ;

 END IF;


END $$

DELIMITER ;
