Exemple #1
0
 protected override void AfterProcessForCancelAbandon(PayItemInfo payItemInfo)
 {
 }
Exemple #2
0
 protected override void BeforeProcessForCancelPay(PayItemInfo payItemInfo)
 {
 }
Exemple #3
0
        /// <summary>
        /// PMCC审核通过
        /// </summary>
        /// <param name="refundInfo"></param>
        /// <returns></returns>
        public virtual VendorRefundInfo PMCCApproveVendorRefund(VendorRefundInfo refundInfo)
        {
            //编号不能为空
            if (!refundInfo.SysNo.HasValue || refundInfo.SysNo.Value <= 0)
            {
                //供应商退款编号无效
                throw new BizException(GetMessageString("VendorRefund_SysNoEmpty"));
            }
            VendorRefundInfo localEntity = VendorRefundDA.LoadVendorRefundInfo(refundInfo.SysNo.Value);

            if (localEntity == null)
            {
                //供应商退款单在数据中不存在
                throw new BizException(GetMessageString("VendorRefund_RefundNotExist"));
            }

            if (localEntity.Status.Value == VendorRefundStatus.Abandon)
            {
                //该供应商退款单为作废状态,不允许进行当前操作!
                throw new BizException(GetMessageString("VendorRefund_Abandon_Invalid"));
            }

            if (localEntity.Status.Value == VendorRefundStatus.Origin)
            {
                //该供应商退款单为初始状态,不允许进行当前操作!
                throw new BizException(GetMessageString("VendorRefund_Origin_Invalid"));
            }

            if (localEntity.Status.Value == VendorRefundStatus.PMDVerify)
            {
                //该供应商退款单为PMD审核状态,不允许进行当前操作!
                throw new BizException(GetMessageString("VendorRefund_PMDVerify_Invalid"));
            }
            if (localEntity.Status.Value == VendorRefundStatus.PMCCVerify)
            {
                throw new BizException("该供应商退款单为PMCC审核状态,不允许进行当前操作!");
            }

            //if (localEntity.CreateUserSysNo == ServiceContext.Current.UserSysNo)
            //{
            //    //供应商退款单中,创建人,PM审核人,PMD审核人,PMCC审核人,不能相同
            //    throw new BizException(GetMessageString("VendorRefund_OperatorCannotSame_Invalid"));
            //}

            localEntity.PMCCUserSysNo = ServiceContext.Current.UserSysNo;
            localEntity.PMCCAuditTime = System.DateTime.Now;
            localEntity.PMCCMemo      = refundInfo.PMCCMemo;
            localEntity.Status        = VendorRefundStatus.PMCCVerify;

            //加载当前商家退款单Items:
            List <VendorRefundItemInfo> localItem = VendorRefundDA.LoadVendorRefundItems(localEntity.SysNo.Value);

            #region 调用RMA接口:判断单件是否可以关闭
            List <int> RegisterSysNo = new List <int>();
            localItem.ForEach(a => RegisterSysNo.Add(a.RegisterSysNo.Value));
            //调用RMA接口,判断单件是否可以关闭
            List <RMARegisterInfo> getList = ExternalDomainBroker.GetRMARegisterList(RegisterSysNo);
            foreach (var item in getList)
            {
                if (item.BasicInfo.Status != RMARequestStatus.Handling)  //RMARequestStatus.Handling 1 表示 处理中
                {
                    throw new BizException(string.Format(GetMessageString("VendorRefund_CloseInvalid"), item.SysNo.Value));
                }
            }
            #endregion

            TransactionOptions options = new TransactionOptions();
            options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            options.Timeout        = TransactionManager.DefaultTimeout;

            List <VendorRefundItemInfo>     list           = new List <VendorRefundItemInfo>();
            List <KeyValuePair <int, int> > registerList   = new List <KeyValuePair <int, int> >();
            List <VendorRefundInfo>         deductOnVendor = new List <VendorRefundInfo>();
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
            {
                //更新状态 :
                localEntity = VendorRefundDA.UpdateVendorRefundInfo(localEntity);
                //关闭单件并扣减RMA库存中OnVendorQty数量:
                list = VendorRefundDA.LoadVendorRefundItems(localEntity.SysNo.Value);
                foreach (var item in list)
                {
                    int registerNo = item.RegisterSysNo.Value;
                    registerList.Add(new KeyValuePair <int, int>(registerNo, localEntity.PMDUserSysNo.Value));

                    ////调用RMA接口,根据单件号获取接收仓库:
                    string[] str = ExternalDomainBroker.GetReceiveWarehouseByRegisterSysNo(registerNo);
                    if (!string.IsNullOrEmpty(str[0]) && !string.IsNullOrEmpty(str[1]))
                    {
                        deductOnVendor.Add(new VendorRefundInfo
                        {
                            WarehouseSysNo = Convert.ToInt32(str[0]),
                            ProductSysNo   = Convert.ToInt32(str[1]),
                            RegisterSysNo  = registerNo
                        });
                    }
                }

                ////调用RMA接口,关闭送修单:
                List <int> OutBound = ExternalDomainBroker.GetOutBoundSysNoListByRegisterSysNo(registerList.ToListString("Key"));
                ExternalDomainBroker.UpdateOutBound(OutBound.ToListString());

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

                scope.Complete();
            }
            ////调用RMA接口:关闭单件
            List <int> registerSysNos = new List <int>();
            registerList.ForEach(x =>
            {
                registerSysNos.Add(x.Key);
            });

            ExternalDomainBroker.BatchCloseRegisterForVendorRefund(registerSysNos);

            //扣减RMA库存中OnVendorQty数量

            ExternalDomainBroker.BatchDeductOnVendorQty(deductOnVendor);

            ////调用Invoice接口,生成财务POR记录
            PayableInfo payableInfo = new PayableInfo()
            {
                OrderSysNo        = localEntity.SysNo.Value,
                CurrencySysNo     = 1,
                OrderAmt          = -1 * localEntity.RefundCashAmt.Value,
                PayStatus         = 0,
                InvoiceStatus     = 0,
                OrderType         = PayableOrderType.RMAPOR,        //9
                InvoiceUpdateTime = DateTime.Parse("1900-1-1"),
                InvoiceFactStatus = PayableInvoiceFactStatus.Others // 3
            };
            PayableInfo createdPayableInfo = ExternalDomainBroker.CreatePayable(payableInfo);
            if (null != createdPayableInfo && 0 < createdPayableInfo.SysNo)
            {
                int financePaySysNo = createdPayableInfo.SysNo.Value;

                List <PayItemInfo> payItemList = new List <PayItemInfo>();
                list.ForEach(x =>
                {
                    PayItemInfo item = new PayItemInfo()
                    {
                        PaySysNo   = financePaySysNo,
                        PayStyle   = PayItemStyle.Normal,
                        Status     = PayItemStatus.Origin,
                        PayAmt     = x.RefundCash.HasValue ? (-1 * x.RefundCash.Value) : -999999,
                        OrderType  = PayableOrderType.RMAPOR,
                        OrderSysNo = x.RefundSysNo.Value
                    };
                    payItemList.Add(item);
                });

                ExternalDomainBroker.BatchCreatePayItem(payItemList);
            }

            return(localEntity);
        }
        protected override void ProcessReferencePayableInfoForCreate(PayItemInfo entity)
        {
            //如果该付款单对应的应付款已经Abandon,那么此时需要重新激活该应付款并将其更新
            if (ReferencePayableInfo != null)
            {
                if (ReferencePayableInfo.PayStatus == PayableStatus.Abandon)
                {
                    ReferencePayableInfo.OrderAmt  = entity.PayAmt;
                    ReferencePayableInfo.PayStatus = PayableStatus.UnPay;

                    if (entity.OrderType == PayableOrderType.VendorSettleOrder)
                    {
                        ReferencePayableInfo.EIMSNo = ExternalDomainBroker.GetConsignSettlementReturnPointSysNo(entity.OrderSysNo.Value);
                    }
                    else
                    {
                        ReferencePayableInfo.EIMSNo = null;
                    }
                    PayableBizProcessor.UpdateStatusAndOrderAmt(ReferencePayableInfo);

                    entity.PaySysNo      = ReferencePayableInfo.SysNo.Value;
                    entity.CurrencySysNo = m_ConsignSettlement.CurrencyCode;
                    entity.OrderType     = ReferencePayableInfo.OrderType;
                    entity.OrderSysNo    = ReferencePayableInfo.OrderSysNo;
                }

                if (ReferencePayableInfo.PayStatus == PayableStatus.UnPay)
                {
                    entity.PaySysNo      = ReferencePayableInfo.SysNo.Value;
                    entity.CurrencySysNo = m_ConsignSettlement.CurrencyCode;
                    entity.OrderType     = ReferencePayableInfo.OrderType;
                    entity.OrderSysNo    = ReferencePayableInfo.OrderSysNo;
                }
            }
            else
            {
                ReferencePayableInfo                   = new PayableInfo();
                ReferencePayableInfo.OrderSysNo        = entity.OrderSysNo.Value;
                ReferencePayableInfo.OrderType         = entity.OrderType.Value;
                ReferencePayableInfo.AlreadyPayAmt     = 0;
                ReferencePayableInfo.OrderAmt          = entity.PayAmt;
                ReferencePayableInfo.CurrencySysNo     = m_ConsignSettlement.CurrencyCode;
                ReferencePayableInfo.PayStatus         = PayableStatus.UnPay;
                ReferencePayableInfo.InvoiceStatus     = PayableInvoiceStatus.Absent;
                ReferencePayableInfo.AuditStatus       = PayableAuditStatus.NotAudit;
                ReferencePayableInfo.InvoiceFactStatus = PayableInvoiceFactStatus.Corrent;
                ReferencePayableInfo.Note              = "Auto created by system!";
                ReferencePayableInfo.CompanyCode       = entity.CompanyCode;

                if (entity.OrderType == PayableOrderType.VendorSettleOrder)
                {
                    ReferencePayableInfo.EIMSNo = ExternalDomainBroker.GetConsignSettlementReturnPointSysNo(entity.OrderSysNo.Value);
                }
                ReferencePayableInfo = PayableBizProcessor.Create(ReferencePayableInfo);

                entity.PaySysNo      = ReferencePayableInfo.SysNo.Value;
                entity.CurrencySysNo = m_ConsignSettlement.CurrencyCode;
                entity.OrderType     = ReferencePayableInfo.OrderType;
                entity.OrderSysNo    = ReferencePayableInfo.OrderSysNo;
            }
        }
