예제 #1
0
        /// <summary>
        /// 审核通过成本变价单信息
        /// </summary>
        /// <param name="costChangeInfo"></param>
        /// <returns></returns>
        public virtual CostChangeInfo AuditCostChange(CostChangeInfo costChangeInfo)
        {
            TransactionOptions option = new TransactionOptions();

            //option.IsolationLevel = IsolationLevel.ReadUncommitted;
            option.Timeout = TransactionManager.DefaultTimeout;
            using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, option))
            {
                costChangeInfo.CostChangeBasicInfo.Status = CostChangeStatus.Audited;
                //修改单据状态
                costChangeInfo = CostChangeDA.UpdateCostChangeAuditStatus(costChangeInfo);
                //调用Inventory接口:更新库存成本
                ExternalDomainBroker.UpdateCostInWhenCostChange(costChangeInfo);
                //调用Invoice接口:生成结算单的付款单
                ExternalDomainBroker.CreatePayItem(new PayItemInfo()
                {
                    OrderSysNo  = costChangeInfo.SysNo.Value,
                    PayAmt      = costChangeInfo.CostChangeBasicInfo.TotalDiffAmt,
                    OrderType   = PayableOrderType.CostChange,
                    PayStyle    = PayItemStyle.Normal,
                    CompanyCode = costChangeInfo.CompanyCode
                });

                //记录日志
                ExternalDomainBroker.CreateLog("Audit CostChange"
                                               , BizEntity.Common.BizLogType.CostChange_Audit
                                               , costChangeInfo.SysNo.Value, costChangeInfo.CompanyCode);
                ts.Complete();
            }

            return(costChangeInfo);
        }
예제 #2
0
        public ConsignAdjustInfo MaintainStatus(ConsignAdjustInfo info)
        {
            var old = ObjectFactory <IConsignAdjustDA> .Instance.LoadInfo(info.SysNo.Value);

            if (info.Status == ConsignAdjustStatus.Abandon && old.Status != ConsignAdjustStatus.WaitAudit)
            {
                throw new BizException("记录状态不为待审核,作废失败");
            }
            if (info.Status == ConsignAdjustStatus.Audited && old.Status != ConsignAdjustStatus.WaitAudit)
            {
                throw new BizException("记录状态不为待审核,审核失败");
            }
            if (info.Status == ConsignAdjustStatus.Audited)
            {
                ExternalDomainBroker.CreatePayItem(new PayItemInfo()
                {
                    OrderSysNo  = old.SysNo.Value,
                    PayAmt      = old.TotalAmt,
                    OrderType   = PayableOrderType.ConsignAdjust,
                    PayStyle    = PayItemStyle.Normal,
                    CompanyCode = "8601"
                });
            }
            return(ObjectFactory <IConsignAdjustDA> .Instance.UpdateStatus(info));
        }
예제 #3
0
        /// <summary>
        /// 代收结算单 - 结算
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public GatherSettlementInfo SettleGatherSettlement(GatherSettlementInfo info)
        {
            info.SettleStatus = GatherSettleStatus.SET;
            GatherSettlementInfo oldSettle = GatherSettlementDA.GetVendorSettleGatherInfo(info);

            if (oldSettle.SettleStatus != GatherSettleStatus.AUD)
            {
                //该结算单不是已审核状态,不能进行结算操作!
                throw new BizException(GetMessageString("Gather_Audited_Invalid_Settle"));
            }
            GatherSettlementDA.UpdateGatherSettlementSettleStatus(info);
            //调用Invoice接口,创建PayItem:

            ExternalDomainBroker.CreatePayItem(
                new PayItemInfo()
            {
                OrderSysNo = info.SysNo.Value,
                PayAmt     = info.TotalAmt,
                OrderType  = PayableOrderType.CollectionSettlement,
                PayStyle   = PayItemStyle.Normal
            });

            //发送结算Message
            EventPublisher.Publish(new GatherSettlementSettledMessage()
            {
                SettlementSysNo  = info.SysNo.Value,
                CurrentUserSysNo = ServiceContext.Current.UserSysNo
            });

            //写Log:
            //CommonService.WriteLog<VendorSettleGatherEntity>(entity, " Settle Gather ", entity.SysNo.Value.ToString(), (int)LogType.Purchase_Verify_InStock);

            ExternalDomainBroker.CreateLog(" Settle Gather "
                                           , BizEntity.Common.BizLogType.Purchase_Verify_InStock
                                           , info.SysNo.Value
                                           , info.CompanyCode);
            return(info);
        }
