public void Approve(IVersionSupport obj) { crmDealWithStageVersion approvingObj = obj as crmDealWithStageVersion; if (approvingObj == null) { DevExpress.XtraEditors.XtraMessageBox.Show("Документ не может быть утверждён"); return; } ApproveVersion(approvingObj); }
private void AddPFRegisterRecords(crmDealWithStageVersion scVersion) { if (scVersion == null) { return; } /* !!! Временно отключаем проверку !!! * // Примечание. В этом регистр пишутся только контролируемые организации * // Проверяем, что организация контролируемая. Это значит, что для её crmPartyRu найдётся какой-либо объект UserParty * OperandProperty prop = new OperandProperty("Party"); * CriteriaOperator op = prop == scVersion.; * XPCollection<crmUserParty> userPartyCol = new XPCollection<crmUserParty>(this.Session, op, null); * userPartyCol.Criteria = op; * userPartyCol.Reload(); * if (!userPartyCol.IsLoaded) userPartyCol.Load(); * * if (userPartyCol.Count == 0) return; */ using (UnitOfWork uow = this.Session.BeginNestedUnitOfWork()) { crmDealWithStageVersion scVersion1 = uow.GetObjectByKey <crmDealWithStageVersion>(scVersion.Oid); // Цикл по финансовым этапам и их техническим подэтапам foreach (crmStage stage in GetStageList(scVersion1)) { if (!IsChildOfFinanceStage(stage)) { continue; } foreach (crmDeliveryUnit du in stage.DeliveryPlan.DeliveryUnits) { foreach (crmDeliveryItem di in du.DeliveryItems) { CreatePlaneFactCommonRegister(uow, scVersion1, stage, di); } } foreach (crmPaymentUnit pu in stage.PaymentPlan.PaymentUnits) { foreach (crmPaymentItem pi in pu.PaymentItems) { CreatePlaneFactCommonRegister(uow, scVersion1, stage, pi); } } } uow.CommitChanges(); } }
protected virtual void RegisterOperations(crmDealWithStageVersion scVersion) { if (scVersion == null) { return; } // Добавляем запись в crmPlaneFactRegister для scVersion AddPFRegisterRecords(scVersion); // Добавляем запись в crmDebtorCreditorDebtRegister для scVersion AddDCDRegisterRecords(scVersion); // Добавляем запись в crmCashFlowRegister для scVersion AddCFRegisterRecords(scVersion); }
private crmCashFlowRegister CreateCFRegister(Session ssn, crmDealWithStageVersion scVersion, crmStage stage, crmPaymentItem pi) { crmCashFlowRegister cfr = new crmCashFlowRegister(ssn); // Используем ((crmDealWithoutStage)scVersion.MainObject).Oid как token (метку для разспознавания набора связанных записей) Guid token = ((crmDealWithStage)scVersion.MainObject).Oid; cfr.Token = token; if (scVersion.ContractDeal != null) { cfr.Contract = scVersion.ContractDeal.Contract; } cfr.ContractDeal = scVersion.ContractDeal; cfr.CostItem = pi.CostItem; cfr.PrimaryParty = scVersion.Customer.Party; cfr.ContragentParty = scVersion.Supplier.Party; cfr.fmOrder = pi.Order; cfr.Subject = (pi.Order != null) ? pi.Order.Subject : null; //cfr.PlaneFact = PlaneFact.PLAN; cfr.Section = CashFlowRegisterSection.CONTRACT_PLAN; //cfr.Stage = stage; cfr.PaymentItem = pi; cfr.ObligationUnit = pi.PaymentUnit; cfr.ObligationUnitDateTime = pi.PaymentUnit.DatePlane; //cfr.StageTech = ; //cfr.StageTech2 = ; //!Паша пока без финансовый сделок //if (scVersion.FinancialDeal != null) { // cfr.FinancialDeal = pi.FinancialDeal.FinancialDeal; //} cfr.Valuta = pi.Valuta; cfr.Cost = pi.SummFull; //cfr.CostInRUR = scVersion.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. cfr.PaymentCost = pi.AccountSumma; cfr.PaymentValuta = pi.AccountValuta; return(cfr); }
/// <summary> /// Список всех этапов /// </summary> /// <param name="scVersion"></param> /// <returns></returns> private IList <crmStage> GetStageList(crmDealWithStageVersion scVersion) { IList <crmStage> res = new List <crmStage>(); foreach (crmStage stage in scVersion.Stages) { if (res.IndexOf(stage) == -1) { res.Add(stage); } IList <crmStage> res1 = GetStageList(stage); //if (res1.Count == 0) break; foreach (crmStage stage1 in res1) { if (res1.IndexOf(stage) == -1) { res.Add(stage1); } } } return(res); }
//private crmDealWithStageVersion _Current; //[Aggregated] //[ExpandObjectMembers(ExpandObjectMembers.InDetailView)] //public crmDealWithStageVersion Current { // get { return _Current; } // set { SetPropertyValue<crmDealWithStageVersion>("Current", ref _Current, value); } //} #endregion #region МЕТОДЫ #endregion #region IVersionBusinessLogicSupport public void ApproveVersion(crmDealWithStageVersion scVersion) { crmDealWithStageVersion newcur = null; foreach (crmDealWithStageVersion cont in this.DealVersions) //DealVersions) { if (cont == scVersion) { newcur = cont; } } if (newcur == null) { throw new Exception("Version is not in Version List"); } VersionHelper vHelper; if (scVersion.VersionState == VersionStates.VERSION_NEW) { vHelper = new VersionHelper(this.Session); vHelper.SetVersionStateExt(scVersion, VersionStates.VERSION_CURRENT); crmDealWithStage dealVersionMainObj = (crmDealWithStage)scVersion.MainObject; //scVersion.StageStructure.Stages[0].DeliveryPlan.DeliveryUnits[0].DeliveryItems[0] // Здесь вставить перебор FinanceDeal и прочее с целью добавления в коллекцию StageMains и ObligationUnitMains // В коллекциии scVersion.Stages находятся все этапы из полной их иерархии (т.е. рекурсия не нужна) IList <crmStage> stageList = GetStageList(scVersion); foreach (crmStage stage in stageList) { if (stage.StageType != StageType.FINANCE) { continue; } crmStageMain stageMain = scVersion.CreateStageMain(stage); if (dealVersionMainObj.StageMains.IndexOf(stageMain) == -1) { dealVersionMainObj.StageMains.Add(stageMain); } // Пополнение коллекции ObligationUnitMain (имеются две разновидности: Delivery и Payment) //foreach (crmObligationUnitMain obligationUnitMain in GetFinanceDeliveryList(stage.DeliveryPlan)) { foreach (crmObligationUnitMain obligationUnitMain in scVersion.CreateFinanceDeliveryList(stage.DeliveryPlan)) { if (dealVersionMainObj.ObligationUnitMains.IndexOf(obligationUnitMain) == -1) { dealVersionMainObj.ObligationUnitMains.Add(obligationUnitMain); } } //foreach (crmObligationUnitMain paymentUnitMain in GetFinancePaymentList(stage.PaymentPlan)) { foreach (crmObligationUnitMain paymentUnitMain in scVersion.CreateFinancePaymentList(stage.PaymentPlan)) { if (dealVersionMainObj.ObligationUnitMains.IndexOf(paymentUnitMain) == -1) { dealVersionMainObj.ObligationUnitMains.Add(paymentUnitMain); } } } // Отрабатывание регистров RegisterClear(scVersion); RegisterOperations(scVersion); } else if (scVersion.VersionState == VersionStates.VERSION_PROJECT) { foreach (crmDealWithStageVersion cont in this.DealVersions) //DealVersions) { { if (cont == scVersion) { continue; } if (cont.VersionState == VersionStates.VERSION_CURRENT) { vHelper = new VersionHelper(this.Session); vHelper.SetVersionStateExt(cont, VersionStates.VERSION_OLD); } else if (cont.VersionState == VersionStates.VERSION_PROJECT) { vHelper = new VersionHelper(this.Session); vHelper.SetVersionStateExt(cont, VersionStates.VERSION_DECLINE); } } vHelper = new VersionHelper(this.Session); vHelper.SetVersionStateExt(scVersion, VersionStates.VERSION_CURRENT); this.Current = scVersion; crmDealWithStage dealVersionMainObj = (crmDealWithStage)scVersion.MainObject; // -- Когда происходит Утверждение не новой версии, то старые этапы нельзя удалять, а можно только закрывать foreach (crmStageMain stageMaim in dealVersionMainObj.StageMains) { stageMaim.Closed = true; if (stageMaim.DateClosed == null || stageMaim.DateClosed == DateTime.MinValue) { stageMaim.DateClosed = System.DateTime.Now; } } foreach (crmObligationUnitMain obligationUnitMain in dealVersionMainObj.ObligationUnitMains) { obligationUnitMain.Closed = true; if (obligationUnitMain.DateClosed == null || obligationUnitMain.DateClosed == DateTime.MinValue) { obligationUnitMain.DateClosed = System.DateTime.Now; } } // -- // Здесь вставить перебор FinanceDeal и прочее с целью добавления в коллекцию StageMains и ObligationUnitMains // В коллекции scVersion.Stages находятся все этапы из полной их иерархии (т.е. рекурсия не нужна) foreach (crmStage stage in scVersion.Stages) { if (stage.StageType != StageType.FINANCE) { continue; } // SHU 2011-11-01 Создаём накрывающий объект для данного этапа с типом Finance if (stage.StageMain == null) { stage.StageMain = new crmStageMain(this.Session); stage.StageMain.Current = stage; } // Пополнение коллекции StageMains if (dealVersionMainObj.StageMains.IndexOf(stage.StageMain) == -1) { dealVersionMainObj.StageMains.Add(stage.StageMain); } // Пополнение коллекции ObligationUnitMain (имеются две разновидности: Delivery и Payment) foreach (crmObligationUnitMain obligationUnitMain in GetFinanceDeliveryList(stage.DeliveryPlan)) { if (dealVersionMainObj.ObligationUnitMains.IndexOf(obligationUnitMain) == -1) { dealVersionMainObj.ObligationUnitMains.Add(obligationUnitMain); } } foreach (crmObligationUnitMain paymentUnitMain in GetFinancePaymentList(stage.PaymentPlan)) { if (dealVersionMainObj.ObligationUnitMains.IndexOf(paymentUnitMain) == -1) { dealVersionMainObj.ObligationUnitMains.Add(paymentUnitMain); } } } // Отрабатывание регистров RegisterClear(scVersion); RegisterOperations(scVersion); } }
private void AddCFRegisterRecords(crmDealWithStageVersion scVersion) { if (scVersion == null) { return; } /* !!! Временно отключаем проверку !!! * // Примечание. В этом регистр пишутся только контролируемые организации * // Проверяем, что организация контролируемая. Это значит, что для её crmPartyRu найдётся какой-либо объект UserParty * OperandProperty prop = new OperandProperty("Party"); * CriteriaOperator op = prop == scVersion.; * XPCollection<crmUserParty> userPartyCol = new XPCollection<crmUserParty>(this.Session, op, null); * userPartyCol.Criteria = op; * userPartyCol.Reload(); * if (!userPartyCol.IsLoaded) userPartyCol.Load(); * * if (userPartyCol.Count == 0) return; */ // Цикл по финансовым этапам и их техническим подэтапам using (UnitOfWork uow = this.Session.BeginNestedUnitOfWork()) { crmDealWithStageVersion scVersion1 = uow.GetObjectByKey <crmDealWithStageVersion>(scVersion.Oid); foreach (crmStage stage in GetStageList(scVersion1)) { if (!IsChildOfFinanceStage(stage)) { continue; } // Список обязательств IList <crmObligationUnit> obligationUnits = new List <crmObligationUnit>(); //foreach (crmDeliveryUnit du in stage.DeliveryPlan.DeliveryUnits) { // if (obligationUnits.IndexOf(du) == -1) obligationUnits.Add(du); //} foreach (crmPaymentUnit pu in stage.PaymentPlan.PaymentUnits) { if (obligationUnits.IndexOf(pu) == -1) { obligationUnits.Add(pu); } } // Обход всех обязательств этапа DeliveryItem и PaymentItem foreach (crmPaymentUnit pu in obligationUnits) { foreach (crmPaymentItem pi in pu.PaymentItems) { // Примечание 2. Этот регистр отслеживает только финансовые платёжные обязательства PaymentMoney if (pi as crmPaymentMoney == null) { continue; } CreateCFRegister(uow, scVersion1, stage, pi); } } } uow.CommitChanges(); } }
private void AddDCDRegisterRecords(crmDealWithStageVersion scVersion) { if (scVersion == null) { return; } // Примечание. В этом регистр пишутся все организации, а не только контролируемые // Используем ((crmDealWithoutStage)scVersion.MainObject).Oid как token (метку для разспознавания набора связанных записей) Guid token = ((crmDealWithStage)scVersion.MainObject).Oid; using (UnitOfWork uow = this.Session.BeginNestedUnitOfWork()) { crmDealWithStageVersion scVersion1 = uow.GetObjectByKey <crmDealWithStageVersion>(scVersion.Oid); // Заполняем две записи. Вторая является инвертированной к первой по отношению Первичная сторона - Вторичная сторона foreach (crmStage stage in GetStageList(scVersion1)) { if (!IsChildOfFinanceStage(stage)) { continue; } // Список обязательств IList <crmObligationUnit> obligationUnits = new List <crmObligationUnit>(); foreach (crmDeliveryUnit du in stage.DeliveryPlan.DeliveryUnits) { if (obligationUnits.IndexOf(du) == -1) { obligationUnits.Add(du); } } foreach (crmPaymentUnit pu in stage.PaymentPlan.PaymentUnits) { if (obligationUnits.IndexOf(pu) == -1) { obligationUnits.Add(pu); } } // Обход всех обязательств этапа DeliveryItem и PaymentItem foreach (crmObligationUnit du in obligationUnits) { //foreach (crmDeliveryItem di in du.DeliveryItems) { // Первая запись crmDebtorCreditorDebtRegister dcdr1 = new crmDebtorCreditorDebtRegister(uow); dcdr1.Token = token; if (scVersion1.ContractDeal != null) { dcdr1.Contract = scVersion1.ContractDeal.Contract; } dcdr1.ContractDeal = scVersion1.ContractDeal; dcdr1.CostItem = scVersion1.CostItem; dcdr1.PrimaryParty = scVersion1.Customer.Party; dcdr1.ContragentParty = scVersion1.Supplier.Party; dcdr1.fmOrder = scVersion1.Order; dcdr1.Subject = (scVersion1.Order != null) ? scVersion1.Order.Subject : null; dcdr1.PlaneFact = PlaneFact.PLAN; dcdr1.Stage = stage; dcdr1.ObligationUnit = du; dcdr1.ObligationUnitDateTime = du.DatePlane; //dcdr2.StageTech = ; //dcdr2.StageTech2 = ; //dcdr.Nomenclature = scVersion1.; //if (scVersion1.FinancialDeal != null) { // dcdr1.FinancialDeal = scVersion1.FinancialDeal.FinancialDeal; //} //dcdr1.MeasureUnit = scVersion1.Order; //dcdr1.Volume = scVersion1.; //--- dcdr1.DebitValuta = scVersion1.Valuta; dcdr1.DebitCost = scVersion1.Price; //dcdr1.DebitCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //--- dcdr1.CreditValuta = scVersion1.Valuta; //null; dcdr1.CreditCost = 0; //dcdr1.CreditCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //--- //dcdr1.BalanceValuta = scVersion1.Valuta; //dcdr1.BalanceCost = dcdr1.DebitCost - dcdr1.CreditCost; // ??? dcdr1.BalanceCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //dcdr1.Save(); // Вторая запись crmDebtorCreditorDebtRegister dcdr2 = new crmDebtorCreditorDebtRegister(uow); dcdr2.Token = token; if (scVersion1.ContractDeal != null) { dcdr2.Contract = scVersion1.ContractDeal.Contract; } dcdr2.ContractDeal = scVersion1.ContractDeal; dcdr2.CostItem = scVersion1.CostItem; dcdr2.PrimaryParty = scVersion1.Supplier.Party; dcdr2.ContragentParty = scVersion1.Customer.Party; dcdr2.fmOrder = scVersion1.Order; dcdr2.Subject = (scVersion1.Order != null) ? scVersion1.Order.Subject : null; dcdr2.PlaneFact = PlaneFact.PLAN; dcdr2.Stage = stage; dcdr2.ObligationUnit = du; dcdr2.ObligationUnitDateTime = du.DatePlane; //dcdr2.StageTech = ; //dcdr2.StageTech2 = ; //if (scVersion1.FinancialDeal != null) { // dcdr2.FinancialDeal = scVersion1.FinancialDeal.FinancialDeal; //} //--- dcdr2.DebitValuta = scVersion1.Valuta; //null; dcdr2.DebitCost = 0; //dcdr2.DebitCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //--- dcdr2.CreditValuta = scVersion1.Valuta; dcdr2.CreditCost = scVersion1.Price; //dcdr2.CreditCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //--- //dcdr2.BalanceValuta = scVersion1.Valuta; //dcdr2.BalanceCost = dcdr2.DebitCost - dcdr2.CreditCost; // ??? dcdr.BalanceCostInRUR = scVersion1.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. //dcdr2.Save(); //} } } uow.CommitChanges(); } }
/// <summary> /// Создание записи регистра План-Факт /// </summary> /// <param name="scVersion"></param> /// <param name="di"></param> /// <returns></returns> private crmPlaneFactRegister CreatePlaneFactCommonRegister(Session ssn, crmDealWithStageVersion scVersion, crmStage stage, crmObligationTransfer obligationItem) { crmPlaneFactRegister pfr = new crmPlaneFactRegister(ssn); // Используем ((crmDealWithoutStage)scVersion.MainObject).Oid как token (метку для разспознавания набора связанных записей) Guid token = ((crmDealWithStage)scVersion.MainObject).Oid; pfr.Token = token; pfr.Contract = scVersion.ContractDeal.Contract; pfr.ContractDeal = scVersion.ContractDeal; pfr.CostItem = scVersion.CostItem; pfr.Creditor = scVersion.Customer.Party; pfr.Debitor = scVersion.Supplier.Party; pfr.fmOrder = scVersion.Order; pfr.Subject = (scVersion.Order != null) ? scVersion.Order.Subject : null; pfr.PlaneFact = PlaneFact.PLAN; pfr.Stage = stage; // ??? pfr.CostInRUR = scVersion.; //pfr.FinancialDeal - заменяется на финансовый этап //!Паша пока без финансовых сделок // if (scVersion.FinancialDeal != null) { // pfr.FinancialDeal = di.FinancialDeal.FinancialDeal; // } //pfr.Nomenclature = scVersion.DeliveryUnit.DeliveryItems; // SHU!!! Не ясно, откуда брать номенклатуру //pfr.FinancialDeal = scVersion.FinancialDeal.FinancialDeal; //pfr.MeasureUnit = scVersion.Order; //pfr.Volume = scVersion.; //pfr.Valuta = scVersion.Valuta; //pfr.Cost = scVersion.Price; //pfr.CostInRUR = scVersion.Price; // Надо вычислять с учётом прайса, курса по прайсу и т.п. pfr.Nomenclature = obligationItem.Nomenclature; crmDeliveryItem deliveryItem = obligationItem as crmDeliveryItem; if (deliveryItem != null) { pfr.MeasureUnit = deliveryItem.CountUnit; pfr.Volume = deliveryItem.CountValue; pfr.Valuta = deliveryItem.Valuta; pfr.Cost = deliveryItem.Price; } crmPaymentItem paymentItem = obligationItem as crmPaymentItem; if (paymentItem != null) { pfr.MeasureUnit = null; pfr.Volume = 0; pfr.Valuta = paymentItem.Valuta; pfr.Cost = paymentItem.SummFull; } return(pfr); }