/// <summary> /// Tính giá cho một loại phòng /// </summary> /// <returns></returns> public static double Calculate(RoomClass rclass, RoomTypex rtype, int adult, int child, bool isSingle, SailsTrip trip, Cruise cruise, TripOption option, DateTime startDate, SailsModule Module, IList policies, double childPrice, double agencySup, Agency agency) { // Lấy về bảng giá áp dụng cho thời điểm xuất phát if (trip == null) { return(0); } SailsPriceConfig priceConfig = Module.SailsPriceConfigGet(rclass, rtype, trip, cruise, option, startDate, BookingType.Double, agency); if (priceConfig == null) { throw new PriceException(string.Format("There isn't any price for {0} {1} room in trip {2} on {3}", rclass.Name, rtype.Name, trip.Name, startDate)); } #region -- Giá phòng -- double price; // Biến để lưu giá trị single supplement nếu là booking single double singlesup = 0; if (isSingle) { if (agencySup > 0) { singlesup = agencySup; } else { singlesup = priceConfig.SpecialPrice; //Module.ApplyPriceFor(priceConfig.SpecialPrice, policies); } } // Tính giá phòng theo người lớn // Đơn giá của phòng (đã áp dụng chính sách) double unitPrice; if (priceConfig.Table.Agency == null) { //unitPrice = Module.ApplyPriceFor(priceConfig.NetPrice, policies); } else { //unitPrice = priceConfig.NetPrice; } if (rtype.IsShared) { // Giá phòng twin phòng đơn giá x số lượng người lớn / 2 + đơn giá x tỉ lệ dành cho child x số child / 2 // (Thực ra adult = 1/2, child =0/1) //price = unitPrice * adult / 2 + unitPrice * child * childPrice / 100 / 2; // Cộng thêm singlesup (nếu không phải single thì là + 0) //price += singlesup; } else { // Giá phòng double phòng đơn giá x số lượng người lớn / 2 + đơn giá x tỉ lệ dành cho child x số child / 2 //price = unitPrice * adult / 2 + unitPrice * child * childPrice / 100 / 2; // Cộng thêm singlesup (nếu không phải single thì là + 0) //price += singlesup; } #endregion //return price; return(0.0); }
public static double RoomPrice(SailsModule module, RoomClass rclass, RoomTypex rtype, SailsTrip trip, Cruise cruise, TripOption option, DateTime startDate) { if (trip == null) { return(0); } SailsPriceConfig rolePrice = module.SailsPriceConfigGet(rclass, rtype, trip, cruise, option, startDate, BookingType.Double, null); if (rolePrice != null) { return(rolePrice.NetPrice); } SailsPriceConfig priceConfig = module.SailsPriceConfigGet2(rclass, rtype, trip, cruise, option, startDate, BookingType.Double, null); if (priceConfig != null) { return(priceConfig.NetPrice * MARK_UP); } return(-1); }
public virtual Dictionary <CostType, double> Calculate(IList costTypes, GetCurrentCostTable costTable, GetCurrentDailyCostTable dailyTable, GetCurrentCruiseExpenseTable getCruiseTable, Cruise activecruise, IList bookings, SailsModule module, bool partnership) { Cruise = activecruise; // Nếu là chi phí từng tàu, tính chi phí cho tàu đó // Nếu là chi phí tổng, tính chi phí từng tàu rồi sau đó cộng lại #region -- Chi phí cho một tàu -- if (Cruise != null) { // Dựng bảng dịch vụ trắng Dictionary <CostType, ExpenseService> serviceMap = new Dictionary <CostType, ExpenseService>(); Dictionary <CostType, double> serviceTotal = new Dictionary <CostType, double>(); foreach (CostType type in costTypes) { serviceMap.Add(type, null); serviceTotal.Add(type, 0); } #region -- Tạo bảng giá trắng và lấy giá nhập thủ công theo thuyến -- // Kiểm tra xem đã có giá các dịch vụ nào foreach (ExpenseService service in Services) { // Nếu không thuộc diện tính chi phí cho ngày (không nằm trong danh sách chi phí) if (!serviceMap.ContainsKey(service.Type)) { continue; } serviceMap[service.Type] = service; // Nếu là giá nhập thủ công thì cộng luôn if (service.Type.IsDailyInput) { serviceTotal[service.Type] += service.Cost; } } #endregion int adultHaiPhong = 0; int childHaiPhong = 0; // Tính giá từng dịch vụ với từng booking (chi phí theo số khách ) #region -- Dịch vụ theo booking (chi phí theo số khách) -- foreach (Booking booking in bookings) { Dictionary <CostType, double> bookingCost = booking.Cost(costTable(Date, booking.Trip, booking.TripOption), costTypes); // Sau khi có bảng giá từng booking thì cộng vào tổng foreach (CostType type in costTypes) { serviceTotal[type] += bookingCost[type]; } // Đồng thời tính số người để tính giá thuê tàu Hải Phong luôn adultHaiPhong += booking.Adult; childHaiPhong += booking.Child; } #endregion #region -- Chi phí theo chuyến -- bool _isRun = bookings.Count > 0; // Nếu có booking thì tính chi phí theo chuyến (tàu có chạy) if (_isRun) { DailyCostTable table = dailyTable(Date); if (table != null) { foreach (DailyCost cost in dailyTable(Date).Costs) { if (serviceTotal.ContainsKey(cost.Type)) { serviceTotal[cost.Type] += cost.Cost; // Luôn cộng luôn chi phí vào tổng } } } } #endregion #region -- Giá tàu Hải Phong -- // Chỉ tính giá tàu Hải Phong nếu đây là bảng chi phí cho một tàu CruiseExpenseTable cruiseTable = getCruiseTable(Date, Cruise); CalculateCruiseExpense(costTypes, serviceTotal, adultHaiPhong, childHaiPhong, cruiseTable); #endregion #region -- Trước khi trả về kết quả, kiểm tra cơ sở dữ liệu -- foreach (CostType type in costTypes) { // Bỏ qua dịch vụ theo ngày vì đã lưu theo từng dịch vụ riêng rẽ if (type.IsDailyInput) { continue; } if (serviceMap[type] != null) { // Nếu giá dịch vụ trong CSDL không bằng thực tính if (serviceMap[type].Cost != serviceTotal[type]) { serviceMap[type].Cost = serviceTotal[type]; module.SaveOrUpdate(serviceMap[type]); } // Ngược lại thì bỏ qua } else { // Nếu chưa có thì cập nhật mới if (type.DefaultAgency == null && partnership) { throw new Exception("You must config default agency for " + type.Name); } ExpenseService service = new ExpenseService(); service.Expense = this; service.Cost = serviceTotal[type]; service.Name = string.Format("{0:dd/MM/yyyy}- {1}", Date, type.Name); service.Paid = 0; service.Supplier = type.DefaultAgency; if (service.Supplier != null) { service.Phone = type.DefaultAgency.Phone; } service.Type = type; module.SaveOrUpdate(service); } } #endregion return(serviceTotal); } #endregion #region -- Chi phí cho tất cả các tàu -- Dictionary <CostType, double> total = new Dictionary <CostType, double>(); #region -- Lấy về chi phí cho từng tàu nếu là chi phí tổng -- //Chi phí cho từng tàu //Dictionary<int, SailExpense> expenseCruise = new Dictionary<int, SailExpense>(); IList cruises = module.CruiseGetAll(); #region -- Tạo bảng giá trắng -- foreach (CostType type in costTypes) { total.Add(type, 0); } #endregion foreach (Cruise cruise in cruises) { SailExpense expense = module.ExpenseGetByDate(cruise, Date); IList filtered = new ArrayList(); foreach (Booking booking in bookings) { if (booking.Cruise != null && booking.Cruise.Id == cruise.Id) { filtered.Add(booking); } } Dictionary <CostType, double> expenses = expense.Calculate(costTypes, costTable, dailyTable, getCruiseTable, cruise, filtered, module, partnership); foreach (CostType type in costTypes) { total[type] += expenses[type]; } } #endregion return(total); #endregion }
public virtual Dictionary <CostType, double> Calculate(IList costTypes, GetCurrentCostTable costTable, GetCurrentDailyCostTable dailyTable, GetCurrentCruiseExpenseTable getCruiseTable, Cruise activecruise, IList bookings, SailsModule module, bool partnership) { Cruise = activecruise; if (Cruise != null) { Dictionary <CostType, ExpenseService> serviceMap = new Dictionary <CostType, ExpenseService>(); Dictionary <CostType, double> serviceTotal = new Dictionary <CostType, double>(); foreach (CostType type in costTypes) { serviceMap.Add(type, null); serviceTotal.Add(type, 0); } foreach (ExpenseService service in Services) { if (!serviceMap.ContainsKey(service.Type)) { continue; } serviceMap[service.Type] = service; if (service.Type.IsDailyInput) { serviceTotal[service.Type] += service.Cost; } } int adultHaiPhong = 0; int childHaiPhong = 0; foreach (Booking booking in bookings) { Dictionary <CostType, double> bookingCost = booking.Cost(costTable(Date, booking.Trip, booking.TripOption), costTypes); foreach (CostType type in costTypes) { serviceTotal[type] += bookingCost[type]; } adultHaiPhong += booking.Adult; childHaiPhong += booking.Child; } bool _isRun = bookings.Count > 0; if (_isRun) { DailyCostTable table = dailyTable(Date); if (table != null) { foreach (DailyCost cost in dailyTable(Date).Costs) { if (serviceTotal.ContainsKey(cost.Type)) { serviceTotal[cost.Type] += cost.Cost; } } } } CruiseExpenseTable cruiseTable = getCruiseTable(Date, Cruise); CalculateCruiseExpense(costTypes, serviceTotal, adultHaiPhong, childHaiPhong, cruiseTable); foreach (CostType type in costTypes) { if (type.IsDailyInput) { continue; } if (serviceMap[type] != null) { if (serviceMap[type].Cost != serviceTotal[type]) { serviceMap[type].Cost = serviceTotal[type]; module.SaveOrUpdate(serviceMap[type]); } } else { if (type.DefaultAgency == null && partnership) { throw new Exception("You must config default agency for " + type.Name); } ExpenseService service = new ExpenseService(); service.Expense = this; service.Cost = serviceTotal[type]; service.Name = string.Format("{0:dd/MM/yyyy}- {1}", Date, type.Name); service.Paid = 0; service.Supplier = type.DefaultAgency; if (service.Supplier != null) { service.Phone = type.DefaultAgency.Phone; } service.Type = type; module.SaveOrUpdate(service); } } return(serviceTotal); } Dictionary <CostType, double> total = new Dictionary <CostType, double>(); IList cruises = module.CruiseGetAll(); foreach (CostType type in costTypes) { total.Add(type, 0); } foreach (Cruise cruise in cruises) { Expense expense = module.ExpenseGetByDate(cruise, Date); IList filtered = new ArrayList(); foreach (Booking booking in bookings) { if (booking.Cruise != null && booking.Cruise.Id == cruise.Id) { filtered.Add(booking); } } Dictionary <CostType, double> expenses = expense.Calculate(costTypes, costTable, dailyTable, getCruiseTable, cruise, filtered, module, partnership); foreach (CostType type in costTypes) { total[type] += expenses[type]; } } return(total); }