예제 #4
0
        public CollectionPaymentInfo Settle(CollectionPaymentInfo entity)
        {
            string OperationIP             = entity.OperationIP;
            int?   OperationUserSysNumber  = entity.OperationUserSysNumber;
            string OperationUserUniqueName = entity.OperationUserUniqueName;

            entity.SettleUserSysNo = entity.CurrentUserSysNo;
            VerifySettle(entity);

            this.VerifySettleItems(entity, SettlementVerifyType.SETTLE);
            //entity.SettleUserSysNo = SystemUserHelper.GetUserSystemNumber(BusinessContext.Current.OperationUserFullName,
            //    BusinessContext.Current.OperationUserSourceDirectoryKey, BusinessContext.Current.OperationUserLoginName,
            //    BusinessContext.Current.CompanyCode);
            //CollVendorSettleDAL dal = collVendorSettleDAL;
            //entity.CreateUserSysNo = 3256;


            //统计规则
            string text = string.Empty;
            List <ConsignSettlementRulesInfo> ruleList = CollectionPaymentDA.GetSettleRuleQuantityCount(entity.SysNo.Value);

            foreach (var currentRule in ruleList)
            {
                //规则状态到结算这一步,一定会是已生效或者是未生效,其他的一律视为异常
                if (currentRule.Status != ConsignSettleRuleStatus.Available && currentRule.Status != ConsignSettleRuleStatus.Enable)
                {
                    //规则已经是无效状态,抛出异常
                    text = string.Format("无效的规则:{0}", currentRule.SettleRulesName);
                    throw new BizException(text);
                }

                //超过结算数量
                bool result = false;
                if (currentRule.SettleRulesQuantity.HasValue)
                {
                    result = currentRule.SettleRulesQuantity.Value - (currentRule.SettledQuantity ?? 0) - (currentRule.SubmitSettleQuantity ?? 0) < 0;
                }
                if (result)
                {
                    //超过结算数量,抛出异常
                    throw new BizException(string.Format(GetMessageString("Consign_Check_MoreThanSettleRuleQuantity"), currentRule.SettleRulesName));
                }
            }

            using (TransactionScope scope = new TransactionScope())
            {
                #region 结算规则操作
                foreach (var quantityCount in ruleList)
                {
                    quantityCount.SettledQuantity = quantityCount.SettledQuantity.Value + quantityCount.SubmitSettleQuantity;
                    //修改规则状态
                    if (quantityCount.Status == ConsignSettleRuleStatus.Available)
                    {
                        quantityCount.Status = ConsignSettleRuleStatus.Enable;
                    }

                    //如果数量为0了,将修改状态为已过期
                    if (quantityCount.SettleRulesQuantity.HasValue && quantityCount.SettleRulesQuantity.Value == (quantityCount.SettledQuantity ?? 0))
                    {
                        quantityCount.Status          = ConsignSettleRuleStatus.Disable;
                        quantityCount.SettledQuantity = quantityCount.SettleRulesQuantity;
                    }
                    //修改结算规则状态为已生效
                    ObjectFactory <IConsignSettlementDA> .Instance.UpdateConsignSettleRuleStatusAndQuantity(quantityCount.RuleSysNo.Value, quantityCount.Status.Value, quantityCount.SettledQuantity.Value);
                }

                #endregion

                //更改每个item的财务记录为最终结算
                foreach (CollectionPaymentItem item in entity.SettleItems)
                {
                    if (ConsignToAccountLogStatus.Settled == item.ConsignToAccLogInfo.ConsignToAccStatus.Value)
                    {
                        //当前商品的代销转财务记录(记录号:{0})的状态已经为“已结算”状态!
                        throw new BizException(string.Format(GetMessageString("Consign_AccStatus_Settled_Check"), item.ConsignToAccLogInfo.ConsignToAccStatus.Value));
                    }

                    if (item.Cost < 0)
                    {
                        //当前商品(商品系统编号:{0})的结算金额小于0!
                        throw new BizException(string.Format(GetMessageString("Consign_Products_SettleAmt_Check"), item.ConsignToAccLogInfo.ProductSysNo.Value));
                    }
                    decimal foldCost = item.ConsignToAccLogInfo.CreateCost.Value - item.Cost;
                    ConsignSettlementDA.SettleConsignToAccountLog(item.ConsignToAccLogInfo.LogSysNo.Value, item.Cost, foldCost);
                }

                //2 修改结算单的状态
                entity.SettleTime = DateTime.Now;
                entity.Status     = POCollectionPaymentSettleStatus.Settled;
                entity            = this.CollectionPaymentDA.UpdateVendorSettleStatus(entity);

                //发送ESB消息
                EventPublisher.Publish <CollectionPaymentSettlementMessage>(new CollectionPaymentSettlementMessage()
                {
                    CurrentUserSysNo = ServiceContext.Current.UserSysNo,
                    SysNo            = entity.SysNo.Value
                });

                scope.Complete();
            }


            //结算商品期间过期状态判断
            foreach (var quantityCount in ruleList)
            {
                if (quantityCount.Status == ConsignSettleRuleStatus.Enable)
                {
                    //如果这期间的结算商品已经全部结算完毕,那么这个结算规则也无效,对于是否还有剩余将无效
                    ObjectFactory <IConsignSettlementDA> .Instance.UpdateExistsConsignSettleRuleItemStatus(quantityCount.RuleSysNo.Value);
                }
            }
            //3 生成结算单的付款单
            //调用Invoice接口:生成结算单的付款单

            ExternalDomainBroker.CreatePayItem(new PayItemInfo()
            {
                OrderSysNo = entity.SysNo.Value,
                PayAmt     = entity.TotalAmt,
                OrderType  = PayableOrderType.CollectionPayment,
                PayStyle   = PayItemStyle.Normal
            });

            ExternalDomainBroker.CreateLog(" Settled VendorSettle "
                                           , BizEntity.Common.BizLogType.POC_VendorSettle_Settle
                                           , entity.SysNo.Value
                                           , entity.CompanyCode);
            //记录规则更新日志
            foreach (var qLog in ruleList)
            {
                ExternalDomainBroker.CreateLog("Settled VendorSettle Update SettleRule"
                                               , BizEntity.Common.BizLogType.ConsignSettleRule_Update
                                               , qLog.RuleSysNo.Value
                                               , qLog.CompanyCode);
            }

            return(entity);
        }
