Idea aplikacj.
W restauracji na kazdym stoliku będize naklejka z inwydidualnym kodem QR.
Klient bedzie mógł zeskanować kod QR i wejść do aplikacji.



Dane do bazy danych Microsoft SQL
$serverName = '192.168.20.20';
$connectionOptions = [
    'Database' => 'Gastro',
    'Uid' => 'sa',
    'PWD' => 'karczma!@#26',
    'CharacterSet' => 'UTF-8',
];

dbo.NGastroDTRachunek - Tutaj jest lista rachunków. 
        {
            "schema": "dbo",
            "name": "NGastroDTRachunek",
            "full_name": "dbo.NGastroDTRachunek",
            "columns": [
                {
                    "name": "ID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": "(newid())",
                    "ordinal": 1
                },
                {
                    "name": "UzytkownikModyfikujacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 2
                },
                {
                    "name": "RabatID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 3
                },
                {
                    "name": "StolikID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 4
                },
                {
                    "name": "KartaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 5
                },
                {
                    "name": "DotacjaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 6
                },
                {
                    "name": "RezerwacjaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 7
                },
                {
                    "name": "ZmianaUzytkownikOtwierajacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 8
                },
                {
                    "name": "RodzajOtwarciaRachunkuID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 9
                },
                {
                    "name": "PoziomCenowyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 10
                },
                {
                    "name": "UzytkownikOtwierajacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 11
                },
                {
                    "name": "KasaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 12
                },
                {
                    "name": "ZmianaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 13
                },
                {
                    "name": "Numer",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 14
                },
                {
                    "name": "NumerZmiana",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 15
                },
                {
                    "name": "NumerReczny",
                    "data_type": "varchar",
                    "type": "varchar(10)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 16
                },
                {
                    "name": "DataOtwarcia",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 17
                },
                {
                    "name": "DataZamkniecia",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 18
                },
                {
                    "name": "DataModyfikacji",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 19
                },
                {
                    "name": "Opis",
                    "data_type": "nvarchar",
                    "type": "nvarchar(400)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 20
                },
                {
                    "name": "IloscOsob",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 21
                },
                {
                    "name": "Status",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 22
                },
                {
                    "name": "FlgRozliczony",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 23
                },
                {
                    "name": "RachunekWstepnyIlosc",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 24
                },
                {
                    "name": "FlgBlokadaEdycji",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 25
                },
                {
                    "name": "FlgBlokadaEdycjiPoRabacie",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 26
                },
                {
                    "name": "NIP",
                    "data_type": "varchar",
                    "type": "varchar(20)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 27
                },
                {
                    "name": "FlgDotacjaUwzgledniaPozycjeNaDokumencie",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 28
                },
                {
                    "name": "KodKreskowy",
                    "data_type": "varchar",
                    "type": "varchar(16)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 29
                },
                {
                    "name": "FlgNumerWydrukowany",
                    "data_type": "bit",
                    "type": "bit",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 30
                },
                {
                    "name": "FlgKolejnoscSerwowania",
                    "data_type": "bit",
                    "type": "bit",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 31
                },
                {
                    "name": "OkresSerwowaniaNr",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": true,
                    "default": null,
                    "ordinal": 32
                },
                {
                    "name": "FlgExecutionStatus",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 33
                },
                {
                    "name": "NumerDoOdbioruOdnawialny",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 34
                },
                {
                    "name": "FlgFastTrack",
                    "data_type": "bit",
                    "type": "bit",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 35
                },
                {
                    "name": "LimitWartosciRachunku",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 36
                },
                {
                    "name": "Telefon",
                    "data_type": "varchar",
                    "type": "varchar(15)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 37
                },
                {
                    "name": "FlgRecznyTelefon",
                    "data_type": "bit",
                    "type": "bit",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 38
                },
                {
                    "name": "_FlgTCF",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 39
                },
                {
                    "name": "DS_RowVersion",
                    "data_type": "timestamp",
                    "type": "timestamp",
                    "nullable": false,
                    "default": null,
                    "ordinal": 40
                }
            ],
            "column_count": 40,
            "order_column": "DS_RowVersion",
            "order_reason": "timestamp\/rowversion"
        },


Kolumna StolikID w tabeli SaleTransOrder jest ID stolika, który został przypisany do zamówienia. Kolumna Ta jest kluczem obcym, który wskazuje na tabelę SaleStolik.

Pozycje danego rachunku znajdują się w tabeli: dbo.NGastroDTRachunekPozycja

        {
            "schema": "dbo",
            "name": "NGastroDTRachunekPozycja",
            "full_name": "dbo.NGastroDTRachunekPozycja",
            "columns": [
                {
                    "name": "ID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": "(newid())",
                    "ordinal": 1
                },
                {
                    "name": "UzytkownikUsuwajacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 2
                },
                {
                    "name": "RabatID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 3
                },
                {
                    "name": "ZestawID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 4
                },
                {
                    "name": "KonfiguracjaDrukowaniaZamowienID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 5
                },
                {
                    "name": "UzytkownikAutoryzujacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 6
                },
                {
                    "name": "PrzyczynaStornZwrotowID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 7
                },
                {
                    "name": "PromocjaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 8
                },
                {
                    "name": "KuponID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 9
                },
                {
                    "name": "DTRachunekID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 10
                },
                {
                    "name": "TowarID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 11
                },
                {
                    "name": "UzytkownikDodajacyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 12
                },
                {
                    "name": "StawkaVatID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 13
                },
                {
                    "name": "KasaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 14
                },
                {
                    "name": "PoziomCenowyID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": false,
                    "default": null,
                    "ordinal": 15
                },
                {
                    "name": "Ilosc",
                    "data_type": "decimal",
                    "type": "decimal(19,6)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 16
                },
                {
                    "name": "IloscZestawow",
                    "data_type": "decimal",
                    "type": "decimal(19,6)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 17
                },
                {
                    "name": "Cena",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 18
                },
                {
                    "name": "DataDodania",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 19
                },
                {
                    "name": "DataUsuniecia",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 20
                },
                {
                    "name": "DataModyfikacjiGrupySerwowania",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 21
                },
                {
                    "name": "IloscMinutOpoznienia",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 22
                },
                {
                    "name": "FlgWydrukowana",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 23
                },
                {
                    "name": "NumerGrupySerwowania",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 24
                },
                {
                    "name": "IloscKawalkow",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 25
                },
                {
                    "name": "RolaWKompozycji",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 26
                },
                {
                    "name": "NumerCzesci",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 27
                },
                {
                    "name": "Notatka",
                    "data_type": "varchar",
                    "type": "varchar(255)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 28
                },
                {
                    "name": "_p_StawkaVatGrupaSymbol",
                    "data_type": "varchar",
                    "type": "varchar(1)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 29
                },
                {
                    "name": "_p_StawkaVatSymbol",
                    "data_type": "varchar",
                    "type": "varchar(10)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 30
                },
                {
                    "name": "_p_StawkaVatSeparatorFiskalny",
                    "data_type": "varchar",
                    "type": "varchar(10)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 31
                },
                {
                    "name": "_p_StawkaVatStawka",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 32
                },
                {
                    "name": "_p_StawkaVatFlgZwolniona",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 33
                },
                {
                    "name": "_c_Wartosc",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 34
                },
                {
                    "name": "_c_DataUtworzenia",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 35
                },
                {
                    "name": "CenaPodstawowa",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 36
                },
                {
                    "name": "CenaPozaZestawem",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 37
                },
                {
                    "name": "CenaPodstawowaPozaZestawem",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 38
                },
                {
                    "name": "GrupaZestawuID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 39
                },
                {
                    "name": "ZrodloRabatuID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 40
                },
                {
                    "name": "FlgRodzajZrodlaRabatu",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 41
                },
                {
                    "name": "IloscZrealizowana",
                    "data_type": "decimal",
                    "type": "decimal(19,6)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 42
                },
                {
                    "name": "StatusRealizacji",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 43
                },
                {
                    "name": "DataZmianyStatusuRealizacji",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 44
                },
                {
                    "name": "StatusEdycji",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 45
                },
                {
                    "name": "DataWydruku",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 46
                },
                {
                    "name": "NazwaDanieOtwarte",
                    "data_type": "varchar",
                    "type": "varchar(200)",
                    "nullable": false,
                    "default": "('')",
                    "ordinal": 47
                },
                {
                    "name": "FlgPozycjaNadrzedna",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 48
                },
                {
                    "name": "IloscTalerzy",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((1))",
                    "ordinal": 49
                },
                {
                    "name": "DotacjaIlosc",
                    "data_type": "decimal",
                    "type": "decimal(19,6)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 50
                },
                {
                    "name": "DotacjaWartosc",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 51
                },
                {
                    "name": "DotacjaPierwotnaWartosc",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 52
                },
                {
                    "name": "KredytWartosc",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 53
                },
                {
                    "name": "KredytPierwotnaWartosc",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 54
                },
                {
                    "name": "FlgPotwierdzona",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 55
                },
                {
                    "name": "DodatekDlaDTRachunekPozycjaID",
                    "data_type": "uniqueidentifier",
                    "type": "uniqueidentifier",
                    "nullable": true,
                    "default": null,
                    "ordinal": 56
                },
                {
                    "name": "PunktyLojalnosciowe",
                    "data_type": "int",
                    "type": "int(10,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 57
                },
                {
                    "name": "FlgDowolnaCena",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 58
                },
                {
                    "name": "DataWyswietleniaNaKDS",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": true,
                    "default": null,
                    "ordinal": 59
                },
                {
                    "name": "FlgCzyZestornowanyZRozchodem",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 60
                },
                {
                    "name": "TowarKodKreskowy",
                    "data_type": "varchar",
                    "type": "varchar(100)",
                    "nullable": true,
                    "default": null,
                    "ordinal": 61
                },
                {
                    "name": "PromocjaTyp",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 62
                },
                {
                    "name": "DataWykonania",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 63
                },
                {
                    "name": "DataWydania",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 64
                },
                {
                    "name": "DataOdebrania",
                    "data_type": "datetime",
                    "type": "datetime",
                    "nullable": false,
                    "default": "('1900-01-01')",
                    "ordinal": 65
                },
                {
                    "name": "CenaPoWydzieleniu",
                    "data_type": "decimal",
                    "type": "decimal(19,2)",
                    "nullable": true,
                    "default": "(NULL)",
                    "ordinal": 66
                },
                {
                    "name": "FlgSerwis",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 67
                },
                {
                    "name": "FlgNapiwek",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 68
                },
                {
                    "name": "FlgBlokadaEdycji",
                    "data_type": "bit",
                    "type": "bit",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 69
                },
                {
                    "name": "_FlgTCF",
                    "data_type": "tinyint",
                    "type": "tinyint(3,0)",
                    "nullable": false,
                    "default": "((0))",
                    "ordinal": 70
                },
                {
                    "name": "DS_RowVersion",
                    "data_type": "timestamp",
                    "type": "timestamp",
                    "nullable": false,
                    "default": null,
                    "ordinal": 71
                }
            ],
            "column_count": 71,
            "order_column": "DS_RowVersion",
            "order_reason": "timestamp\/rowversion"
        },


CREATE PROCEDURE [dbo].[PV_WSKDSGetBill] 
    @cGetRequestTemplate bit = 0,
    @cGetResponseTemplate bit  = 0, 
    @cRequest  xml=null
