Esempio n. 1
0
        public PLATCE_RESP InsertPlatce(Session sesna, int EXT_APP_KOD, PLATCE platce, P_RGP rgp, bool nastavitKCdleDPH)
        {
            PLATCE_RESP      Resp = new PLATCE_RESP();
            CriteriaOperator criteria;

            platce.RGP_EA = EXT_APP_KOD;

            Type sesnaType      = null;
            Type unitOfWorkType = null;

            bool commituj = false;

            if (sesna is DevExpress.Xpo.Session)
            {
                commituj  = (sesna == null) ? true : (!sesna.InTransaction);
                sesnaType = typeof(DevExpress.Xpo.Session);
            }
            if (sesna is DevExpress.Xpo.UnitOfWork)
            {
                commituj       = false;
                unitOfWorkType = typeof(DevExpress.Xpo.UnitOfWork);
            }



            try
            {
                #region kontrola v pripade transakce - nejak musim vratit vysledek, k tomu se pouzije objekt rgp
                if (((sesna.InTransaction) && (rgp == null)) ||
                    ((sesna is DevExpress.Xpo.UnitOfWork) && (rgp == null)))
                {
                    string thisNamespace  = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace;
                    string thisMethodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
                    throw new Exception(string.Format("Proměnná \"rgp\" ve volání metody {0}.{1} není inicializována.", thisNamespace, thisMethodName));
                }
                #endregion kontrola v pripade transakce

                #region kontrola ext.aplikace
                if (EXT_APP_KOD == null)
                {
                    throw new Exception("kód externí aplikace není zadán");
                }
                P_EXTAPP EA = sesna.GetObjectByKey <P_EXTAPP>(EXT_APP_KOD);
                if (EA == null)
                {
                    throw new Exception("chybný kód externí aplikace");
                }

                if ((int)platce.RGP_POPLATEK == 0)
                {
                    throw new Exception("kód poplatku není zadán");
                }

                KONTROLA_POPLATKU kp = new KONTROLA_POPLATKU(sesna, EXT_APP_KOD);
                if (!kp.EAexist())
                {
                    throw new Exception("chybný kód externí aplikace");
                }
                if (!kp.existPravoNadPoplatkem(platce.RGP_POPLATEK))
                {
                    throw new Exception("Ext. aplikace nemá oprávnění k typu pohledávky.");
                }
                #endregion kontrola ext.apliace

                #region kontrola prava nad poplatkem
                PravoNadPoplatkem pnp = null;
                try
                {
                    pnp = new PravoNadPoplatkem(sesna);
                }
                catch (Exception e)
                {
                    throw new Exception("kontrola přístup. práv uživatele nad daty Příjmové agendy skončila chybou" + "\n" + e.Message);
                }

                //pro platce je povoleno vkladani
                if (!pnp.PravoExist((int)platce.RGP_POPLATEK, PravoNadPoplatkem.PrtabTable.RGP, PravoNadPoplatkem.SQLPerm.INSERT))
                {
                    throw new Exception("PoplWS - nedostatečná oprávnění");
                }

                #endregion kontrola prava nad poplatkem

                #region test, zda adresa existuje v P_ADRESA_ROBRHS, dohledani ADR_ICO
                criteria = CriteriaOperator.Parse("ADR_ID = ?", platce.OSOBA_ID);
                XPCollection <P_ADRESA_ROBRHS> adr = new XPCollection <P_ADRESA_ROBRHS>(sesna, criteria);

                if (adr.Count != 1)
                {
                    Resp.result    = Result.ERROR;
                    Resp.ERRORMESS = String.Format(@"osoba ID={0} neexistuje", platce.OSOBA_ID);
                    return(Resp);
                }
                platce.RGP_ICO = adr[0].ADR_ICO;
                #endregion test, zda adresa existuje

                #region DOPLKOD - nastaveni pokud je null, TRIM, odstraneni nasobnych mezer
                if (platce.RGP_DOPLKOD == null)
                {
                    platce.RGP_DOPLKOD = " ";
                }
                else
                {
                    platce.RGP_DOPLKOD = platce.RGP_DOPLKOD.Trim();
                }

                if (platce.RGP_DOPLKOD == String.Empty)
                {
                    platce.RGP_DOPLKOD = " ";
                }
                while (platce.RGP_DOPLKOD.IndexOf("  ") >= 0)
                {
                    platce.RGP_DOPLKOD = platce.RGP_DOPLKOD.Replace("  ", " ");
                }
                #endregion DOPLKODU - nastaveni, pokud je null, TRIM, odstraneni nasobnych mezer

                #region test zda neexists v P_RGP
                DBUtil   dbu = new DBUtil(sesna);
                C_EVPOPL evp = dbu.GetEvpopl(platce.RGP_POPLATEK, platce.RGP_PER);
                criteria = CriteriaOperator.Parse("CompoundKey1.RGP_POPLATEK = ?" +
                                                  " and CompoundKey1.RGP_ICO = ?" +
                                                  " and CompoundKey1.RGP_DOPLKOD = ?",
                                                  platce.RGP_POPLATEK, platce.RGP_ICO, platce.RGP_DOPLKOD);
                XPCollection <P_RGP> plceExist = new XPCollection <P_RGP>(sesna, criteria);

                foreach (P_RGP item in plceExist)
                {
                    if (item.CompoundKey1.RGP_PER == platce.RGP_PER)
                    {
                        Resp.result = Result.OK;
                        Resp.status = Status.EXISTS;
                        Utils.copy.CopyDlePersistentAttr <PLATCE_RESP>(plceExist[0], Resp);
                        Resp.RGP_POPLATEK = plceExist[0].CompoundKey1.RGP_POPLATEK;
                        Resp.RGP_PER      = plceExist[0].CompoundKey1.RGP_PER;
                        Resp.RGP_DOPLKOD  = plceExist[0].CompoundKey1.RGP_DOPLKOD;
                        Resp.OSOBA_ID     = platce.OSOBA_ID;

                        Resp.RGP_ID = plceExist[0].RGP_ID;
                        Resp.VS     = DejVS(sesna, evp, plceExist[0].RGP_PORVS); //0.35
                        return(Resp);
                    }
                }

                if (plceExist.Count > 0)
                {
                    platce.RGP_PORVS = plceExist[0].RGP_PORVS;
                    Resp.VS          = DejVS(sesna, evp, plceExist[0].RGP_PORVS); //0.35
                }

                #endregion test zda exists v P_RGP

                nastavitKCdleDPH = nastavitKCdleDPH && platce.RADKY_DPH.Count > 0;
                if (((int)platce.RGP_KCROK == 0) && nastavitKCdleDPH && (platce.RADKY_DPH.Count > 0))
                {
                    platce.RGP_KCROK = 1;
                }

                #region vypocet splatky
                short   pocSplatek = 0; short periodicita = 0;
                decimal kcSplatka = 0, poslSplatka = 0;
                dbu.GetRgpSplatky(platce.RGP_KCROK, platce.RGP_PER, ref kcSplatka, ref poslSplatka, ref pocSplatek, ref periodicita);
                if (periodicita != 365)
                {
                    if ((int)platce.RGP_KCROK == 0)
                    {
                        throw new Exception(String.Format(@"částka není zadána (KC_ZAROK)"));
                    }

                    if (poslSplatka == 0)
                    {
                        throw new Exception(String.Format(@"Nelze určit výši splátky pro roční výši předpisu {0} Kč", platce.RGP_KCROK));
                    }
                }
                platce.RGP_KCSPLATKA   = kcSplatka;
                platce.RGP_POSLSPLATKA = poslSplatka;

                #endregion vypocet splatky

                #region vypocet splatek DPH, zaokrouhleni DPH
                List <DPHRozpis> dphSplatka     = new List <DPHRozpis>();
                List <DPHRozpis> dphPoslSplatka = new List <DPHRozpis>();
                if (platce.RADKY_DPH.Count > 0)
                {
                    //rozpocitam radky DPH na splatky a posledni splatku
                    DPHRozpis dpr;
                    foreach (RADEK_DPH item in platce.RADKY_DPH)
                    {
                        if (item.ZAKLAD == 0)
                        {
                            continue;
                        }
                        dpr = new DPHRozpis();
                        Utils.copy.CopyDlePersistentAttr(item, dpr);
                        dpr.ZAKLAD = item.ZAKLAD / pocSplatek;
                        dpr.DAN    = item.ZAKLAD * ((item.SAZBA ?? 0) / 100);
                        dpr.KC     = dpr.ZAKLAD + dpr.DAN;
                        dphSplatka.Add(dpr);

                        dpr = new DPHRozpis();
                        Utils.copy.CopyDlePersistentAttr(item, dpr);
                        decimal splatka = item.ZAKLAD / pocSplatek;
                        dpr.ZAKLAD = item.ZAKLAD - (splatka * (pocSplatek - 1));
                        dpr.DAN    = item.ZAKLAD * ((item.SAZBA ?? 0) / 100);
                        dpr.KC     = dpr.ZAKLAD + dpr.DAN;
                        dphPoslSplatka.Add(dpr);
                    }
                    DPHZaokrouhleni dphZaokr = new DPHZaokrouhleni();
                    dphZaokr.DPHZaokrouhli(dphSplatka, platce.RGP_POPLATEK, sesna);
                    dphZaokr.DPHZaokrouhli(dphPoslSplatka, platce.RGP_POPLATEK, sesna);

                    //sectu vsechny radky DPH a vytvorim do posledni splatky radek dorovnani
                    decimal sumDphRowsSplatka = 0, sumDphRowsPoslSplatka = 0, diff = 0;
                    foreach (DPHRozpis item in dphSplatka)
                    {
                        sumDphRowsSplatka += item.KC + item.ZAOKROUHLENI;
                    }
                    foreach (DPHRozpis item in dphPoslSplatka)
                    {
                        sumDphRowsPoslSplatka += item.KC + item.ZAOKROUHLENI;
                    }

                    //0.19
                    sumDphRowsSplatka     = Utils.Mathm.ZaokrouhliDouble(sumDphRowsSplatka, 2);
                    sumDphRowsPoslSplatka = Utils.Mathm.ZaokrouhliDouble(sumDphRowsPoslSplatka, 2);

                    platce.RGP_KCSPLATKA   = sumDphRowsSplatka;
                    platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka;

                    diff = 0;
                    if (!nastavitKCdleDPH)  //0.19 - do 0.19 nebyla podminka
                    {
                        diff = platce.RGP_KCROK - (sumDphRowsSplatka * (pocSplatek - 1)) - sumDphRowsPoslSplatka;
                    }
                    diff = Utils.Mathm.ZaokrouhliDouble(diff, 2);
                    if (diff != 0)
                    {
                        dpr          = new DPHRozpis();
                        dpr.KAT      = 'R';
                        dpr.ZAKLAD   = diff;
                        dpr.KC       = diff;
                        dpr.SAZBA    = null;
                        dpr.POZNAMKA = "dorovnání";
                        dphPoslSplatka.Add(dpr);
                        sumDphRowsPoslSplatka += diff;
                        platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka; //0.20
                    }

                    //0.9 kontrola splatky a posledni splatky
                    #region kontrola splatky, posledni splatky
                    if (nastavitKCdleDPH)
                    {
                        platce.RGP_KCSPLATKA   = sumDphRowsSplatka;
                        platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka;
                        platce.RGP_KCROK       = (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka;
                    }
                    else
                    {
                        if (platce.RGP_KCROK != (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka)
                        {
                            throw new Exception(string.Format("Nesouhlasí celková výše Kč ({0}) s rozpisem DPH ({1}).",
                                                              platce.RGP_KCROK, (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka));
                        }

                        if (sumDphRowsSplatka != platce.RGP_KCSPLATKA)
                        {
                            throw new Exception(string.Format("Nesouhlasí výše splátky ({0}) s rozpisem DPH splátky ({1}).",
                                                              platce.RGP_KCSPLATKA, sumDphRowsSplatka));
                        }

                        if (sumDphRowsPoslSplatka != platce.RGP_POSLSPLATKA)
                        {
                            throw new Exception(string.Format("Nesouhlasí výše poslední splátky ({0}) s rozpisem DPH poslední splátky ({1}).",
                                                              platce.RGP_POSLSPLATKA, sumDphRowsPoslSplatka));
                        }
                    }
                    #endregion kontrola splatky, posledni splatky
                }
                #endregion vypocet splatek DPH, zaokrouhledni DPH

                #region perioda existuje pro poplatek

                if (evp == null)
                {
                    Resp.result = Result.ERROR;

                    Resp.ERRORMESS = "nepovolená kombinace poplatek / perioda";
                    return(Resp);
                }
                #endregion perioda existuje pro poplatek

                #region pouziti vkladaneho VS
                if (!string.IsNullOrEmpty(platce.VS))
                {
                    int porvs;
                    if (!korektniVS(sesna, platce, evp, out porvs))
                    {
                        Resp.result    = Result.ERROR; //0.16
                        Resp.ERRORMESS = string.Format("chybný VS {0}", platce.VS);
                        return(Resp);
                    }
                    platce.RGP_PORVS = porvs;
                }
                #endregion pouziti vkladaneho VS

                {
                    if ((sesna.GetType().BaseType == sesnaType) && (!sesna.InTransaction))
                    {
                        sesna.BeginTransaction();
                    }
                    try
                    {
                        XPCollection <P_RGP> plceInserted;
                        if (rgp == null)
                        {
                            rgp = new P_RGP(sesna);
                        }
                        Utils.copy.CopyDlePersistentAttr <P_RGP>(platce, rgp);

                        rgp.CompoundKey1.RGP_POPLATEK = platce.RGP_POPLATEK;
                        rgp.CompoundKey1.RGP_PER      = platce.RGP_PER;
                        rgp.CompoundKey1.RGP_DOPLKOD  = platce.RGP_DOPLKOD;
                        rgp.CompoundKey1.RGP_ICO      = platce.RGP_ICO;
                        rgp.Save();


                        //povkladam rozpis dane
                        foreach (DPHRozpis item in dphSplatka)
                        {
                            P_RGP_DPHSPL rd = new P_RGP_DPHSPL(sesna);
                            Utils.copy.CopyDlePersistentAttr <P_RGP_DPHSPL>(item, rd);
                            rgp.P_RGP_DPHSPL.Add(rd);
                            rd.Save();
                        }
                        foreach (DPHRozpis item in dphPoslSplatka)
                        {
                            P_RGP_DPHPSPL rd  = new P_RGP_DPHPSPL(sesna);
                            DPHRozpisTmp  tmp = new DPHRozpisTmp();
                            Utils.copy.CopyDlePersistentAttr <DPHRozpisTmp>(item, tmp);
                            Utils.copy.CopyDlePersistentAttr <P_RGP_DPHPSPL>(tmp, rd);
                            rgp.P_RGP_DPHPSPL.Add(rd);
                            rd.Save();
                        }

                        if (commituj && (sesna.InTransaction))
                        {
                            sesna.CommitTransaction();
                        }

                        Utils.copy.CopyDlePersistentAttr <PLATCE_RESP>(rgp, Resp);

                        Resp.result       = Result.OK;
                        Resp.status       = Status.INSERTED;
                        Resp.RGP_POPLATEK = rgp.CompoundKey1.RGP_POPLATEK;
                        Resp.RGP_PER      = rgp.CompoundKey1.RGP_PER;
                        Resp.RGP_DOPLKOD  = rgp.CompoundKey1.RGP_DOPLKOD;
                        Resp.OSOBA_ID     = platce.OSOBA_ID;
                        Resp.RGP_ID       = rgp.RGP_ID;
                        if (Resp.VS == null)
                        {
                            Resp.VS = DejVS(sesna, evp, plceExist[0].RGP_PORVS); //0.35
                        }
                        switch (rgp.RGP_EXPUCTO)
                        {
                        case "ANO":
                            Resp.EXPORTOVAT_DO_FINANCI = SouhlasAnoNe.ANO;
                            break;

                        default:
                            Resp.EXPORTOVAT_DO_FINANCI = SouhlasAnoNe.NE;
                            break;
                        }

                        return(Resp);
                    }
                    catch (Exception exc)
                    {
                        if (sesna.InTransaction)
                        {
                            sesna.RollbackTransaction();
                        }

                        Resp.result = Result.ERROR;

                        if (exc.InnerException == null)
                        {
                            Resp.ERRORMESS = exc.Message;
                        }
                        else
                        {
                            Resp.ERRORMESS = exc.InnerException.Message;
                        }
                        return(Resp);

                        /*
                         * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                         */
                    }
                }  //using (MyUnitOfWork
            }

            catch (Exception exc)
            {
                Resp.result = Result.ERROR;

                if (exc.InnerException == null)
                {
                    Resp.ERRORMESS = exc.Message;
                }
                else
                {
                    Resp.ERRORMESS = exc.InnerException.Message;
                }

                Util.Util.WriteLog(Resp.ERRORMESS + exc.StackTrace);

                return(Resp);

                /*
                 * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                 */
            }
        }
        /// <summary>
        /// vraci pouze hodnotu PLATCE_ID, datumy platnosti ...
        /// OSOBA_ID, KCROK, KCSPLATKA, POSLSPLATKA vraci hodnotu nula
        /// metoda je urcena pro stare pripady, kdy ext. agenda zna VS a potrebuje zjistit PLATCE_ID, aby mohla
        /// pridavat predpisy
        /// </summary>
        /// <param name="sesna"></param>
        /// <param name="EXT_APP_KOD"></param>
        /// <param name="inParams"></param>
        /// <returns></returns>
        public PLATCE_RESP DejPlatce(Session sesna, int EXT_APP_KOD, GET_PLATCE_PARAMS inParams)
        {
            PLATCE_RESP Resp = new PLATCE_RESP();

            Resp.status = Status.NOTEXISTS;

            sesna.DropIdentityMap();

            int popl;

            try
            {
                #region kontrola vyberovych parametru
                if (string.IsNullOrWhiteSpace(inParams.VS))
                {
                    throw new Exception("Výběrová podmínka není zadána.");
                }

                popl = decimal.ToInt16(inParams.POPLATEK);

                #endregion kontrola vyberovych parametru


                #region kontrola prava na poplatek
                if (EXT_APP_KOD == null)
                {
                    throw new Exception("kód externí aplikace není zadán");
                }

                KONTROLA_POPLATKU kp = new KONTROLA_POPLATKU(sesna, EXT_APP_KOD);
                if (!kp.EAexist())
                {
                    throw new Exception("chybný kód externí aplikace");
                }
                if (!kp.existPravoNadPoplatkem(popl))
                {
                    throw new Exception("Ext. aplikace nemá oprávnění k typu pohledávky.");
                }
                #endregion kontrola prava na poplatek

                #region kontrola prava na cteni platce
                PravoNadPoplatkem pnp = null;
                try
                {
                    pnp = new PravoNadPoplatkem(sesna);
                }
                catch (Exception)
                {
                    throw new Exception("kontrola přístp. práv uživatele nad daty Příjmové agendy skončila chybou");
                }


                if (!pnp.PravoExist(popl, PravoNadPoplatkem.PrtabTable.RGP, PravoNadPoplatkem.SQLPerm.SELECT))
                {
                    throw new Exception("PoplWS - nedostatečná oprávnění pro čtení plátce.");
                }

                #endregion kontrola prava nad platce


                CriteriaOperator criteria;
                criteria = CriteriaOperator.Parse("CompoundKey1.LIKEVS_POPLATEK = ? and LIKEVS_VS = ?", inParams.POPLATEK, inParams.VS);
                XPCollection <P_LIKEVS> vsExist = new XPCollection <P_LIKEVS>(sesna, criteria);
                XPCollection <P_RGP>    plce;
                if (vsExist.Count > 0)
                {
                    criteria = CriteriaOperator.Parse("CompoundKey1.RGP_POPLATEK=? and RGP_PORVS=?",
                                                      vsExist[0].CompoundKey1.LIKEVS_POPLATEK,
                                                      vsExist[0].LIKEVS_PORVS);
                    plce = new XPCollection <P_RGP>(sesna, criteria, new SortProperty("RGP_ID", SortingDirection.Ascending)); //order by, sort
                    if (plce.Count == 0)
                    {
                        Resp.status    = Status.NOTEXISTS;
                        Resp.ERRORMESS = "Plátce neexistuje.";
                        return(Resp);
                    }
                }
                else
                {
                    Resp.status    = Status.NOTEXISTS;
                    Resp.ERRORMESS = "VS neexistuje.";
                    return(Resp);
                }

                Utils.copy.CopyDlePersistentAttr <PLATCE_RESP>(plce[0], Resp);

                Resp.RGP_ID                = plce[0].RGP_ID;
                Resp.OSOBA_ID              = 0;
                Resp.RGP_KCROK             = 0;
                Resp.RGP_KCSPLATKA         = 0;
                Resp.RGP_POSLSPLATKA       = 0;
                Resp.RGP_POPLATEK          = plce[0].CompoundKey1.RGP_POPLATEK;
                Resp.RGP_PER               = plce[0].CompoundKey1.RGP_PER;
                Resp.RGP_DOPLKOD           = plce[0].CompoundKey1.RGP_DOPLKOD;
                Resp.EXPORTOVAT_DO_FINANCI = (SouhlasAnoNe)Enum.Parse(typeof(SouhlasAnoNe), plce[0].RGP_EXPUCTO);

                Resp.result = Result.OK;
                Resp.status = Status.EXISTS;
                return(Resp);
            }
            catch (Exception exc)
            {
                Resp.result = Result.ERROR;
                Resp.status = Status.ERROR;

                if (exc.InnerException == null)
                {
                    Resp.ERRORMESS = exc.Message;
                }
                else
                {
                    Resp.ERRORMESS = exc.InnerException.Message;
                }
                return(Resp);
            }
        }
        /// <summary>
        /// updatuje rozpis DPH, výši splátky, celkovou částku
        /// </summary>
        public PLATCE_RESP UpdatePlatce(Session sesna, int EXT_APP_KOD, PLATCE platce, bool nastavitKCdleDPH)
        {
            PLATCE_RESP      Resp = new PLATCE_RESP();
            CriteriaOperator criteria;

            platce.RGP_EA = EXT_APP_KOD;

            Type sesnaType      = null;
            Type unitOfWorkType = null;

            if (platce.RGP_ID <= 0)
            {
                throw new Exception("ID Plátce není zadáno.");
            }

            try
            {
                bool commituj = false;
                if (sesna is DevExpress.Xpo.Session)   //UnitOfWork dedi z Session a proto je tez typu Session, test (sesna is DevExpress.Xpo.Session) je tak vzdy true
                {
                    commituj  = (sesna == null) ? true : (!sesna.InTransaction);
                    sesnaType = typeof(DevExpress.Xpo.Session);
                }
                if (sesna is DevExpress.Xpo.UnitOfWork)
                {
                    commituj       = false;
                    unitOfWorkType = typeof(DevExpress.Xpo.UnitOfWork);
                }

                #region test zda exists v P_RGP
                if (platce.RGP_ID > 0)
                {
                    criteria = CriteriaOperator.Parse(String.Format(@"RGP_ID = {0}", platce.RGP_ID));
                }
                else
                {
                    criteria = CriteriaOperator.Parse("CompoundKey1.RGP_POPLATEK = ?" +
                                                      " and CompoundKey1.RGP_PER = ?" +
                                                      " and CompoundKey1.RGP_ICO = ?" +
                                                      " and CompoundKey1.RGP_DOPLKOD = ?",
                                                      platce.RGP_POPLATEK, platce.RGP_PER, platce.RGP_ICO, platce.RGP_DOPLKOD);
                }
                XPCollection <P_RGP> plceExist = new XPCollection <P_RGP>(sesna, criteria);
                if (plceExist.Count == 0)
                {
                    Resp.result = Result.ERROR;
                    Resp.status = Status.NOTEXISTS;

                    //rgp = null;
                    return(Resp);
                }
                #endregion test zda exists v P_RGP

                //odmazu stavajici rozpisDPH
                for (int i = plceExist[0].P_RGP_DPHSPL.Count - 1; i >= 0; i--)
                {
                    plceExist[0].P_RGP_DPHSPL[i].Delete();
                }
                for (int i = plceExist[0].P_RGP_DPHPSPL.Count - 1; i >= 0; i--)
                {
                    plceExist[0].P_RGP_DPHPSPL[i].Delete();
                }

                P_RGP  rgpOld    = plceExist[0];
                PLATCE platceOld = new PLATCE();

                Utils.copy.CopyDlePersistentAttr <PLATCE>(platce, platceOld);
                Utils.copy.CopyDlePersistentAttr <PLATCE>(rgpOld, platce);

                platce.RGP_POPLATEK          = rgpOld.CompoundKey1.RGP_POPLATEK;
                platce.RGP_PER               = rgpOld.CompoundKey1.RGP_PER;
                platce.RGP_ICO               = rgpOld.CompoundKey1.RGP_ICO;
                platce.RGP_DOPLKOD           = rgpOld.CompoundKey1.RGP_DOPLKOD;
                platce.EXPORTOVAT_DO_FINANCI = (SouhlasAnoNe)Enum.Parse(typeof(SouhlasAnoNe), rgpOld.RGP_EXPUCTO);
                platce.RGP_FROMDATE          = platceOld.RGP_FROMDATE;
                platce.RGP_TODATE            = platceOld.RGP_TODATE;
                rgpOld.RGP_EA = EXT_APP_KOD;  //0.39

                nastavitKCdleDPH = nastavitKCdleDPH && platce.RADKY_DPH.Count > 0;
                if (((int)platce.RGP_KCROK == 0) && nastavitKCdleDPH && (platce.RADKY_DPH.Count > 0))
                {
                    platce.RGP_KCROK = 1;
                }

                #region vypocet splatky
                if (platceOld.RGP_KCROK == 0)
                {
                    platce.RGP_KCROK = rgpOld.RGP_KCROK;
                }
                else
                {
                    platce.RGP_KCROK = platceOld.RGP_KCROK;
                }

                //0.12 umoznuji updatovat na nulu
                //      if ((platceOld.RGP_KCROK == 0)) { throw new Exception("částka není zadána"); }

                short   pocSplatek = 0; short periodicita = 0;
                decimal kcSplatka = 0, poslSplatka = 0;
                DBUtil  dbu = new DBUtil(sesna);
                dbu.GetRgpSplatky(platce.RGP_KCROK, platce.RGP_PER, ref kcSplatka, ref poslSplatka, ref pocSplatek, ref periodicita);
                if (poslSplatka == 0)
                {
                    // throw new Exception(String.Format(@"Nelze určit výši splátky, perioda ""{0}"" neexistuje.", platce.RGP_PER));
                    throw new Exception(String.Format(@"Nelze určit výši splátky pro roční výši předpisu {0} Kč", platce.RGP_KCROK));
                }
                platce.RGP_KCSPLATKA   = kcSplatka;
                platce.RGP_POSLSPLATKA = poslSplatka;

                #endregion vypocet splatky

                #region vypocet splatek DPH, zaokrouhleni DPH
                List <DPHRozpis> dphSplatka     = new List <DPHRozpis>();
                List <DPHRozpis> dphPoslSplatka = new List <DPHRozpis>();
                if (platce.RADKY_DPH.Count > 0)
                {
                    //rozpocitam radky DPH na splatky a posledni splatku
                    DPHRozpis dpr;
                    foreach (RADEK_DPH item in platce.RADKY_DPH)
                    {
                        if (item.ZAKLAD == 0)
                        {
                            continue;
                        }
                        dpr = new DPHRozpis();
                        Utils.copy.CopyDlePersistentAttr(item, dpr);
                        dpr.ZAKLAD = item.ZAKLAD / pocSplatek;
                        dpr.DAN    = item.ZAKLAD * ((item.SAZBA ?? 0) / 100);
                        dpr.KC     = dpr.ZAKLAD + dpr.DAN;
                        dphSplatka.Add(dpr);

                        dpr = new DPHRozpis();
                        Utils.copy.CopyDlePersistentAttr(item, dpr);
                        decimal splatka = item.ZAKLAD / pocSplatek;
                        dpr.ZAKLAD = item.ZAKLAD - (splatka * (pocSplatek - 1));
                        dpr.DAN    = item.ZAKLAD * ((item.SAZBA ?? 0) / 100);
                        dpr.KC     = dpr.ZAKLAD + dpr.DAN;
                        dphPoslSplatka.Add(dpr);
                    }
                    //pripadne zaokrouhli radky dane - dolu
                    DPHZaokrouhleni dphZaokr = new DPHZaokrouhleni();
                    dphZaokr.DPHZaokrouhli(dphSplatka, platce.RGP_POPLATEK, sesna);
                    dphZaokr.DPHZaokrouhli(dphPoslSplatka, platce.RGP_POPLATEK, sesna);

                    //sectu vsechny radky DPH a vytvorim do posledni splatky radek dorovnani
                    decimal sumDphRowsSplatka = 0, sumDphRowsPoslSplatka = 0, diff = 0;
                    foreach (DPHRozpis item in dphSplatka)
                    {
                        sumDphRowsSplatka += item.KC + item.ZAOKROUHLENI;
                    }
                    foreach (DPHRozpis item in dphPoslSplatka)
                    {
                        sumDphRowsPoslSplatka += item.KC + item.ZAOKROUHLENI;
                    }

                    //0.19
                    sumDphRowsSplatka     = Utils.Mathm.ZaokrouhliDouble(sumDphRowsSplatka, 2);
                    sumDphRowsPoslSplatka = Utils.Mathm.ZaokrouhliDouble(sumDphRowsPoslSplatka, 2);

                    //0.20 vlivem zaokrouhleni napr. u 12 splatek se muze lisit
                    platce.RGP_KCSPLATKA   = sumDphRowsSplatka;
                    platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka;

                    //pokud je treba, vytvorim dorovnavaci nedanovy radek, aby celkova castka rozpisu DPH
                    //souhlasila s RGP_KCROK
                    if (!nastavitKCdleDPH)
                    {
                        diff = platce.RGP_KCROK - (sumDphRowsSplatka * (pocSplatek - 1)) - sumDphRowsPoslSplatka;
                    }
                    diff = Utils.Mathm.ZaokrouhliDouble(diff, 2);
                    if (diff != 0)
                    {
                        dpr          = new DPHRozpis();
                        dpr.KAT      = 'R';
                        dpr.ZAKLAD   = diff;
                        dpr.KC       = diff;
                        dpr.SAZBA    = null;
                        dpr.POZNAMKA = "dorovnání";
                        dphPoslSplatka.Add(dpr);
                        sumDphRowsPoslSplatka += diff;
                        platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka; //0.20
                    }

                    #region kontrola splatky, posledni splatky
                    if (nastavitKCdleDPH)
                    {
                        platce.RGP_KCSPLATKA   = sumDphRowsSplatka;
                        platce.RGP_POSLSPLATKA = sumDphRowsPoslSplatka;
                        platce.RGP_KCROK       = (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka;
                    }
                    else
                    {
                        if (platce.RGP_KCROK != (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka)
                        {
                            throw new Exception(string.Format("Nesouhlasí celková výše Kč ({0}) s rozpisem DPH ({1}).",
                                                              platce.RGP_KCROK, (sumDphRowsSplatka * (pocSplatek - 1)) + sumDphRowsPoslSplatka));
                        }

                        if (sumDphRowsSplatka != platce.RGP_KCSPLATKA)
                        {
                            throw new Exception(string.Format("Nesouhlasí výše splátky ({0}) s rozpisem DPH splátky ({1}).",
                                                              platce.RGP_KCSPLATKA, sumDphRowsSplatka));
                        }

                        if (sumDphRowsPoslSplatka != platce.RGP_POSLSPLATKA)
                        {
                            throw new Exception(string.Format("Nesouhlasí výše poslední splátky ({0}) s rozpisem DPH poslední splátky ({1}).",
                                                              platce.RGP_POSLSPLATKA, sumDphRowsPoslSplatka));
                        }
                    }
                    #endregion kontrola splatky, posledni splatky
                }
                #endregion vypocet splatek DPH, zaokrouhledni DPH

                //zkopiruji
                Utils.copy.CopyDlePersistentAttr <P_RGP>(platce, rgpOld);

                rgpOld.Save();

                if ((sesna.GetType().BaseType == sesnaType) && (!sesna.InTransaction))
                {
                    sesna.BeginTransaction();
                }

                try
                {
                    //povkladam rozpis dane
                    #region vlozeni rozpisu DPH
                    foreach (DPHRozpis item in dphSplatka)
                    {
                        P_RGP_DPHSPL rd = new P_RGP_DPHSPL(sesna);
                        Utils.copy.CopyDlePersistentAttr <P_RGP_DPHSPL>(item, rd);
                        rgpOld.P_RGP_DPHSPL.Add(rd);
                        rd.Save();
                    }
                    foreach (DPHRozpis item in dphPoslSplatka)
                    {
                        P_RGP_DPHPSPL rd  = new P_RGP_DPHPSPL(sesna);
                        DPHRozpisTmp  tmp = new DPHRozpisTmp();
                        Utils.copy.CopyDlePersistentAttr <DPHRozpisTmp>(item, tmp);
                        Utils.copy.CopyDlePersistentAttr <P_RGP_DPHPSPL>(tmp, rd);
                        rgpOld.P_RGP_DPHPSPL.Add(rd);
                        rd.Save();
                    }
                    #endregion vlozeni rozpisu DPH

                    if (commituj && (sesna.InTransaction))
                    {
                        sesna.CommitTransaction();
                    }

                    Utils.copy.CopyDlePersistentAttr <PLATCE_RESP>(rgpOld, Resp);

                    Resp.result                = Result.OK;
                    Resp.status                = Status.EXISTS;
                    Resp.RGP_POPLATEK          = rgpOld.CompoundKey1.RGP_POPLATEK;
                    Resp.RGP_PER               = rgpOld.CompoundKey1.RGP_PER;
                    Resp.RGP_DOPLKOD           = rgpOld.CompoundKey1.RGP_DOPLKOD;
                    Resp.OSOBA_ID              = 0;
                    Resp.RGP_ID                = rgpOld.RGP_ID;
                    Resp.EXPORTOVAT_DO_FINANCI = (SouhlasAnoNe)Enum.Parse(typeof(SouhlasAnoNe), rgpOld.RGP_EXPUCTO);  //convert string to Enum;

                    return(Resp);
                }

                catch (Exception exc)
                {
                    if (sesna.InTransaction)
                    {
                        sesna.RollbackTransaction();
                    }

                    Resp.result = Result.ERROR;

                    if (exc.InnerException == null)
                    {
                        Resp.ERRORMESS = exc.Message;
                    }
                    else
                    {
                        Resp.ERRORMESS = exc.InnerException.Message;
                    }
                    return(Resp);

                    /*
                     * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                     */
                }
            }
            catch (Exception exc)
            {
                Resp.result = Result.ERROR;

                if (exc.InnerException == null)
                {
                    Resp.ERRORMESS = exc.Message;
                }
                else
                {
                    Resp.ERRORMESS = exc.InnerException.Message;
                }
                return(Resp);

                /*
                 * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                 */
            }
        }