Exemple #5
0
 /// <summary>
 /// 创建应付款单
 /// </summary>
 /// <param name="payItem"></param>
 /// <returns></returns>
 public static PayItemInfo CreatePayItem(PayItemInfo payItem)
 {
     return(ObjectFactory <IInvoiceBizInteract> .Instance.CreatePayItem(payItem));
 }
Exemple #6
0
        protected virtual void ProcessPayedPrepay(PayableInfo entity, PayItemInfo payitem)
        {
            PayableInfo payable = null;

            if (payitem.AvailableAmt < entity.InStockAmt - entity.EIMSAmt)
            {
                ThrowBizException("Payable_ProcessPayedPrepay_InStockAmtMoreThanAvailableAmt");
            }
            //更新付款单可用金额
            payitem.AvailableAmt -= entity.InStockAmt - entity.EIMSAmt;
            ObjectFactory <PayItemProcessor> .Instance.UpdateAvailableAmt(payitem.OrderType.Value, payitem.OrderSysNo.Value, payitem.AvailableAmt.Value);

            var pEntity = m_PayableDA.GetFirstPay(entity.OrderType.Value, entity.OrderSysNo.Value);

            if (entity.BatchNumber == 1)
            {
                if (pEntity == null)
                {
                    ThrowBizException("Payable_ProcessPayedPrepay_NotExistPaidRecord");
                }
                payable             = new PayableInfo();
                payable.OrderAmt    = pEntity.OrderAmt;
                payable.SysNo       = pEntity.SysNo;
                payable.PayStatus   = PayableStatus.FullPay;
                payable.OrderStatus = entity.OrderStatus;
                payable.InStockAmt  = entity.InStockAmt;
                payable.EIMSAmt     = entity.EIMSAmt;
                payable.RawOrderAmt = entity.RawOrderAmt;
                m_PayableDA.UpdateFirstPay(payable);
            }
            else
            {
                payable               = new PayableInfo();
                payable.OrderSysNo    = entity.OrderSysNo;
                payable.OrderType     = entity.OrderType;
                payable.BatchNumber   = entity.BatchNumber;
                payable.PayStatus     = PayableStatus.FullPay;
                payable.AlreadyPayAmt = 0;
                payable.OrderAmt      = payable.AlreadyPayAmt;
                payable.RawOrderAmt   = entity.RawOrderAmt;
                payable.InStockAmt    = entity.InStockAmt;
                payable.EIMSAmt       = entity.EIMSAmt;
                payable.Note          = "auto create during in stock";
                payable.CurrencySysNo = 1;
                payable.OrderStatus   = entity.OrderStatus;
                payable               = Create(payable);
            }

            PayItemInfo pie = new PayItemInfo();

            pie.OrderSysNo  = entity.OrderSysNo;
            pie.OrderType   = (PayableOrderType)entity.OrderType;
            pie.PaySysNo    = payable.SysNo.Value;
            pie.PayAmt      = entity.InStockAmt.Value - entity.EIMSAmt.Value;
            pie.SysNo       = payitem.SysNo;
            pie.OrderStatus = entity.OrderStatus;
            pie.CompanyCode = entity.CompanyCode;

            if (entity.BatchNumber != 1)
            {
                ObjectFactory <PayItemProcessor> .Instance.CreatePayEx(pie);
            }

            if (entity.OrderStatus.Value == (int)PurchaseOrderStatus.PartlyInStocked)
            {
                //调用PO接口中止入库
                ExternalDomainBroker.StopInStock(entity.OrderSysNo.Value);
            }
        }
