예제 #1
0
        private async Task <BillingDivisionContract> PrepareDataForBillingDivisionContract(BillingImport billingImport, long billingSaveId, int CompanyId, CancellationToken token)
        {
            var setting = await billingDivisionSettingQueryProcessor.GetAsync(CompanyId, token);

            if (setting == null)
            {
                return(null);
            }

            var newNumber = await billingDivisionContractQueryProcessor.GetNewContractNumberAsync(CompanyId, token);

            var contract = new BillingDivisionContract {
                ContractNumber       = newNumber.ToString(),
                CustomerId           = billingImport.CustomerId,
                FirstDateType        = setting.FirstDateType,
                Monthly              = setting.Monthly,
                BasisDay             = setting.BasisDay,
                DivisionCount        = setting.DivisionCount,
                RoundingMode         = setting.RoundingMode,
                RemainsApportionment = setting.RemainsApportionment,
                BillingId            = billingSaveId,
                BillingAmount        = billingImport.BillingAmount,
                Comfirm              = 0,
            };

            return(contract);
        }
        public Task <BillingDivisionContract> SaveAsync(BillingDivisionContract billingDivisionContract, CancellationToken token = default(CancellationToken))
        {
            #region insert query
            var query = @"
INSERT INTO BillingDivisionContract
(CompanyId
,CustomerId
,ContractNumber
,FirstDateType
,Monthly
,BasisDay
,DivisionCount
,RoundingMode
,RemainsApportionment
,BillingId
,BillingAmount
,Comfirm
,CancelDate
,CreateBy
,CreateAt
,UpdateBy
,UpdateAt
)
VALUES
(@CompanyId
,@CustomerId
,@ContractNumber
,@FirstDateType
,@Monthly
,@BasisDay
,@DivisionCount
,@RoundingMode
,@RemainsApportionment
,@BillingId
,@BillingAmount
,@Comfirm
,@CancelDate
,@CreateBy
,GETDATE()
,@UpdateBy
,GETDATE())";
            #endregion
            return(dbHelper.ExecuteAsync <BillingDivisionContract>(query, billingDivisionContract, token));
        }
        private string GetQueryUpdateBilling(BillingDivisionContract contract)
        {
            var cancel = contract.ContractNumber == null;
            var query  = new StringBuilder($@"
UPDATE BillingDivisionContract
   SET UpdateBy     = @UpdateBy 
     , UpdateAt     = GETDATE()
     , BillingId    = {(cancel ? "NULL" : "@BillingId")}
 WHERE CompanyId    = @ComanyId
   AND CustomerId   = @CustomerId");

            if (cancel)
            {
                query.Append(@"
   AND BillingId    = @BillingId");
            }
            else
            {
                query.Append(@"
   AND ContractNumber = @ContractNumer");
            }
            return(query.ToString());
        }
 public Task <int> UpdateBillingAsync(BillingDivisionContract contract, CancellationToken token = default(CancellationToken))
 => dbHelper.ExecuteAsync(GetQueryUpdateBilling(contract), contract, token);
예제 #5
0
        public async Task <IEnumerable <Billing> > SaveItemsAsync(IEnumerable <Billing> billings, CancellationToken token = default(CancellationToken))
        {
            var source = billings.ToArray();
            var result = new List <Billing>();

            using (var scope = transactionScopeBuilder.Create())
            {
                BillingInput billingInput = null;
                var          index        = 0;
                if (source[0].BillingInputId == null && source[0].Id == 0)
                {
                    billingInput = await addBillingInputQueryProcessor.AddAsync(token);
                }

                foreach (var billing in source)
                {
                    if (billingInput != null)
                    {
                        billing.BillingInputId = billingInput.Id;
                    }

                    result.Add(await SaveInnerAsync(billing));

                    if (billing.UseDiscount)
                    {
                        var discounts = (await customerDiscountQueryProcessor.GetAsync(billing.CustomerId, token)).ToList();

                        if (discounts.Count > 0)
                        {
                            var discount  = new BillingDiscount();
                            var billingId = result[index].Id;
                            discount.BillingId = billingId;
                            await deleteBillingDiscountQueryProcessor.DeleteAsync(billingId, token);

                            for (var i = 0; i < discounts.Count; i++)
                            {
                                var customerDiscount = discounts[i];
                                discount.DiscountType   = customerDiscount.Sequence;
                                discount.DiscountAmount = customerDiscount.GetRoundingValue(billing.BillingAmount, billing.CurrencyPrecision);
                                await addBillingDiscountQueryProcessor.SaveAsync(discount, token);
                            }
                        }
                    }
                    else if (!billing.UseDiscount && billing.BillingDiscountId != null)
                    {
                        var billingId = result[index].Id;
                        await deleteBillingDiscountQueryProcessor.DeleteAsync(billingId, token);
                    }

                    /* query から見直し updateBilling の 修正が必要 */
                    var contract = new BillingDivisionContract();
                    contract.BillingId      = result[index].Id;
                    contract.CreateBy       = billing.CreateBy;
                    contract.UpdateBy       = billing.UpdateBy;
                    contract.CompanyId      = billing.CompanyId;
                    contract.CustomerId     = billing.CustomerId;
                    contract.ContractNumber = billing.ContractNumber;

                    if (billing.BillingDivisionContract == 1)
                    {
                        await updateBillingDivisionContractQueryProcessor.UpdateBillingAsync(contract, token);
                    }
                    else if (billing.BillingDivisionContract == 2)
                    {
                        await deleteBillingDivisionContractQueryProcessor.DeleteWithBillingIdAsync(billing.Id, token);
                    }
                    else if (billing.BillingDivisionContract == 3)
                    {
                        var newContractNo = await billingDivisionContractQueryProcessor.GetNewContractNumberAsync(contract.CompanyId, token);

                        contract.ContractNumber = newContractNo.ToString();
                        var setting = await billingDivisionSettingQueryProcessor.GetAsync(billing.CompanyId, token);

                        contract.FirstDateType        = setting.FirstDateType;
                        contract.Monthly              = setting.Monthly;
                        contract.BasisDay             = setting.BasisDay;
                        contract.DivisionCount        = setting.DivisionCount;
                        contract.RoundingMode         = setting.RoundingMode;
                        contract.RemainsApportionment = setting.RemainsApportionment;
                        contract.Comfirm              = 0;
                        contract.CancelDate           = null;
                        await addBillingDivisionContractQueryProcessor.SaveAsync(contract, token);
                    }
                    index++;
                }
                scope.Complete();
            }
            return(result);
        }
예제 #6
0
        public async Task <IEnumerable <Billing> > SaveAsync(IEnumerable <Billing> billings, CancellationToken token = default(CancellationToken))
        {
            var results = new List <Billing>();

            using (var scope = transactionScopeBuilder.Create())
            {
                var source     = billings.ToArray();
                var first      = source.First();
                var userId     = first.UpdateBy;
                var appControl = await applicationControlQueryProcessor.GetAsync(first.CompanyId, token);

                List <CustomerDiscount> discounts = null;
                var useDiscount = appControl.UseDiscount == 1;
                if (useDiscount)
                {
                    discounts = (await customerDiscountQueryProcessor.GetAsync(first.CustomerId, token)).ToList();
                }
                var useLongTermAdv             = appControl.UseLongTermAdvanceReceived == 1;
                var contractRegistered         = appControl.RegisterContractInAdvance == 1;
                BillingDivisionSetting setting = null;
                if (useLongTermAdv && !contractRegistered)
                {
                    setting = await billingDivisionSettingQueryProcessor.GetAsync(first.CompanyId, token);
                }
                var inputId = first.BillingInputId;
                var isInput = first.InputType == (int)BillingInputType.BillingInput ||
                              first.InputType == (int)BillingInputType.PeriodicBilling;
                var requireInputId = isInput && !inputId.HasValue;
                if (requireInputId)
                {
                    inputId = (await addBillingInputQueryProcessor.AddAsync(token)).Id;
                    foreach (var item in source)
                    {
                        item.BillingInputId = inputId;
                    }
                }
                else if (isInput && inputId.HasValue)
                {
                    var registeredIds = (await billingQueryProcessor.GetByBillingInputIdAsync(inputId.Value)).Select(x => x.Id).ToList();
                    var deleteSource  = new BillingDeleteSource {
                        Ids         = registeredIds.Where(x => !source.Any(y => y.Id == x)).ToArray(),
                        CompanyId   = first.CompanyId,
                        LoginUserId = userId,
                    };
                    await billingProcessor.DeleteAsync(deleteSource, token);
                }
                var requireDiscount = source.Any(x => x.UseDiscount);

                foreach (var item in source)
                {
                    var result = await SaveInnerAsync(item, token);

                    if (useDiscount)
                    {
                        if (!item.UseDiscount && item.BillingDiscountId.HasValue)
                        {
                            await deleteBillingDiscountQueryProcessor.DeleteAsync(result.Id, token);
                        }
                        if (item.UseDiscount && discounts.Any())
                        {
                            await deleteBillingDiscountQueryProcessor.DeleteAsync(result.Id, token);

                            var billingDiscount = new BillingDiscount {
                                BillingId = result.Id
                            };
                            foreach (var x in discounts)
                            {
                                billingDiscount.DiscountType   = x.Sequence;
                                billingDiscount.DiscountAmount = x.GetRoundingValue(item.BillingAmount, item.CurrencyPrecision);
                                await addBillingDiscountQueryProcessor.SaveAsync(billingDiscount, token);
                            }
                        }
                    }
                    if (useLongTermAdv && item.BillingDiscountId > 0)
                    {
                        var contract = new BillingDivisionContract
                        {
                            BillingId      = result.Id,
                            CreateBy       = userId,
                            UpdateBy       = userId,
                            CompanyId      = item.CompanyId,
                            CustomerId     = item.CustomerId,
                            ContractNumber = item.ContractNumber,
                        };
                        if (item.BillingDivisionContract == 1)
                        {
                            await updateBillingDivisionContractQueryProcessor.UpdateBillingAsync(contract, token);
                        }
                        else if (item.BillingDivisionContract == 2)
                        {
                            await deleteBillingDivisionContractQueryProcessor.DeleteWithBillingIdAsync(result.Id, token);
                        }
                        else if (item.BillingDivisionContract == 3)
                        {
                            var newNumber = await billingDivisionContractQueryProcessor.GetNewContractNumberAsync(contract.CompanyId, token);

                            contract.ContractNumber       = newNumber.ToString();
                            contract.FirstDateType        = setting.FirstDateType;
                            contract.Monthly              = setting.Monthly;
                            contract.BasisDay             = setting.BasisDay;
                            contract.DivisionCount        = setting.DivisionCount;
                            contract.RoundingMode         = setting.RoundingMode;
                            contract.RemainsApportionment = setting.RemainsApportionment;
                            contract.Comfirm              = 0;
                            await addBillingDivisionContractQueryProcessor.SaveAsync(contract, token);
                        }
                    }
                    results.Add(result);
                }
                scope.Complete();
            }

            return(results);
        }