コード例 #1
0
        public static String TerminationReason(this CourseContractRevision item)
        {
            StringBuilder sb = new StringBuilder();

            if (item.CauseForEnding.HasValue)
            {
                sb.Append((Naming.CauseForEnding)item.CauseForEnding);
            }
            if (item.CourseContract.Remark != null)
            {
                sb.Append($"({item.CourseContract.Remark})");
            }

            return(sb.ToString());
        }
コード例 #2
0
        public static void ProcessContractTransference(this CourseContractRevision item)
        {
            ThreadPool.QueueUserWorkItem(t =>
            {
                try
                {
                    using (var models = new ModelSource <UserProfile>())
                    {
                        item = models.GetTable <CourseContractRevision>()
                               .Where(r => r.RevisionID == item.RevisionID).First();
                        ///1.變更狀態
                        ///
                        item.SourceContract.Status        = (int)Naming.CourseContractStatus.已轉讓;
                        item.SourceContract.ValidTo       = DateTime.Now;
                        item.CourseContract.EffectiveDate = DateTime.Now;
                        foreach (var lesson in item.SourceContract.RegisterLessonContract)
                        {
                            lesson.RegisterLesson.Attended = (int)Naming.LessonStatus.課程結束;
                        }
                        ///2.回沖繳款餘額
                        ///
                        var balance             = item.SourceContract.TotalPaidAmount() - item.SourceContract.TotalCost / item.SourceContract.Lessons * (item.SourceContract.Lessons - item.SourceContract.RemainedLessonCount());
                        Payment balancedPayment = null;
                        if (balance > 0)
                        {
                            var dummyInvoice = models.GetTable <InvoiceItem>().Where(i => i.No == "--").FirstOrDefault();

                            balancedPayment = new Payment
                            {
                                Status             = (int)Naming.CourseContractStatus.已生效,
                                ContractPayment    = new ContractPayment {
                                },
                                PaymentTransaction = new PaymentTransaction
                                {
                                    BranchID = item.SourceContract.CourseContractExtension.BranchID
                                },
                                PaymentAudit    = new Models.DataEntity.PaymentAudit {
                                },
                                PayoffAmount    = -balance,
                                PayoffDate      = DateTime.Today,
                                Remark          = $"轉讓",
                                HandlerID       = item.CourseContract.AgentID,
                                PaymentType     = "現金",
                                TransactionType = (int)Naming.PaymentTransactionType.合約轉讓沖銷
                            };
                            balancedPayment.ContractPayment.ContractID = item.OriginalContract.Value;
                            if (dummyInvoice != null)
                            {
                                balancedPayment.InvoiceID = dummyInvoice.InvoiceID;
                            }
                            models.GetTable <Payment>().InsertOnSubmit(balancedPayment);

                            models.GetTable <ContractTrustTrack>().InsertOnSubmit(new ContractTrustTrack
                            {
                                ContractID = item.OriginalContract.Value,
                                EventDate  = balancedPayment.PayoffDate.Value,
                                Payment    = balancedPayment,
                                TrustType  = Naming.TrustType.X.ToString()
                            });
                        }

                        models.SubmitChanges();

                        ///3.產生新合約
                        ///
                        var contract = models.InitiateCourseContract(
                            new CourseContractViewModel
                        {
                            ContractType = (CourseContractType.ContractTypeDefinition)item.SourceContract.ContractType,
                            Subject      = item.SourceContract.Subject,
                            OwnerID      = item.CourseContract.CourseContractMember.First().UID,
                            Lessons      = item.SourceContract.RemainedLessonCount(),
                            PriceID      = item.SourceContract.PriceID,
                            Remark       = String.Concat("原合約編號 ", item.SourceContract.ContractNo(), "剩餘上課堂數:",
                                                         item.SourceContract.RemainedLessonCount(), " 堂,轉讓至此合約"),
                            FitnessConsultant = item.CourseContract.FitnessConsultant,
                            UID     = item.CourseContract.CourseContractMember.Select(m => m.UID).ToArray(),
                            Version = (Naming.ContractVersion?)item.SourceContract.CourseContractExtension.Version,
                        },
                            item.CourseContract.ContractAgent, item.SourceContract.LessonPriceType);
                        contract.CourseContractExtension.RevisionTrackingID = item.RevisionID;

                        ///4.回存轉讓餘額
                        ///
                        if (balancedPayment != null)
                        {
                            balancedPayment = new Payment
                            {
                                Status          = (int)Naming.CourseContractStatus.已生效,
                                ContractPayment = new ContractPayment
                                {
                                    CourseContract = contract
                                },
                                PaymentTransaction = new PaymentTransaction
                                {
                                    BranchID = item.SourceContract.CourseContractExtension.BranchID
                                },
                                PaymentAudit    = new Models.DataEntity.PaymentAudit {
                                },
                                PayoffAmount    = balance,
                                PayoffDate      = DateTime.Today,
                                Remark          = $"轉讓({item.SourceContract.ContractNo()})",
                                HandlerID       = item.CourseContract.AgentID,
                                PaymentType     = "現金",
                                TransactionType = (int)Naming.PaymentTransactionType.合約轉讓餘額,
                                InvoiceID       = balancedPayment.InvoiceID
                            };
                            models.GetTable <Payment>().InsertOnSubmit(balancedPayment);

                            models.GetTable <ContractTrustTrack>().InsertOnSubmit(new ContractTrustTrack
                            {
                                ContractID = contract.ContractID,
                                EventDate  = balancedPayment.PayoffDate.Value,
                                Payment    = balancedPayment,
                                TrustType  = Naming.TrustType.T.ToString()
                            });

                            models.SubmitChanges();
                        }
                    }
                }
                catch (Exception ex)
                {
                    ApplicationLogging.LoggerFactory.CreateLogger(typeof(TaskExtensionMethods))
                    .LogError(ex, ex.Message);
                }
            });
        }