Exemple #7
0
        public void PayPayItem(PayItemInfo entity)
        {
            if (entity.SysNo == null)
            {
                throw new ArgumentNullException("entity.SysNo");
            }
            if (entity.PayUserSysNo == null)
            {
                throw new ArgumentNullException("entity.PayUserSysNo");
            }
            var payItems = m_FinaceDA.QueryPayItems(new PayableItemCriteriaInfo
            {
                SysNo = entity.SysNo
            });

            if (payItems == null || payItems.Count == 0)
            {
                //throw new BizException(string.Format("编号为[{0}]的付款单不存在", entity.SysNo));
                ThrowBizException("Payable_PayBillNotFound");
            }
            var item = payItems[0];

            if (item.Status != PayItemStatus.Origin)
            {
                //throw new BizException("只有未支付的付款单才能支付.");
                ThrowBizException("Payable_JustUnPayBillCanPay");
            }

            item.PayUserSysNo = entity.PayUserSysNo;

            var payList = m_FinaceDA.PayableQuery(new PayableCriteriaInfo {
                SysNo = item.PaySysNo
            });

            if (payList == null || payList.Count == 0)
            {
                //throw new BizException("未找到该付款单对应的应付款信息");
                ThrowBizException("Payable_PayBillNotFoundPayInfo");
            }
            var pay = payList[0];

            if (!string.Equals(pay.AuditStatus.ToString(), PayableAuditStatus.Audited.ToString(), StringComparison.OrdinalIgnoreCase))
            {
                //throw new BizException("只有财务审核通过的付款单才能支付.");
                ThrowBizException("Payable_JustAuditPassCanPay");
            }

            item.OrderSysNo  = pay.OrderSysNo;
            item.BatchNumber = pay.BatchNumber;

            //现金支付的必须有银行科目号
            //if (pay.OrderType == PayableOrderType.ReturnPointCashAdjust)
            //{
            //    if (string.IsNullOrEmpty(entity.BankGLAccount))
            //    {
            //        throw new BizException("现金支付必须有银行科目账号");
            //    }
            //    item.BankGLAccount = entity.BankGLAccount;
            //}

            if (pay.OrderType == PayableOrderType.PO ||
                pay.OrderType == PayableOrderType.POAdjust)
            {
                item = new POProcess().Pay(item, true);
            }
            //else if (pay.OrderType == PayableOrderType.ReturnPointCashAdjust
            //    || pay.OrderType == PayableOrderType.SubAccount
            //    || pay.OrderType == PayableOrderType.SubInvoice)
            //{
            //    item = new EIMSReturnPointCashProcess().Pay(item, true);
            //}
            else
            {
                item = new OtherOrderTypeProcess().Pay(item, true);
            }
        }