Esempio n. 1
0
        protected virtual void FAOrganizationBook_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
        {
            FAOrganizationBook book = (FAOrganizationBook)e.Row;

            if (book == null)
            {
                return;
            }

            PXSetPropertyException disableRowException = null;
            FABookYearSetup        setup = PXSelect <FABookYearSetup, Where <FABookYearSetup.bookID, Equal <Current <FAOrganizationBook.bookID> > > > .SelectSingleBound(this, new object[] { book });

            if (setup == null && book.UpdateGL != true)
            {
                disableRowException = new PXSetPropertyException(Messages.CalendarSetupNotFound, PXErrorLevel.RowWarning, book.BookCode);
            }

            OrganizationFinYear nearestFinYear = FinPeriodRepository.FindNearestOrganizationFinYear(book.OrganizationID, "1900");

            if (disableRowException == null &&
                book.OrganizationID != FinPeriod.organizationID.MasterValue &&
                book.UpdateGL == true &&
                nearestFinYear == null)
            {
                disableRowException = new PXSetPropertyException(GL.Messages.OrganizationCalendarDoesNotExist, PXErrorLevel.RowWarning, PXAccess.GetOrganizationCD(book.OrganizationID));
            }

            if (disableRowException != null)
            {
                PXUIFieldAttribute.SetEnabled <FAOrganizationBook.selected>(sender, book, false);
                sender.RaiseExceptionHandling <FAOrganizationBook.selected>(book, null, disableRowException);
            }
        }
        private bool IsFirstOrLastOrganizationFinYear(OrganizationFinYear organizationFinYear)
        {
            FinYear firstFinYear = FinPeriodRepository.FindFirstYear(organizationFinYear.OrganizationID, clearQueryCache: true);

            FinYear lastFinYear = FinPeriodRepository.FindLastYear(organizationFinYear.OrganizationID, clearQueryCache: true);

            return(organizationFinYear.Year == firstFinYear.Year ||
                   organizationFinYear.Year == lastFinYear.Year);
        }
 protected bool IsOrganizationFinYearUsed(OrganizationFinYear organizationFinYear)
 {
     return(OrgFinPeriods
            .Select(organizationFinYear.OrganizationID, organizationFinYear.Year)
            .RowCast <OrganizationFinPeriod>()
            .Any(period => period.Status == FinPeriod.status.Closed ||
                 period.Status == FinPeriod.status.Locked ||
                 period.DateLocked == true) ||
            IsOrganizationFinYearReferenced(organizationFinYear));
 }
        protected virtual OrganizationFinYear GenerateNextOrganizationFinYear(OrganizationFinYear year)
        {
            string        generatedYearNumber = $"{int.Parse(year.Year) + 1:0000}";
            MasterFinYear masterFinYear;

            while ((masterFinYear = FinPeriodRepository.FindMasterFinYearByID(generatedYearNumber, clearQueryCache: true)) == null)
            {
                MasterCalendarGraph.Clear();
                MasterCalendarGraph.GenerateCalendar(
                    FinPeriod.organizationID.MasterValue,
                    int.Parse(FinPeriodRepository.FindLastYear(FinPeriod.organizationID.MasterValue, clearQueryCache: true).Year),
                    int.Parse(generatedYearNumber));
            }

            short generatedFinPeriodsCount = (short)masterFinYear.FinPeriods;

            if (YearSetup.Current.HasAdjustmentPeriod == true)
            {
                generatedFinPeriodsCount--;
            }

            OrganizationFinPeriod lastNonAdjustmentOrgFinPeriod = this.FinPeriodRepository.FindLastNonAdjustmentOrganizationFinPeriodOfYear(year.OrganizationID, year.Year, clearQueryCache: true);
            int generatedMasterYearNumber = int.Parse(lastNonAdjustmentOrgFinPeriod.FinYear);

            List <MasterFinPeriod> masterFinPeriods;

            PXSelectBase <MasterFinPeriod> select = new PXSelectReadonly <
                MasterFinPeriod,
                Where <MasterFinPeriod.finPeriodID, Greater <Required <MasterFinPeriod.finPeriodID> >,
                       And <MasterFinPeriod.startDate, NotEqual <MasterFinPeriod.endDate> > >,
                OrderBy <
                    Asc <MasterFinPeriod.finPeriodID> > >(this);

            select.View.Clear();

            while ((masterFinPeriods = select
                                       .SelectWindowed(0, generatedFinPeriodsCount, lastNonAdjustmentOrgFinPeriod.MasterFinPeriodID)
                                       .RowCast <MasterFinPeriod>()
                                       .ToList()).Count < generatedFinPeriodsCount)
            {
                generatedMasterYearNumber++;
                MasterCalendarGraph.Clear();
                MasterCalendarGraph.GenerateCalendar(
                    FinPeriod.organizationID.MasterValue,
                    int.Parse(FinPeriodRepository.FindLastYear(FinPeriod.organizationID.MasterValue, clearQueryCache: true).Year),
                    generatedMasterYearNumber);
                select.View.Clear();
            }

            MasterFinPeriod startMasterFinPeriod = masterFinPeriods.First();

            return(GenerateSingleOrganizationFinYear((int)year.OrganizationID, masterFinYear, startMasterFinPeriod));
        }
        protected virtual void VerifyOrganizationFinYearForDelete(OrganizationFinYear organizationFinYear)
        {
            if (!IsFirstOrLastOrganizationFinYear(organizationFinYear))
            {
                throw new PXException(Messages.OnlyFirstOrLastYearCanBeDeleted);
            }

            if (IsOrganizationFinYearUsed(organizationFinYear))
            {
                throw new PXException(Messages.PeriodAlreadyUsed);
            }
        }
        private bool IsOrganizationFinYearReferenced(OrganizationFinYear organizationFinYear)
        {
            using (new PXConnectionScope())
            {
                GLTran tran = ReferencingByTranQuery
                              .WhereNew <Where <OrganizationFinPeriod.organizationID, Equal <Required <OrganizationFinYear.organizationID> >,
                                                And <OrganizationFinPeriod.finYear, Equal <Required <OrganizationFinYear.year> > > > >()
                              .SelectSingleReadonly <GLTran>(this, organizationFinYear.OrganizationID, organizationFinYear.Year);

                Batch batch = ReferencingByBatchQuery
                              .WhereNew <Where <OrganizationFinPeriod.organizationID, Equal <Required <OrganizationFinYear.organizationID> >,
                                                And <OrganizationFinPeriod.finYear, Equal <Required <OrganizationFinYear.year> > > > >()
                              .SelectSingleReadonly <Batch>(this, organizationFinYear.OrganizationID, organizationFinYear.Year);

                return(batch != null || tran != null);
            }
        }
        public virtual void GenerateCalendar(int?organizationID, int fromYear, int toYear)
        {
            (int firstYearNumber, int lastYearNumber) = FinPeriodUtils.GetFirstLastYearForGeneration(organizationID, fromYear, toYear,
                                                                                                     clearQueryCache: true);

            OrganizationFinYear firstFinYear = FinPeriodRepository.FindOrganizationFinYearByID(organizationID, $"{firstYearNumber:0000}",
                                                                                               clearQueryCache: true);
            OrganizationFinYear lastFinYear = FinPeriodRepository.FindOrganizationFinYearByID(organizationID, $"{lastYearNumber:0000}",
                                                                                              clearQueryCache: true);

            OrganizationFinYear baseFinYear = firstFinYear;

            using (PXTransactionScope ts = new PXTransactionScope())
            {
                if (fromYear < firstYearNumber)
                {
                    do
                    {
                        baseFinYear = GeneratePreviousOrganizationFinYear(baseFinYear);
                        Actions.PressSave();
                    }while (baseFinYear != null &&
                            string.CompareOrdinal(baseFinYear.Year, $"{fromYear:0000}") > 0);
                }
                baseFinYear = lastFinYear;
                if (toYear > lastYearNumber)
                {
                    do
                    {
                        baseFinYear = GenerateNextOrganizationFinYear(baseFinYear);
                        Actions.PressSave();
                    }while (baseFinYear != null &&
                            string.CompareOrdinal(baseFinYear.Year, $"{toYear:0000}") < 0);
                }
                ts.Complete();
            }
        }
        protected virtual OrganizationFinYear GenerateSingleOrganizationFinYear(int organizationID, MasterFinYear startMasterYear, MasterFinPeriod startMasterFinPeriod)
        {
            if (startMasterYear == null)
            {
                throw new ArgumentNullException(nameof(startMasterYear));
            }
            if (startMasterFinPeriod == null)
            {
                throw new ArgumentNullException(nameof(startMasterFinPeriod));
            }

            OrganizationFinYear newOrganizationFinYear = (OrganizationFinYear)this.Caches <OrganizationFinYear>().Insert(
                new OrganizationFinYear
            {
                OrganizationID         = organizationID,
                Year                   = startMasterYear.Year,
                FinPeriods             = startMasterYear.FinPeriods,
                StartMasterFinPeriodID = startMasterFinPeriod.FinPeriodID,
                StartDate              = startMasterFinPeriod.StartDate,
            });

            short           periodNumber          = 1;
            MasterFinPeriod sourceMasterFinPeriod = startMasterFinPeriod;
            int             periodsCountForCopy   = (int)newOrganizationFinYear.FinPeriods;

            if (YearSetup.Current.HasAdjustmentPeriod == true)
            {
                periodsCountForCopy--;
            }
            OrganizationFinPeriod newOrganizationFinPeriod = null;

            FinPeriod firstOrgFinPeriod = FinPeriodRepository.FindFirstPeriod(organizationID, clearQueryCache: true);

            while (periodNumber <= periodsCountForCopy)
            {
                newOrganizationFinPeriod = (OrganizationFinPeriod)this.Caches <OrganizationFinPeriod>().Insert(
                    CopyOrganizationFinPeriodFromMaster(
                        organizationID,
                        sourceMasterFinPeriod,
                        firstOrgFinPeriod != null && Convert.ToInt32(firstOrgFinPeriod.FinYear) > Convert.ToInt32(newOrganizationFinYear.Year) ? firstOrgFinPeriod : null,
                        newOrganizationFinYear.Year,
                        $"{periodNumber:00}"));

                if (periodNumber < periodsCountForCopy)                 // no need to search for the next master period if last organization period is generated
                {
                    string sourceMasterFinPeriodID = sourceMasterFinPeriod.FinPeriodID;
                    while ((sourceMasterFinPeriod = FinPeriodRepository.FindNextNonAdjustmentMasterFinPeriod(sourceMasterFinPeriodID, clearQueryCache: true)) == null)
                    {
                        MasterCalendarGraph.Clear();
                        MasterCalendarGraph.GenerateNextMasterFinYear();
                    }
                }

                periodNumber++;
            }
            newOrganizationFinYear.EndDate = newOrganizationFinPeriod.EndDate;
            if (YearSetup.Current.HasAdjustmentPeriod == true)
            {
                this.Caches <OrganizationFinPeriod>().Insert(GenerateAdjustmentOrganizationFinPeriod(organizationID, newOrganizationFinPeriod));
            }

            return(newOrganizationFinYear);
        }
        protected virtual IEnumerable Cancel(PXAdapter a)
        {
            string organizationCD;
            string yearNumber;

            if (NewCalendarParams.View.Answer == WebDialogResult.None)             // First outer call
            {
                FinYearKey storedYearKey = new FinYearKey
                {
                    OrganizationID = OrgFinYear.Current?.OrganizationID,
                    Year           = OrgFinYear.Current?.Year
                };

                #region Deliberate Technomagic. Copy-pasted fron base PXCancel instead invocation
                Clear();
                SelectTimeStamp();
                #endregion

                StoredYearKey.Cache.Clear();
                StoredYearKey.Insert(storedYearKey);
                StoredYearKey.Cache.IsDirty = false;

                organizationCD = (string)a.Searches.GetSearchValueByPosition(0);
                if (organizationCD == null)
                {
                    yield break;
                }
                yearNumber = (string)a.Searches.GetSearchValueByPosition(1);
            }
            else             // Second call after SmartPanel closing
            {
                object       extValue = NewCalendarParams.Cache.GetValueExt <NewOrganizationCalendarParameters.organizationID>(NewCalendarParams.Current);
                PXFieldState state    = extValue as PXFieldState;
                organizationCD = state != null ? (string)state.Value : (string)extValue;
                yearNumber     = NewCalendarParams.Current.StartYear;
            }

            OrganizationFinYear targetYear = PXSelectJoin <
                OrganizationFinYear,
                InnerJoin <Organization,
                           On <OrganizationFinYear.organizationID, Equal <Organization.organizationID> > >,
                Where <Organization.organizationCD, Equal <Required <Organization.organizationCD> >,
                       And <OrganizationFinYear.year, Equal <Required <OrganizationFinYear.year> > > > >
                                             .SelectSingleBound(this, new object[] { }, organizationCD, yearNumber);

            OrganizationFinYear returnYear = null;
            if (targetYear == null)
            {
                OrganizationFinYear lastYear = LastOrganizationYear.SelectSingle(organizationCD);

                if (lastYear == null)
                {
                    if (NewCalendarParams.AskExtFullyValid((graph, viewName) =>
                    {
                        NewCalendarParams.Current.OrganizationID = PXAccess.GetOrganizationID(organizationCD);
                    },
                                                           DialogAnswerType.Positive))
                    {
                        OrganizationFinYear generatedFinYear;
                        using (PXTransactionScope ts = new PXTransactionScope())
                        {
                            generatedFinYear = GenerateSingleOrganizationFinYear(
                                (int)NewCalendarParams.Current.OrganizationID,
                                NewCalendarParams.Current.StartYear,
                                NewCalendarParams.Current.StartMasterFinPeriodID);
                            Actions.PressSave();
                            ts.Complete();
                        }
                        returnYear = generatedFinYear;
                    }
                    else
                    {
                        OrganizationFinYear storedYear = FinPeriodRepository.FindOrganizationFinYearByID(StoredYearKey.Current?.OrganizationID, StoredYearKey.Current?.Year);
                        returnYear = storedYear;
                    }
                }
                else
                {
                    returnYear = lastYear;
                }
            }
            else
            {
                returnYear = targetYear;
            }

            if (returnYear != null)
            {
                yield return(returnYear);
            }
            yield break;
        }