コード例 #3
0
        public static void ProcessContractQuickTermination(this CourseContractRevision item, UserProfile handler = null)
        {
            ThreadPool.QueueUserWorkItem(t =>
            {
                try
                {
                    using (var models = new ModelSource <UserProfile>())
                    {
                        item = models.GetTable <CourseContractRevision>()
                               .Where(r => r.RevisionID == item.RevisionID).First();
                        ///1.變更狀態
                        ///
                        item.SourceContract.Status        = (int)Naming.CourseContractStatus.已終止;
                        item.SourceContract.ValidTo       = DateTime.Now;
                        item.CourseContract.EffectiveDate = DateTime.Now;
                        foreach (var lesson in item.SourceContract.RegisterLessonContract)
                        {
                            lesson.RegisterLesson.Attended = (int)Naming.LessonStatus.課程結束;
                        }
                        ///2.回沖繳款餘額
                        ///
                        var original  = item.SourceContract;
                        var totalPaid = original.TotalPaidAmount();
                        if (totalPaid > 0)
                        {
                            int?returnAmt;
                            if (original.ContractType == (int)CourseContractType.ContractTypeDefinition.CGA)
                            {
                                var lessons = original.CountableRegisterLesson();
                                returnAmt   = totalPaid
                                              - lessons.Where(r => r.LessonPriceType.IsDietaryConsult)
                                              .Sum(r => r.LessonPriceType.ListPrice * r.LessonTime.Count)
                                              - lessons.Where(r => !r.LessonPriceType.IsDietaryConsult)
                                              .Sum(r => r.LessonPriceType.ListPrice * r.LessonTime.Count);
                            }
                            else
                            {
                                var remained   = original.RemainedLessonCount();
                                var calculated = original.Lessons - remained;
                                returnAmt      = totalPaid - calculated
                                                 * original.LessonPriceType.ListPrice
                                                 * original.CourseContractType.GroupingMemberCount
                                                 * original.CourseContractType.GroupingLessonDiscount.PercentageOfDiscount / 100;
                            }

                            var dummyInvoice        = models.GetTable <InvoiceItem>().Where(i => i.No == "--").FirstOrDefault();
                            Payment balancedPayment = null;
                            balancedPayment         = new Payment
                            {
                                Status             = (int)Naming.CourseContractStatus.已生效,
                                ContractPayment    = new ContractPayment {
                                },
                                PaymentTransaction = new PaymentTransaction
                                {
                                    BranchID = item.SourceContract.CourseContractExtension.BranchID
                                },
                                PaymentAudit     = new Models.DataEntity.PaymentAudit {
                                },
                                PayoffAmount     = -returnAmt,
                                PayoffDate       = DateTime.Today,
                                Remark           = "終止退款",
                                HandlerID        = handler != null ? handler.UID : item.CourseContract.AgentID,
                                PaymentType      = "現金",
                                TransactionType  = (int)Naming.PaymentTransactionType.合約終止沖銷,
                                AdjustmentAmount = returnAmt,
                            };
                            balancedPayment.ContractPayment.ContractID = item.OriginalContract.Value;
                            if (dummyInvoice != null)
                            {
                                balancedPayment.InvoiceID = dummyInvoice.InvoiceID;
                            }
                            models.GetTable <Payment>().InsertOnSubmit(balancedPayment);

                            if (models.GetTable <ContractTrustTrack>().Any(a => a.ContractID == item.OriginalContract))
                            {
                                models.GetTable <ContractTrustTrack>().InsertOnSubmit(new ContractTrustTrack
                                {
                                    ContractID   = item.OriginalContract.Value,
                                    EventDate    = balancedPayment.PayoffDate.Value,
                                    TrustType    = Naming.TrustType.S.ToString(),
                                    ReturnAmount = returnAmt,
                                });
                            }
                        }

                        models.SubmitChanges();
                        original.TerminateRegisterLesson(models);
                    }
                }
                catch (Exception ex)
                {
                    ApplicationLogging.LoggerFactory.CreateLogger(typeof(TaskExtensionMethods))
                    .LogError(ex, ex.Message);
                }
            });
        }
