public ActionResult AddSave(OrderRecord data)
        {
            //# validation
            if (data.MasterRecordID < 0)
                throw new SystemException("Invalid Entity ID");

            int timeInt = 0;
            if (!String.IsNullOrEmpty(data.StartTimeHour))
            {
                if (!Int32.TryParse(data.StartTimeHour, out timeInt) || Convert.ToInt32(data.StartTimeHour) < 0 || Convert.ToInt32(data.StartTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.StartTimeMinute))
            {
                if (!Int32.TryParse(data.StartTimeMinute, out timeInt) || Convert.ToInt32(data.StartTimeMinute) < 0 || Convert.ToInt32(data.StartTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.EndTimeHour))
            {
                if (!Int32.TryParse(data.EndTimeHour, out timeInt) || Convert.ToInt32(data.EndTimeHour) < 0 || Convert.ToInt32(data.EndTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.EndTimeMinute))
            {
                if (!Int32.TryParse(data.EndTimeMinute, out timeInt) || Convert.ToInt32(data.EndTimeMinute) < 0 || Convert.ToInt32(data.EndTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.repair_date) && !String.IsNullOrEmpty(data.CompleteDate))
            {
                if (DateTime.ParseExact(data.CompleteDate, "dd-MM-yyyy", null) < DateTime.ParseExact(data.repair_date, "dd-MM-yyyy", null))
                {
                    data.SaveResult.WarningMessage = "完成日期應在維修日期之後";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            Member member = new Member("users");
            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# get old master customer record
            if (data.MasterRecordType == OrderMasterRecordType.quotation)
                return this.AddSave_Quotation(data);
            else
                return this.AddSave_Maintenance(data);
        }
        public ActionResult EditSave(OrderRecord data)
        {
            recsys_order order;
            recsys_relate_customers customerData;

            //# validation
            if (data.id < 0)
                throw new SystemException("Invalid Entity ID");

            int timeInt = 0;
            if (!String.IsNullOrEmpty(data.StartTimeHour))
            {
                if (!Int32.TryParse(data.StartTimeHour, out timeInt) || Convert.ToInt32(data.StartTimeHour) < 0 || Convert.ToInt32(data.StartTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.StartTimeMinute))
            {
                if (!Int32.TryParse(data.StartTimeMinute, out timeInt) || Convert.ToInt32(data.StartTimeMinute) < 0 || Convert.ToInt32(data.StartTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.EndTimeHour))
            {
                if (!Int32.TryParse(data.EndTimeHour, out timeInt) || Convert.ToInt32(data.EndTimeHour) < 0 || Convert.ToInt32(data.EndTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.EndTimeMinute))
            {
                if (!Int32.TryParse(data.EndTimeMinute, out timeInt) || Convert.ToInt32(data.EndTimeMinute) < 0 || Convert.ToInt32(data.EndTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.repair_date) && !String.IsNullOrEmpty(data.CompleteDate))
            {
                if (DateTime.ParseExact(data.CompleteDate, "dd-MM-yyyy", null) < DateTime.ParseExact(data.repair_date, "dd-MM-yyyy", null))
                {
                    data.SaveResult.WarningMessage = "完成日期應在維修日期之後";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            //# get old record
            var records = from e in this._db.recsys_order
                          join c in this._db.recsys_relate_customers on e.customer_id equals c.id into cs
                          from c in cs.DefaultIfEmpty()
                          where e.id == data.id
                          select new
                          {
                              Order = e,
                              CustomerData = c
                          };
            var record = records.FirstOrDefault();

            Member member = new Member("users");

            //# validation
            if (record == null)
                throw new RecordNotFoundException();

            order = record.Order;
            customerData = record.CustomerData;

            //# validation
            if (order == null || customerData == null)
                throw new RecordNotFoundException();
            if (!order.last_update.HasValue)
                throw new ImproperDataException();
            if (order.last_update.Value > data.FetchRecordTime)
                throw new OptimisticConcurrencyException("資料已被其他使用者更新");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# saving
            //# mapping
            order.by_system = 1;
            order.completion_date = DateChecking(data.CompleteDate);
            if ((String.IsNullOrEmpty(data.EndTimeHour)) && (String.IsNullOrEmpty(data.EndTimeMinute)))
                order.end_time = null;
            else
                order.end_time = new TimeSpan(Convert.ToInt32(data.EndTimeHour), Convert.ToInt32(data.EndTimeMinute), 0);
            order.engineer_id_1 = data.engineer_id_1;
            order.engineer_id_2 = data.engineer_id_2;
            order.engineer_id_3 = data.engineer_id_3;
            order.engineer_id_4 = data.engineer_id_4;
            order.fault = data.fault;
            order.last_update = DateTime.Now;
            order.model = data.model;
            order.remark = data.remark2;
            order.repair = data.repair;
            order.repair_date = DateChecking(data.repair_date);
            order.report = data.report;
            order.reviewer = data.reviewer;
            if ((String.IsNullOrEmpty(data.StartTimeHour)) && (String.IsNullOrEmpty(data.StartTimeMinute)))
                order.start_time = null;
            else
                order.start_time = new TimeSpan(Convert.ToInt32(data.StartTimeHour), Convert.ToInt32(data.StartTimeMinute), 0);
            order.status = (byte)data.status;
            order.tc = (byte)(data.tc ? 1 : 0);
            order.update_user_id = (int)member.infoBySession("id");
            order.job_number = data.JobNumber;
            order.order_status = data.order_status;
            customerData.address1 = data.address1;
            customerData.address2 = data.address2;
            customerData.contact = data.contact;
            customerData.district1 = data.district1;
            customerData.district2 = data.district2;
            customerData.email = data.email;
            customerData.fax1 = data.fax1;
            customerData.fax2 = data.fax2;
            customerData.group_id = data.group_id;
            customerData.name = data.name;
            customerData.chi_name = data.chi_name;
            customerData.remark = data.remark;
            customerData.tel1 = data.tel1;
            customerData.tel2 = data.tel2;
            customerData.title = (byte)data.title;
            customerData.reference_number = data.customer_reference_number;

            //alter 故障內容
            if (!string.IsNullOrEmpty(order.fault))
            {
                int index1 = order.fault.IndexOf("[");
                int index2 = order.fault.IndexOf("]");
                if (index1 > -1 && index2 > -1)
                    order.fault = order.fault.Substring(index2 + 1);
            }

            if (order.completion_date.HasValue)
            {
                order.order_status = OrderStatus.WarrantyCompleted.ID;
                order.fault = "[" + OrderStatus.WarrantyCompleted.Name + "] " + order.fault;
            }
            else if (order.order_status == OrderStatus.DoingWarranty.ID)
            {
                order.fault = "[" + OrderStatus.DoingWarranty.Name + "] " + order.fault;
                order.order_status = OrderStatus.DoingWarranty.ID;
            }
            else if (order.order_status == OrderStatus.AppointedWarranty.ID)
            {
                order.fault = "[" + OrderStatus.AppointedWarranty.Name + "] " + order.fault;
                order.order_status = OrderStatus.AppointedWarranty.ID;
            }

            try
            {
                this._db.SaveChanges();
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, order);
                data.id = order.id;
                data.SaveResult.SavedSuccessfully = true;
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
        public ActionResult AddSave(QuotationRecord data)
        {
            Member member;
            recsys_customers masterCustomer;
            recsys_relate_customers customerData;
            recsys_quotation quotation;

            //# validation
            if (!String.IsNullOrEmpty(data.invoice) && data.dummy)
            {
                data.SaveResult.WarningMessage = "請刪除Invoice No或取消選取'有Dummy Invoice'";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (!String.IsNullOrEmpty(data.minor_work))
            {
                if (data.minor_work.Length > 3)
                {
                    data.SaveResult.WarningMessage = "請修改Minor Work至3字以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            //# validation
            if (data.MasterCustomerID < 0)
                throw new SystemException("Invalid Entity ID");

            //# get old master customer record
            masterCustomer = this._db.recsys_customers.FirstOrDefault(theCustomer => theCustomer.id == data.MasterCustomerID);

            //# validation
            if (masterCustomer == null)
                throw new RecordNotFoundException();

            member = new Member("users");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# mapping
            customerData = new recsys_relate_customers()
            {
                address1 = data.address1,
                address2 = data.address2,
                center = masterCustomer.center,
                code = masterCustomer.code,
                contact = data.contact,
                customer_code = masterCustomer.customer_code,
                customer_id = masterCustomer.id,
                district1 = data.district1,
                district2 = data.district2,
                email = data.email,
                fax1 = data.fax1,
                fax2 = data.fax2,
                group_id = data.group_id,
                manual_input_code = masterCustomer.manual_input_code,
                name = data.name,
                chi_name = data.chi_name,
                prefix = masterCustomer.prefix,
                relate_type = (int)Rec_System.Models.Customers.CustomerDataRelateType.Maintenance,
                reference_number = masterCustomer.reference_number,
                remark = data.remark,
                tel1 = data.tel1,
                tel2 = data.tel2,
                title = (byte)data.title,
                type = (byte)masterCustomer.type
            };

            this._db.recsys_relate_customers.AddObject(customerData);

            quotation = new recsys_quotation()
            {
                dummy = (byte)(data.dummy ? 1 : 0),
                dummy_date = DateChecking(data.dummy_date),
                initial = data.initial,
                lang = data.lang,
                order_number = data.order_number,
                number = data.number,
                subcon_estimation = data.subcon_estimation.HasValue ? data.subcon_estimation : 0.00,
                subcon_name = data.subcon_name,
                subcon_estimation2 = data.subcon_estimation2.HasValue ? data.subcon_estimation2 : 0.00,
                subcon_name2 = data.subcon_name2,
                subcon_estimation3 = data.subcon_estimation3.HasValue ? data.subcon_estimation3 : 0.00,
                subcon_name3 = data.subcon_name3,
                supervision = data.supervision.HasValue ? data.supervision : 0.00,
                supplier_name = data.supplier_name,
                supplier_name2 = data.supplier_name2,
                supplier_name3 = data.supplier_name3,
                supplier_estimation = data.supplier_estimation.HasValue ? data.supplier_estimation : 0.00,
                supplier_estimation2 = data.supplier_estimation2.HasValue ? data.supplier_estimation2 : 0.00,
                supplier_estimation3 = data.supplier_estimation3.HasValue ? data.supplier_estimation3 : 0.00,
                supplier_id = data.supplier_id.HasValue ? data.supplier_id : 0.00,
                material_estimation2 = data.material_estimation2.HasValue ? data.material_estimation2 : 0.00,
                material_estimation3 = data.material_estimation3.HasValue ? data.material_estimation3 : 0.00,
                payment_received_date = DateChecking(data.payment_received_date),
                tender_number = data.tender_number,
                direct_labour = data.direct_labour,
                direct_labour_cost = data.direct_labour_cost.HasValue ? data.direct_labour_cost : 0.00,
                billing_date = DateChecking(data.billing_date),
                confirm_date = DateChecking(data.confirm_date),
                create_date = DateTime.Now,
                invoice = data.invoice,
                invoice_date = DateChecking(data.billing_date),
                minor_work = data.minor_work,
                minor_work_currency = data.minor_work_currency.HasValue ? data.minor_work_currency : 0.00,
                gp = data.gp.HasValue ? data.gp : 0.00,
                last_update = DateTime.Now,
                remark = data.remark2,
                status = (byte)data.status,
                update_user_id = (int)member.infoBySession("id"),
                issue_date = DateChecking(data.issue_date)
            };

            this._db.recsys_quotation.AddObject(quotation);

            try
            {
                this._db.SaveChanges();

                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, customerData);
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, quotation);

                quotation.customer_id = customerData.id;

                this._db.SaveChanges();

                data.id = quotation.id;

                data.SaveResult.SavedSuccessfully = true;
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
        public ActionResult EditSave(QuotationRecord data)
        {
            recsys_quotation quotation;
            recsys_relate_customers customerData;

            //# validation
            if (data.id < 0)
                throw new SystemException("Invalid Entity ID");

            if (!String.IsNullOrEmpty(data.invoice) && data.dummy)
            {
                data.SaveResult.WarningMessage = "請刪除Invoice No或取消選取'有Dummy Invoice'";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (!String.IsNullOrEmpty(data.minor_work))
            {
                if (data.minor_work.Length > 3)
                {
                    data.SaveResult.WarningMessage = "請修改Minor Work至3字以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            //# get old record
            var records = from q in this._db.recsys_quotation
                          join c in this._db.recsys_relate_customers on q.customer_id equals c.id into cs
                          from c in cs.DefaultIfEmpty()
                          where q.id == data.id
                          select new
                          {
                              Quotation = q,
                              CustomerData = c
                          };
            var record = records.FirstOrDefault();

            Member member = new Member("users");

            //# validation
            if (record == null)
                throw new RecordNotFoundException();

            quotation = record.Quotation;
            customerData = record.CustomerData;

            //# validation
            if (quotation == null || customerData == null)
                throw new RecordNotFoundException();
            if (!quotation.last_update.HasValue)
                throw new ImproperDataException();
            if (quotation.last_update.Value > data.FetchRecordTime)
                throw new OptimisticConcurrencyException("資料已被其他使用者更新");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# saving
            //# mapping
            quotation.billing_date = DateChecking(data.billing_date);
            quotation.confirm_date = DateChecking(data.confirm_date);
            quotation.dummy = (byte)(data.dummy ? 1 : 0);
            quotation.dummy_date = DateChecking(data.dummy_date);
            quotation.initial = data.initial;
            quotation.invoice = data.invoice;
            quotation.invoice_date = DateChecking(data.billing_date);
            quotation.minor_work = data.minor_work;
            quotation.minor_work_currency = data.minor_work_currency.HasValue ? data.minor_work_currency : 0.00;
            quotation.gp = data.gp.HasValue ? data.gp : 0.0;
            quotation.lang = data.lang;
            quotation.last_update = DateTime.Now;
            quotation.order_number = data.order_number;
            quotation.number = data.number;
            quotation.remark = data.remark2;
            quotation.status = (byte)data.status;
            quotation.subcon_estimation = data.subcon_estimation.HasValue ? data.subcon_estimation : 0.00;
            quotation.subcon_name = data.subcon_name;
            quotation.subcon_estimation2 = data.subcon_estimation2.HasValue ? data.subcon_estimation2 : 0.00;
            quotation.subcon_name2 = data.subcon_name2;
            quotation.subcon_estimation3 = data.subcon_estimation3.HasValue ? data.subcon_estimation3 : 0.00;
            quotation.subcon_name3 = data.subcon_name3;
            quotation.supplier_name = data.supplier_name;
            quotation.supplier_name2 = data.supplier_name2;
            quotation.supplier_name3 = data.supplier_name3;
            quotation.supplier_estimation = data.supplier_estimation.HasValue ? data.supplier_estimation : 0.00;
            quotation.supplier_estimation2 = data.supplier_estimation2.HasValue ? data.supplier_estimation2 : 0.00;
            quotation.supplier_estimation3 = data.supplier_estimation3.HasValue ? data.supplier_estimation3 : 0.00;
            quotation.supervision = data.supervision.HasValue ? data.supervision : 0.00;
            quotation.supplier_id = data.supplier_id.HasValue ? data.supplier_id : 0.00;
            quotation.material_estimation2 = data.material_estimation2.HasValue ? data.material_estimation2 : 0.00;
            quotation.material_estimation3 = data.material_estimation3.HasValue ? data.material_estimation3 : 0.00;
            quotation.direct_labour = data.direct_labour;
            quotation.direct_labour_cost = data.direct_labour_cost.HasValue ? data.direct_labour_cost : 0.00;
            quotation.payment_received_date = DateChecking(data.payment_received_date);
            quotation.tender_number = data.tender_number;
            quotation.update_user_id = (int)member.infoBySession("id");
            quotation.issue_date = DateChecking(data.issue_date);
            customerData.address1 = data.address1;
            customerData.address2 = data.address2;
            customerData.contact = data.contact;
            customerData.district1 = data.district1;
            customerData.district2 = data.district2;
            customerData.email = data.email;
            customerData.fax1 = data.fax1;
            customerData.fax2 = data.fax2;
            customerData.group_id = data.group_id;
            customerData.name = data.name;
            customerData.chi_name = data.chi_name;
            customerData.remark = data.remark;
            customerData.tel1 = data.tel1;
            customerData.tel2 = data.tel2;
            customerData.title = (byte)data.title;

            try
            {
                this._db.SaveChanges();
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, quotation);
                data.id = quotation.id;
                data.SaveResult.SavedSuccessfully = true;
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
        public ActionResult EditSave(MaintenanceRecord data)
        {
            recsys_maintenance maintenance;
            recsys_relate_customers customerData;

            //# validation
            if (data.id < 0)
                throw new SystemException("Invalid Entity ID");

            //# get old record
            var records = from m in this._db.recsys_maintenance
                          join c in this._db.recsys_relate_customers on m.customer_id equals c.id into cs
                          from c in cs.DefaultIfEmpty()
                          where m.id == data.id
                          select new
                          {
                              Maintenance = m,
                              CustomerData = c
                          };
            var record = records.FirstOrDefault();

            Member member = new Member("users");

            //# validation
            if (record == null)
                throw new RecordNotFoundException();

            maintenance = record.Maintenance;
            customerData = record.CustomerData;

            //# validation
            if (maintenance == null || customerData == null)
                throw new RecordNotFoundException();
            if (!maintenance.last_update.HasValue)
                throw new ImproperDataException();
            if (maintenance.last_update.Value > data.FetchRecordTime)
                throw new OptimisticConcurrencyException("資料已被其他使用者更新");

            if (string.IsNullOrEmpty(data.start_date))
            {
                data.SaveResult.WarningMessage = "請填上開始日期";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }
            if (string.IsNullOrEmpty(data.end_date))
            {
                data.SaveResult.WarningMessage = "請填上完結日期";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (DateTime.ParseExact(data.end_date, "dd-MM-yyyy", null) < DateTime.ParseExact(data.start_date, "dd-MM-yyyy", null))
            {
                data.SaveResult.WarningMessage = "完結日期應在開始日期之後";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (!data.routine_id.HasValue)
            {
                data.SaveResult.WarningMessage = "請選擇Routine";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }
            if (!String.IsNullOrEmpty(data.chq_no))
            {
                if (data.chq_no.Length > 50)
                {
                    data.SaveResult.WarningMessage = "請修改Cheque No.至50字以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# saving
            //# mapping
            maintenance.amount = data.amount;
            maintenance.chq_no = data.chq_no;
            maintenance.chq_receive_date = DateChecking(data.chq_receive_date);
            maintenance.billing_date = DateChecking(data.billing_date);
            maintenance.checking_date = DateChecking(data.checking_date);
            maintenance.confirm_date = DateChecking(data.confirm_date);
            maintenance.end_date = DateChecking(data.end_date);
            maintenance.invoice = data.invoice;
            maintenance.invoice_date = DateChecking(data.invoice_date);
            maintenance.issue_date = DateChecking(data.issue_date);
            maintenance.last_update = DateTime.Now;
            maintenance.model = data.model;
            maintenance.payment = data.payment;
            maintenance.period = record.Maintenance.period;
            maintenance.printed = (byte)( data.printed ? 1 : 0);
            maintenance.first_print_Date = data.first_print_date;
            maintenance.schedule = data.schedule;
            maintenance.routine = data.routine;
            maintenance.routine2 = data.routine2;
            //# alter maintenance remark
            if (!string.IsNullOrEmpty(data.remark2))
            {
                int index1 = data.remark2.IndexOf("[");
                int index2 = data.remark2.IndexOf("]");
                if (index1 > -1 && index2 > -1)
                    data.remark2 = data.remark2.Substring(index2 + 1);
            }
            recsys_routine routine = null;
            if (data.routine_id != null)
            {
                routine = (from r in this._db.recsys_routine
                           where r.id == data.routine_id
                           select r).FirstOrDefault();
            }
            maintenance.remark = routine != null ? "[" + routine.description_chi + "]" + data.remark2 : data.remark2;
            maintenance.lang = data.lang;
            maintenance.start_date = DateChecking(data.start_date);
            maintenance.status = (byte) data.status;
            maintenance.update_user_id = (int)member.infoBySession("id");
            maintenance.master_routine_id = data.routine_id;
            customerData.address1 = data.address1;
            customerData.address2 = data.address2;
            customerData.contact = data.contact;
            customerData.district1 = data.district1;
            customerData.district2 = data.district2;
            customerData.email = data.email;
            customerData.fax1 = data.fax1;
            customerData.fax2 = data.fax2;
            customerData.group_id = data.group_id;
            customerData.name = data.name;
            customerData.chi_name = data.chi_name;
            customerData.remark = data.remark;
            customerData.tel1 = data.tel1;
            customerData.tel2 = data.tel2;
            customerData.title = (byte)data.title;

            try
            {
                this._db.SaveChanges();
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, maintenance);
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, customerData);

                bool generateOrderYet = data.auto_gen_order.HasValue ? data.auto_gen_order.Value : false;
                if (!generateOrderYet && !string.IsNullOrEmpty(data.confirm_date))
                {
                    IEnumerable<recsys_order> orders;

                    //# logic: create orders (定期保養)
                    if (this.TryGenerateOrdersForMaintenance(maintenance, this._db.recsys_routine.FirstOrDefault(theRoutine => theRoutine.id == maintenance.master_routine_id), out orders))
                    {
                        maintenance.period = orders.Count();
                        maintenance.auto_gen_order = true;

                        this._db.SaveChanges();
                        data.SaveResult.SavedSuccessfully = true;
                    }
                }

                data.id = maintenance.id;
                data.center = customerData.center;
                data.SaveResult.SavedSuccessfully = true;
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
        public ActionResult EditSave(ECallRecord data)
        {
            recsys_order ecall;
            recsys_relate_customers customerData;

            //# validation
            if (data.id < 0)
                throw new SystemException("Invalid Entity ID");

            int timeInt = 0;
            if (!String.IsNullOrEmpty(data.StartTimeHour))
            {
                if (!Int32.TryParse(data.StartTimeHour, out timeInt) || Convert.ToInt32(data.StartTimeHour) < 0 || Convert.ToInt32(data.StartTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!Int32.TryParse(data.StartTimeMinute, out timeInt) || !String.IsNullOrEmpty(data.StartTimeMinute))
            {
                if (Convert.ToInt32(data.StartTimeMinute) < 0 || Convert.ToInt32(data.StartTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改開始時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!Int32.TryParse(data.EndTimeHour, out timeInt) || !String.IsNullOrEmpty(data.EndTimeHour))
            {
                if (Convert.ToInt32(data.EndTimeHour) < 0 || Convert.ToInt32(data.EndTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!Int32.TryParse(data.EndTimeMinute, out timeInt) || !String.IsNullOrEmpty(data.EndTimeMinute))
            {
                if (Convert.ToInt32(data.EndTimeMinute) < 0 || Convert.ToInt32(data.EndTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改結束時間";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }
            if (!String.IsNullOrEmpty(data.repair_date) && !String.IsNullOrEmpty(data.CompleteDate))
            {
                if (DateTime.ParseExact(data.CompleteDate, "dd-MM-yyyy", null) < DateTime.ParseExact(data.repair_date, "dd-MM-yyyy", null))
                {
                    data.SaveResult.WarningMessage = "完成日期應在維修日期之後";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            //# get old record
            var records = from e in this._db.recsys_order
                          join c in this._db.recsys_relate_customers on e.customer_id equals c.id into cs
                          from c in cs.DefaultIfEmpty()
                          where e.id == data.id
                          select new
                          {
                              ECall = e,
                              CustomerData = c
                          };
            var record = records.FirstOrDefault();

            Member member = new Member("users");

            //# validation
            if (record == null)
                throw new RecordNotFoundException();

            ecall = record.ECall;
            customerData = record.CustomerData;

            //# validation
            if (ecall == null || customerData == null)
                throw new RecordNotFoundException();
            if (!ecall.last_update.HasValue)
                throw new ImproperDataException();
            if (ecall.last_update.Value > data.FetchRecordTime)
                throw new OptimisticConcurrencyException("資料已被其他使用者更新");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }
            //check range of time input
            if (data.StartTimeHour != null)
            {
                if (Convert.ToInt32(data.StartTimeHour) < 0 || Convert.ToInt32(data.StartTimeHour) > 23)
                {
                    data.SaveResult.WarningMessage = "請修改至0-23以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }

            }
            if (data.StartTimeMinute != null)
            {
                if (Convert.ToInt32(data.StartTimeMinute) < 0 || Convert.ToInt32(data.StartTimeMinute) > 59)
                {
                    data.SaveResult.WarningMessage = "請修改至0-59以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }

            }

            //# saving
            //# mapping
            ecall.by_system = 0;
            ecall.call_pickup_user_id = data.call_pickup_user_id;
            ecall.completion_date = DateChecking(data.CompleteDate);
            if ((string.IsNullOrEmpty(data.EndTimeHour)) && (string.IsNullOrEmpty(data.EndTimeMinute)))
            {
                ecall.end_time = null;
            }
            else
            {
                ecall.end_time = new TimeSpan(Convert.ToInt32(data.EndTimeHour), Convert.ToInt32(data.EndTimeMinute), 0);
            }
            ecall.engineer_id_1 = data.engineer_id_1;
            ecall.engineer_id_2 = data.engineer_id_2;
            ecall.engineer_id_3 = data.engineer_id_3;
            ecall.engineer_id_4 = data.engineer_id_4;
            ecall.fault = data.fault;
            ecall.last_update = DateTime.Now;
            ecall.model = data.model;
            ecall.remark = data.remark2;
            ecall.repair = data.repair;
            ecall.repair_date = DateChecking(data.repair_date);
            ecall.report = data.report;
            ecall.reviewer = data.reviewer;
            if ((string.IsNullOrEmpty(data.StartTimeHour)) && (string.IsNullOrEmpty(data.StartTimeMinute)))
            {
                ecall.start_time = null;
            }
            else
            {
                ecall.start_time = new TimeSpan(Convert.ToInt32(data.StartTimeHour), Convert.ToInt32(data.StartTimeMinute), 0);
            }
            ecall.status = (byte) data.status;
            ecall.tc = (byte) (data.tc ? 1 : 0);
            ecall.update_user_id = (int)member.infoBySession("id");
            ecall.job_number = data.JobNumber;
            ecall.order_status = ecall.completion_date.HasValue ? 3 : (ecall.repair_date.HasValue ? 2 : 1);
            customerData.address1 = data.address1;
            customerData.address2 = data.address2;
            customerData.contact = data.contact;
            customerData.district1 = data.district1;
            customerData.district2 = data.district2;
            customerData.email = data.email;
            customerData.fax1 = data.fax1;
            customerData.fax2 = data.fax2;
            customerData.group_id = data.group_id;
            customerData.name = data.name;
            customerData.chi_name = data.chi_name;
            customerData.remark = data.remark;
            customerData.tel1 = data.tel1;
            customerData.tel2 = data.tel2;
            customerData.title = (byte)data.title;

            try
            {
                this._db.SaveChanges();
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, ecall);
                data.id = ecall.id;
                data.SaveResult.SavedSuccessfully = true;
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
        public ActionResult AddSave(MaintenanceRecord data)
        {
            //# validation
            if (string.IsNullOrEmpty(data.start_date))
            {
                data.SaveResult.WarningMessage = "請填上開始日期";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }
            if (string.IsNullOrEmpty(data.end_date))
            {
                data.SaveResult.WarningMessage = "請填上完結日期";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }
            if (DateTime.ParseExact(data.end_date, "dd-MM-yyyy", null) < DateTime.ParseExact(data.start_date, "dd-MM-yyyy", null))
            {
                data.SaveResult.WarningMessage = "完結日期應在開始日期之後";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (!data.routine_id.HasValue)
            {
                data.SaveResult.WarningMessage = "請選擇Routine";
                data.SaveResult.SavedSuccessfully = false;
                return Json(data);
            }

            if (!String.IsNullOrEmpty(data.chq_no))
            {
                if (data.chq_no.Length > 50)
                {
                    data.SaveResult.WarningMessage = "請修改Cheque No.至50字以內";
                    data.SaveResult.SavedSuccessfully = false;
                    return Json(data);
                }
            }

            Member member;
            recsys_customers masterCustomer;
            recsys_relate_customers customerData;
            recsys_maintenance maintenance;

            //# validation
            if (data.MasterCustomerID < 0)
                throw new SystemException("Invalid Entity ID");

            //# get old master customer record
            masterCustomer = this._db.recsys_customers.FirstOrDefault(theCustomer => theCustomer.id == data.MasterCustomerID);

            //# validation
            if (masterCustomer == null)
                throw new RecordNotFoundException();

            member = new Member("users");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    data.district2 = workingDistrict.id;
                    data.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.WorkingDistrictName.Trim(),
                    name = data.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district2 = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(data.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(data.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    data.district1 = mailingDistrict.id;
                    data.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = data.MailingDistrictName.Trim(),
                    name = data.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                data.district1 = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().id;
                data.group_id = this._db.recsys_district.Where(x => x.name.Equals(data.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            //# mapping
            customerData = new recsys_relate_customers()
            {
                address1 = data.address1,
                address2 = data.address2,
                center = masterCustomer.center,
                code = masterCustomer.code,
                contact = data.contact,
                customer_code = masterCustomer.customer_code,
                customer_id = masterCustomer.id,
                district1 = data.district1,
                district2 = data.district2,
                email = data.email,
                fax1 = data.fax1,
                fax2 = data.fax2,
                group_id = data.group_id,
                manual_input_code = masterCustomer.manual_input_code,
                name = data.name,
                chi_name = data.chi_name,
                prefix = masterCustomer.prefix,
                relate_type = (int) Rec_System.Models.Customers.CustomerDataRelateType.Maintenance,
                reference_number = masterCustomer.reference_number,
                remark = data.remark,
                tel1 = data.tel1,
                tel2 = data.tel2,
                title = (byte) data.title,
                type = (byte) masterCustomer.type
            };

            this._db.recsys_relate_customers.AddObject(customerData);
            recsys_routine routine = null;
            if (data.routine_id != null)
            {
                routine = (from r in this._db.recsys_routine
                              where r.id == data.routine_id
                              select r).FirstOrDefault();
            }
            maintenance = new recsys_maintenance()
            {
                amount = data.amount,
                chq_no = data.chq_no,
                chq_receive_date = DateChecking(data.chq_receive_date),
                billing_date = DateChecking(data.billing_date),
                checking_date = DateChecking(data.checking_date),
                confirm_date = DateChecking(data.confirm_date),
                create_date = DateTime.Now,
                end_date = DateChecking(data.end_date),
                invoice = data.invoice,
                invoice_date = DateChecking(data.invoice_date),
                issue_date = DateChecking(data.issue_date),
                last_update = DateTime.Now,
                model = data.model,
                routine = data.routine,
                routine2 = data.routine2,
                lang = data.lang,
                payment = data.payment,
                period = data.period,
                printed = (byte)(data.printed ? 1 : 0),
                remark = routine != null ? "[" + routine.description_chi + "]" + data.remark2 : data.remark2,
                schedule = data.schedule,
                start_date = DateChecking(data.start_date),
                status = (byte)data.status,
                update_user_id = (int)member.infoBySession("id"),
                master_routine_id = data.routine_id
            };

            this._db.recsys_maintenance.AddObject(maintenance);

            try
            {
                this._db.SaveChanges();

                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, customerData);
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, maintenance);

                maintenance.customer_id = customerData.id;

                this._db.SaveChanges();

                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, maintenance);

                data.id = maintenance.id;
                data.center = customerData.center;

                bool generateOrderYet = data.auto_gen_order.HasValue ? data.auto_gen_order.Value : false;
                if (!generateOrderYet && !string.IsNullOrEmpty(data.confirm_date))
                {
                    IEnumerable<recsys_order> orders;

                    //# logic: create orders (定期保養)
                    if (this.TryGenerateOrdersForMaintenance(maintenance, this._db.recsys_routine.FirstOrDefault(theRoutine => theRoutine.id == maintenance.master_routine_id), out orders))
                    {
                        maintenance.period = orders.Count();
                        maintenance.auto_gen_order = true;

                        this._db.SaveChanges();
                        data.SaveResult.SavedSuccessfully = true;
                    }
                }
                else
                {
                    data.SaveResult.SavedSuccessfully = true;
                }
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(data);
        }
Beispiel #8
0
 /// <summary>
 /// Deprecated Method for adding a new object to the recsys_district EntitySet. Consider using the .Add method of the associated ObjectSet&lt;T&gt; property instead.
 /// </summary>
 public void AddTorecsys_district(recsys_district recsys_district)
 {
     base.AddObject("recsys_district", recsys_district);
 }
Beispiel #9
0
 /// <summary>
 /// Create a new recsys_district object.
 /// </summary>
 /// <param name="id">Initial value of the id property.</param>
 /// <param name="group_id">Initial value of the group_id property.</param>
 /// <param name="region">Initial value of the region property.</param>
 /// <param name="name">Initial value of the name property.</param>
 /// <param name="status">Initial value of the status property.</param>
 public static recsys_district Createrecsys_district(global::System.Int32 id, global::System.Int32 group_id, global::System.Byte region, global::System.String name, global::System.Byte status)
 {
     recsys_district recsys_district = new recsys_district();
     recsys_district.id = id;
     recsys_district.group_id = group_id;
     recsys_district.region = region;
     recsys_district.name = name;
     recsys_district.status = status;
     return recsys_district;
 }
        public ActionResult EditSave(CustomerRecord model)
        {
            //# validation
            if (model.id < 0)
                throw new SystemException("Invalid Entity ID");

            if (!String.IsNullOrEmpty(model.name))
            {
                if (model.name.Length > 250)
                {
                    model.SaveResult.WarningMessage = "請修改客戶英文名稱至250字以內";
                    model.SaveResult.SavedSuccessfully = false;
                    return Json(model);
                }
            }
            else
            {
                model.SaveResult.WarningMessage = "請輸入客戶英文名稱";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (!String.IsNullOrEmpty(model.chi_name))
            {
                if (model.chi_name.Length > 250)
                {
                    model.SaveResult.WarningMessage = "請修改客戶中文名稱至250字以內";
                    model.SaveResult.SavedSuccessfully = false;
                    return Json(model);
                }
            }
            else
            {
                model.SaveResult.WarningMessage = "請輸入客戶中文名稱";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (String.IsNullOrEmpty(model.address1))
            {
                model.SaveResult.WarningMessage = "請輸入郵寄地址";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (String.IsNullOrEmpty(model.MailingDistrictName))
            {
                model.SaveResult.WarningMessage = "請輸入郵寄地址地區";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            //# get old record
            recsys_customers record = this._db.recsys_customers.FirstOrDefault(theCustomer => theCustomer.id == model.id);
            Member member = new Member("users");

            //# validation
            if (record == null)
                throw new RecordNotFoundException();
            if (!record.last_update.HasValue)
                throw new ImproperDataException();
            if (model.FetchRecordTime.CompareTo(record.last_update.Value) < 0)
                throw new OptimisticConcurrencyException("資料已被其他使用者更新");

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(model.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(model.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    model.district2 = workingDistrict.id;
                    model.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = model.WorkingDistrictName.Trim(),
                    name = model.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                model.district2 = this._db.recsys_district.Where(x => x.name.Equals(model.WorkingDistrictName.Trim())).SingleOrDefault().id;
                model.group_id = this._db.recsys_district.Where(x => x.name.Equals(model.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;

            if (!string.IsNullOrEmpty(model.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(model.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    model.district1 = mailingDistrict.id;
                    model.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = model.MailingDistrictName.Trim(),
                    name = model.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                model.district1 = this._db.recsys_district.Where(x => x.name.Equals(model.MailingDistrictName.Trim())).SingleOrDefault().id;
                model.group_id = this._db.recsys_district.Where(x => x.name.Equals(model.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            DateTime nowRef = DateTime.Now;

            //# saving
            //# mapping
            record.address1 = model.address1 ?? "";
            record.address2 = model.address2 ?? "";
            record.center = model.center;
            record.code = model.code;
            record.manual_input_code = model.manual_input_code;
            record.contact = model.contact ?? "";
            record.district1 = model.district1;
            record.district2 = model.district2;
            record.email = model.email ?? "";
            record.fax1 = model.fax1 ?? "";
            record.fax2 = model.fax2 ?? "";
            record.group_id = model.group_id;
            record.id = model.id;
            record.last_update = nowRef.AddMilliseconds(-nowRef.Millisecond);
            record.name = model.name ?? "";
            record.chi_name = model.chi_name ?? "";
            record.prefix = model.prefix ?? "";
            record.reference_number = model.reference_number ?? "";
            record.remark = model.remark ?? "";
            record.status = (byte)(model.status.HasValue ? model.status.Value : 0);
            record.tel1 = model.tel1 ?? "";
            record.tel2 = model.tel2 ?? "";
            record.title = (byte)(model.title.HasValue ? model.title.Value : 0);
            record.type = (byte)(model.type.HasValue ? model.type.Value : 0);
            record.update_user_id = (int)member.infoBySession("id");

            #region Business Logic
            this.CustomerBusinessLogicProcessing(ref record, model.Mode);
            #endregion

            try
            {
                this._db.SaveChanges();
                model.SaveResult.SavedSuccessfully = true;
            }
            catch(OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(model);
        }
        public ActionResult AddSave(CustomerRecord model)
        {
            Member member = new Member("users");

            //check customer code duplicate
            if (model.type.HasValue)
            {
                if (model.type == (int)CustomerType.Others)
                {
                    string customer_code = model.prefix + model.manual_input_code;
                    var result = this._db.recsys_customers.Where(x => x.customer_code.ToUpper().Equals(customer_code.ToUpper())).SingleOrDefault();

                    if (result != null)
                    {
                        model.SaveResult.WarningMessage = "客戶編號重覆";
                        model.SaveResult.SavedSuccessfully = false;
                        return Json(model);
                    }
                }
            }

            if (!String.IsNullOrEmpty(model.name))
            {
                if (model.name.Length > 250)
                {
                    model.SaveResult.WarningMessage = "請修改客戶英文名稱至250字以內";
                    model.SaveResult.SavedSuccessfully = false;
                    return Json(model);
                }
            }
            else
            {
                model.SaveResult.WarningMessage = "請輸入客戶英文名稱";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (!String.IsNullOrEmpty(model.chi_name))
            {
                if (model.chi_name.Length > 250)
                {
                    model.SaveResult.WarningMessage = "請修改客戶中文名稱至250字以內";
                    model.SaveResult.SavedSuccessfully = false;
                    return Json(model);
                }
            }
            else
            {
                model.SaveResult.WarningMessage = "請輸入客戶中文名稱";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (String.IsNullOrEmpty(model.address1))
            {
                model.SaveResult.WarningMessage = "請輸入郵寄地址";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            if (String.IsNullOrEmpty(model.MailingDistrictName))
            {
                model.SaveResult.WarningMessage = "請輸入郵寄地址地區";
                model.SaveResult.SavedSuccessfully = false;
                return Json(model);
            }

            bool createNewDistrict = false;
            if (!string.IsNullOrEmpty(model.WorkingDistrictName))
            {
                recsys_district workingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(model.WorkingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (workingDistrict != null)
                {
                    model.district2 = workingDistrict.id;
                    model.group_id = workingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = model.WorkingDistrictName.Trim(),
                    name = model.WorkingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                model.district2 = this._db.recsys_district.Where(x => x.name.Equals(model.WorkingDistrictName.Trim())).SingleOrDefault().id;
                model.group_id = this._db.recsys_district.Where(x => x.name.Equals(model.WorkingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            createNewDistrict = false;
            if (!string.IsNullOrEmpty(model.MailingDistrictName))
            {
                recsys_district mailingDistrict = this._db.recsys_district.Where(x => x.name.Trim().ToUpper().Equals(model.MailingDistrictName.Trim().ToUpper())).SingleOrDefault();
                if (mailingDistrict != null)
                {
                    model.district1 = mailingDistrict.id;
                    model.group_id = mailingDistrict.group_id;
                }
                else
                    createNewDistrict = true;
            }

            if (createNewDistrict)
            {
                recsys_district addNewDistrict = new recsys_district()
                {
                    code = model.MailingDistrictName.Trim(),
                    name = model.MailingDistrictName.Trim(),
                    group_id = this._db.recsys_group.Where(x => x.name.Equals("Unknown Group For System Migration")).SingleOrDefault().id,
                    region = 4,
                    status = 1,
                    last_update = DateTime.Now,
                    update_user_id = (int)member.infoBySession("id")
                };

                this._db.recsys_district.AddObject(addNewDistrict);
                this._db.SaveChanges();

                model.district1 = this._db.recsys_district.Where(x => x.name.Equals(model.MailingDistrictName.Trim())).SingleOrDefault().id;
                model.group_id = this._db.recsys_district.Where(x => x.name.Equals(model.MailingDistrictName.Trim())).SingleOrDefault().group_id;
            }

            DateTime nowRef = DateTime.Now;
            //# mapping
            recsys_customers newCustomer = new recsys_customers()
            {
                address1 = model.address1 ?? "",
                address2 = model.address2 ?? "",
                code = model.code,
                contact = model.contact ?? "",
                create_date = nowRef,
                last_update = nowRef.AddMilliseconds(-nowRef.Millisecond),
                center = model.center,
                manual_input_code = model.manual_input_code ?? "",
                district1 = model.district1,
                district2 = model.district2,
                email = model.email ?? "",
                fax1 = model.fax1 ?? "",
                fax2 = model.fax2 ?? "",
                group_id = model.group_id,
                name = model.name ?? "",
                chi_name = model.chi_name ?? "",
                prefix = model.prefix ?? "",
                remark = model.remark ?? "",
                reference_number = model.reference_number ?? "",
                status = (byte)(model.status.HasValue ? model.status.Value : 1),
                tel1 = model.tel1 ?? "",
                tel2 = model.tel2 ?? "",
                title = (byte)(model.title.HasValue ? model.title.Value : 0),
                type = (byte)(model.type.HasValue ? model.type.Value : 0),
                update_user_id = (int) member.infoBySession("id")
            };

            #region Business Logic
            this.CustomerBusinessLogicProcessing(ref newCustomer, model.Mode);
            #endregion

            try
            {
                this._db.recsys_customers.AddObject(newCustomer);
                this._db.SaveChanges();
                this._db.Refresh(System.Data.Objects.RefreshMode.StoreWins, newCustomer);

                model.SaveResult.SavedSuccessfully = true;
                model.id = newCustomer.id;
                model.Mode = PageMode.Edit;         //# after inserted successfully, switch to edit mode
            }
            catch (OptimisticConcurrencyException)
            {
                //# log down
            }

            return Json(model);
        }