public ServiceContractPerHourManager()
     : base(CrmEntityNamesMapping.ServiceContractPerHour, "new_hindvcontractid")
 {
     HourlyPricingManager = new HourlyPricingManager();
     PromotionMgr         = new PromotionManager();
 }
        public Entity CastToCrmEntity(RequestServiceContractPerHour contract)
        {
            Entity contractEntity = new Entity(CrmEntityName);

            contractEntity["new_hindivclintname"] = new EntityReference(CrmEntityNamesMapping.Contact, new Guid(contract.CustomerId.ToString()));
            contractEntity["new_nationality"]     = new EntityReference(CrmEntityNamesMapping.Nationality, new Guid(contract.NationalityId));
            contractEntity["new_houlrypricing"]   = new EntityReference(CrmEntityNamesMapping.HourlyPricing, new Guid(contract.HourlyPricingId));
            contractEntity["new_city"]            = new EntityReference(CrmEntityNamesMapping.City, new Guid(contract.CityId));
            contractEntity["new_district"]        = new EntityReference(CrmEntityNamesMapping.District, new Guid(contract.DistrictId));

            RequestHourlyPricing pricingObj = new RequestHourlyPricing();

            pricingObj.PromotionCode = contract.PromotionCode;

            var promotion = PromotionMgr.GetPromotionByCode(pricingObj, UserLanguage.Arabic);

            contractEntity["new_promotionid"] = new EntityReference(CrmEntityNamesMapping.Promotion, new Guid(promotion.Id));
            var totalVisits          = contract.ContractDuration * contract.NumOfVisits;
            var extraVisits          = (promotion.FreeVisitsFactor ?? 0) == 0 ? 0 : Math.Truncate((decimal)totalVisits / promotion.FreeVisitsFactor.Value);
            var totalPlusExtraVisits = totalVisits + extraVisits;

            contractEntity["new_contractsource"] = new OptionSetValue(contract.Who == 1 ? 1 : 2);  // why?

            contractEntity["new_housetype"]      = new OptionSetValue(contract.HouseType);
            contractEntity["new_floorno"]        = new OptionSetValue(contract.FloorNo);
            contractEntity["new_partmentnumber"] = contract.PartmentNo;

            contractEntity["new_houseno"] = contract.HouseNo;
            contractEntity["new_notes"]   = contract.AddressNotes;


            //if (contract.Who == 1)
            //    contractEntity["new_contractsource"] = new OptionSetValue(contract.Who);
            //else
            //    contractEntity["new_contractsource"] = new OptionSetValue(2);

            contractEntity["new_new_contractdate"] = DateTime.Now;
            contractEntity["new_contractconfirm"]  = DefaultValues.ServiceContractPerHour_IsConfirmed;
            contractEntity["statuscode"]           = new OptionSetValue(DefaultValues.ServiceContractPerHour_StatusCode);

            contract.StartDay = contract.StartDay.Replace('/', '-');

            contractEntity["new_contractstartdate"] = DateTime.ParseExact(contract.StartDay, "dd-MM-yyyy", CultureInfo.InvariantCulture);

            contractEntity["new_customerdays"] = contract.AvailableDays;
            contractEntity["new_selecteddays"] = contract.AvailableDays;
            contractEntity["new_latitude"]     = contract.Latitude;
            contractEntity["new_longitude"]    = contract.Longitude;
            contractEntity["new_mapurl"]       = "http://maps.google.com/maps?q=" + contract.Latitude + "," + contract.Longitude + "&z=15";
            contractEntity["new_paymentcode"]  = new Random().Next(0, 1000000).ToString("D6");

            Entity hourlyPricing     = HourlyPricingManager.GetCrmEntity(contract.HourlyPricingId);
            var    hourlyPricingCost = HourlyPricingManager.CalculateHourlyPricingCost(hourlyPricing, contract.NumOfHours, contract.NumOfVisits, contract.ContractDuration, contract.NumOfWorkers, promotion);

            contractEntity["new_shift"] = bool.Parse(hourlyPricing["new_shift"].ToString());

            contractEntity["new_hoursnumber"]     = new OptionSetValue(contract.NumOfHours);
            contractEntity["new_visitcount_def"]  = contract.NumOfVisits;
            contractEntity["new_weeklyvisits"]    = new OptionSetValue(contract.NumOfVisits);
            contractEntity["new_contractmonth"]   = new OptionSetValue(contract.ContractDuration);
            contractEntity["new_employeenumber"]  = new OptionSetValue(contract.NumOfWorkers);
            contractEntity["new_visitprice_def"]  = int.Parse(MathNumber.RoundDeciamlToInt(hourlyPricingCost.HourRate.ToString())) * contract.NumOfHours;
            contractEntity["new_visittotalprice"] = hourlyPricingCost.HourRate * contract.NumOfHours;
            contractEntity["new_monthvisits_def"] = contract.NumOfVisits * 4;

            //  contractEntity["new_totalvisits_def"] = contract.NumOfVisits * contract.ContractDuration; MIB Must be int
            contractEntity["new_totalvisits_def"] = (int)Math.Round(totalPlusExtraVisits, 0);

            contractEntity["new_hindivcount"]    = contract.NumOfHours;
            contractEntity["new_discount_def"]   = hourlyPricingCost.Discount;
            contractEntity["new_totalprice_def"] = (int)Math.Round(hourlyPricingCost.TotalPriceAfterPromotion, 0);   //decimal value string 180 = 180m as string not using parse
            contractEntity["new_vatrate"]        = hourlyPricingCost.VatRate / 100m;
            contractEntity["new_vatamount"]      = hourlyPricingCost.VatAmount;
            contractEntity["new_finalprice"]     = hourlyPricingCost.TotalPriceWithVat;

            contractEntity["new_onevisitprice"] = hourlyPricingCost.TotalPriceWithVat / (((int)Math.Round(totalPlusExtraVisits, 0)) * contract.NumOfWorkers);

            return(contractEntity);
        }