public UHRADY_RESP InsertUhraduPredpisu(Session session, int EXT_APP_KOD, int PREDPIS_ID, decimal KC, DateTime DATUM_UHRADY, string ZAPLATIL, string DOKLAD, int SS)
        {
            Session     sesna  = session;
            UHRADY_RESP plResp = new UHRADY_RESP();

            plResp.status = Status.NOTEXISTS;
            P_PRPL prpl;

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

                if (PREDPIS_ID == null)
                {
                    throw new Exception("PREDPIS_ID není zadán");
                }

                prpl = sesna.FindObject <P_PRPL>(CriteriaOperator.Parse("PRPL_ID = ? and PRPL_PREDPIS + PRPL_SANKCE > 0", PREDPIS_ID));
                if (prpl == null)
                {
                    plResp.status = Status.NOTEXISTS;
                    plResp.result = Result.ERROR;
                    { throw new Exception("neexistující předpis"); }
                }

                if (KC <= 0)
                {
                    throw new Exception("nelze vložit zápornou platbu");
                }

                P_NASTAVENI nast     = sesna.GetObjectByKey <P_NASTAVENI>("OTEVR_OBDOBI");
                string      obd      = "01." + nast.HODNOTA;
                DateTime    otevrObd = DateTime.ParseExact(obd, "d.M.yyyy", null);
                if (DATUM_UHRADY < otevrObd)
                {
                    throw new Exception("datum úhrady není v otevřeném období");
                }


                //zda je pristup na poplatek
                KONTROLA_POPLATKU kp = new KONTROLA_POPLATKU(sesna, EXT_APP_KOD);
                if (!kp.EAexist())
                {
                    throw new Exception("chybný kód externí aplikace");
                }
                if (!kp.existPravoNadPoplatkem(prpl.CompoundKey.PRPL_POPLATEK))
                {
                    throw new Exception("k pohledávce neexistuje oprávnění");
                }

                #region kontrola prava nad poplatkem
                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");
                }

                //pro platby je povoleno vkladani
                if (!pnp.PravoExist((int)prpl.CompoundKey.PRPL_POPLATEK, PravoNadPoplatkem.PrtabTable.PLATBA, PravoNadPoplatkem.SQLPerm.INSERT))
                {
                    throw new Exception("PoplWS - nedostatečná oprávnění pro vkládání plateb.");
                }

                #endregion kontrola prava nad poplatkem
            }
            catch (Exception exc)
            {
                plResp.result = Result.ERROR;

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

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

            decimal prNesparovano = (prpl.PRPL_PREDPIS + prpl.PRPL_SANKCE) - prpl.PRPL_SPAROVANO;
            try
            {
                using (UnitOfWork uow = new UnitOfWork(sesna.DataLayer))
                {
                    DBUtil dbu = new DBUtil(sesna);

                    P_PLATBA plIns = new P_PLATBA(uow);
                    plIns.PLATBA_ID        = dbu.LIZNI_SEQ("PLATBA_ID");
                    plIns.PLATBA_VS        = prpl.PRPL_VS;
                    plIns.PLATBA_PLDATE    = DATUM_UHRADY;
                    plIns.PLATBA_NAUCETDNE = plIns.PLATBA_PLDATE;
                    plIns.PLATBA_PLKC      = KC;
                    plIns.PLATBA_PLATCE    = ZAPLATIL.SubstrLeft(30);
                    if (!string.IsNullOrWhiteSpace(DOKLAD))
                    {
                        plIns.PLATBA_DOKLAD = DOKLAD.SubstrLeft(30);
                    }
                    plIns.PLATBA_UCETMESIC = plIns.PLATBA_PLDATE.Month;
                    plIns.PLATBA_UCETROK   = plIns.PLATBA_PLDATE.Year;
                    plIns.PLATBA_RECORD    = " ";
                    plIns.PLATBA_SS        = SS;
                    DBValue dbv = DBValue.Instance(sesna);
                    plIns.LOGIN         = dbv.DBUserName;
                    plIns.LASTUPDATE    = dbv.DBSysDateTime;
                    plIns.ENTRYLOGIN    = plIns.LOGIN;
                    plIns.ENTRYDATE     = plIns.LASTUPDATE;
                    plIns.PLATBA_EA     = EXT_APP_KOD;
                    plIns.PLATBA_INTOZN = "0";

                    decimal prKc = prpl.PRPL_PREDPIS + prpl.PRPL_SANKCE;
                    if ((prKc > 0) && (KC > 0) && (prNesparovano > 0)) //kladna platba s kladnym predpisem
                    {
                        P_PAROVANI parovaniIns = new P_PAROVANI(uow);
                        parovaniIns.CompoundKey1.PAR_PRPL_ID   = prpl.PRPL_ID;
                        parovaniIns.CompoundKey1.PAR_PLATBA_ID = plIns.PLATBA_ID;

                        if (prNesparovano == KC)
                        {
                            parovaniIns.PAR_SPARKC = KC;
                        }
                        if (Math.Abs(prNesparovano) < Math.Abs(KC))
                        {
                            parovaniIns.PAR_SPARKC = prNesparovano;
                        }
                        if (Math.Abs(prNesparovano) > Math.Abs(KC))
                        {
                            parovaniIns.PAR_SPARKC = KC;
                        }

                        parovaniIns.PAR_VYTVRUCNE = "NE";
                        parovaniIns.PAR_DATE      = dbv.DBSysDateTime.ToString("yyMMddHHmmss");

                        uow.ExecuteNonQuery(String.Format(
                                                "insert into P_PR_AKT (PRA_PRPL_ID, PRA_PR, PRA_TYP) values ({0}, {1}, '{2}')",
                                                prpl.PRPL_ID, plIns.PLATBA_ID, "+"));
                    }
                    uow.CommitChanges();

                    plResp.result = Result.OK;
                    plResp.status = Status.INSERTED;

                    return(plResp);
                } //uow
            }     //try

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

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

                /*
                 * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                 */
            }
        }
        public OSOBA_RESP InsertOsobu(Session session, int EXT_APP_KOD, OSOBA osoba)
        {
            Session    sesna     = session;
            OSOBA_RESP osobaResp = new OSOBA_RESP();

            osoba.ADR_EA = EXT_APP_KOD;

            try
            {
                #region test  vyplneni vstupnich hodnot

                if (osoba.RC_IC != null)
                {
                    osoba.RC_IC = osoba.RC_IC.Trim();
                }
                if (osoba.JMENO != null)
                {
                    osoba.JMENO = osoba.JMENO.Trim();
                }
                if (osoba.PRIJMENI != null)
                {
                    osoba.PRIJMENI = osoba.PRIJMENI.Trim();
                }

                if (string.IsNullOrEmpty(osoba.RC_IC))  // na string.IsNullOrWhiteSpace(osoba.RC_IC) testovat nemusim,
                                                        //protoze je vyse Trimovan
                {
                    P_NASTAVENI nast = sesna.GetObjectByKey <P_NASTAVENI>("ICOP");
                    if ((nast == null) || ((nast != null) && (nast.HODNOTA == "1")))
                    {
                        osobaResp.result    = Result.ERROR;
                        osobaResp.ERRORMESS = "IČ/RČ musí­ být vyplněno";
                        return(osobaResp);
                    }
                }

                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 (((osoba.TYP == TypOsoby.F) || (osoba.TYP == TypOsoby.C)) &&
                    (string.IsNullOrEmpty(osoba.RC_IC)) &&
                    (string.IsNullOrEmpty(osoba.JMENO) || string.IsNullOrEmpty(osoba.PRIJMENI) ||
                     (!osoba.DATUM_NAROZENI.HasValue))
                    )
                {
                    throw new Exception("u fyzické osoby musí být vyplněno jméno, příjmení a datum narození");
                }


                if (!string.IsNullOrEmpty(osoba.STAT))
                {
                    P_STAT stat = sesna.FindObject <P_STAT>(CriteriaOperator.Parse("Upper(STAT_NAZEV) = ?", osoba.STAT.ToUpper()));
                    if (stat == null)
                    {
                        stat = sesna.FindObject <P_STAT>(CriteriaOperator.Parse("STAT_KOD = ?", osoba.STAT.ToUpper()));
                    }

                    if (stat == null)
                    {
                        throw new Exception(string.Format("stát \"{0}\" není uveden v číselníku států", osoba.STAT));
                    }
                    else
                    {
                        osoba.STAT = stat.STAT_KOD;
                    }
                }
                else
                {
                    osoba.STAT = null;
                }


                if (osoba.ZAHRANICNI_ADRESA != null)
                {
                    if ((osoba.TYP != TypOsoby.C) && (osoba.TYP != TypOsoby.P))
                    {
                        throw new Exception(string.Format("Zahraniční adresu lze uvádět pouze pro cizince a právnické osoby."));
                    }
                    if (String.IsNullOrEmpty(osoba.ZAHRANICNI_ADRESA.STAT))
                    {
                        throw new Exception(string.Format("U zahraniční adresy musí být uveden stát."));
                    }

                    if (!String.IsNullOrEmpty(osoba.OBEC_NAZEV) || !String.IsNullOrEmpty(osoba.ULICE_NAZEV) ||
                        (osoba.CIS_DOMU != null) || (osoba.CIS_OR != null) ||
                        !String.IsNullOrEmpty(osoba.PSC) || !String.IsNullOrEmpty(osoba.STAT)
                        )
                    {
                        throw new Exception(string.Format("U zahraniční adresy nelze současně uvádět trvalou adresu."));
                    }

                    P_STAT stat = sesna.FindObject <P_STAT>(CriteriaOperator.Parse("Upper(STAT_NAZEV) = ?", osoba.ZAHRANICNI_ADRESA.STAT.ToUpper()));
                    if (stat == null)
                    {
                        stat = sesna.FindObject <P_STAT>(CriteriaOperator.Parse("STAT_KOD = ?", osoba.ZAHRANICNI_ADRESA.STAT.ToUpper()));
                    }
                    if (stat == null)
                    {
                        throw new Exception(string.Format("Stát \"{0}\" není uveden v číselníku států.", osoba.ZAHRANICNI_ADRESA.STAT));
                    }
                }


                #endregion test  vyplneni vstupnich hodnot

                using (UnitOfWork uow = new UnitOfWork(sesna.DataLayer))
                {
                    //dotaz, zda j*z neexistuje
                    if (!string.IsNullOrEmpty(osoba.RC_IC))
                    {
                        CriteriaOperator criteria = CriteriaOperator.Parse("(ADR_SICO = ? or ADR_ICO = ?)", osoba.RC_IC, osoba.RC_IC);
                        XPCollection <P_ADRESA_ROBRHS> adrExist = new XPCollection <P_ADRESA_ROBRHS>(sesna, criteria);
                        if (adrExist.Count > 0)
                        {
                            #region adresa existuje - muze existovat vice osob se stejnym ADR_SICO
                            #region adresa je vybirana v poradi

                            P_ADRESA_ROBRHS osobaExist = null;
                            int             isico      = -1;
                            int             iico       = -1;
                            for (int i = 1; i <= 4; i++)
                            {
                                if (i == 1)
                                {
                                    adrExist.Filter = CriteriaOperator.Parse("ADR_EA = ? and ADR_ADRPOPL > -1", EXT_APP_KOD);
                                }
                                if (i == 2)
                                {
                                    adrExist.Filter = CriteriaOperator.Parse("ADR_ADRPOPL > -1");
                                }
                                if (i == 3)
                                {
                                    adrExist.Filter = CriteriaOperator.Parse("ADR_EA = ?", EXT_APP_KOD);
                                }
                                if (i == 4)
                                {
                                    adrExist.Filter = null;
                                }
                                if (adrExist.Count > 0)
                                {
                                    if (adrExist.First(P_ADRESA_ROBRHS => P_ADRESA_ROBRHS.ADR_SICO == osoba.RC_IC).ADR_SICO != null)
                                    {
                                        isico = 0;
                                    }
                                    if (adrExist.First(P_ADRESA_ROBRHS => P_ADRESA_ROBRHS.ADR_ICO == osoba.RC_IC).ADR_ICO != null)
                                    {
                                        iico = 0;
                                    }
                                }

                                if (isico > -1 || iico > -1)
                                {
                                    break;
                                }
                            }
                            #endregion adresa je vybrana v poradi

                            if (isico > -1 || iico > -1)
                            {
                                osobaExist = isico >= 0 ? adrExist[isico] : adrExist[iico];

                                if ((adrExist[adrExist.IndexOf(osobaExist)].ADR_SICO == null) && (isico == -1) && (iico >= 0))
                                {
                                    adrExist[iico].ADR_SICO = osoba.RC_IC;
                                    adrExist[iico].Save();
                                }

                                osobaResp.result = Result.OK;
                                osobaResp.status = Status.EXISTS;

                                Utils.copy.CopyDlePersistentAttr <OSOBA_RESP>(osobaExist, osobaResp);
                                Utils.copy.CopyDlePersistentAttr <KONTAKTNI_ADRESA>(osobaExist, osobaResp.KONTAKTNI_ADRESA);
                                osobaResp.RC_IC = osobaExist.ADR_SICO; //0.8
                                #endregion adresa existuje
                                return(osobaResp);
                            }
                        }
                    }

                    P_ADRESA_ROBRHS adr = new P_ADRESA_ROBRHS(uow);

                    Utils.copy.CopyDlePersistentAttr <P_ADRESA_ROBRHS>(osoba, adr);
                    Utils.copy.CopyDlePersistentAttr <P_ADRESA_ROBRHS>(osoba.KONTAKTNI_ADRESA, adr);
                    if (osoba.ZAHRANICNI_ADRESA != null)
                    {
                        Utils.copy.CopyDlePersistentAttr <P_ADRESA_ROBRHS>(osoba.ZAHRANICNI_ADRESA, adr);
                    }

                    try
                    {
                        uow.CommitChanges();
                        CriteriaOperator criteria = CriteriaOperator.Parse("ADR_ICO = ?", adr.ADR_ICO);
                        XPCollection <P_ADRESA_ROBRHS> adrInserted = new XPCollection <P_ADRESA_ROBRHS>(sesna, criteria);

                        Utils.copy.CopyDlePersistentAttr <OSOBA_RESP>(adrInserted[0], osobaResp);
                        Utils.copy.CopyDlePersistentAttr <KONTAKTNI_ADRESA>(adrInserted[0], osobaResp.KONTAKTNI_ADRESA);

                        osobaResp.result = Result.OK;
                        osobaResp.status = Status.INSERTED;
                        osobaResp.ADR_ID = adrInserted[0].ADR_ID;
                        osobaResp.RC_IC  = adrInserted[0].ADR_SICO; //0.8
                        return(osobaResp);
                    }
                    catch (Exception exc)
                    {
                        uow.RollbackTransaction();
                        osobaResp.result = Result.ERROR;

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

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

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

                Util.Util.WriteLog(osobaResp.ERRORMESS + "\n" + exc.StackTrace);

                return(osobaResp);

                /*
                 * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                 */
            }
        }
        public STORNO_RESP StornoPredpis(Session session, int EXT_APP_KOD, int PREDPIS_ID, string POZNAMKA)
        {
            sesna          = session;
            Resp           = new STORNO_RESP();
            Resp.STORNO_ID = -1;

            CriteriaOperator criteria;

            sesna.DropIdentityMap();

            #region test vyplneni vstupnich hodnot, kontroly
            try
            {
                P_PRPL predp = null;
                ValidateInputParam(EXT_APP_KOD, PREDPIS_ID, ref predp);

                if (predp == null)
                {
                    Resp.result    = Result.ERROR;
                    Resp.status    = Status.NOTEXISTS;
                    Resp.ERRORMESS = "Stornovaný předpis neexistuje.";
                    return(Resp);
                }


                string[] sRecord = new string[] { " ", "", "P" };
                if ((!sRecord.Contains(predp.PRPL_RECORD)))
                {
                    Resp.result    = Result.ERROR;
                    Resp.status    = Status.EXISTS;
                    Resp.ERRORMESS = "Předpis neumožňuje jeho stornování.";
                    return(Resp);
                }

                if (predp.PRPL_PR > 0)
                {
                    Resp.result    = Result.ERROR;
                    Resp.status    = Status.EXISTS;
                    Resp.ERRORMESS = "Předpis je vymáhán, nelze jej stornovat.";
                    return(Resp);
                }

                #endregion test  vyplneni vstupnich hodnot

                #region vzdy odparuji vse od predpisu
                XPCollection <P_PAROVANI> odparujPredpisy = new XPCollection <P_PAROVANI>(sesna,
                                                                                          CriteriaOperator.Parse("((CompoundKey1.PAR_PRPL_ID = ?) or (CompoundKey1.PAR_PLATBA_ID = ?) )",
                                                                                                                 PREDPIS_ID, PREDPIS_ID * -1));

                decimal dluh    = (predp.PRPL_PREDPIS + predp.PRPL_SANKCE) - (predp.PRPL_SPAROVANO * (Math.Abs(predp.PRPL_PREDPIS + predp.PRPL_SANKCE) / (predp.PRPL_PREDPIS + predp.PRPL_SANKCE)));
                decimal odparKc = Math.Abs(dluh);
                if (predp.PRPL_SANKCEDO == DateTime.MinValue)
                {
                    foreach (var item in odparujPredpisy)
                    {
                        odparKc += item.PAR_SPARKC;
                    }
                }

                sesna.Delete(odparujPredpisy);
                sesna.Save(odparujPredpisy);

                #endregion vzdy odparuji vse od predpisu

                DBValue dbv = DBValue.Instance(this.sesna);

                //otevrene obdobi
                P_NASTAVENI nast         = sesna.GetObjectByKey <P_NASTAVENI>("OTEVR_OBDOBI");
                DateTime    otevrObd     = DateTime.ParseExact("01." + nast.HODNOTA, "d.M.yyyy", null);
                bool        predpUzavren = predp.PRPL_OBDOBIROK > -1;
                predpUzavren = predpUzavren && ((predp.PRPL_OBDOBIROK < otevrObd.Year) ||
                                                (((predp.PRPL_OBDOBIROK == otevrObd.Year) && (predp.PRPL_OBDOBIMES < otevrObd.Month))));
                bool uzaverkyNedelaji = (dbv.DBSysDate - otevrObd).TotalDays > (365 + 60);

                DBUtil dbu   = new DBUtil(sesna);
                P_PRPL prIns = null;
                if ((predp.PRPL_EXPORTOVANO == "ANO") || predpUzavren || uzaverkyNedelaji)
                {
                    using (MyUnitOfWork uow = new MyUnitOfWork(sesna.DataLayer))
                    {
                        P_PRPL prOld = uow.FindObject <P_PRPL>(CriteriaOperator.Parse("PRPL_ID = ?", PREDPIS_ID));

                        prIns         = new P_PRPL(uow);
                        prIns.PRPL_ID = dbu.LIZNI_SEQ("PRPL_ID");
                        prIns.CompoundKey.PRPL_POPLATEK = prOld.CompoundKey.PRPL_POPLATEK;
                        prIns.CompoundKey.PRPL_PER      = prOld.CompoundKey.PRPL_PER;
                        prIns.CompoundKey.PRPL_ICO      = prOld.CompoundKey.PRPL_ICO;
                        prIns.CompoundKey.PRPL_DOPLKOD  = prOld.CompoundKey.PRPL_DOPLKOD;
                        prIns.PRPL_RECORD    = prOld.PRPL_RECORD;
                        prIns.PRPL_ROK       = dbv.DBSysDate.Year;
                        prIns.PRPL_PORPER    = prOld.PRPL_PORPER;
                        prIns.PRPL_VS        = prOld.PRPL_VS;
                        prIns.PRPL_EA        = EXT_APP_KOD;
                        prIns.PRPL_PREDPIS   = prOld.PRPL_PREDPIS * -1;
                        prIns.PRPL_SANKCE    = prOld.PRPL_SANKCE * -1;
                        prIns.PRPL_EXPFIN    = prOld.PRPL_EXPFIN;
                        prIns.PRPL_VYSTUP    = prOld.PRPL_VYSTUP;
                        prIns.PRPL_TISK      = prOld.PRPL_TISK;
                        prIns.PRPL_VYSTAVENO = dbv.DBSysDate;
                        if (prOld.PRPL_SPLATNO > dbv.DBSysDate)
                        {
                            prIns.PRPL_SPLATNO = prOld.PRPL_SPLATNO;
                        }
                        else
                        {
                            prIns.PRPL_SPLATNO = dbv.DBSysDate;
                        }
                        prIns.PRPL_EXPFIN      = prOld.PRPL_EXPFIN;
                        prIns.PRPL_EXPORTOVANO = "NE";
                        prIns.PRPL_UCETMESIC   = prIns.PRPL_VYSTAVENO.Month;
                        prIns.PRPL_UCETROK     = prIns.PRPL_VYSTAVENO.Year;
                        prIns.PRPL_EXPSIPO     = prOld.PRPL_EXPSIPO;
                        prIns.PRPL_POZNAMKA    = POZNAMKA.SubstrLeft(110);
                        prIns.PRPL_SS          = prOld.PRPL_SS;
                        P_C_TYPDANE typdane = uow.GetObjectByKey <P_C_TYPDANE>(prOld.PRPL_TYPDANE.TYPDANE_KOD);
                        if (typdane != null)
                        {
                            prIns.PRPL_TYPDANE = typdane;
                        }
                        else
                        {
                            typdane            = uow.GetObjectByKey <P_C_TYPDANE>((short)5);
                            prIns.PRPL_TYPDANE = typdane;
                        }
                        if ((prOld.P_PRPL_DPH != null) && (prOld.P_PRPL_DPH.Count > 0))
                        {
                            prIns.PRPL_UZP = dbv.DBSysDate;
                        }

                        prIns.PRPL_EA        = EXT_APP_KOD;
                        prIns.PRPL_EXTDOKLAD = prOld.PRPL_EXTDOKLAD;

                        if ((prOld.P_PRPL_DPH != null) && (prOld.P_PRPL_DPH.Count > 0))
                        {
                            P_PRPL_DPH dph;
                            foreach (var item in prOld.P_PRPL_DPH)
                            {
                                dph              = new P_PRPL_DPH(uow);
                                dph.DPH_KAT      = item.DPH_KAT;
                                dph.DPH_SAZBA    = item.DPH_SAZBA;
                                dph.DPH_KC       = item.DPH_KC * -1;
                                dph.DPH_POZNAMKA = item.DPH_POZNAMKA;
                                dph.DPH_ZAKLAD   = item.DPH_ZAKLAD * -1;
                                dph.DPH_ZAOKR    = item.DPH_ZAOKR * -1;
                                dph.DPH_DAN      = item.DPH_DAN * -1;
                                prIns.P_PRPL_DPH.Add(dph);
                            }
                        }

                        uow.CommitTransaction();

                        P_PAROVANI par        = new P_PAROVANI(sesna);
                        decimal    priparujKc = 0;
                        if (Math.Abs(prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE) <= Math.Abs(odparKc))
                        {
                            priparujKc = Math.Abs(prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE);
                        }
                        if (Math.Abs(prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE) > Math.Abs(odparKc))
                        {
                            priparujKc = Math.Abs(odparKc);
                        }

                        if (priparujKc != 0)
                        {
                            if ((prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE) < 0)
                            {
                                par.CompoundKey1.PAR_PRPL_ID   = prIns.PRPL_ID;
                                par.CompoundKey1.PAR_PLATBA_ID = prOld.PRPL_ID * -1;
                            }
                            if ((prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE) > 0)
                            {
                                par.CompoundKey1.PAR_PRPL_ID   = prOld.PRPL_ID;
                                par.CompoundKey1.PAR_PLATBA_ID = prIns.PRPL_ID * -1;
                            }

                            par.PAR_SPARKC    = priparujKc;
                            par.PAR_VYTVRUCNE = "ANO";
                            par.PAR_DATE      = dbv.DBSysDateTime.ToString("yyMMddHHmmss");

                            par.Save();
                        }
                    } //end using
                }

                if (prIns != null)
                {
                    Resp.STORNO_ID = prIns.PRPL_ID;
                }
                else
                {
                    predp.PRPL_RECORD = "S";
                    predp.PRPL_EA     = EXT_APP_KOD;
                    predp.LASTUPDATE  = dbv.DBSysDateTime;
                    predp.LOGIN       = String.Format("PoplWS({0})", EXT_APP_KOD);
                    predp.Save();
                    Resp.STORNO_ID = predp.PRPL_ID;
                }
                Resp.result = Result.OK;
                Resp.status = Status.INSERTED;

                try //
                {
                    Util.Util.WriteLog(string.Format("pozadavek na export do ucta: EXPFIN={0}, PREDPIS_ID={1}, {2} Kč", prIns.PRPL_EXPFIN, prIns.PRPL_ID, prIns.PRPL_PREDPIS + prIns.PRPL_SANKCE));
                    if (prIns.PRPL_EXPFIN == "ANO")
                    {
                        dbu.PredpisExport((int)prIns.CompoundKey.PRPL_POPLATEK, prIns.CompoundKey.PRPL_PER,
                                          (int)prIns.PRPL_UCETMESIC, (int)prIns.PRPL_UCETROK,
                                          prIns.PRPL_ID);
                    }
                }
                catch (Exception exc)
                {
                }

                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);

                /*
                 * throw new Exception(String.Format("chyba \n {0}", exc.InnerException.Message));
                 */
            }
        }
Example #4
0
        public PREDPIS_RESP InsertPredpis(Session session, int EXT_APP_KOD, PREDPIS predpis, bool nastavitKCdleDPH)
        {
            Session          sesna = session;
            PREDPIS_RESP     Resp  = new PREDPIS_RESP();
            CriteriaOperator criteria;

            //Session sesna = predpis.sesna;

            sesna.DropIdentityMap();

            predpis.PRPL_ID    = 0;
            predpis.PRPL_EXTVS = null;
            predpis.PRPL_EA    = EXT_APP_KOD;

            try
            {
                #region test  vyplneni vstupnich hodnot

                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 (predpis.PLATCE_ID == 0)
                {
                    throw new Exception("údaj PLATCE_ID není zadán");
                }

                if (predpis.PRPL_PREDPIS == 0)
                {
                    throw new Exception("údaj KC není zadán");
                }

                if (predpis.PRPL_VYSTAVENO == DateTime.MinValue)
                {
                    throw new Exception("údaj VYSTAVENO_DNE není zadán");
                }

                if ((predpis.RADKY_DPH.Count > 0) && (predpis.PRPL_UZP == null))
                {
                    throw new Exception("údaj DATUM_UZP není zadán");
                }

                if (predpis.RADKY_DPH.Count > 0)
                {
                    P_NASTAVENI nast     = sesna.GetObjectByKey <P_NASTAVENI>("OTEVR_UZP");
                    string      s        = nast.HODNOTA.Substring(1, nast.HODNOTA.IndexOf('|') - 1);
                    DateTime    otevrUZP = DateTime.ParseExact(s, "d.M.yyyy", null);
                    otevrUZP = new DateTime(otevrUZP.Year, otevrUZP.Month, 1);
                    if (predpis.PRPL_UZP < otevrUZP)
                    {
                        throw new Exception("DATUM_UZP není v otevřeném období UZP");
                    }
                }

                //otevrene obdobi
                {
                    P_NASTAVENI nast     = sesna.GetObjectByKey <P_NASTAVENI>("OTEVR_OBDOBI");
                    string      obd      = "01." + nast.HODNOTA;
                    DateTime    otevrObd = DateTime.ParseExact(obd, "d.M.yyyy", null);
                    if (predpis.PRPL_VYSTAVENO < otevrObd)
                    {
                        throw new Exception("datum vystavení není v otevřeném období");
                    }
                }

                //v minulosti
                {
                    DBValue dbv = DBValue.Instance(sesna);
                    if (predpis.PRPL_VYSTAVENO < dbv.DBSysDate)
                    {
                        throw new Exception("datum vystavení nemůže být v minulosti");
                    }
                }

                #endregion test  vyplneni vstupnich hodnot

                #region test, zda existuje v P_RGP, dohledani zbytku klice
                XPQuery <P_RGP>      Qplce = sesna.Query <P_RGP>();
                XPCollection <P_RGP> plces = new XPCollection <P_RGP>(sesna, false); //loadingEnabled = false;
                P_RGP[] rgps = Qplce.Where(a => a.RGP_ID == predpis.PLATCE_ID).ToArray <P_RGP>();
                plces.AddRange(rgps);

                if (plces.Count == 0)
                {
                    throw new Exception(String.Format(@"poplatník s ID {0} neexistuje", predpis.PLATCE_ID));
                }

                #endregion test, zda existuje v P_RGP, dohledani zbytku klice


                KONTROLA_POPLATKU kp = new KONTROLA_POPLATKU(sesna, EXT_APP_KOD);
                if (!kp.EAexist())
                {
                    throw new Exception("chybný kód externí aplikace");
                }
                if (!kp.existPravoNadPoplatkem(plces[0].CompoundKey1.RGP_POPLATEK))
                {
                    throw new Exception("k pohledávce neexistuje oprávnění");
                }

                #region kontrola prava nad poplatkem
                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");
                }
                //pro predpisy je povoleno vkladani
                if (!pnp.PravoExist((int)plces[0].CompoundKey1.RGP_POPLATEK, PravoNadPoplatkem.PrtabTable.PRPL, PravoNadPoplatkem.SQLPerm.INSERT))
                {
                    throw new Exception("PoplWS - nedostatečná oprávnění");
                }
                #endregion kontrola prava nad poplatkem

                P_RGP plce = plces[0];
                predpis.PRPL_PORPER = predpis.PRPL_PORPER == 0 ? 1 : predpis.PRPL_PORPER;

                DBUtil   dbu = new DBUtil(sesna);
                C_EVPOPL evp = dbu.GetEvpopl(plce.CompoundKey1.RGP_POPLATEK, plce.CompoundKey1.RGP_PER);
                if (evp == null)
                {
                    throw new Exception("nepovolená kombinace poplatek / perioda");
                }

                //datum splatnosti
                if (predpis.PRPL_SPLATNO == DateTime.MinValue)
                {
                    predpis.PRPL_SPLATNO = dbu.GetDatumSplatnosti(predpis.PRPL_VYSTAVENO, evp, (short)predpis.PRPL_PORPER);
                }

                if ((predpis.PRPL_VYSTAVENO > predpis.PRPL_SPLATNO) && (evp.EVPOPL_SPLT_VYST != "A"))
                {
                    throw new Exception("datum splatnosti nemůže být starší než datum vystavení");
                }

                //pocet period
                if (evp.CompoundKey1.EVPOPL_PER.PERIODA_POC < predpis.PRPL_PORPER)
                {
                    throw new Exception(String.Format("nepovolené pořadí periody \"{0}\", max. pořadí pro periodu \"{1}\" = {2}", predpis.PRPL_PORPER, plce.CompoundKey1.RGP_PER, evp.CompoundKey1.EVPOPL_PER.PERIODA_POC));
                }

                using (MyUnitOfWork uow = new MyUnitOfWork(sesna.DataLayer))
                {
                    P_PRPL prIns = new P_PRPL(uow);
                    Utils.copy.CopyDlePersistentAttr <P_PRPL>(predpis, prIns);

                    prIns.PRPL_ID = dbu.LIZNI_SEQ("PRPL_ID");
                    prIns.CompoundKey.PRPL_POPLATEK = plce.CompoundKey1.RGP_POPLATEK;
                    prIns.CompoundKey.PRPL_PER      = plce.CompoundKey1.RGP_PER;
                    prIns.CompoundKey.PRPL_ICO      = plce.CompoundKey1.RGP_ICO;
                    prIns.CompoundKey.PRPL_DOPLKOD  = plce.CompoundKey1.RGP_DOPLKOD;
                    prIns.PRPL_ROK    = predpis.PRPL_ROK == 0 ? predpis.PRPL_VYSTAVENO.Year : predpis.PRPL_ROK;
                    prIns.PRPL_PORPER = predpis.PRPL_PORPER == 0 ? 1 : predpis.PRPL_PORPER;
                    prIns.PRPL_SS     = predpis.PRPL_SS ?? evp.EVPOPL_SS;

                    if (predpis.EXPORTOVAT_DO_FINANCI == null)
                    {
                        prIns.PRPL_EXPFIN = plce.RGP_EXPUCTO;
                    }
                    else
                    {
                        prIns.PRPL_EXPFIN = predpis.EXPORTOVAT_DO_FINANCI.ToString();
                    }
                    P_C_TYPDANE typdane = uow.GetObjectByKey <P_C_TYPDANE>(predpis.PRPL_TYPDANE);
                    if (typdane != null)
                    {
                        prIns.PRPL_TYPDANE = typdane;
                    }
                    else
                    {
                        typdane            = uow.GetObjectByKey <P_C_TYPDANE>((short)5);
                        prIns.PRPL_TYPDANE = typdane;
                    }

                    prIns.PRPL_RECORD = dbu.GetRecordFromTypDane(prIns.PRPL_TYPDANE.TYPDANE_KOD);

                    if (prIns.PRPL_RECORD == "-1")
                    {
                        throw new Exception(String.Format(@"chybný typ daně {0}", prIns.PRPL_TYPDANE));
                    }

                    if (prIns.PRPL_RECORD == "P")
                    {
                        prIns.PRPL_SANKCE  = prIns.PRPL_PREDPIS;
                        prIns.PRPL_PREDPIS = 0;
                    }
                    ;

                    prIns.PRPL_VS = plce.VS;

                    prIns.PRPL_PORSANKCE   = 0m;
                    prIns.PRPL_PROCSANKCE  = plce.RGP_PROCSANKCE;
                    prIns.PRPL_VYSTUP      = plce.RGP_VYSTUP;
                    prIns.PRPL_TISK        = "NE";
                    prIns.PRPL_EXPORTOVANO = "NE";
                    prIns.PRPL_UCETMESIC   = predpis.PRPL_VYSTAVENO.Month;
                    prIns.PRPL_UCETROK     = predpis.PRPL_VYSTAVENO.Year;
                    prIns.PRPL_OBDOBIMES   = -1;
                    prIns.PRPL_OBDOBIROK   = -1;
                    prIns.PRPL_TYPSANKCE   = plce.RGP_TYPSANKCE;
                    prIns.PRPL_PEVNACASTKA = plce.RGP_PEVNACASTKA;
                    prIns.PRPL_NASOBEK     = plce.RGP_NASOBEK;
                    prIns.PRPL_PERNAS      = plce.RGP_PERNAS;
                    prIns.PRPL_STAVSANKCE  = " ";
                    prIns.PRPL_SPAROVANO   = 0m;
                    prIns.PRPL_EXPSIPO     = "NE";
                    prIns.PRPL_VYMAHAT     = predpis.PRPL_VYMAHAT == null ? "N" : predpis.PRPL_VYMAHAT;
                    prIns.PRPL_VYMAHANO    = "N";
                    prIns.PRPL_PR          = 0;
                    DBValue dbv = DBValue.Instance(sesna);
                    prIns.LOGIN      = dbv.DBUserName;
                    prIns.LASTUPDATE = dbv.DBSysDateTime;
                    prIns.ENTRYLOGIN = prIns.ENTRYLOGIN;
                    prIns.ENTRYDATE  = prIns.LASTUPDATE;
                    if (!prIns.PRPL_OLDVS.HasValue)
                    {
                        prIns.PRPL_OLDVS = plce.RGP_OLDVS;
                    }

                    #region DPH - zkontrolovani celkove castky, zaokrouhleni
                    decimal          SumaRadkuDPH = predpis.PRPL_PREDPIS;
                    List <DPHRozpis> radkyDph     = new List <DPHRozpis>();
                    if (predpis.RADKY_DPH.Count > 0)
                    {
                        DPHRozpis dpr;
                        foreach (RADEK_DPH item in predpis.RADKY_DPH)
                        {
                            if (item.ZAKLAD == 0)
                            {
                                continue;
                            }
                            dpr = new DPHRozpis();
                            Utils.copy.CopyDlePersistentAttr(item, dpr);
                            dpr.DAN = item.ZAKLAD * ((item.SAZBA ?? 0) / 100);
                            dpr.KC  = dpr.ZAKLAD + dpr.DAN;
                            radkyDph.Add(dpr);
                        }

                        DPHZaokrouhleni dphZaokr = new DPHZaokrouhleni();
                        dphZaokr.DPHZaokrouhli(radkyDph, prIns.CompoundKey.PRPL_POPLATEK, sesna);

                        SumaRadkuDPH = 0;
                        foreach (var item in radkyDph)
                        {
                            SumaRadkuDPH += item.KC + item.ZAOKROUHLENI;
                        }

                        if (nastavitKCdleDPH)
                        {
                            predpis.PRPL_PREDPIS = SumaRadkuDPH;
                        }
                        else
                        {
                            if (SumaRadkuDPH != predpis.PRPL_PREDPIS)
                            {
                                throw new Exception(String.Format("nesouhlasí částka předpisu {0} \n s rozpisem DPH {1}",
                                                                  predpis.PRPL_PREDPIS, SumaRadkuDPH));
                            }
                        }
                    }
                    #endregion DPH - zkontrolovani celkove castky, zaokrouhleni

                    //povkladam radkyDph
                    foreach (var item in radkyDph)
                    {
                        P_PRPL_DPH     dphr = new P_PRPL_DPH(uow);
                        DPHRozpisPredp tmp  = new DPHRozpisPredp();
                        Utils.copy.CopyDlePersistentAttr <DPHRozpisPredp>(item, tmp);
                        Utils.copy.CopyDlePersistentAttr <P_PRPL_DPH>(tmp, dphr);
                        prIns.P_PRPL_DPH.Add(dphr);
                    }

                    uow.CommitTransaction();

                    Utils.copy.CopyDlePersistentAttr <PREDPIS_RESP>(predpis, Resp);
                    Resp.result = Result.OK;
                    Resp.status = Status.INSERTED;
                    Utils.copy.CopyDlePersistentAttr <PREDPIS_RESP>(prIns, Resp);
                    Resp.PRPL_TYPDANE = prIns.PRPL_TYPDANE.TYPDANE_KOD;
                    switch (prIns.PRPL_EXPFIN)
                    {
                    case "ANO":
                        Resp.EXPORTOVAT_DO_FINANCI = SouhlasAnoNe.ANO;
                        break;

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

                    foreach (var item in prIns.P_PRPL_DPH)
                    {
                        RADEK_DPH      respDphRow = new RADEK_DPH();
                        DPHRozpisPredp tmp        = new DPHRozpisPredp();
                        Utils.copy.CopyDlePersistentAttr <DPHRozpisPredp>(item, tmp);
                        Utils.copy.CopyDlePersistentAttr <RADEK_DPH>(tmp, respDphRow);
                        Resp.RADKY_DPH.Add(respDphRow);
                    }

                    try
                    {
                        if (prIns.PRPL_EXPFIN == "ANO")
                        {
                            dbu.PredpisExport((int)prIns.CompoundKey.PRPL_POPLATEK, prIns.CompoundKey.PRPL_PER,
                                              (int)Resp.PRPL_UCETMESIC, (int)Resp.PRPL_UCETROK,
                                              Resp.PRPL_ID);
                        }
                    }
                    catch (Exception exc)
                    {
                    }

                    return(Resp);
                } //uow
            }
            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 + "\n" + exc.StackTrace);

                return(Resp);

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