예제 #5
0
        public CommissionMaster CreateSettleCommission(CommissionMaster req)
        {
            req = GetManualCommissionMaster(req, true);
            if (req.ItemList.Count == 0)
            {
                throw new BizException(GetMessageString("Commission_Error_NoItemData"));
            }
            TransactionOptions options = new TransactionOptions();

            options.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                req.Status = VendorCommissionMasterStatus.SET;
                CommissionDA.InsertCommissionMaster(req);

                CommissionDA.InsertCommissionItems(req);

                #region Insert Detail
                foreach (var item in req.ItemList)
                {
                    if (item.DetailList != null)
                    {
                        item.DetailList.ForEach(p =>
                        {
                            p.CommissionItemSysNo = item.ItemSysNo;
                            CommissionDA.InsertCommissionDetail(p, req.CompanyCode, VendorCommissionItemType.SAC);
                        });
                    }
                    if (item.DetailOrderList != null)
                    {
                        item.DetailOrderList.ForEach(p =>
                        {
                            p.CommissionItemSysNo = item.ItemSysNo;
                            p.SalePrice           = item.OrderCommissionFee;
                            p.PromotionDiscount   = 0;
                            if (p.ReferenceType == VendorCommissionReferenceType.RMA)
                            {
                                p.SalePrice = -p.SalePrice;
                            }
                            p.Quantity = null;
                            CommissionDA.InsertCommissionDetail(p, req.CompanyCode, VendorCommissionItemType.SOC);
                        });
                    }
                    if (item.DetailDeliveryList != null)
                    {
                        item.DetailDeliveryList.ForEach(p =>
                        {
                            p.CommissionItemSysNo = item.ItemSysNo;
                            p.SalePrice           = item.DeliveryFee;
                            p.PromotionDiscount   = 0;
                            p.Quantity            = null;
                            CommissionDA.InsertCommissionDetail(p, req.CompanyCode, VendorCommissionItemType.DEF);
                        });
                    }
                }
                #endregion

                #region CreatePayItem
                ExternalDomainBroker.CreatePayItem(new PayItemInfo()
                {
                    OrderSysNo  = req.SysNo.Value,
                    PayAmt      = -Math.Round(req.TotalAmt ?? 0, 2),
                    OrderType   = PayableOrderType.Commission,
                    PayStyle    = PayItemStyle.Normal,
                    BatchNumber = 1,
                    Note        = GetMessageString("Commission_ManualNote")
                });
                #endregion

                scope.Complete();
            }

            return(req);
        }