private bool Save()
        {
            Contract contract = new Contract();
            string[] subitemIds = Request.Form.GetValues("subitem-id");
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            int i = -1;

            try
            {
                contract.Start = Convert.ToDateTime(txtDateStart.Text, Thread.CurrentThread.CurrentCulture);
                contract.End = Convert.ToDateTime(txtDateEnd.Text, Thread.CurrentThread.CurrentCulture);
                contract.ExchangeRate = Convert.ToDecimal(txtCurrencyRate.Text, CultureInfo.InvariantCulture);
                contract.ContractorId = Convert.ToInt32(ddlContractor.SelectedValue, CultureInfo.InvariantCulture);
            }
            catch(Exception)
            {
                return false;
            }

            contract.Description = edtDescription.Text;
            contract.Currency = ddlCurrency.SelectedValue;
            contract.CreatedBy = SiteUtils.GetCurrentSiteUser().Name;

            foreach(string inputPrice in Request.Form.GetValues("subitem-price"))
            {
                decimal price = 0;
                string jsonIds = null;
                Dictionary<string, object> ids = null;
                ContractDetail detail = null;

                i++;

                if(!decimal.TryParse(inputPrice, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out price))
                    continue;

                try
                {
                    jsonIds =Server.UrlDecode(subitemIds[i]);
                    ids = (Dictionary<string, object>)serializer.DeserializeObject(jsonIds);
                    detail = new ContractDetail();
                    detail.ProjectId = (int)ids["pId"];
                    detail.BlockId = (int)ids["bId"];
                    detail.WorkId = (int)ids["wId"];
                    detail.GroupId = (int)ids["gId"];
                    detail.ItemId = (int)ids["iId"];
                    detail.SubItemId = (int)ids["sId"];
                    detail.Price = price;
                }
                catch(Exception)
                {
                    continue;
                }

                contract.Detail.Add(detail);
            }

            return contract.Save() > 0;
        }
        private void LoadParams()
        {
            _pageId = WebUtils.ParseInt32FromQueryString("pageid", _pageId);
            _moduleId = WebUtils.ParseInt32FromQueryString("mid", _moduleId);

            if (!IsPostBack)
                return;

            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            string[] rows = Request.Form.GetValues("subitem-data");
            string[] totals = Request.Form.GetValues("subitem-price-total");

            if (rows != null && totals != null)
            {
                for (int i = 0; i < rows.Length; i++)
                {
                    ListDictionary dataRow = null;
                    ContractDetail detail = new ContractDetail();

                    try
                    {
                        dataRow = jsSerializer.Deserialize<ListDictionary>(rows[i]);
                        detail.ProjectId = Convert.ToInt32(dataRow["pId"]);
                        detail.BlockId = Convert.ToInt32(dataRow["bId"]);
                        detail.WorkId = Convert.ToInt32(dataRow["wId"]);
                        detail.GroupId = Convert.ToInt32(dataRow["gId"]);
                        detail.ItemId = Convert.ToInt32(dataRow["iId"]);
                        detail.SubItemId = Convert.ToInt32(dataRow["sId"]);
                        detail.InitialProgress = Convert.ToInt32(dataRow["progress"]);
                        detail.Price = decimal.Parse(totals[i], CultureInfo.InvariantCulture);
                    }
                    catch (Exception)
                    {
                        continue;
                    }

                    _contractDetails.Add(detail);
                }
            }
        }
        public static Contract Create(int contractId, bool fillDetail)
        {
            Contract contract = Create(contractId);

            if (!fillDetail)
                return contract;

            using (IDataReader reader = DBContract.GetDetail(contractId))
            {
                while (reader.Read())
                {
                    ContractDetail detail = new ContractDetail();

                    detail.ProjectId = Convert.ToInt32(reader["ProjectId"]);
                    detail.BlockId = Convert.ToInt32(reader["BlockId"]);
                    detail.WorkId = Convert.ToInt32(reader["WorkId"]);
                    detail.GroupId = Convert.ToInt32(reader["GroupId"]);
                    detail.ItemId = Convert.ToInt32(reader["ItemId"]);
                    detail.SubItemId = Convert.ToInt32(reader["SubItemId"]);
                    detail.Price = Convert.ToDecimal(reader["Price"]);
                    detail.Name = reader["Name"].ToString();
                    detail.Quantity = Convert.ToDecimal(reader["Quantity"]);
                    detail.Unit = reader["Unit"].ToString();
                    detail.InitialProgress = Convert.ToInt32(reader["Progress"]);
                    contract.Detail.Add(detail);
                }
            }

            return contract;
        }
 internal static DBContractDetail ToDBContractDetail(ContractDetail cd)
 {
     return new DBContractDetail(cd.ProjectId, cd.BlockId, cd.WorkId, cd.GroupId, cd.ItemId, cd.SubItemId, cd.InitialProgress, cd.Price);
 }