コード例 #4
0
        public static void ProcessContractTermination(this CourseContractRevision item, UserProfile handler = null)
        {
            ThreadPool.QueueUserWorkItem(t =>
            {
                try
                {
                    using (var models = new ModelSource <UserProfile>())
                    {
                        item = models.GetTable <CourseContractRevision>()
                               .Where(r => r.RevisionID == item.RevisionID).First();
                        ///1.變更狀態
                        ///
                        item.SourceContract.Status        = (int)Naming.CourseContractStatus.已終止;
                        item.SourceContract.ValidTo       = DateTime.Now;
                        item.CourseContract.EffectiveDate = DateTime.Now;
                        foreach (var lesson in item.SourceContract.RegisterLessonContract)
                        {
                            lesson.RegisterLesson.Attended = (int)Naming.LessonStatus.課程結束;
                        }
                        ///2.回沖繳款餘額
                        ///
                        var original  = item.SourceContract;
                        var totalPaid = original.TotalPaidAmount();
                        if (totalPaid > 0)
                        {
                            int refund;
                            int?returnAmt;

                            if (original.ContractType == (int)CourseContractType.ContractTypeDefinition.CGA)
                            {
                                var lessons = original.CountableRegisterLesson();

                                returnAmt = totalPaid
                                            - lessons.Where(r => r.LessonPriceType.IsDietaryConsult)
                                            .Sum(r => r.LessonPriceType.ListPrice * r.LessonTime.Count)
                                            - lessons.Where(r => !r.LessonPriceType.IsDietaryConsult)
                                            .Sum(r => r.LessonPriceType.ListPrice * r.LessonTime.Count);

                                refund = totalPaid
                                         - (item.ProcessingFee ?? 0)
                                         - (lessons.Select(r => r.LessonPriceType)
                                            .Where(l => l.IsDietaryConsult).Sum(l => l.ListPrice * l.BundleCount) ?? 0)
                                         - (lessons.Where(r => !r.LessonPriceType.IsDietaryConsult)
                                            .Sum(r => item.CourseContract.CourseContractExtension.SettlementPrice * r.LessonTime.Count) ?? 0);
                            }
                            else
                            {
                                var remained   = original.RemainedLessonCount();
                                var calculated = original.Lessons - remained;
                                returnAmt      = totalPaid - calculated
                                                 * original.LessonPriceType.ListPrice
                                                 * original.CourseContractType.GroupingMemberCount
                                                 * original.CourseContractType.GroupingLessonDiscount.PercentageOfDiscount / 100;

                                refund = totalPaid
                                         - (item.ProcessingFee ?? 0)
                                         - (calculated
                                            * item.CourseContract.CourseContractExtension.SettlementPrice
                                            * original.CourseContractType.GroupingMemberCount
                                            * original.CourseContractType.GroupingLessonDiscount.PercentageOfDiscount / 100 ?? 0);
                            }

                            refund         = Math.Max(refund, 0);
                            var adjustment = returnAmt - refund;

                            var dummyInvoice        = models.GetTable <InvoiceItem>().Where(i => i.No == "--").FirstOrDefault();
                            Payment balancedPayment = null;
                            balancedPayment         = new Payment
                            {
                                Status             = (int)Naming.CourseContractStatus.已生效,
                                ContractPayment    = new ContractPayment {
                                },
                                PaymentTransaction = new PaymentTransaction
                                {
                                    BranchID = item.SourceContract.CourseContractExtension.BranchID
                                },
                                PaymentAudit     = new Models.DataEntity.PaymentAudit {
                                },
                                PayoffAmount     = -refund,
                                PayoffDate       = DateTime.Today,
                                Remark           = "終止退款",
                                HandlerID        = handler != null ? handler.UID : item.CourseContract.AgentID,
                                PaymentType      = "現金",
                                TransactionType  = (int)Naming.PaymentTransactionType.合約終止沖銷,
                                AdjustmentAmount = adjustment != 0 ? adjustment : (int?)null,
                            };
                            balancedPayment.ContractPayment.ContractID = item.OriginalContract.Value;
                            if (dummyInvoice != null)
                            {
                                balancedPayment.InvoiceID = dummyInvoice.InvoiceID;
                            }
                            models.GetTable <Payment>().InsertOnSubmit(balancedPayment);

                            if (models.GetTable <ContractTrustTrack>().Any(a => a.ContractID == item.OriginalContract))
                            {
                                models.GetTable <ContractTrustTrack>().InsertOnSubmit(new ContractTrustTrack
                                {
                                    ContractID   = item.OriginalContract.Value,
                                    EventDate    = balancedPayment.PayoffDate.Value,
                                    TrustType    = Naming.TrustType.S.ToString(),
                                    ReturnAmount = returnAmt,
                                });
                            }

                            if (refund > 0)
                            {
                                //Logger.Debug("RevisionID: " + item.RevisionID);
                                //Logger.Debug("balance: " + balance);
                                models.CreateAllowanceForContract(original, refund, handler);
                            }
                        }

                        models.SubmitChanges();
                        original.TerminateRegisterLesson(models);
                    }
                }
                catch (Exception ex)
                {
                    Logger.Error("終止失敗:\r\n" + ex);
                }
            });
        }