AS BEGIN    
      SET NOCOUNT ON;
      SET DATEFORMAT ymd;
 
      --------------------------------------------------------------------------
      -- kolejne kroki wykonania procedury                      

        IF @cGetRequestTemplate = 1 and @cGetResponseTemplate = 0 
        BEGIN
        
            SELECT 	'<request>
                        <DeviceID typ="Int"/>
                        <SessionID	typ="Varchar"/>					
                    </request>' as template
            RETURN;
            
        END
      
      IF @cGetResponseTemplate = 1 and @cGetRequestTemplate = 0
      BEGIN
            SELECT 
                '<response>
                    <SessionID	typ="Varchar"/>					
                    <ExecutionStatus typ="Int"/>
                    <Bills typ="lista">
                         <Bill typ="klasa">
                               <ID typ="VarChar"/>                               
                               <Description typ="VarChar"/> 
                               <Remark typ="VarChar"/>
                               <PointOfSale typ="VarChar"/>
                               <User typ="VarChar"/>									
                               <Date typ="DateTime"/>
                               <OpenningType typ="Int"/>
                                  <Articles typ="lista">
                                    <Article typ="klasa">
                                        <ID typ="VarChar"/>										
                                        <ArticleID typ="VarChar"/>										
                                        <Name typ="VarChar"/>
                                        <ServingGroup typ="Int"/>
                                        <ServingGroupName typ="VarChar"/>
                                        <PersonNumber typ="Int"/>
                                        <Remark typ="VarChar"/>
                                        <QuantitySet typ="Int"/>
                                        <QuantityToDo typ="Decimal"/>
                                        <QuantityDone typ="Decimal"/>
                                        <QuantityRemoved typ="Decimal"/>
                                        <QuantityPrecision typ="Int"/>
                                        <Date typ="DateTime"/>										
                                        <IsModified typ="TinyInt"/>
                                        <IsNew typ="TinyInt"/>	
                                        <StatusOfPreparation typ="TinyInt"/>
                                        <Color typ="VarChar"/>
                                        <ShowWeight typ="Int"/>
                                        <ConnectionID typ="VarChar"/>
                                        <SubArticles typ="lista">	
                                            <SubArticle typ="klasa">
                                                <ID typ="VarChar"/>
                                                <SubArticleID typ="VarChar"/>
                                                <Name typ="VarChar"/>
                                                <QuantitySet typ="Int"/>
                                                <Quantity typ="Decimal"/>
                                                <QuantityPrecision typ="Int"/>
                                                <IsPrimary typ="TinyInt"/>
                                                <StatusOfPreparation typ="TinyInt"/>
                                                <IsModified typ="TinyInt"/>
                                            </SubArticle>
                                        </SubArticles>
                                    </Article>
                               </Articles>
                        </Bill>
                  </Bills>
            </response>' as template					
        RETURN;
      END
        DECLARE	@DeviceID						UNIQUEIDENTIFIER,
                @SessionID						UNIQUEIDENTIFIER,
                @KierunekWydrukuWszystkieID		UNIQUEIDENTIFIER,
                @DeviceNumber					INT,
                @ExecutionStatus				INT,
                @result							XML;

        DECLARE	@SortType									INT	= 0,			-- 0 - najstarsze na poczatku; 1 - najnowsze na poczatku
                @WyswietlanieEdytowanychRachunkow			INT = 0,			-- 0 - nie wyświetlamy rachunków w trakcie edycji; 1 - wyświetlane są rachunki już podczas ich edycji
                @WyswietlanieWykonanychPozycji				INT = 0,			-- 0 - nie wyświetlamy wykonanych pozycji; 1 - wyświetlane są pozycje już wykonane
                @RodzajNumeracjiNaKDS						INT = 0,			-- 0 - Globalny, 1 - Zmianowy, 2- DoOdbioru, 3 - GlobalnyDoOdbioru, 4 - ZmianowyDoOdbioru, 5 - DoOdbioruGlobalny = 5, 6 - DoOdbioruZmianowy 
                @RodzajKDS									INT = 0,			-- 0 - KDS kuchenny; 1 - KDS wydawka
                @KDSWydawkaKolorPozycjiWPrzygotowaniu       INT = 0,			-- kolor dla pozycji w trakcie przygotowania - dla KDS wydawki
                @KDSWydawkaKolorPozycjiWydanych				INT = 0,			-- kolor dla pozycji przygotowanych - dla KDS wydawki
				@KDsWydawkaKolorPozycjiWezwanychDoWydania	INT = 0,			-- kolor dla pozycji wezwanych do wydania - dla KDS wydawki
                @RodzajNumerkaDoOdbioruZamowienia			INT = 0,
                @KDSExistsIssued							BIT = 1,				-- verification of existing KDS Issued
				@WyswietlajRachunkiZOstatnichGodzin			INT = 48,
				@DataCzasOdKtorejWyswietlacRachunki			DATETIME = DATEADD(hh, -48, GETDATE());
                
        SET @KierunekWydrukuWszystkieID = '7DA780B3-6E27-49F7-AE4A-1F8BDC792A72'

        SET @ExecutionStatus = 0;	
        SET @DeviceID = NULL;
    
        SELECT	@DeviceNumber = CAST(NULLIF(tab.item.value('DeviceID[1]','INT'),'0') AS INT), 
                @SessionID = CAST(NULLIF(tab.item.value('SessionID[1]','VARCHAR(36)'),'') AS UNIQUEIDENTIFIER)
        FROM   @cRequest.nodes('//GetBill') AS tab(item)	

        SELECT	@DeviceID									= u.ID,
                @RodzajKDS									= CAST(ISNULL(uk1.Wartosc, '0') AS INT),
                @KDSWydawkaKolorPozycjiWPrzygotowaniu		= CAST(ISNULL(uk2.Wartosc, '0') AS INT),
                @KDSWydawkaKolorPozycjiWydanych				= CAST(ISNULL(uk3.Wartosc, '0') AS INT),
				@KDsWydawkaKolorPozycjiWezwanychDoWydania	= CAST(ISNULL(uk4.Wartosc, '0') AS INT)
        FROM NGastroUrzadzenie u
        INNER JOIN NGastroUrzadzenieTyp ut	ON	u.UrzadzenieTypID = ut.ID
                                            AND ut.Symbol = 'Android'
        INNER JOIN NGastroUrzadzenieKonfiguracja uk	ON	uk.UrzadzenieID = u.ID
                                                    AND uk.Nazwa = 'Number'
        LEFT JOIN NGastroUrzadzenieKonfiguracja uk1	ON	uk1.UrzadzenieID = u.ID
                                                    AND uk1.Nazwa = 'Tryb'
        LEFT JOIN NGastroUrzadzenieKonfiguracja uk2	ON	uk2.UrzadzenieID = u.ID
                                                    AND uk2.Nazwa = 'KDSColorInProgress'
        LEFT JOIN NGastroUrzadzenieKonfiguracja uk3	ON	uk3.UrzadzenieID = u.ID
                                                    AND uk3.Nazwa = 'KDSColorDone'
		LEFT JOIN NGastroUrzadzenieKonfiguracja uk4	ON	uk4.UrzadzenieID = u.ID
                                                    AND uk4.Nazwa = 'KDSColorItemsCalled'
        WHERE	CAST(uk.Wartosc AS INT) = @DeviceNumber
                AND u.FlgAktywne = 1
    
        SET @SortType = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a	ON a.ID = ks.AppID 
                                AND a.Nr = 8
            WHERE ks.Symbol = 'Local.KDS.BillSortOrder'
        )

        SET @RodzajNumeracjiNaKDS = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a	ON a.ID = ks.AppID 
                                AND a.Nr = 8
            WHERE ks.Symbol = 'Lokal.Sprzedaz.RodzajNumeracjiNaKDS'
        )

        SET @WyswietlanieEdytowanychRachunkow = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a ON a.ID = ks.AppID AND a.Nr = 8
            WHERE ks.Symbol = 'Local.KDS.ShowBillsOnEdit'
        )

        SET @WyswietlanieWykonanychPozycji = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a ON a.ID = ks.AppID AND a.Nr = 8
            WHERE ks.Symbol = 'Local.KDS.ShowDonePositions'
        )

        SET @RodzajNumerkaDoOdbioruZamowienia = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a ON a.ID = ks.AppID AND a.Nr = 8
            WHERE ks.Symbol = 'Lokal.POS.RodzajNumerkaDoOdbioruZamowienia'
        )

		 SET @WyswietlajRachunkiZOstatnichGodzin = 
        (
            SELECT TOP 1 k.TInt
            FROM NSysAppKonfiguracjaSzablon  ks
            INNER JOIN NSysAppKonfiguracja k ON k.SzablonID = ks.ID
            INNER JOIN NSysApp a ON a.ID = ks.AppID AND a.Nr = 8
            WHERE ks.Symbol = 'Local.KDS.ShowOrdersFromTheLastHours'
        )

		IF(@WyswietlajRachunkiZOstatnichGodzin > 0)
			SET @DataCzasOdKtorejWyswietlacRachunki	=  DATEADD(hh, (-1)*@WyswietlajRachunkiZOstatnichGodzin, GETDATE());

        if @RodzajKDS = 0 
            if NOT EXISTS (
                        SELECT	u.*
                        FROM NGastroUrzadzenie u
                                INNER JOIN NGastroUrzadzenieTyp ut	ON	u.UrzadzenieTypID = ut.ID AND ut.Symbol = 'Android'
                                inner JOIN NGastroUrzadzenieKonfiguracja uk1 ON	uk1.UrzadzenieID = u.ID	AND uk1.Nazwa = 'Tryb'
                                inner join NGastroUrzadzenieKdsWydawkaDla w on u.id = w.UrzadzenieIDWydawka  and w.UrzadzenieIDKds = @DeviceID
                        WHERE	CAST(uk1.Wartosc AS INT) = 1
                                AND u.FlgAktywne = 1
                      )	
                AND EXISTS (
                            SELECT	u.*
                            FROM NGastroUrzadzenie u
                                    INNER JOIN NGastroUrzadzenieTyp ut	ON	u.UrzadzenieTypID = ut.ID AND ut.Symbol = 'Android'
                                    inner JOIN NGastroUrzadzenieKonfiguracja uk1 ON	uk1.UrzadzenieID = u.ID	AND uk1.Nazwa = 'Tryb'
                            WHERE	CAST(uk1.Wartosc AS INT) = 2
                                    AND u.FlgAktywne = 1
                          )						
                      set @KDSExistsIssued = 0


        IF (OBJECT_ID('tempdb..#BillsToShow') IS NOT NULL) 
            DROP TABLE #BillsToShow
        CREATE TABLE #BillsToShow  (ID UNIQUEIDENTIFIER)

        IF (OBJECT_ID('tempdb..#LastBills') IS NOT NULL) 
            DROP TABLE #LastBills
        CREATE TABLE #LastBills  (ID UNIQUEIDENTIFIER)

        IF (OBJECT_ID('tempdb..#OpenBillTypes') IS NOT NULL) 
            DROP TABLE #OpenBillTypes
        CREATE TABLE #OpenBillTypes  (ID UNIQUEIDENTIFIER)

		IF @RodzajKDS IN (0, 3)
		BEGIN
			INSERT INTO #OpenBillTypes
			SELECT RodzajOtwarciaRachunkuID
			FROM NGastroUrzadzenieRodzajOtwarciaRachunku
			WHERE UrzadzenieID = @DeviceID
		END
		ELSE
		BEGIN
			INSERT INTO #OpenBillTypes
			SELECT RodzajOtwarciaRachunkuID
			FROM NGastroUrzadzenieRodzajOtwarciaRachunku u
			INNER JOIN NGastroUrzadzenieKdsWydawkaDla w ON u.UrzadzenieID = w.UrzadzenieIDKds 
			WHERE w.UrzadzenieIDWydawka = @DeviceID
			GROUP BY RodzajOtwarciaRachunkuID
		END
			

        INSERT INTO #LastBills
        SELECT rachunek.ID 
        FROM NGastroDTRachunek rachunek
        INNER JOIN NGastroUrzadzenieKasa urzadzenieKasa on urzadzenieKasa.UrzadzenieID=@DeviceID
		INNER JOIN #OpenBillTypes obt ON obt.ID = rachunek.RodzajOtwarciaRachunkuID
        WHERE 
            rachunek.DataOtwarcia >= @DataCzasOdKtorejWyswietlacRachunki 
            AND (rachunek.KasaID = urzadzenieKasa.KasaID)
			AND rachunek.Status <> 2  -- rachunek usunięty
 
	IF(@RodzajKDS = 0 AND @KDSExistsIssued = 0)
		BEGIN
			DECLARE @UrzadzenieKasa TABLE (UrzadzenieID uniqueidentifier, KasaID uniqueidentifier)
			INSERT INTO @UrzadzenieKasa (UrzadzenieID, KasaID)
			SELECT uk.UrzadzenieID, uk.KasaID 
			FROM NGastroUrzadzenieKasa uk 
			INNER JOIN NGastroUrzadzenie u ON u.ID = uk.UrzadzenieID
			INNER JOIN NGastroUrzadzenieTyp ut	ON	u.UrzadzenieTypID = ut.ID AND ut.Symbol = 'Android'
			INNER JOIN NGastroUrzadzenieKonfiguracja uk1 ON	uk1.UrzadzenieID = u.ID	AND uk1.Nazwa = 'Tryb'
			WHERE CAST(uk1.Wartosc AS INT) = 2
					AND u.FlgAktywne = 1

			-- nie ma wydawki, usuwamy zbumpowane rachunki ,dla których nie ma order number (i był potrzebny tylko 1 bump) 
			DELETE #LastBills
			WHERE ID  IN (
								SELECT rach.ID 
								FROM #LastBills rach
								INNER JOIN NGastroDTRachunek rr ON rr.ID = rach.ID
								LEFT JOIN NGastroDTRachunekPozycja p on p.DTRachunekID = rach.ID and ISNULL(p.StatusRealizacji, 6) < 3  
								LEFT JOIN @UrzadzenieKasa uk ON uk.KasaID = rr.KasaID 
								WHERE p.ID IS NULL
								AND uk.KasaID IS NULL
						)

		END

		IF(@RodzajKDS = 3)
		DELETE #LastBills
			WHERE ID  IN (
							SELECT rach.ID 
							FROM #LastBills rach
							INNER JOIN NGastroDTRachunek rr ON rr.ID = rach.ID
							LEFT JOIN NGastroDTRachunekPozycja p on p.DTRachunekID = rach.ID and ISNULL(p.StatusRealizacji, 6) IN (3,4)
							LEFT JOIN @UrzadzenieKasa uk ON uk.KasaID = rr.KasaID 
							WHERE p.ID IS NULL
							      AND uk.KasaID IS NULL
						)

        IF (OBJECT_ID('tempdb..#Pizza') IS NOT NULL) 
            DROP TABLE #Pizza
        CREATE TABLE #Pizza 
        (
            BillID				UNIQUEIDENTIFIER NOT NULL,
            ID					UNIQUEIDENTIFIER NOT NULL,
            TowarID				UNIQUEIDENTIFIER NOT NULL,
            NazwaZestawu		VARCHAR(200) COLLATE POLISH_CS_AI NOT NULL,
            NazwaTowaru			VARCHAR(200) COLLATE POLISH_CS_AI NOT NULL,			
            Ilosc				DECIMAL(19,6) NOT NULL,
            Skladnik			TINYINT NOT NULL,
            Zamiennik			TINYINT NOT NULL,
            PizzaBaza			TINYINT NOT NULL,
            IloscBaza			DECIMAL(19,6) NOT NULL,
            NumerCzesci			INT,
            GrupaZestawuID		UNIQUEIDENTIFIER NOT NULL
        )		

        IF (OBJECT_ID('tempdb..#Pozycje') IS NOT NULL) 
            DROP TABLE #Pozycje
        CREATE TABLE #Pozycje 
        (
            ID									UNIQUEIDENTIFIER,
			DTRachunekID						UNIQUEIDENTIFIER,
			DodatekDlaDTRachunekPozycjaID		UNIQUEIDENTIFIER,
			FlgPozycjaNadrzedna					TINYINT,
			GrupaZestawuID						UNIQUEIDENTIFIER,
			TowarID								UNIQUEIDENTIFIER,
			FlgPotwierdzona						TINYINT,
			StatusRealizacji					TINYINT,
			UzytkownikUsuwajacyID				UNIQUEIDENTIFIER ,
			KonfiguracjaDrukowaniaZamowienID	UNIQUEIDENTIFIER,
			DataWyswietleniaNaKDS				DATETIME,
			DataWydruku							DATETIME,
			DataDodania							DATETIME,
			ZestawID							UNIQUEIDENTIFIER,
			NumerCzesci							TINYINT,
			NumerGrupySerwowania				TINYINT,
			Notatka								VARCHAR(255),
			Ilosc								DECIMAL(19,6),
			IloscZestawow						DECIMAL(19,6),
			IloscZrealizowana					DECIMAL(19,6),
			IloscKawalkow						TINYINT,
			DataUsuniecia						DATETIME,
			DataModyfikacjiGrupySerwowania		DATETIME,
			RolaWKompozycji						TINYINT,
			NazwadanieOtwarte					VARCHAR(200) COLLATE POLISH_CS_AI NOT NULL
        )		

        IF (OBJECT_ID('tempdb..#Bills') IS NOT NULL) 
            DROP TABLE #Bills
        CREATE TABLE #Bills 
        (
            ID					UNIQUEIDENTIFIER,
            Description			NVARCHAR(150),
            UserDescription		VARCHAR(20),
            Remark				VARCHAR(150),
            PointOfSale			NVARCHAR(50),
            Date				DATETIME,
            OpenningType		INT,
            FlgFastTrack		TINYINT
        )
        IF (OBJECT_ID('tempdb..#Articles') IS NOT NULL) 
            DROP TABLE #Articles
        CREATE TABLE #Articles
        (
            ID								UNIQUEIDENTIFIER,
            BillID							UNIQUEIDENTIFIER,
            ArticleID						UNIQUEIDENTIFIER,
            PackageID						UNIQUEIDENTIFIER,
            Name							VARCHAR(200) COLLATE POLISH_CS_AI DEFAULT '',
            ServingGroup					INT DEFAULT 0,
            ServingGroupName				VARCHAR(50) COLLATE POLISH_CS_AI  DEFAULT '',
            PersonNumber					INT DEFAULT 0,
            Remark							VARCHAR(255) COLLATE POLISH_CS_AI  DEFAULT '',
            QuantitySet						TINYINT DEFAULT 0,
            QuantityToDo					DECIMAL(19,6) DEFAULT 0,
            QuantityDone					DECIMAL(19,6) DEFAULT 0,
            QuantityRemoved					DECIMAL(19,6) DEFAULT 0,
            QuantityPrecision				INT DEFAULT 0,
            Date							DATETIME,
            IsModified						TINYINT DEFAULT 0,
            IsNew							TINYINT DEFAULT 0,
            StatusOfPreparation				TINYINT DEFAULT 0,
            ArticleType						TINYINT DEFAULT 0,
            PartNumber						TINYINT DEFAULT 1,
            Parts							TINYINT DEFAULT 1,
            ServingGroupModificationDate	DATETIME,
            Color							INT,
            ShowWeight						INT,
            ConnectionID					UNIQUEIDENTIFIER
        )
        IF (OBJECT_ID('tempdb..#Modifiers') IS NOT NULL) 
            DROP TABLE #Modifiers
        CREATE TABLE #Modifiers
        (
            ItemID				UNIQUEIDENTIFIER,
            ZamiennikTowarID	UNIQUEIDENTIFIER,
            TowarNazwaDlaKas	VARCHAR(MAX),
            Ilosc				DECIMAL(19,6),
            DeleteFlag			TINYINT,
            Pozycja				INT
        )
        IF (OBJECT_ID('tempdb..#SubArticles') IS NOT NULL) 
            DROP TABLE #SubArticles
        CREATE TABLE #SubArticles
        (			
            ID						UNIQUEIDENTIFIER,
            ArticleID				UNIQUEIDENTIFIER,
            SubArticleID			UNIQUEIDENTIFIER,
            Name					VARCHAR(200) COLLATE POLISH_CS_AI DEFAULT '',
            Quantity				DECIMAL(19,6) DEFAULT 0,
            QuantityPrecision		INT DEFAULT 0,
            IsPrimary				TINYINT DEFAULT 0,
            StatusOfPreparation		TINYINT DEFAULT 0,
            IsModified				TINYINT DEFAULT 0,
            Numer					INT,
            NumerCzesci				INT DEFAULT 0,
            GrupaZestawuID			UNIQUEIDENTIFIER,
            Pozycja					INT,
            ZestawID				UNIQUEIDENTIFIER,
            IsModify				TINYINT DEFAULT 1,
            IsAddition				TINYINT DEFAULT 0,
            Date					DATETIME,
            Remark					VARCHAR(255) COLLATE POLISH_CS_AI  DEFAULT ''
        )
        
        SET @SessionID = ISNULL(@SessionID, NEWID())
        
        IF EXISTS(SELECT * FROM NGastroUrzadzenieAktywnosc ua WHERE ua.ID <> @SessionID AND ua.UrzadzenieID = @DeviceID
            AND DATEDIFF(second, ua.DataOstatniejAktywnosci, GETDATE()) < 3 )
        BEGIN
            SET @ExecutionStatus = 1;
            --GOTO Result;
        END

        IF @DeviceID IS NULL
        BEGIN
            SET @ExecutionStatus = 2;
            GOTO Result;			
        END	
        
        IF EXISTS(SELECT 1 FROM NGastroUrzadzenieAktywnosc ua WHERE ua.ID = @SessionID)
        BEGIN
            UPDATE 	NGastroUrzadzenieAktywnosc
            SET DataOstatniejAktywnosci = GETDATE()
            WHERE ID = @SessionID
        END
        ELSE
        BEGIN
            INSERT INTO NGastroUrzadzenieAktywnosc(ID, UrzadzenieID, DataOstatniejAktywnosci)
            VALUES( @SessionID, @DeviceID, GETDATE())
        END			
        
        IF (OBJECT_ID('tempdb..#BillsTemp') IS NOT NULL) 
            DROP TABLE #BillsTemp
        CREATE TABLE #BillsTemp (ID UNIQUEIDENTIFIER)

        IF (OBJECT_ID('tempdb..#ResultModyf') IS NOT NULL)
            DROP TABLE #ResultModyf
       
	   CREATE TABLE #ResultModyf
        (
            PozycjaID							UNIQUEIDENTIFIER,
            ZamiennikTowarID					UNIQUEIDENTIFIER,
            KonfiguracjaDrukowaniaZamowienID	UNIQUEIDENTIFIER,
            TowarNazwaDlaKas					VARCHAR(MAX),
            Ilosc								DECIMAL(19,6),
            DeleteFlag							TINYINT,
            Pozycja								INT
        )



        IF @RodzajKDS = 0
        BEGIN
            
            DECLARE @TabPozRachID NGastroTableOfID
            INSERT INTO @TabPozRachID
            SELECT DISTINCT rp.DTRachunekID 
            FROM #LastBills b
            INNER JOIN NGastroDTRachunekPozycja rp ON rp.DTRachunekID = b.ID
            INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu<99900
            INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
            INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID 
                                                                                OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                AND ukdz.UrzadzenieID =  @DeviceID
            WHERE rp.StatusRealizacji in (1,2,99) OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.StatusRealizacji = 0)
				
             
                                    INSERT INTO #Pozycje
                                    SELECT DISTINCT *
                                    FROM 
                                    (
                                    SELECT 			rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,rp.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte 
                                    FROM NGAStroDTRachunekPozycja rp 
                                    INNER JOIN #LastBills r on r.ID = rp.DtrachunekID
                                    INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu<99900
                                    INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                                    INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID 
                                                                                                        OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                                     AND ukdz.UrzadzenieID =  @DeviceID
                                    WHERE	 											 
                                            (
                                                (@WyswietlanieEdytowanychRachunkow = 1 AND (RP.StatusRealizacji <> 99 OR rp.FlgPotwierdzona = 1))
                                                OR (@WyswietlanieEdytowanychRachunkow = 0 AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0 )
                                            )
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                            AND (
                                                    rp.StatusRealizacji=99
                                                    OR (@WyswietlanieWykonanychPozycji = 0 AND rp.StatusRealizacji < 3) 
                                                    OR (@WyswietlanieWykonanychPozycji = 1 
                                                         AND rp.StatusRealizacji < 5 
                                                         AND	EXISTS(SELECT * FROM @TabPozRachID rach WHERE rach.ID = r.ID) 
                                                                        
                                                    )
                                                    OR ( @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                                                    OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.StatusRealizacji = 0)
                                                 )
                                            AND ( @KDSExistsIssued = 0
                                                  OR (@KDSExistsIssued = 1
                                                        AND	EXISTS(SELECT * FROM @TabPozRachID rach WHERE rach.ID = r.ID) 
                                                     )
                                                )
                                    UNION ALL
                                    SELECT 			rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,rp.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania 
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte 
                                    FROM NGAStroDTRachunekPozycja rp 
                                    INNER JOIN #LastBills r on r.ID = rp.DtrachunekID
                                    INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu>99900
                                    INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                                    INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                      OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                                      AND ukdz.UrzadzenieID =  @DeviceID
                                    WHERE (rp.StatusRealizacji=99
                                            OR (@WyswietlanieWykonanychPozycji = 0 and rp.StatusRealizacji < 3) 
                                            OR (@WyswietlanieWykonanychPozycji = 1 and rp.StatusRealizacji < 5 )
                                            OR ( @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                                           )
                                            AND 
                                            (
                                                (@WyswietlanieEdytowanychRachunkow = 1 AND @RodzajKDS = 0)
                                                OR (@WyswietlanieEdytowanychRachunkow = 0 AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0 )
                                            )
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                            AND ( @KDSExistsIssued = 0
                                                  OR(@KDSExistsIssued = 1
                                                        AND	EXISTS(SELECT * FROM NGastroDTRachunekPozycja rp
                                                                    WHERE rp.DTRachunekID = r.ID 
                                                                    AND rp.StatusRealizacji in (1,2,99)  
                                                                    ) 
                                                     )
                                                )
                                    ) A

                                    INSERT INTO #Pozycje
                                    SELECT DISTINCT *
                                    FROM 
                                    (
                                            SELECT 		rp.ID 
                                                            ,rp.DTRachunekID 
                                                            ,rp.DodatekDlaDTRachunekPozycjaID
                                                            ,rp.FlgPozycjaNadrzedna 
                                                            ,rp.GrupaZestawuID 
                                                            ,rp.TowarID 
                                                            ,rp.FlgPotwierdzona 
                                                            ,rp.StatusRealizacji 
                                                            ,rp.UzytkownikUsuwajacyID  
                                                            ,p.KonfiguracjaDrukowaniaZamowienID 
                                                            ,rp.DataWyswietleniaNaKDS 
                                                            ,rp.DataWydruku	
                                                            ,rp._c_DataUtworzenia 
                                                            ,rp.ZestawID 
                                                            ,rp.NumerCzesci 
                                                            ,rp.NumerGrupySerwowania 
                                                            ,rp.Notatka 
                                                            ,rp.Ilosc 
                                                            ,rp.IloscZestawow 
                                                            ,rp.IloscZrealizowana 
                                                            ,rp.IloscKawalkow 
                                                            ,rp.DataUsuniecia 
                                                            ,rp.DataModyfikacjiGrupySerwowania
                                                            ,rp.RolaWKompozycji
                                                            ,rp.NazwadanieOtwarte 
                                            FROM NGAStroDTRachunekPozycja rp
                                            INNER JOIN NGastroDTRachunekPozycjaPowiazanie pow ON pow.DTRachunekPozycjaID = rp.ID
                                            LEFT JOIN #Pozycje p ON p.ID = pow.DTRachunekPozycjaDocelowaID
                                            WHERE pow.DTRachunekPozycjaDocelowaID IN (SELECT ID FROM #Pozycje)
                                                  AND pow.DTRachunekPozycjaID NOT IN (SELECT ID FROM #Pozycje)
                                            
                                )B

                                ---- towary które mają wybrame modyfikatory ze zgodnym kierunkiem 
                                INSERT INTO #Pozycje
                                SELECT DISTINCT *
                                FROM 
                                (
                                        SELECT 	
                                                        rp.ID 
                                                        ,rp.DTRachunekID 
                                                        ,rp.DodatekDlaDTRachunekPozycjaID
                                                        ,rp.FlgPozycjaNadrzedna 
                                                        ,rp.GrupaZestawuID 
                                                        ,rp.TowarID 
                                                        ,rp.FlgPotwierdzona 
                                                        ,rp.StatusRealizacji 
                                                        ,rp.UzytkownikUsuwajacyID  
                                                        ,tm.KonfiguracjaDrukowaniaZamowienID 
                                                        ,rp.DataWyswietleniaNaKDS 
                                                        ,rp.DataWydruku	
                                                        ,rp._c_DataUtworzenia 
                                                        ,rp.ZestawID 
                                                        ,rp.NumerCzesci 
                                                        ,rp.NumerGrupySerwowania 
                                                        ,rp.Notatka 
                                                        ,rp.Ilosc 
                                                        ,rp.IloscZestawow 
                                                        ,rp.IloscZrealizowana 
                                                        ,rp.IloscKawalkow 
                                                        ,rp.DataUsuniecia 
                                                        ,rp.DataModyfikacjiGrupySerwowania
                                                        ,rp.RolaWKompozycji
                                                        ,rp.NazwadanieOtwarte 
                                        FROM #LastBills r
                                        INNER JOIN NGastroDTRachunekPozycja rp ON r.ID = rp.DtrachunekID
                                        INNER JOIN NGastroDTRachunekPozycjaModyfikacja rpm ON rp.ID = rpm.DTRachunekPozycjaID
                                        INNER JOIN NGastroTowar t ON t.ID = rpm.TowarID
                                        INNER JOIN NGastroTowar tm ON tm.ID = rpm.ModyfikatorID
                                        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON kdz.ID = ISNULL(rp.KonfiguracjaDrukowaniaZamowienID, tm.KonfiguracjaDrukowaniaZamowienID)
                                        INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                         OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                                         AND ukdz.UrzadzenieID =  @DeviceID
                                        WHERE	rpm.Ilosc > 0 
                                                AND rpm.ModyfikatorIlosc > 0 
                                            AND (rp.StatusRealizacji=99
                                            OR (@WyswietlanieWykonanychPozycji = 0 and rp.StatusRealizacji < 3) 
                                            OR (@WyswietlanieWykonanychPozycji = 1 and rp.StatusRealizacji < 5 )
                                            OR ( @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                                           )
                                            AND 
                                            (
                                                (@WyswietlanieEdytowanychRachunkow = 1 AND @RodzajKDS = 0)
                                                OR (@WyswietlanieEdytowanychRachunkow = 0 AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0 )
                                            )
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                            AND ( @KDSExistsIssued = 0
                                                  OR(@KDSExistsIssued = 1
                                                        AND	EXISTS(SELECT * FROM NGastroDTRachunekPozycja rp
                                                                    WHERE rp.DTRachunekID = r.ID 
                                                                    AND rp.StatusRealizacji in (0,1,2,99)  
                                                                    ) 
                                                     )
                                                )
                                        
                            )modyf
							
                            INSERT INTO #Pozycje
                            SELECT DISTINCT *
                            FROM (	
                                    SELECT 			rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,rp.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania 
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte 
                                    FROM NGAStroDTRachunekPozycja rp 
                                    INNER JOIN #LastBills r on r.ID = rp.DtrachunekID
                                    INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu>99900
                                    INNER JOIN NGastroDTRachunekPozycjaPowiazanie rpp ON rpp.DTRachunekPozycjaID = rp.ID
                                    INNER JOIN NGastroDTRachunekPozycja rpz ON rpz.ID = rpp.DTRachunekPozycjaDocelowaID
                                    INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON ISNULL(rp.KonfiguracjaDrukowaniaZamowienID, rpz.KonfiguracjaDrukowaniaZamowienID)  = kdz.ID
                                    INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                      OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                                      AND ukdz.UrzadzenieID =  @DeviceID
                                    WHERE	(rp.StatusRealizacji=99
                                            OR (@WyswietlanieWykonanychPozycji = 0 and rp.StatusRealizacji < 3) 
                                            OR (@WyswietlanieWykonanychPozycji = 1 and rp.StatusRealizacji < 5 )
                                            OR ( @KDSExistsIssued = 0 and (rp.StatusRealizacji = 4 OR (rp.StatusRealizacji = 5 AND rpz.StatusRealizacji = 4 ))
                                           ))
                                            AND 
                                            (
                                                (@WyswietlanieEdytowanychRachunkow = 1 AND @RodzajKDS = 0)
                                                OR (@WyswietlanieEdytowanychRachunkow = 0 AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0 )
                                            )
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                                AND ( @KDSExistsIssued = 0
                                                  OR(@KDSExistsIssued = 1
                                                        AND	EXISTS(SELECT * FROM NGastroDTRachunekPozycja rp
                                                                    WHERE rp.DTRachunekID = r.ID 
                                                                    AND rp.StatusRealizacji in (0,1,2,99)  
                                                                    ) 
                                                     )
                                                )

                                ) dod



                            ----tu dokładamy bazowe skałdniki nie zamienione na nic innego
                            INSERT INTO #ResultModyf 
                            SELECT	DISTINCT rp.ID,
                                            rpm.ModyfikatorID,
                                            tm.KonfiguracjaDrukowaniaZamowienID,
                                            CASE WHEN ISNULL(tm.NazwaNaZamowieniu,'') = ''	THEN tm.NazwaDlaKas ELSE tm.NazwaNaZamowieniu END AS ModyfikatorNazwaNaZamowieniu,
                                            rpm.ModyfikatorIlosc,
                                            CAST(0 AS TINYINT),
                                            skl.Pozycja
                           FROM #LastBills r
                            INNER JOIN NGastroDTRachunekPozycja rp ON r.ID = rp.DtrachunekID
							CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
							             FROM NGastroBOM 
										 WHERE TowarID = rp.TowarID
										 AND ObowiazujeOd <= GETDATE()
										 ORDER BY ObowiazujeOd DESC
										) bom
                            INNER JOIN NGastroSkladnik skl ON bom.id = skl.BomID
                            INNER JOIN NGastroTowar towar on towar.ID = skl.TowarID
							INNER JOIN NGastroDTRachunekPozycjaModyfikacja rpm ON rp.ID = rpm.DTRachunekPozycjaID AND rpm.TowarID =  skl.TowarID
                            INNER JOIN NGastroTowar t ON t.ID = rpm.TowarID
                            INNER JOIN NGastroTowar tm ON tm.ID = rpm.ModyfikatorID
                            INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON (rp.KonfiguracjaDrukowaniaZamowienID IS NULL AND kdz.ID = tm.KonfiguracjaDrukowaniaZamowienID)
                                                                                    OR (rp.KonfiguracjaDrukowaniaZamowienID IS NOT NULL AND kdz.ID = rp.KonfiguracjaDrukowaniaZamowienID) 
                            INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                                AND ukdz.UrzadzenieID =  @DeviceID
                            WHERE	tm.FlgSprzedawany = 1
                                    AND tm.FlgAktywny = 1
                                    AND tm.FlgDeleted = 0
                                    AND rpm.Ilosc > 0 
                                    AND rpm.ModyfikatorIlosc > 0 
                                        AND (rp.StatusRealizacji=99
                                        OR (@WyswietlanieWykonanychPozycji = 0 and rp.StatusRealizacji < 3) 
                                        OR (@WyswietlanieWykonanychPozycji = 1 and rp.StatusRealizacji < 5 )
                                        OR ( @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                                        )
                                        AND 
                                        (
                                            (@WyswietlanieEdytowanychRachunkow = 1 AND @RodzajKDS = 0)
                                            OR rp.FlgPotwierdzona = 1
                                        )
                                        AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                                                                    AND ( @KDSExistsIssued = 0
                                                OR(@KDSExistsIssued = 1
                                                    AND	EXISTS(SELECT * FROM NGastroDTRachunekPozycja rp
                                                                WHERE rp.DTRachunekID = r.ID 
                                                                AND rp.StatusRealizacji in (0,1,2,99)  
                                                                ) 
                                                    )
                                            )						


                            ----tu dokładamy bazowe skąłdniki nie zamienione na nic innego
                            INSERT INTO #ResultModyf 
                            SELECT	DISTINCT 
							rp.ID,
                                            skl.TowarID, 
                                            towar.KonfiguracjaDrukowaniaZamowienID,
                                            towar.NazwaDlaKas, 
                                            ROUND(skl.Ilosc/bom.Ilosc,3),
                                            0 ,
                                            skl.Pozycja
                            FROM #LastBills R
                            INNER JOIN NGastroDTRachunekPozycja rp ON rp.DTRachunekID = r.ID
							LEFT JOIN NGastroTowar tz ON tz.ID = rp.ZestawID
                            INNER JOIN NGastroTowar tow ON tow.id = rp.TowarID and tow.FlgReceptura = 1
							CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
							             FROM NGastroBOM 
										 WHERE TowarID = rp.TowarID
										 AND ObowiazujeOd <= GETDATE()
										 ORDER BY ObowiazujeOd DESC
										) bom
                            INNER JOIN NGastroSkladnik skl ON bom.id = skl.BomID
							INNER JOIN NGastroTowar towar on towar.ID = skl.TowarID
                            INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON (rp.KonfiguracjaDrukowaniaZamowienID IS NULL AND kdz.ID = towar.KonfiguracjaDrukowaniaZamowienID)
                                                                                     OR (rp.KonfiguracjaDrukowaniaZamowienID IS NOT NULL AND kdz.ID = rp.KonfiguracjaDrukowaniaZamowienID) 
                            INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                            OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                           AND ukdz.UrzadzenieID =  @DeviceID			
                            WHERE  towar.FlgSprzedawany = 1
                                    AND towar.FlgAktywny = 1
                                    AND towar.FlgDeleted = 0
                                    AND (rp.StatusRealizacji=99
                                        OR (@WyswietlanieWykonanychPozycji = 0 and rp.StatusRealizacji < 3) 
                                        OR (@WyswietlanieWykonanychPozycji = 1 and rp.StatusRealizacji < 5 )
                                        OR ( @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                                        )
                                        AND 
                                        (
                                            (@WyswietlanieEdytowanychRachunkow = 1 AND @RodzajKDS = 0)
                                            OR rp.FlgPotwierdzona = 1
                                        )
                                        AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                                                                    AND ( @KDSExistsIssued = 0
                                                OR(@KDSExistsIssued = 1
                                                    AND	EXISTS(SELECT * FROM NGastroDTRachunekPozycja rp
                                                                WHERE rp.DTRachunekID = r.ID 
                                                                AND rp.StatusRealizacji in (1,2,99)  
                                                                ) 
                                                    )
                                            )
									AND (tz.ID IS NULL 
									     OR (tz.ID IS NOT NULL AND tz.RodzajTowaru <> 3)
										 OR (tz.ID IS NOT NULL AND tz.RodzajTowaru = 3 AND rp.RolaWKompozycji <> 0 )
										 )		
                               

                            UPDATE t SET 
                                t.DeleteFlag = 1
                            FROM #ResultModyf t
                            INNER JOIN NGastroDTRachunekPozycjaModyfikacja modyfikacja ON t.ZamiennikTowarID = modyfikacja.TowarID 
                                                                                          AND t.PozycjaID = modyfikacja.DTRachunekPozycjaID
            
                            DELETE FROM #ResultModyf
                            WHERE DeleteFlag = 1;

                            INSERT INTO #Pozycje
                            SELECT DISTINCT *
                            FROM 
                            (
                                    SELECT  	rp.ID 
                                                ,rp.DTRachunekID 
                                                ,rp.DodatekDlaDTRachunekPozycjaID
                                                ,rp.FlgPozycjaNadrzedna 
                                                ,rp.GrupaZestawuID 
                                                ,rp.TowarID 
                                                ,rp.FlgPotwierdzona 
                                                ,rp.StatusRealizacji 
                                                ,rp.UzytkownikUsuwajacyID  
                                                ,r.KonfiguracjaDrukowaniaZamowienID 
                                                ,rp.DataWyswietleniaNaKDS 
                                                ,rp.DataWydruku	
                                                ,rp._c_DataUtworzenia 
                                                ,rp.ZestawID 
                                                ,rp.NumerCzesci 
                                                ,rp.NumerGrupySerwowania 
                                                ,rp.Notatka 
                                                ,rp.Ilosc 
                                                ,rp.IloscZestawow 
                                                ,rp.IloscZrealizowana 
                                                ,rp.IloscKawalkow 
                                                ,rp.DataUsuniecia 
                                                ,rp.DataModyfikacjiGrupySerwowania
                                                ,rp.RolaWKompozycji
                                                ,rp.NazwadanieOtwarte 
                                    FROM #ResultModyf r
                                    INNER JOIN NGastroDTRachunekPozycja rp ON rp.ID = r.PozycjaID
                                    LEFT JOIN #Pozycje p ON p.ID = r.PozycjaID
                                    WHERE p.ID IS NULL
                                            
                        )modyf2


                END
                ELSE
                BEGIN
                            INSERT INTO #Pozycje
                                    SELECT DISTINCT *
                                    FROM 
                                    (
                                    SELECT 			rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,rp.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia 
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania 
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte
                                    FROM NGAStroDTRachunekPozycja rp 
                                    INNER JOIN #LastBills r on r.ID = rp.DtrachunekID
                                    INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu<99900
                                    INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                                    INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                      OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                    LEFT JOIN  NGAStroUrzadzenieKdsWydawkaDla u ON u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID
			                        WHERE	@RodzajKDS in (1, 3)  
                                            AND ((@RodzajKDS = 1 
													AND u.ID IS NOT NULL
                                                  AND (rp.StatusRealizacji < 5 OR (rp.StatusRealizacji in (5,99) AND rp.UzytkownikUsuwajacyID IS NOT NULL))
                                                  AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0 
												  )
												  OR
												 (@RodzajKDS = 3 
												   AND rp.StatusRealizacji IN (3,4) 
												   AND rp.UzytkownikUsuwajacyID IS NULL
                                                   AND rp.FlgPotwierdzona = 1  
												  )
												)
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                    UNION ALL
                                    SELECT 			rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,rp.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania 
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte 
                                    FROM NGAStroDTRachunekPozycja rp 
                                    INNER JOIN #LastBills r on r.ID = rp.DtrachunekID
                                    INNER JOIN NGAStroTowar t ON rp.TowarID = t.ID and t.NumerPlu>99900
                                    INNER JOIN NGAStroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                                    INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                      OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)		
                                    LEFT JOIN  NGAStroUrzadzenieKdsWydawkaDla u ON u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID 
                                    WHERE	@RodzajKDS in (1, 3) 
                                            AND (
												(@RodzajKDS = 1 
												  AND u.ID IS NOT NULL 
												  AND (rp.StatusRealizacji < 5 or (rp.StatusRealizacji in (5,99) and rp.UzytkownikUsuwajacyID is not null))
												  AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0
												)
												 OR
												 (@RodzajKDS = 3 
												   AND rp.StatusRealizacji IN (3,4) 
												   AND rp.UzytkownikUsuwajacyID IS NULL
                                                   AND rp.FlgPotwierdzona = 1  
												  )
											)
                                            AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                    ) A

                                    INSERT INTO #Pozycje
                                    SELECT DISTINCT *
                                    FROM 
                                    (
                                            SELECT 	    	rp.ID 
                                                            ,rp.DTRachunekID 
                                                            ,rp.DodatekDlaDTRachunekPozycjaID
                                                            ,rp.FlgPozycjaNadrzedna 
                                                            ,rp.GrupaZestawuID 
                                                            ,rp.TowarID 
                                                            ,rp.FlgPotwierdzona 
                                                            ,rp.StatusRealizacji 
                                                            ,rp.UzytkownikUsuwajacyID  
                                                            ,p.KonfiguracjaDrukowaniaZamowienID 
                                                            ,rp.DataWyswietleniaNaKDS 
                                                            ,rp.DataWydruku	
                                                            ,rp._c_DataUtworzenia 
                                                            ,rp.ZestawID 
                                                            ,rp.NumerCzesci 
                                                            ,rp.NumerGrupySerwowania 
                                                            ,rp.Notatka 
                                                            ,rp.Ilosc 
                                                            ,rp.IloscZestawow 
                                                            ,rp.IloscZrealizowana 
                                                            ,rp.IloscKawalkow 
                                                            ,rp.DataUsuniecia 
                                                            ,rp.DataModyfikacjiGrupySerwowania
                                                            ,rp.RolaWKompozycji
                                                            ,rp.NazwadanieOtwarte 
                                            FROM NGAStroDTRachunekPozycja rp
                                            INNER JOIN NGastroDTRachunekPozycjaPowiazanie pow ON pow.DTRachunekPozycjaID = rp.ID
                                            LEFT JOIN #Pozycje p ON p.ID = pow.DTRachunekPozycjaDocelowaID
                                            WHERE pow.DTRachunekPozycjaDocelowaID IN (SELECT ID FROM #Pozycje)
                                                  AND pow.DTRachunekPozycjaID NOT IN (SELECT ID FROM #Pozycje)
                                            
                                )B

                                ---- towary które mają wybrane modyfikatory ze zgodnym kierunkiem 
                                INSERT INTO #Pozycje
                                SELECT DISTINCT *
                                FROM 
                                (
                                        SELECT DISTINCT	rp.ID 
                                                        ,rp.DTRachunekID 
                                                        ,rp.DodatekDlaDTRachunekPozycjaID
                                                        ,rp.FlgPozycjaNadrzedna 
                                                        ,rp.GrupaZestawuID 
                                                        ,rp.TowarID 
                                                        ,rp.FlgPotwierdzona 
                                                        ,rp.StatusRealizacji 
                                                        ,rp.UzytkownikUsuwajacyID  
                                                        ,ISNULL(rp.KonfiguracjaDrukowaniaZamowienID,tm.KonfiguracjaDrukowaniaZamowienID)  KonfiguracjaDrukowaniaZamowienID
                                                        ,rp.DataWyswietleniaNaKDS 
                                                        ,rp.DataWydruku	
                                                        ,rp._c_DataUtworzenia 
                                                        ,rp.ZestawID 
                                                        ,rp.NumerCzesci 
                                                        ,rp.NumerGrupySerwowania 
                                                        ,rp.Notatka 
                                                        ,rp.Ilosc 
                                                        ,rp.IloscZestawow 
                                                        ,rp.IloscZrealizowana 
                                                        ,rp.IloscKawalkow 
                                                        ,rp.DataUsuniecia 
                                                        ,rp.DataModyfikacjiGrupySerwowania
                                                        ,rp.RolaWKompozycji
                                                        ,rp.NazwadanieOtwarte 
                                        FROM #LastBills r
                                        INNER JOIN NGastroDTRachunekPozycja rp ON r.ID = rp.DtrachunekID
                                        INNER JOIN NGastroDTRachunekPozycjaModyfikacja rpm ON rp.ID = rpm.DTRachunekPozycjaID
                                        INNER JOIN NGastroTowar t ON t.ID = rpm.TowarID
                                        INNER JOIN NGastroTowar tm ON tm.ID = rpm.ModyfikatorID
                                        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON (rp.KonfiguracjaDrukowaniaZamowienID IS NULL AND kdz.ID = tm.KonfiguracjaDrukowaniaZamowienID)
                                                                                     OR (rp.KonfiguracjaDrukowaniaZamowienID IS NOT NULL AND kdz.ID = rp.KonfiguracjaDrukowaniaZamowienID) 
                                        INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                         OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)			
                                        LEFT JOIN  NGAStroUrzadzenieKdsWydawkaDla u ON u.UrzadzenieIDKds = u.UrzadzenieIDKds and u.UrzadzenieIDWydawka = @DeviceID
                                        WHERE	@RodzajKDS IN (1 ,3) 
                                                AND ((@RodzajKDS = 1 AND u.ID IS NOT NULL AND (rp.StatusRealizacji < 5 or (rp.StatusRealizacji in (5,99) and rp.UzytkownikUsuwajacyID is not null)))
												     OR (@RodzajKDS = 3 AND (rp.StatusRealizacji IN (3,4) AND rp.UzytkownikUsuwajacyID IS NULL)))
												AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0
												AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
												AND rpm.Ilosc > 0 
												AND rpm.ModyfikatorIlosc > 0 	
													
                            )modyf

                            INSERT INTO #ResultModyf 
                            SELECT	DISTINCT rp.ID,
                                             rpm.ModyfikatorID,
                                             ISNULL(rp.KonfiguracjaDrukowaniaZamowienID,tm.KonfiguracjaDrukowaniaZamowienID) KonfiguracjaDrukowaniaZamowienID,
                                             CASE WHEN ISNULL(tm.NazwaNaZamowieniu,'') = ''	THEN tm.NazwaDlaKas ELSE tm.NazwaNaZamowieniu END AS ModyfikatorNazwaNaZamowieniu,
                                             rpm.ModyfikatorIlosc,
                                             CAST(0 AS TINYINT),
                                             0
                            FROM #LastBills r
                                        INNER JOIN NGastroDTRachunekPozycja rp ON r.ID = rp.DtrachunekID
                                        INNER JOIN NGastroDTRachunekPozycjaModyfikacja rpm ON rp.ID = rpm.DTRachunekPozycjaID
                                        INNER JOIN NGastroTowar t ON t.ID = rpm.TowarID
                                        INNER JOIN NGastroTowar tm ON tm.ID = rpm.ModyfikatorID
                                        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON (rp.KonfiguracjaDrukowaniaZamowienID IS NULL AND kdz.ID = tm.KonfiguracjaDrukowaniaZamowienID)
                                                                                     OR (rp.KonfiguracjaDrukowaniaZamowienID IS NOT NULL AND kdz.ID = rp.KonfiguracjaDrukowaniaZamowienID) 
                                        INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                          OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)	
                                        LEFT JOIN  NGAStroUrzadzenieKdsWydawkaDla u ON u.UrzadzenieIDKds = u.UrzadzenieIDKds and u.UrzadzenieIDWydawka = @DeviceID
                            WHERE	tm.FlgSprzedawany = 1
                                    AND tm.FlgAktywny = 1
                                    AND tm.FlgDeleted = 0
                                    AND @RodzajKDS IN (1,3) 
                                    AND (
										(@RodzajKDS = 1 AND u.ID IS NOT NULL AND (rp.StatusRealizacji < 5 or (rp.StatusRealizacji in (5,99) and rp.UzytkownikUsuwajacyID is not null)))
                                        OR 
										(@RodzajKDS = 3 AND rp.StatusRealizacji IN (3,4) AND rp.UzytkownikUsuwajacyID is null)
										)
                                    AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0
                                    AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)
                                    AND rpm.Ilosc > 0 
                                    AND rpm.ModyfikatorIlosc > 0 							


                            ----tu dokładamy bazowe skąłdniki nie zamienione na nic innego
                            INSERT INTO #ResultModyf 
                            SELECT	rp.ID,
                                    skl.TowarID, 
                                    towar.KonfiguracjaDrukowaniaZamowienID,
                                    towar.NazwaDlaKas, 
                                     ROUND(skl.Ilosc/bom.Ilosc,3),
                                    0 ,
                                    skl.Pozycja
                            FROM #LastBills R
                            INNER JOIN NGastroDTRachunekPozycja rp ON rp.DTRachunekID = r.ID
                            INNER JOIN NGastroTowar tow ON tow.id = rp.TowarID and tow.FlgReceptura = 1
                            CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
							             FROM NGastroBOM 
										 WHERE TowarID = rp.TowarID
										 AND ObowiazujeOd <= GETDATE()
										 ORDER BY ObowiazujeOd DESC
										) bom
                            INNER JOIN NGastroSkladnik skl ON bom.id = skl.BomID
                            INNER JOIN NGastroTowar towar on towar.ID = skl.TowarID
                            INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON kdz.ID = towar.KonfiguracjaDrukowaniaZamowienID
                            INNER JOIN NGAStroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	(ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                            OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                            LEFT JOIN  NGAStroUrzadzenieKdsWydawkaDla u ON u.UrzadzenieIDKds = u.UrzadzenieIDKds and u.UrzadzenieIDWydawka = @DeviceID
                            WHERE 	towar.FlgSprzedawany = 1
                                    AND towar.FlgAktywny = 1
                                    AND towar.FlgDeleted = 0
                                    AND @RodzajKDS IN (1,3) 
                                    AND (
										(@RodzajKDS = 1 AND u.ID IS NOT NULL AND (rp.StatusRealizacji < 5 or (rp.StatusRealizacji in (5,99) and rp.UzytkownikUsuwajacyID is not null)))
                                        OR 
										(@RodzajKDS = 3 AND rp.StatusRealizacji IN (3,4) AND rp.UzytkownikUsuwajacyID is null)
										)
                                    AND rp.FlgPotwierdzona = 1 AND rp.StatusRealizacji > 0
                                    AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)


                            UPDATE t SET 
                                t.DeleteFlag = 1
                            FROM #ResultModyf t
                            INNER JOIN NGastroDTRachunekPozycjaModyfikacja modyfikacja ON t.ZamiennikTowarID = modyfikacja.TowarID 
                                                                                          AND t.PozycjaID = modyfikacja.DTRachunekPozycjaID


                            DELETE FROM #ResultModyf
                            WHERE DeleteFlag = 1;
                            
                            INSERT INTO #Pozycje
                            SELECT DISTINCT *
                            FROM 
                            (
                                    SELECT 		rp.ID 
                                                    ,rp.DTRachunekID 
                                                    ,rp.DodatekDlaDTRachunekPozycjaID
                                                    ,rp.FlgPozycjaNadrzedna 
                                                    ,rp.GrupaZestawuID 
                                                    ,rp.TowarID 
                                                    ,rp.FlgPotwierdzona 
                                                    ,rp.StatusRealizacji 
                                                    ,rp.UzytkownikUsuwajacyID  
                                                    ,r.KonfiguracjaDrukowaniaZamowienID 
                                                    ,rp.DataWyswietleniaNaKDS 
                                                    ,rp.DataWydruku	
                                                    ,rp._c_DataUtworzenia 
                                                    ,rp.ZestawID 
                                                    ,rp.NumerCzesci 
                                                    ,rp.NumerGrupySerwowania 
                                                    ,rp.Notatka 
                                                    ,rp.Ilosc 
                                                    ,rp.IloscZestawow 
                                                    ,rp.IloscZrealizowana 
                                                    ,rp.IloscKawalkow 
                                                    ,rp.DataUsuniecia 
                                                    ,rp.DataModyfikacjiGrupySerwowania
                                                    ,rp.RolaWKompozycji
                                                    ,rp.NazwadanieOtwarte 
                                    FROM #ResultModyf r
                                    INNER JOIN NGastroDTRachunekPozycja rp ON rp.DTRachunekID = r.PozycjaID
                                    INNER JOIN NGastroTowar t ON t.ID = rp.TowarID
                                    LEFT JOIN #Pozycje p ON p.ID = r.PozycjaID
                                    WHERE p.ID IS NULL
                                            
                        )modyf2
                END

        DECLARE @date AS DATETIME = GETDATE()

        INSERT INTO #Bills
        (			
            ID,
            Description,
            UserDescription,
            Remark,
            PointOfSale,
            Date,
            OpenningType,
            FlgFastTrack
        )  
        SELECT	
            r.ID,
            CAST((
                CASE @RodzajNumeracjiNaKDS 
                    WHEN 0 THEN CAST(r.Numer AS VARCHAR(MAX))
                    WHEN 1 THEN CAST(r.NumerZmiana AS VARCHAR(MAX)) 
                    WHEN 2 THEN CASE WHEN @RodzajNumerkaDoOdbioruZamowienia = 0 THEN CAST(r.NumerZmiana AS VARCHAR(MAX))
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 1 THEN NumerReczny 
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 2 THEN CAST(r.NumerDoOdbioruOdnawialny AS VARCHAR(MAX))
                                END
                    WHEN 3 THEN CAST(r.Numer AS VARCHAR(MAX)) + '/' +	CASE WHEN @RodzajNumerkaDoOdbioruZamowienia = 0 THEN CAST(r.NumerZmiana AS VARCHAR(MAX))
                                                                             WHEN @RodzajNumerkaDoOdbioruZamowienia = 1 THEN NumerReczny 
                                                                             WHEN @RodzajNumerkaDoOdbioruZamowienia = 2 THEN CAST(r.NumerDoOdbioruOdnawialny AS VARCHAR(MAX))
                                                                        END
                    WHEN 4 THEN CAST(r.NumerZmiana AS VARCHAR(MAX)) + '/' + CASE WHEN @RodzajNumerkaDoOdbioruZamowienia = 0 THEN CAST(r.NumerZmiana AS VARCHAR(MAX))
                                                                                 WHEN @RodzajNumerkaDoOdbioruZamowienia = 1 THEN NumerReczny 
                                                                                 WHEN @RodzajNumerkaDoOdbioruZamowienia = 2 THEN CAST(r.NumerDoOdbioruOdnawialny AS VARCHAR(MAX))
                                                                            END
                    WHEN 5 THEN CASE WHEN @RodzajNumerkaDoOdbioruZamowienia = 0 THEN CAST(r.NumerZmiana AS VARCHAR(MAX))
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 1 THEN r.NumerReczny 
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 2 THEN CAST(r.NumerDoOdbioruOdnawialny AS VARCHAR(MAX))
                                END  + '/' + CAST(r.Numer AS VARCHAR(MAX))
                    WHEN 6 THEN CASE WHEN @RodzajNumerkaDoOdbioruZamowienia = 0 THEN CAST(r.NumerZmiana AS VARCHAR(MAX))
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 1 THEN r.NumerReczny 
                                     WHEN @RodzajNumerkaDoOdbioruZamowienia = 2 THEN CAST(r.NumerDoOdbioruOdnawialny AS VARCHAR(MAX))
                                END  + '/' + CAST(r.NumerZmiana AS VARCHAR(MAX))
                END
            ) AS VARCHAR(10)),
            o.Nick,
            LEFT(r.Opis,150),
            s.Nazwa,
            r.DataOtwarcia,
            CASE ror.Kod
                WHEN 'NS' THEN 1		-- NaStolik
                WHEN 'WBD' THEN 5		-- NaWynosBezDostawy
                WHEN 'WZD' THEN 6		-- NaWynosZDostawa
                WHEN 'S' THEN 7			-- Sklepowy
                WHEN 'ZOS' THEN 8		-- ZOpisemSlownym
                WHEN 'H' THEN 9			-- Hotelowy
                WHEN 'NKA' THEN 10		-- NaKarte
                ELSE -1
            END as OpenningType,
            r.FlgFastTrack
        FROM (SELECT DISTINCT DTRachunekID AS ID FROM #Pozycje) b
        INNER JOIN NGastroDTRachunek r on b.ID = r.ID
        INNER JOIN NGastroUzytkownik u ON r.UzytkownikOtwierajacyID = u.ID
        INNER JOIN NSysOperator o ON u.OperatorID = o.ID
        INNER JOIN NSysOperatorLokal ol ON ol.OperatorID = o.ID
        INNER JOIN NGastroKasa k ON k.ID = r.KasaID
        INNER JOIN NSysStanowisko s ON s.ID = k.StanowiskoID	
        LEFT JOIN NGastroRodzajOtwarciaRachunku ror on ror.ID = r.RodzajOtwarciaRachunkuID				

        UPDATE b SET 
            b.Date =  tt.Data 
        FROM #Bills b
        INNER JOIN 
        (	
            SELECT CASE WHEN @SortType =0 
                        THEN Min(CASE	
                                    WHEN rp.DataWyswietleniaNaKDS IS NOT NULL AND rp.DataWyswietleniaNaKDS < rp.DataWydruku	
                                    THEN rp.DataDodania
                                    ELSE rp.DataWydruku
                                END )  
                        ELSE
                            MAX(CASE	
                                    WHEN rp.DataWyswietleniaNaKDS IS NOT NULL AND rp.DataWyswietleniaNaKDS < rp.DataWydruku	
                                    THEN rp.DataDodania
                                    ELSE rp.DataWydruku
                                END ) 
                        END AS Data, 
                rp.DTRachunekID
            FROM #Bills b
            INNER JOIN #Pozycje rp ON b.id = rp.DTRachunekID
            WHERE  ( @WyswietlanieEdytowanychRachunkow = 1	OR rp.FlgPotwierdzona = 1) 
                AND rp.StatusRealizacji NOT IN (3,4,6)
                AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
            GROUP BY rp.DTRachunekID
        ) tt ON tt.DTRachunekID = b.ID

        INSERT INTO #Pizza
        (
            BillID,
            ID,
            TowarID,
            NazwaZestawu,
            NazwaTowaru,			
            Ilosc,
            Skladnik,
            Zamiennik,
            PizzaBaza,
            IloscBaza,
            NumerCzesci,
            GrupaZestawuID
        )		
        SELECT 
            z.BillID,
            z.ZestawID,
            ts.ID,			
            CASE WHEN LTRIM(RTRIM(t.NazwaNaZamowieniu)) = '' THEN t.NazwaDlaKas ELSE t.NazwaNaZamowieniu END AS NazwaZestawu,
            CASE WHEN LTRIM(RTRIM(ts.NazwaNaZamowieniu)) = '' THEN ts.NazwaDlaKas ELSE ts.NazwaNaZamowieniu END AS NazwaTowaru,
            CAST(ROUND(ts.IloscSprzedawana / b.Ilosc, 3) AS DECIMAL(19,6)),
            1,
            0,
            1,
            CAST(ROUND(ts.IloscSprzedawana / b.Ilosc, 3) AS DECIMAL(19,6)),
            NumerCzesci,
            GrupaZestawuID
        FROM 
        (
            SELECT DISTINCT 
                ZestawID,b.ID as BillID, NumerCzesci, GrupaZestawuID
            FROM #Bills b
            INNER JOIN #Pozycje rp ON b.ID = rp.DTRachunekID
            WHERE( 
					(@RodzajKDS IN (0, 1)	
					AND (@WyswietlanieWykonanychPozycji = 1 
							OR @RodzajKDS = 1 
							OR rp.StatusRealizacji <> 3 
							OR (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
						)
                    AND (
                            (@RodzajKDS = 0 and rp.StatusRealizacji < 4) 
                            or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                            or (@RodzajKDS = 1 and rp.StatusRealizacji < 5)
                            or rp.UzytkownikUsuwajacyID is not null 						 
                         )		
                    AND 
						(
							DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
							OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.UzytkownikUsuwajacyID IS NOT NULL AND rp.FlgPotwierdzona = 0)
						 )		
                    AND 
						(
							@WyswietlanieEdytowanychRachunkow = 1
							OR rp.FlgPotwierdzona = 1
						)
					)
					OR 
					( @RodzajKDS = 3 
					     AND rp.StatusRealizacji IN (3,4)
						 AND rp.UzytkownikUsuwajacyID IS NULL
						 AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
						 AND rp.FlgPotwierdzona = 1
					)
					)
					AND rp.ZestawID IS NOT NULL
        ) z
        INNER JOIN NGastroTowar t ON z.ZestawID = t.ID AND t.RodzajTowaru = 3
        CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = z.ZestawID
					 AND ObowiazujeOd <= GETDATE()
					 ORDER BY ObowiazujeOd DESC
				) b  
        INNER JOIN NGastroSkladnik s ON s.BomID = b.ID
        INNER JOIN NGastroTowar ts ON ts.ID = s.TowarID

        UNION ALL

        SELECT 
            z.BillID,
            z.ZestawID,
            tz.ID,
            CASE WHEN LTRIM(RTRIM(t.NazwaNaZamowieniu)) = '' THEN t.NazwaDlaKas ELSE t.NazwaNaZamowieniu END AS NazwaZestawu,
            CASE WHEN LTRIM(RTRIM(tz.NazwaNaZamowieniu)) = '' THEN tz.NazwaDlaKas ELSE tz.NazwaNaZamowieniu END AS NazwaTowaru,
            CAST(ROUND(ts.IloscSprzedawana / b.Ilosc, 3) AS DECIMAL(19,6)),
            0,
            1,
            1,
            zam.Ilosc,
            NumerCzesci,
            z.GrupaZestawuID
        FROM 
        (		
            SELECT DISTINCT 
                ZestawID,b.ID as BillID, NumerCzesci, GrupaZestawuID
            FROM #Bills b
            INNER JOIN #Pozycje rp ON b.ID = rp.DTRachunekID
            WHERE( 
					(@RodzajKDS IN (0, 1)
					AND (@WyswietlanieWykonanychPozycji = 1 
                        OR @RodzajKDS = 1 
                        OR rp.StatusRealizacji <> 3 
                        OR (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                    )
                    AND  (
                            (@RodzajKDS = 0 and rp.StatusRealizacji < 4) 
                            or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                            or (@RodzajKDS = 1 and rp.StatusRealizacji < 5)
                            or rp.UzytkownikUsuwajacyID is not null 
                        )		
                    AND 
                    (
                        DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
                        OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.UzytkownikUsuwajacyID IS NOT NULL AND rp.FlgPotwierdzona = 0)
                    )
                    AND 
                    (
                        @WyswietlanieEdytowanychRachunkow = 1
                        OR rp.FlgPotwierdzona = 1
                    )
					)
					OR 
					( @RodzajKDS = 3 
					     AND rp.StatusRealizacji IN (3,4)
						 AND rp.UzytkownikUsuwajacyID IS NULL
						 AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
						 AND rp.FlgPotwierdzona = 1
					)
					)
                    AND rp.ZestawID IS NOT NULL
        ) z
        CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = z.ZestawID
					 AND ObowiazujeOd <= GETDATE()
					 ORDER BY ObowiazujeOd DESC
					) b
        INNER JOIN NGastroTowar t ON z.ZestawID = t.ID AND t.RodzajTowaru = 3
        INNER JOIN NGastroSkladnik s ON s.BomID = b.ID
        INNER JOIN NGastroTowar ts ON ts.ID = s.TowarID
        INNER JOIN NGastroZamiennik zam ON zam.SkladnikID = s.ID
        INNER JOIN NGastroTowar tz ON tz.ID = zam.TowarID AND tz.FlgAktywny = 1 and tz.Blokada = 0

        INSERT INTO #Articles 
        (
            ID,
            BillID,
            ArticleID,
            PackageID,
            Name,
            ServingGroup,
            ServingGroupName,
            PersonNumber,
            Remark,
            QuantitySet,
            QuantityToDo,
            QuantityDone,
            QuantityRemoved,
            QuantityPrecision,
            Date,
            IsModified,
            IsNew,
            StatusOfPreparation,
            ArticleType,
            PartNumber,
            Parts,
            ServingGroupModificationDate,
            Color,
            ShowWeight,
            ConnectionID	
        )
        SELECT	
            rp.ID,																	--ID			
            rp.DTRachunekID,														--BillID
            rp.TowarID,																--ArticleID
            rp.GrupaZestawuID,
            CASE	WHEN NazwaNaZamowieniu = '' 
                    THEN NazwaTowaru
                    ELSE NazwaNaZamowieniu
            END + CASE WHEN t.NumerPlu>99900 THEN ': ' + rp.NazwaDanieOtwarte ELSE '' END,																	--Name
            rp.NumerGrupySerwowania,												--ServingGroup
            ISNULL(sp.Opis, CAST(rp.NumerGrupySerwowania AS VARCHAR) ),				--ServingGroupName
            1,																		--PersonNumber
            rp.Notatka,																		--Remark
            CASE WHEN t.RodzajTowaru = 8 and t.FlgPodawanieWagiPoPrzygotowaniu = 1 and @RodzajKDS = 0
                    THEN 0
                    ELSE 1
            END,																		--QuantitySet
            CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                    THEN 0
                    ELSE rp.Ilosc
            END,																	--QuantityToDo
            rp.IloscZrealizowana,													--QuantityDone
            (CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                    THEN rp.Ilosc 
                    ELSE 0 
            END),																	--QuantityRemoved							
            t.Precyzja,																--QuantityPrecision
            rp.DataDodania,															--Date
            0,																		--IsModified
            CASE 
                WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                    THEN CASE WHEN DATEDIFF(SECOND, rp.DataUsuniecia, @date) <= 10 THEN 1 ELSE 0 END
                ELSE
                CASE rp.StatusRealizacji 
                    WHEN 0 THEN 1 				
                    ELSE
                        CASE WHEN ISNULL(konf.TInt, 0) > 0 AND DATEADD(ss, konf.TInt ,rp.DataWyswietleniaNaKDS) > @date
                        THEN 1 ELSE 0
                    END
                END
            END,						--IsNew,
            CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                    THEN 99
                    ELSE CASE WHEN  @WyswietlanieWykonanychPozycji = 1 AND @KDSExistsIssued = 0 AND rp.StatusRealizacji = 4 
                              THEN 3
                              ELSE rp.StatusRealizacji 
                         END
            END,																		--StatusOfPreparation
            t.RodzajTowaru,															--ArticleType
            rp.NumerCzesci,																		-- PartNumber
            1,																		--Parts
            rp.DataModyfikacjiGrupySerwowania,										--ServingGroupModificationDate
            CASE WHEN @RodzajKDS = 1 
                THEN CASE  WHEN rp.StatusRealizacji IN (0,1,2) AND rp.UzytkownikUsuwajacyID IS NULL THEN @KdsWydawkaKolorPozycjiWPrzygotowaniu 
                           WHEN rp.StatusRealizacji IN (3) AND rp.UzytkownikUsuwajacyID IS NULL THEN @KdsWydawkaKolorPozycjiWydanych 
						   WHEN rp.StatusRealizacji IN (4) AND rp.UzytkownikUsuwajacyID IS NULL THEN @KDsWydawkaKolorPozycjiWezwanychDoWydania 
                           ELSE NULL 
                       END
				WHEN @RodzajKDS = 3 
                THEN CASE  WHEN rp.StatusRealizacji IN (3) AND rp.UzytkownikUsuwajacyID IS NULL THEN @KdsWydawkaKolorPozycjiWydanych 
						   WHEN rp.StatusRealizacji IN (4) AND rp.UzytkownikUsuwajacyID IS NULL THEN @KDsWydawkaKolorPozycjiWezwanychDoWydania 
                           ELSE NULL 
                       END
            ELSE NULL
            END,																--Color
            1,																	--ShowWeight
            NULL
        FROM #Bills b
        INNER JOIN #Pozycje rp	ON	b.ID = rp.DTRachunekID
        INNER JOIN NGastroTowar t ON t.ID = rp.TowarID
        LEFT JOIN NGastroDTRachunekPozycjaPowiazanie rpp ON rpp.DTRachunekPozycjaID = rp.ID
        LEFT JOIN NGastroDTRachunekPozycja rpz ON rpz.ID = rpp.DTRachunekPozycjaDocelowaID AND rpz.StatusRealizacji = 4
        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON (t.NumerPlu<>99900 and ISNULL(rp.KonfiguracjaDrukowaniaZamowienID, rpz.KonfiguracjaDrukowaniaZamowienID) = kdz.ID)
        INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                         OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                         and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds =1 ) 
        LEFT join  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @rodzajKds =0
        INNER JOIN NGastroGrupaTowarowa gt ON t.GrupaTowarowaID = gt.ID 			
        LEFT JOIN NSysSlownik s ON	s.SystemNr = 300
        LEFT JOIN NSysSlownikPozycja sp ON	sp.SlownikID = s.ID AND sp.Wartosc = CAST(rp.NumerGrupySerwowania AS VARCHAR)
        LEFT JOIN NSysAppKonfiguracjaSzablon konfSzab ON konfSzab.Symbol= 'Local.KDS.NewPositionBacklightTime'
        LEFT JOIN NSysAppKonfiguracja konf ON konf.SzablonID = konfSzab.ID
        WHERE	(
					(((@RodzajKDS = 1 and U.ID IS NOT NULL) or @RodzajKDS = 0) 
						AND
							(@WyswietlanieWykonanychPozycji = 1 
								OR @RodzajKDS = 1 
								OR rp.StatusRealizacji <> 3 
								OR (@RodzajKDS = 0 and @KDSExistsIssued = 0 and (rp.StatusRealizacji = 4 OR (rp.StatusRealizacji = 5 AND ISNULL(rpz.StatusRealizacji,0) = 4)))
							 )
						AND 
							(	
								DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
								OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.UzytkownikUsuwajacyID IS NOT NULL AND rp.FlgPotwierdzona = 0)
							)
						AND (
								(@RodzajKDS = 0 and rp.StatusRealizacji < 4) 
								or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and  (rp.StatusRealizacji = 4 OR (rp.StatusRealizacji = 5 AND ISNULL(rpz.StatusRealizacji,0) = 4)))	
								or (@RodzajKDS = 1 and rp.StatusRealizacji < 5) 
								or rp.UzytkownikUsuwajacyID is not null 
							) 
						AND rp.StatusRealizacji<>6					
						AND 
							(
								@WyswietlanieEdytowanychRachunkow = 1
								OR rp.FlgPotwierdzona = 1
							)
					)
					OR 
					( @RodzajKDS = 3 
					  AND rp.StatusRealizacji IN (3,4)
					  AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0	
					  AND rp.UzytkownikUsuwajacyID IS NULL
					)
				)
				AND (rp.FlgPozycjaNadrzedna = 1 OR rp.GrupaZestawuID IS NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NULL)		
				AND rp.GrupaZestawuID IS NULL
				AND NOT EXISTS (SELECT * FROM NGastroDTRachunekPozycjaPowiazanie rpp WHERE rpp.DTRachunekPozycjaDocelowaID = rp.ID)

        UNION
        SELECT k.GrupaZestawuID,														--ID			
               k.DTRachunekID,														--BillID
               k.TowarID,	--ArticleID
               k.GrupaZestawuID,
               MAX(k.Name),															--Name
               MAX(k.ServingGroup) ,							--ServingGroup
               MAX(k.ServingGroupName) ,		--ServingGroupName
               MAX(k.PersonNumber),																		--PersonNumber
               MAX(k.Remark),																--Remark
               k.QuantitySet,																	--QuantitySet
               MAX(k.QuantityToDo),																	--QuantityToDo					
               MIN(k.QuantityDone),																	--QuantityDone
               MIN(k.QuantityRemoved),																	--QuantityRemoved							
               MAX(k.QuantityPrecision),																		--QuantityPrecision
               MIN(k.Date),													--Date
               MAX(k.IsModified),																		--IsModified
               MAX(k.IsNew),				
               MIN(k.StatusOfPreparation),																--StatusOfPreparation,
               k.RodzajTowaru,
               k.NumerCzesci,
               1 IloscKawalkow,
               MIN(k.DataModyfikacjiGrupySerwowania),
               CASE WHEN MIN(k.Color) > 0 THEN 
					CASE	WHEN MIN(k.Color) = 4 THEN @KDsWydawkaKolorPozycjiWezwanychDoWydania
							WHEN MIN(k.Color) < 3 THEN @KDSWydawkaKolorPozycjiWPrzygotowaniu
							ELSE @KDSWydawkaKolorPozycjiWydanych
					END
                    ELSE NULL
               END Color,
               k.ShowWeight,
               k.ConnectionID
        FROM (
                SELECT	rp.GrupaZestawuID,														--ID			
                    rp.DTRachunekID,														--BillID
                    CAST( MAX(CAST(rp.ZestawID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) AS TowarID,	--ArticleID
                    CASE	WHEN t.NazwaNaZamowieniu = '' 
                            THEN t.NazwaTowaru
                            ELSE t.NazwaNaZamowieniu
                    END AS Name,															--Name
                    MAX(rp.NumerGrupySerwowania) AS ServingGroup,							--ServingGroup
                    MAX(ISNULL(sp.Opis, CAST(rp.NumerGrupySerwowania AS VARCHAR) )) ServingGroupName,		--ServingGroupName
                    1 AS PersonNumber,																		--PersonNumber
                    MAX(rp.Notatka) AS Remark,																--Remark
                    CASE WHEN t.RodzajTowaru = 8 and @RodzajKDS = 0
                        THEN 0
                        ELSE 1
                    END AS QuantitySet,																	--QuantitySet
                    MAX(CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                                THEN 0
                                ELSE rp.IloscZestawow 
                    END) AS QuantityToDo,																	--QuantityToDo					
                    MIN(CASE	WHEN rp.IloscZrealizowana < rp.Ilosc
                            THEN 0
                            ELSE 1
                    END) AS QuantityDone,																	--QuantityDone
                    MIN(CASE WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                            THEN CASE WHEN t.RodzajTowaru = 9 
                                      THEN rp.IloscZestawow 
                                      ELSE rp.ilosc
                                 END	   
                            ELSE 0 
                    END) AS QuantityRemoved,																	--QuantityRemoved							
                    2 AS QuantityPrecision,																		--QuantityPrecision
                    MIN(rp.DataDodania) AS Date,													--Date
                    0 AS IsModified,																		--IsModified
                    CASE 
                        WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                            THEN CASE WHEN DATEDIFF(second, MIN(DataUsuniecia), @date) <= 10 THEN 1 ELSE 0 END
                        ELSE
                        CASE MIN(rp.StatusRealizacji)
                            WHEN 0 THEN 1 				
                            ELSE
                                CASE WHEN ISNULL(MIN(konf.TInt), 0) > 0 AND DATEADD(ss, MIN(konf.TInt) ,MIN(rp.DataWyswietleniaNaKDS)) > @date
                                THEN 1 ELSE 0
                            END
                        END
                    END AS IsNew,						--IsNew,				
                    MIN(CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                                THEN 99
                                ELSE rp.StatusRealizacji
                        END) AS StatusOfPreparation,																--StatusOfPreparation,
                    t.RodzajTowaru,
                    rp.NumerCzesci,
                    1 AS IloscKawalkow,
                    MIN(rp.DataModyfikacjiGrupySerwowania) DataModyfikacjiGrupySerwowania,
                    CASE WHEN @RodzajKDS = 1 
                          THEN CASE WHEN rp.UzytkownikUsuwajacyID IS NULL THEN rp.StatusRealizacji ELSE -1 END
                    ELSE -1 
                    END	AS Color,
                    1 AS ShowWeight,
                    CASE WHEN t.RodzajTowaru IN (9, 10) THEN rp.GrupaZestawuID ELSE NULL END AS ConnectionID
                    --ShowWeight		
                FROM #Pozycje rp
                INNER JOIN NGastroTowar t ON t.ID = rp.ZestawID AND t.RodzajTowaru <> 3
                INNER JOIN NgastroTowar t1 ON t1.ID = rp.TowarID and rp.ZestawID = t.ID AND t.RodzajTowaru <> 3
                INNER JOIN NGastroGrupaTowarowa gt ON t.GrupaTowarowaID = gt.ID 			
                LEFT JOIN NSysSlownik s ON s.SystemNr = 300
                LEFT JOIN NSysSlownikPozycja sp ON sp.SlownikID = s.ID AND sp.Wartosc = CAST(rp.NumerGrupySerwowania AS VARCHAR)
                LEFT JOIN NSysAppKonfiguracjaSzablon konfSzab ON konfSzab.Symbol= 'Local.KDS.NewPositionBacklightTime'
                LEFT JOIN NSysAppKonfiguracja konf ON konf.SzablonID = konfSzab.ID
                INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON	rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                  OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)		
                                                                                 and (ukdz.UrzadzenieID =  @DeviceID or @RodzajKDS =1 ) 
                LEFT JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @RodzajKDS =0
				WHERE(							
						(	@RodzajKDS IN (0 ,1)
								AND (@WyswietlanieWykonanychPozycji = 1 
									or @RodzajKDS = 1 
									OR rp.StatusRealizacji <> 3 
									or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
								)
							   AND  ((@RodzajKDS = 0 and rp.StatusRealizacji < 4)
									  or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
									  or (@RodzajKDS = 1 and rp.StatusRealizacji < 5) 
									  or rp.UzytkownikUsuwajacyID is not null
									 )	
								AND rp.StatusRealizacji<>6		
								AND 
									(
										@WyswietlanieEdytowanychRachunkow = 1
										OR rp.FlgPotwierdzona = 1
									)
								AND
									(	
										DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
										OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.UzytkownikUsuwajacyID IS NOT NULL AND rp.FlgPotwierdzona = 0)
									)
							)
							OR
							(	@RodzajKDS = 3
								AND rp.StatusRealizacji IN (3,4)
								AND rp.UzytkownikUsuwajacyID IS NULL
								AND rp.FlgPotwierdzona = 1
								AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
							)
						)
						AND	rp.GrupaZestawuID IS NOT NULL														
                GROUP BY	rp.GrupaZestawuID, rp.DTRachunekID, rp.UzytkownikUsuwajacyID,
                            ( CASE WHEN t.NazwaNaZamowieniu = '' THEN t.NazwaTowaru ELSE t.NazwaNaZamowieniu END )
                            ,t.RodzajTowaru,rp.StatusRealizacji, rp.NumerCzesci 	
            )k
        GROUP BY k.GrupaZestawuID,	
               k.DTRachunekID,		
               k.TowarID,	
               k.QuantitySet,	
               k.RodzajTowaru,
               k.NumerCzesci,
               k.ShowWeight,
               k.ConnectionID

        UNION ALL  -- PIZZA
    
        SELECT 
            dtrp.ID							
            ,p.BillID
            ,p.ArticleID
            ,p.GrupaZestawuID
            ,p.Name
            ,p.ServingGroup
            ,p.ServingGroupName
            ,p.PersonNumber
            ,p.Remark
            ,p.QuantitySet
            ,p.QuantityToDo
            ,p.QuantityDone
            ,p.QuantityRemoved
            ,p.QuantityPrecision
            ,dtrp.DataDodania
            ,p.IsModified
            ,p.IsNew
            ,p.StatusOfPreparation
            ,p.RodzajTowaru
            ,p.NumerCzesci
            ,p.IloscKawalkow
            ,dtrp.DataModyfikacjiGrupySerwowania
            ,p.Color
            ,1
            ,p.ConnectionID																	--ShowWeight
        FROM
        (
            SELECT distinct
                rp.GrupaZestawuID,
                rp.ZestawID,
                rp.NumerCzesci,
                rp.DTRachunekID															AS BillID,
                rp.ZestawID																AS ArticleID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END																		AS Name,
                rp.NumerGrupySerwowania													AS ServingGroup,
                ISNULL(sp.Opis, CAST(rp.NumerGrupySerwowania AS VARCHAR) )				AS ServingGroupName,
                1																		AS PersonNumber,
                rp.Notatka																AS Remark,
                CASE WHEN t.RodzajTowaru = 8 and @RodzajKDS = 0
                    THEN 0
                    ELSE 1
                END																		AS QuantitySet,
                CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                        THEN 0
                        ELSE ROUND(rp.ilosc * rp.IloscZestawow,2) 
				END																		 AS QuantityToDo,
                CASE	WHEN rp.IloscZrealizowana < rp.Ilosc
                        THEN 0
                        ELSE ROUND(1.0 / rp.IloscKawalkow, 2)
                END																		AS QuantityDone,
                CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                        THEN ROUND(1.0 / rp.IloscKawalkow, 2)
                        ELSE 0 
                END																		AS QuantityRemoved,
                2																		AS QuantityPrecision,
                0																		AS IsModified,
                CASE 
                    WHEN rp.UzytkownikUsuwajacyID IS NOT NULL 
                        THEN CASE WHEN DATEDIFF(second, DataUsuniecia, @date) <= 10 THEN 1 ELSE 0 END
                    ELSE
                    CASE rp.StatusRealizacji 
                        WHEN 0 THEN 1 				
                        ELSE
                            CASE WHEN ISNULL(konf.TInt, 0) > 0 AND DATEADD(ss, konf.TInt ,rp.DataWyswietleniaNaKDS) > @date
                            THEN 1 ELSE 0
                        END
                    END
                END AS IsNew,						--IsNew,			
                CASE	WHEN rp.UzytkownikUsuwajacyID IS NOT NULL
                            THEN 99
                            ELSE rp.StatusRealizacji
                END																		AS StatusOfPreparation,
                t.RodzajTowaru,
                rp.IloscKawalkow,
                
                CASE WHEN @RodzajKDS = 1 
                 THEN CASE WHEN rp.StatusRealizacji in (0,1,2) and rp.UzytkownikUsuwajacyID is null THEN @KDSWydawkaKolorPozycjiWPrzygotowaniu 
                           when rp.StatusRealizacji in (3,4) and rp.UzytkownikUsuwajacyID is null THEN @KDSWydawkaKolorPozycjiWydanych 
                           ELSE null 
                       END
                ELSE null
                END as Color,
                1 as ShowWeight,
                rp.GrupaZestawuID	as ConnectionID			 														
            FROM #Bills b
            INNER JOIN #Pozycje rp ON rp.DTRachunekID = b.ID and rp.RolaWKompozycji = 1
            INNER JOIN NGastroTowar t ON	t.ID = rp.ZestawID	AND t.RodzajTowaru = 3			
            INNER JOIN #Pizza p 	ON	rp.TowarID = p.TowarID
                                    AND p.ID = rp.ZestawID					
                                    AND p.PizzaBaza = 1
                                    AND p.Skladnik = 1
                                    and p.BillID = rp.DTRachunekID
            INNER JOIN NGastroGrupaTowarowa gt ON t.GrupaTowarowaID = gt.ID 			
            LEFT JOIN NSysSlownik s ON s.SystemNr = 300
            LEFT JOIN NSysAppKonfiguracjaSzablon konfSzab ON konfSzab.Symbol= 'Local.KDS.NewPositionBacklightTime'
            LEFT JOIN NSysAppKonfiguracja konf ON konf.SzablonID = konfSzab.ID
            LEFT JOIN NSysSlownikPozycja sp ON sp.SlownikID = s.ID AND sp.Wartosc = CAST(rp.NumerGrupySerwowania AS VARCHAR)
            LEFT JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON	rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
            INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                              OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)	
                                                                             and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds =1 ) 
            LEFT JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @rodzajKds =0
            WHERE	(
					(@RodzajKDS IN (0,1)
					AND (@WyswietlanieWykonanychPozycji = 1 
                        or @RodzajKDS = 1 
                        or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                        OR rp.StatusRealizacji <> 3 
					)
                    									
                    AND (
                            (@RodzajKDS = 0 and rp.StatusRealizacji < 4) 
                            or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4)
                            or (@RodzajKDS = 1 and rp.StatusRealizacji < 5) 
                            or rp.UzytkownikUsuwajacyID is not null
                        )	
                    AND rp.StatusRealizacji<>6		
                    AND 
                        (
                            @WyswietlanieEdytowanychRachunkow = 1
                            OR rp.FlgPotwierdzona = 1
                        )
                    AND
                        (	
                            DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
                            OR (@WyswietlanieEdytowanychRachunkow = 1 AND rp.UzytkownikUsuwajacyID IS NOT NULL AND rp.FlgPotwierdzona = 0)
                        )					
                    )
					OR
					(	@RodzajKDS = 3
						AND rp.StatusRealizacji IN (3,4)
						AND rp.UzytkownikUsuwajacyID IS NULL
						AND rp.FlgPotwierdzona = 1
						AND DATEDIFF(ss, CASE rp.DataWydruku WHEN CAST('1900-01-01' AS DATETIME) THEN @date ELSE rp.DataWydruku END, @date) > 0
					)
					)
					AND	rp.GrupaZestawuID IS NOT NULL
        ) p
        inner join 
        (
            select	cast(max(cast( ID as varchar(36))) as UNIQUEIDENTIFIER) as ID,
                    GrupaZestawuID, 
                    ZestawID, 
                    MAX(DataModyfikacjiGrupySerwowania) as DataModyfikacjiGrupySerwowania,
                    MAX(DataDodania) AS DataDodania
            from #Pozycje 
            group by GrupaZestawuID, ZestawID
        ) dtrp on dtrp.GrupaZestawuID = p.GrupaZestawuID and dtrp.ZestawID = p.ZestawID


        DECLARE @NazwyTowarowDlaPozycji TABLE (idPoz UNIQUEIDENTIFIER , nazwa VARCHAR(100) COLLATE POLISH_CS_AI DEFAULT '',numer INT IDENTITY (1,1))
        INSERT INTO @NazwyTowarowDlaPozycji(idPoz,nazwa)
        SELECT	rp.ID,
                CASE WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END										
        FROM #Pozycje rp
        INNER JOIN NGastroTowar t ON	t.ID = rp.TowarID AND t.RodzajTowaru <> 4
        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
        LEFT JOIN NGastroTowar tz ON rp.ZestawID = tz.ID
        WHERE	(	
				(@RodzajKDS IN (0,1)
					AND (@WyswietlanieWykonanychPozycji = 1 or @RodzajKDS = 1 OR rp.StatusRealizacji <> 3)
					AND ((@RodzajKDS = 0 and (rp.StatusRealizacji < 4 or rp.StatusRealizacji=99)) or (@RodzajKDS = 1 and (rp.StatusRealizacji < 5 or rp.StatusRealizacji=99)) or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4))		
					AND 
					(
						@WyswietlanieEdytowanychRachunkow = 1
						OR rp.FlgPotwierdzona = 1
					)
				)
				OR (@RodzajKDS = 3
					AND rp.StatusRealizacji IN (3,4)
					AND rp.FlgPotwierdzona = 1
					)
				)
                AND (rp.FlgPozycjaNadrzedna = 0 OR rp.GrupaZestawuID IS NOT NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NOT NULL)				
                AND ISNULL(rp.RolaWKompozycji, 0) IN (0, 2)
                AND ISNULL(tz.RodzajTowaru, 0) <> 3

        INSERT INTO #SubArticles 
        (			
            ID,
            ArticleID,
            SubArticleID,
            Name,
            Quantity,
            QuantityPrecision,
            IsPrimary,
            StatusOfPreparation,
            IsModified,
            Numer,
            NumerCzesci,
            GrupaZestawuID,
            Pozycja,
            ZestawID,
            IsAddition,
            Date,
            Remark
        )
        select  CAST(MAX(CAST(zliczonezestawy.ID AS VARCHAR(36))) AS UNIQUEIDENTIFIER),
                zliczonezestawy.GrupaZestawuID,
                CAST(MAX(CAST(zliczonezestawy.TowarID AS VARCHAR(36))) AS UNIQUEIDENTIFIER),
                max(zliczonezestawy.nazwa), 									
                Max(zliczonezestawy.ilosc),											
                max(zliczonezestawy.Precyzja),
                1,
                max(zliczonezestawy.StatusRealizacji),
                0,
                Numer,
                NumerCzesci,
                zliczonezestawy.GrupaZestawuID,
                0,
                CAST(MAX(CAST(zliczonezestawy.ZestawID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) AS ZestawID,
                0,
                Date,
                '' Remark
            from 
            (
                    select 	CAST(MAX(CAST(sel.ID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) as id,
                            sel.GrupaZestawuID ,
                            CAST(max(CAST(sel.TowarID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) as TowarID,
                            sel.nazwa , 									
                            CASE WHEN max(sel.RodzajTowaru) = 9 THEN sum(sel.Ilosc)
                            ELSE
                            sum((CASE WHEN sel.UzytkownikUsuwajacyID IS NOT NULL THEN -1.0 ELSE 1.0 END
                                *
                                CASE sel.IloscKawalkow WHEN 1 THEN sel.Ilosc ELSE CEILING(ROUND(sel.Ilosc, 2) * sel.IloscKawalkow) END	
                            )) END as ilosc,											
                            max(sel.Precyzja) as Precyzja ,
                            max(sel.StatusRealizacji) as StatusRealizacji,
                            min(sel.Numer) as numer,
                            max(sel.NumerCzesci) as NumerCzesci,
                            CAST(MAX(CAST(sel.ZestawID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) AS ZestawID,
                            MAX(sel.DataDodania) AS DATE,
                            MAX(Notatka) as Remark
                    from 
                    (
                            SELECT DISTINCT	nt.Numer,
                                            t.Precyzja,
                                            tz.RodzajTowaru,
                                            nt.nazwa as nazwa,
                                            rp.*
                            FROM #Pozycje rp
                            INNER JOIN @NazwyTowarowDlaPozycji nt on nt.idPoz = rp.ID
                            INNER JOIN NGastroTowar t ON	t.ID = rp.TowarID AND t.RodzajTowaru <> 4
                            INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
                            INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz	ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                                                OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                                        and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds =1 ) 
                            LEFT JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID and @rodzajKds =1) or @rodzajKds =0
                            INNER JOIN NGastroGrupaTowarowa gt ON t.GrupaTowarowaID = gt.ID 			
                            LEFT JOIN NSysSlownik s ON s.SystemNr = 300
                            LEFT JOIN NSysSlownikPozycja sp ON sp.SlownikID = s.ID AND	 sp.Wartosc = CAST(rp.NumerGrupySerwowania AS VARCHAR)		
                            LEFT JOIN NGastroTowar tz ON rp.ZestawID = tz.ID
                            WHERE  (	
									(@RodzajKDS IN (0,1)
									AND (@WyswietlanieWykonanychPozycji = 1 or @RodzajKDS = 1 OR rp.StatusRealizacji <> 3)
                                    AND ((@RodzajKDS = 0 and (rp.StatusRealizacji < 4 or rp.StatusRealizacji=99)) 
                                          or (@RodzajKDS = 1 and (rp.StatusRealizacji < 5 or rp.StatusRealizacji=99)) 
                                          or (@RodzajKDS = 0 and @KDSExistsIssued = 0 and rp.StatusRealizacji = 4))	
                                    AND rp.StatusRealizacji<>6	
									 AND (@WyswietlanieEdytowanychRachunkow = 1 OR rp.FlgPotwierdzona = 1)
									)
										OR
										(@RodzajKDS = 3
											AND rp.StatusRealizacji IN (3,4)
											AND rp.FlgPotwierdzona = 1
										)
									)	
                                    AND (rp.FlgPozycjaNadrzedna = 0 OR rp.GrupaZestawuID IS NOT NULL OR rp.DodatekDlaDTRachunekPozycjaID IS NOT NULL)				
                                    AND ISNULL(rp.RolaWKompozycji, 0) IN (0, 2)
                                    AND ISNULL(tz.RodzajTowaru, 0) <> 3
                        ) sel
                    group by sel.GrupaZestawuID,sel.nazwa
        ) zliczonezestawy
        group by zliczonezestawy.GrupaZestawuID,zliczonezestawy.Numer, NumerCzesci, zliczonezestawy.DATE


        UNION ALL
            SELECT	distinct rp.ID,
                    rp.ID,
                    m.ZamiennikTowarID AS TowarID,
                    CASE	WHEN t.NazwaNaZamowieniu = '' 
                            THEN t.NazwaTowaru
                            ELSE t.NazwaNaZamowieniu
                    END,										
                    m.Ilosc,
                    t.Precyzja,
                    1,
                    rp.StatusRealizacji,
                    0,
                    0,
                    rp.NumerCzesci,
                    rp.GrupaZestawuID,
                    m.Pozycja + 100,  -- dodajemy 100 aby składniki, których nie mona na nic zmienić znalazły sie na końcu, tak jak w posie
                    NULL,
                    0,
                    rp.DataDodania,
                    rp.Notatka
            FROM #ResultModyf m
            INNER JOIN #Pozycje rp ON rp.ID = m.PozycjaID
            INNER JOIN NGastroTowar t ON t.ID = m.ZamiennikTowarID
            WHERE	(	(@RodzajKDS IN (0,1)
						AND (@WyswietlanieWykonanychPozycji = 1 or @RodzajKDS = 1 OR rp.StatusRealizacji <> 3)
						AND 
						(
							(@RodzajKDS = 0 AND (rp.StatusRealizacji < 4 OR rp.StatusRealizacji=99)) 
							OR (@RodzajKDS = 1 AND (rp.StatusRealizacji < 5 OR rp.StatusRealizacji=99)) 
							OR (@RodzajKDS = 0 AND @KDSExistsIssued = 0 AND rp.StatusRealizacji = 4)
						)	
						AND rp.StatusRealizacji<>6		
						AND 
						(
							@WyswietlanieEdytowanychRachunkow = 1
							OR rp.FlgPotwierdzona = 1
						)
						)
						OR
							(@RodzajKDS = 3
							AND rp.StatusRealizacji IN (3,4)
							AND rp.FlgPotwierdzona = 1
							)
					)
                AND (rp.FlgPozycjaNadrzedna = 1 )
                AND ISNULL(rp.RolaWKompozycji, 0) = 0

            


        UNION ALL
        ---- kompozycja
        SELECT	distinct rp.ID,
                a.ID,
                rp.TowarID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END,										
                rp.Ilosc,								
                t.Precyzja,
                1,
                rp.StatusRealizacji,
                0,
                0,
                a.PartNumber,
                rp.GrupaZestawuID,
                0,
                NULL,
                0,
                a.Date,
                '' Notatka
        FROM #Articles a						
        INNER JOIN #Pozycje rp
            ON	a.ArticleID = rp.ZestawID
                AND a.PackageID = rp.GrupaZestawuID
                AND a.PartNumber = rp.NumerCzesci
        INNER JOIN NGastroTowar t ON t.ID = rp.TowarID	
        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
        INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                          OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                         and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds =1 ) 
        LEFT JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @rodzajKds IN (0 ,3)
        WHERE	a.ArticleType = 3	
                AND rp.RolaWKompozycji = 0

        UNION ALL
        ---- kompozycja
        select NewId(),
            a.ID ,
            z.TowarID,
            CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
            END,
            (-1.0 * z.Ilosc),
            t.Precyzja,
            1,
            a.StatusOfPreparation ,
            1,
            0,
            a.PartNumber,
            a.ConnectionID,
            s.Pozycja,
            NULL,
            0,
            a.Date,
            '' Notatka
        FROM #Articles a	
        CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = a.ArticleID
					 AND ObowiazujeOd <= GETDATE()
					 ORDER BY ObowiazujeOd DESC
					) b
        INNER JOIN NGastroSkladnik s ON b.ID = s.BomID			
        INNER JOIN NGastroZamiennik z ON s.ID = z.SkladnikID AND z.FlgRodzaj = 0
        INNER JOIN NGastroTowar t ON t.ID = z.TowarID AND t.FlgAktywny = 1 AND 	t.Blokada = 0
        where a.ArticleType = 3	
        and z.TowarID not in (  select rp.TowarID from  #Pozycje rp
                                where a.BillId = rp.DTRachunekID 	
                                and a.ArticleID = rp.ZestawID
                                AND a.PackageID = rp.GrupaZestawuID
                                and rp.RolaWKompozycji = 2
                                AND a.PartNumber = rp.NumerCzesci
                                )
        
        UNION ALL
        ---- zestaw automatyczny
        SELECT	distinct rp.ID,
                a.ID,
                rp.TowarID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END,										
                rp.Ilosc,
                t.Precyzja,
                1,
                rp.StatusRealizacji,
                1,
                0,
                a.PartNumber,
                rp.GrupaZestawuID,
                0,
                NULL,
                0,
                a.Date,
                rp.Notatka
        FROM #Articles a						
        INNER JOIN #Pozycje rp ON a.ArticleID = rp.ZestawID AND a.PackageID = rp.GrupaZestawuID
        INNER JOIN NGastroTowar t ON t.ID = rp.TowarID	
        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
        INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                          OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                         and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds =1 ) 
        INNER JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @rodzajKds IN (0 ,3)
        WHERE	a.ArticleType = 10
                AND t.RodzajTowaru IN (4, 9)

        UNION ALL
        ---- zestaw automatyczny
        SELECT	distinct rp.ID,
                a.ID,
                rp.TowarID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END,										
                rpm.ModyfikatorIlosc, 
                t.Precyzja,
                1,
                rp.StatusRealizacji,
                1,
                0,
                a.PartNumber,
                rp.GrupaZestawuID,
                0,
                NULL,
                0,
                a.Date,
                rp.Notatka
        FROM #Articles a						
        INNER JOIN #Pozycje rp ON a.ArticleID = rp.ZestawID AND a.PackageID = rp.GrupaZestawuID
        INNER JOIN NGastroDTRachunekPozycjaModyfikacja rpm ON rpm.DTRachunekPozycjaID = rp.ID
        INNER JOIN NGastroTowar t ON t.ID = rpm.ModyfikatorID
        INNER JOIN NGastroKonfiguracjaDrukowaniaZamowien kdz ON rp.KonfiguracjaDrukowaniaZamowienID = kdz.ID
        INNER JOIN NGastroUrzadzenieKierunekDrukowaniaZamowien ukdz ON	 (ukdz.SposobDrukowaniaZamowienID = kdz.SposobDrukowaniaZamowienID  
                                                                          OR ukdz.SposobDrukowaniaZamowienID = @KierunekWydrukuWszystkieID)
                                                                         and (ukdz.UrzadzenieID =  @DeviceID or @rodzajKds = 1 ) 
        INNER JOIN  NGastroUrzadzenieKdsWydawkaDla u on (u.UrzadzenieIDKds = ukdz.UrzadzenieID and u.UrzadzenieIDWydawka = @DeviceID) or @RodzajKDS IN (0, 3)
        WHERE	a.ArticleType = 10
                AND t.RodzajTowaru = 1

        UNION ALL
        ---- kompozycja
        select	NewId(), 
                temp1.ID,
                temp1.TowarID,
                temp1.NazwaTowaru,
                temp1.ilosc,
                temp1.Precyzja,
                IsPrimary,
                temp1.StatusOfPreparation ,
                temp1.IsModified,
                temp1.Numer,
                temp1.NumerCzesci,
                temp1.GrupaZestawuID,
                0,
                NULL,
                0,
                temp1.date,
                Notatka
        FROM 
        (
            SELECT DISTINCT  
                a.ID ,
                p.TowarID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                            THEN t.NazwaTowaru
                            ELSE t.NazwaNaZamowieniu
                END as NazwaTowaru,
                CASE WHEN rp.Ilosc = 0 
                     THEN round((-1 * p.IloscBaza)/ IloscKawalkow ,2) 
                     ELSE (rp.Ilosc - round(cast(cast((p.IloscBaza*1000)/ IloscKawalkow as int) as decimal(19,3))/1000,3)) * IloscKawalkow
                     END as ilosc,
                t.Precyzja,
                1 as IsPrimary,
                a.StatusOfPreparation ,
                1 as IsModified,
                0 as Numer,
                p.NumerCzesci,
                rp.GrupaZestawuID,
                a.Date,
                '' Notatka
            FROM #Articles a	
            INNER JOIN #Pizza p ON a.BillID = p.BillID AND p.ID = a.ArticleID 
            INNER JOIN #Pozycje rp	ON rp.DTRachunekID = p.BillID 
                                                    AND p.ID = rp.ZestawID 
                                                    AND rp.TowarID = p.TowarID 
                                                    AND rp.NumerCzesci = p.NumerCzesci 
                                                    AND rp.GrupaZestawuID = p.GrupaZestawuID 
                                                    AND rp.RolaWKompozycji = 2
            INNER JOIN NGastroTowar t on t.ID  = p.TowarID
            WHERE a.ArticleType = 3	
                AND rp.Ilosc - ROUND(CAST(CAST((p.IloscBaza*1000)/ IloscKawalkow AS INT) AS DECIMAL(19,3))/1000,3) < 0 
        ) temp1

        UNION ALL  -- opakowanie do pizzy
        SELECT 	CAST(MAX(CAST(rpz.ID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) ID,
                a.ID,
                rpz.TowarID,
                CASE	WHEN t.NazwaNaZamowieniu = '' 
                        THEN t.NazwaTowaru
                        ELSE t.NazwaNaZamowieniu
                END,										
                Sum(rpz.Ilosc) Ilosc, 
                t.Precyzja,
                1 AS IsPrimary,
                rp.StatusRealizacji,
                0 AS IsModified,
                0,
                rp.NumerCzesci AS PartNumber,
                rp.GrupaZestawuID,
                0,
                NULL,
                1,
                MIN(rp.DataDodania) DataDodania,
                rpz.Notatka
        FROM #Pozycje rp
        INNER JOIN #Articles a ON a.PackageID = rp.GrupaZestawuID AND a.ArticleType = 3
        INNER JOIN NGastroDTRachunekPozycjaPowiazanie rpp ON rpp.DTRachunekPozycjaID = rp.ID
        INNER JOIN NGastroDTRachunekPozycja rpz ON rpz.ID = rpp.DTRachunekPozycjaDocelowaID
        INNER JOIN NGastroTowar t ON t.ID = rpz.TowarID
        GROUP BY
                a.ID,
                rpz.TowarID,
                t.NazwaNaZamowieniu,
                t.NazwaTowaru,
                t.Precyzja,
                rp.StatusRealizacji,
                rp.NumerCzesci,
                rp.GrupaZestawuID,
                rpz.Notatka

        ------ Dodatki i opakowania 
        UNION ALL

        SELECT 	CAST(MAX(CAST(rp.ID AS VARCHAR(36))) AS UNIQUEIDENTIFIER) ID ,
                rp.GrupaZestawu,
                rp.TowarID,
                rp.NazwaTowaru,										
                Sum(rp.Ilosc) Ilosc, 
                rp.Precyzja,
                1 AS IsPrimary,
                rp.StatusRealizacji,
                0 AS IsModified,
                0,
                rp.NumerCzesci AS PartNumber,
                rp.GrupaZestawuID GrupaZestawuID,
                0,
                NULL,
                1,
                MIN(rp.DataDodania) DataDodania,
                rp.Notatka COLLATE POLISH_CS_AI
        FROM ( 
                SELECT DISTINCT rpz.ID ID,
                                CASE WHEN a.ArticleType = 9
                                    THEN a.PackageID
                                     ELSE rp.ID
                                END  GrupaZestawu,

                               t.ID TowarID,
                               CASE	WHEN t.NazwaNaZamowieniu = '' 
                                        THEN t.NazwaTowaru
                                        ELSE t.NazwaNaZamowieniu
                                END NazwaTowaru,										
                                rpz.Ilosc, 
                                t.Precyzja,
                                rp.StatusRealizacji,
                                rp.NumerCzesci ,
                                rp.GrupaZestawuID GrupaZestawuID,
                                rp.DataDodania,
                                rpz.Notatka	
                FROM #Pozycje rp
                INNER JOIN #Articles a ON (a.PackageID = rp.GrupaZestawuID OR rp.ID = a.ID) AND a.ArticleType <> 3
                INNER JOIN NGastroDTRachunekPozycjaPowiazanie rpp ON rpp.DTRachunekPozycjaID = rp.ID
                INNER JOIN NGastroDTRachunekPozycja rpz ON rpz.ID = rpp.DTRachunekPozycjaDocelowaID
                INNER JOIN NGastroTowar t ON t.ID = rpz.TowarID
                INNER JOIN #Pozycje p ON p.ID = rpz.ID 
                 
            ) rp
        GROUP BY
                rp.GrupaZestawu,
                rp.TowarID,
                rp.NazwaTowaru,
                rp.Precyzja,
                rp.StatusRealizacji,
                rp.NumerCzesci,
                rp.GrupaZestawuID,
                rp.Notatka
                
        UPDATE a
        SET Remark = CAST(Remark + '; ' AS VARCHAR(255))
        FROM #Articles a
        WHERE a.ArticleType IN (1,3,4,8,9)

        UPDATE a
        SET Remark = CAST(Remark + isnull((
                                    SELECT s.Remark + '; '
                                    FROM #SubArticles s
                                    WHERE s.ArticleID = a.ID
                                            AND s.IsAddition = 1
                                            AND LEN(LTRIM(RTRIM(ISNULL(s.Remark,'')))) > 0
                                    ORDER BY [Date]
                                    FOR XML PATH(''),TYPE
                                    ).value('(./text())[1]','VARCHAR(255)') ,'')
                     AS VARCHAR(255))
        FROM #Articles a
        WHERE a.ArticleType IN (1,3,4,8,9)

        UPDATE a
        SET Remark = ISNULL((
                                    SELECT p.Notatka + '; '
                                    FROM #Pozycje p
                                    WHERE p.GrupaZestawuID = a.PackageID
                                          AND LEN(LTRIM(RTRIM(ISNULL(p.Notatka,'')))) > 0
                                    ORDER BY [DataDodania]
                                    FOR XML PATH(''),TYPE
                                    ).value('(./text())[1]','VARCHAR(255)') ,'')
        FROM #Articles a
        WHERE a.ArticleType = 10

        UPDATE a
        SET Remark = REVERSE(STUFF(REVERSE((Remark)), 1, 2,''))
        FROM #Articles a
        WHERE a.ArticleType IN (1,3,4,8,9,10)


        UPDATE a SET
            Name = '[' + CAST(Lp AS VARCHAR(2)) + '] ' + Name
        FROM #Articles a
        INNER JOIN 
        (				
            SELECT ROW_NUMBER() OVER(PARTITION BY BillID ORDER BY ServingGroup, Date, ModificationDate) AS Lp,
                    BillID,
                    PackageID
            FROM 
            (
                SELECT BillID, PackageID, MAX(ServingGroup) AS ServingGroup, MAX(Date) AS Date, MAX(ServingGroupModificationDate) AS ModificationDate 
                FROM #Articles
                WHERE	PackageID IS NOT NULL
                        AND ArticleType = 3
                GROUP BY BillID, PackageID
            ) tmp
        ) num ON num.PackageID = a.PackageID AND num.BillID = a.BillID 
    
        --Ustawienie kolejności podstaw--
        UPDATE sa SET
            sa.Pozycja = s.Pozycja,
            sa.IsModify = 0
        FROM #SubArticles sa  
		CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = sa.ZestawID
						   AND ObowiazujeOd <= GETDATE()
				     ORDER BY ObowiazujeOd DESC
					) b
        INNER JOIN NGastroSkladnik s ON s.BomID = b.ID
        LEFT JOIN NGastroZamiennik z ON z.SkladnikID = s.ID
        WHERE sa.SubarticleID = s.TowarID
			  AND z.ID IS NULL



        --Ustawienie kolejności kroków zestawu--
        UPDATE sa SET
            sa.Pozycja = s.Pozycja
        FROM #SubArticles sa 
        CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = sa.ZestawID
					 AND ObowiazujeOd <= GETDATE()
				     ORDER BY ObowiazujeOd DESC
				) b
        INNER JOIN NGastroSkladnik s ON s.BomID = b.ID
        INNER JOIN NgastroZamiennik z ON z.SkladnikID = s.ID AND sa.SubArticleID = z.TowarID
        WHERE sa.IsModify = 1

        UPDATE sa SET
            sa.Pozycja = s.Pozycja
        FROM #SubArticles sa 
        CROSS APPLY (SELECT TOP 1 ID, TowarID, Ilosc 
					 FROM NGastroBOM 
					 WHERE TowarID = sa.ZestawID
					 AND ObowiazujeOd <= GETDATE()
				     ORDER BY ObowiazujeOd DESC
				) b
        INNER JOIN NGastroSkladnik s ON s.BomID = b.ID AND sa.SubArticleID = s.TowarID
        WHERE sa.IsModify = 1

		IF @RodzajKDS = 3
		BEGIN
			UPDATE #Articles
			SET StatusOfPreparation = 4 
			WHERE StatusOfPreparation = 3

			UPDATE #SubArticles
			SET StatusOfPreparation = 4 
			WHERE StatusOfPreparation = 3
		END

        SELECT @result = 
        (
        SELECT
            @ExecutionStatus AS ExecutionStatus,
            @SessionID  AS SessionID,
             (
            SELECT
            (		
                SELECT	b.ID,
                        b.Description,
                        b.Remark,
                        b.PointOfSale,
                        b.UserDescription AS [User],
                        b.Date,
                        b.OpenningType,
                        CONVERT(XML,
                            (
                                SELECT	ID,														
                                        ArticleID,
                                        Name,
                                        ServingGroup,
                                        ServingGroupName,
                                        PersonNumber,
                                        Remark,
                                        QuantitySet,
                                        QuantityToDo,
                                        QuantityDone,
                                        QuantityRemoved,
                                        QuantityPrecision,
                                        Date,
                                        IsModified,
                                        IsNew,
                                        StatusOfPreparation,
                                        '#' + RIGHT(sys.fn_varbintohexstr(CONVERT(VARBINARY(8), Color)), 6) as Color,
                                        ShowWeight,	
                                        ConnectionID,																			
                                        CONVERT(XML,
                                            (
                                                SELECT	s.ID,
                                                        s.SubArticleID,
                                                        s.Name,
                                                        s.Quantity,
                                                        s.QuantityPrecision,
                                                        s.IsPrimary,
                                                        s.StatusOfPreparation,
                                                        s.IsModified
                                                FROM #SubArticles s
                                                WHERE	(s.ArticleID = a.ID OR s.ArticleID = a.ConnectionID)
                                                        AND 
                                                        (
                                                            a.PartNumber = 0 
                                                            OR a.PartNumber = s.NumerCzesci 
                                                            AND 
                                                            (
                                                                a.ConnectionID = s.GrupaZestawuID 
                                                                OR s.GrupaZestawuID IS NULL
                                                            )
                                                        )
                                                ORDER BY IsAddition, IsModify, Pozycja, Date
                                                FOR XML PATH('SubArticle'), ROOT('SubArticles'), TYPE
                                            ))
                                FROM #Articles a
                                WHERE a.BillID = b.ID
                                ORDER BY a.ServingGroup, a.Date, a.ServingGroupModificationDate
                                FOR XML PATH('Article'), ROOT('Articles'), TYPE
                            ))
                FROM #Bills b
                WHERE EXISTS
                (
                    SELECT * FROM #Articles WHERE BillID = b.ID
                )
                ORDER BY 
                    CASE WHEN @RodzajKDS = 2 THEN '' ELSE b.FlgFastTrack END DESC	-- @RodzajKDS = 2 (OrderNumber)
                    ,CASE WHEN ISNULL(@SortType, 0) = 0 THEN b.Date ELSE '' END ASC
                    ,CASE WHEN ISNULL(@SortType, 0) = 1 THEN b.Date ELSE '' END DESC
                FOR XML PATH('Bill'), TYPE			
            )
            FOR XML PATH('Bills'), TYPE
            )
            FOR XML PATH(''), ROOT('response'), TYPE
       )                             		

        Result:
        
        IF( @ExecutionStatus > 0  )
        BEGIN
            SET @result = '<response><SessionID>' +  CAST(@SessionID AS VARCHAR(36)) + '</SessionID>' +
                + '<ExecutionStatus>' + CAST(@ExecutionStatus AS VARCHAR(36)) + '</ExecutionStatus><Bills/></response>';
        END	
                        
        SELECT @result AS Response                             
                                          
      --------------------------------------------------------------------------
      -- zakonczenie procedury    
      
      KONIEC:
        IF (OBJECT_ID('tempdb..#BillsToShow') IS NOT NULL) 
            DROP TABLE #BillsToShow

        IF (OBJECT_ID('tempdb..#Pizza') IS NOT NULL) 
            DROP TABLE #Pizza

        IF (OBJECT_ID('tempdb..#Bills') IS NOT NULL) 
            DROP TABLE #Bills

        IF (OBJECT_ID('tempdb..#Articles') IS NOT NULL) 
            DROP TABLE #Articles

        IF (OBJECT_ID('tempdb..#SubArticles') IS NOT NULL) 
            DROP TABLE #SubArticles

        IF (OBJECT_ID('tempdb..#BillsTemp') IS NOT NULL) 
            DROP TABLE #BillsTemp

        IF (OBJECT_ID('tempdb..#Pozycje') IS NOT NULL) 
            DROP TABLE #Pozycje

        IF (OBJECT_ID('tempdb..#Zmiany') IS NOT NULL) 
            DROP TABLE #Zmiany

        IF (OBJECT_ID('tempdb..#LastBills') IS NOT NULL) 
            DROP TABLE #LastBills

      RETURN(0);
      
      BLADWYKONANIA:
      RETURN(99); 
END;