예제 #1
0
        protected virtual void _(Events.FieldUpdated <FeaturesSet, FeaturesSet.centralizedPeriodsManagement> e)
        {
            if (e.Row == null)
            {
                return;
            }

            if ((bool?)e.OldValue != true &&
                e.Row.CentralizedPeriodsManagement == true &&
                EtalonOrganization != null)
            {
                foreach (PXResult <MasterFinPeriod, OrganizationFinPeriod> res in MasterFinPeriods.Select(EtalonOrganization.OrganizationID))
                {
                    MasterFinPeriod       masterFinPeriod       = res;
                    OrganizationFinPeriod organizationFinPeriod = res;

                    masterFinPeriod.DateLocked = organizationFinPeriod.DateLocked;
                    masterFinPeriod.Status     = organizationFinPeriod.Status;
                    masterFinPeriod.APClosed   = organizationFinPeriod.APClosed;
                    masterFinPeriod.ARClosed   = organizationFinPeriod.ARClosed;
                    masterFinPeriod.INClosed   = organizationFinPeriod.INClosed;
                    masterFinPeriod.CAClosed   = organizationFinPeriod.CAClosed;
                    masterFinPeriod.FAClosed   = organizationFinPeriod.FAClosed;

                    MasterFinPeriods.Cache.Update(masterFinPeriod);
                }
            }
        }
        private static void Validate(CATranEntryLight graph, CashAccount cashAccount, CABalanceValidationPeriodFilter filter)
        {
            if (string.IsNullOrEmpty(filter.FinPeriodID))
            {
                throw new PXException(GL.Messages.Prefix + ": " + GL.Messages.ProcessingRequireFinPeriodID);
            }

            MasterFinPeriod period = PXSelect <MasterFinPeriod, Where <MasterFinPeriod.finPeriodID, Equal <Required <MasterFinPeriod.finPeriodID> > > > .Select(graph, filter.FinPeriodID);

            if (period == null)
            {
                throw new PXException(GL.Messages.ProcessingRequireFinPeriodID);
            }

            ValidateAccount(graph, cashAccount);
            graph.Clear();

            ValidateCleared(graph, cashAccount, period);
            graph.Clear();

            ValidateCAAdjustments(graph, cashAccount, period);
            graph.Clear();

            ValidateCATransfers(graph, cashAccount, period);
            graph.Clear();

            ValidateCATrans(graph, cashAccount, period);
            graph.Clear();

            ValidateCADailySummary(graph, cashAccount, period);
        }
        protected virtual FinPeriod BuildFinPeriod(int?organizationID, object record)
        {
            if (organizationID == FinPeriod.organizationID.MasterValue &&
                MasterPeriodBasedOnOrganizationPeriods)
            {
                MasterFinPeriod baseFinPeriod = (record as PXResult).GetItem <MasterFinPeriod>();

                return(new FinPeriod()
                {
                    FinPeriodID = baseFinPeriod.FinPeriodID,
                    StartDateUI = baseFinPeriod.StartDateUI,
                    EndDateUI = baseFinPeriod.EndDateUI,
                    Descr = baseFinPeriod.Descr,
                    NoteID = baseFinPeriod.NoteID
                });
            }
            else
            {
                PXResult resultRecord = record as PXResult;

                FinPeriod orgFinPeriod = resultRecord != null
                                                                                                        ? resultRecord.GetItem <FinPeriod>()
                                                                                                        : (FinPeriod)record;

                return(new FinPeriod
                {
                    FinPeriodID = orgFinPeriod.FinPeriodID,
                    StartDateUI = orgFinPeriod.StartDateUI,
                    EndDateUI = orgFinPeriod.EndDateUI,
                    Descr = orgFinPeriod.Descr,
                    NoteID = orgFinPeriod.NoteID
                });
            }
        }
        protected virtual OrganizationFinYear GenerateSingleOrganizationFinYear(int organizationID, string startYearNumber, string startMasterFinPeriodID)
        {
            MasterFinYear   startYear            = FinPeriodRepository.FindMasterFinYearByID(startYearNumber);
            MasterFinPeriod startMasterFinPeriod = FinPeriodRepository.FindMasterFinPeriodByID(startMasterFinPeriodID);

            return(GenerateSingleOrganizationFinYear(organizationID, startYear, startMasterFinPeriod));
        }
        protected virtual IEnumerable billed()
        {
            UsageFilter filter = Filter.Current;

            if (filter == null)
            {
                return(new List <PMTran>());
            }

            PXSelectBase <PMTran> select = new PXSelectJoin <
                PMTran,
                LeftJoin <CRCase,
                          On <CRCase.noteID, Equal <PMTran.origRefID>,
                              Or <CRCase.caseID, Equal <PMTran.caseID> > > >,
                Where <
                    PMTran.billed, Equal <True>,
                    And <PMTran.projectID, Equal <Current <UsageFilter.contractID> > > > >
                                               (this);

            if (!string.IsNullOrEmpty(filter.InvFinPeriodID))
            {
                MasterFinPeriod finPeriod = PXSelect <MasterFinPeriod, Where <MasterFinPeriod.finPeriodID, Equal <Current <UsageFilter.invFinPeriodID> > > > .Select(this);

                if (finPeriod != null)
                {
                    select.WhereAnd <Where <PMTran.billedDate, Between <Required <MasterFinPeriod.startDate>, Required <MasterFinPeriod.endDate> > > >();
                }
            }

            return(select.Select());
        }
        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 OrganizationFinPeriod GenerateAdjustmentOrganizationFinPeriod(int organizationID, OrganizationFinPeriod prevFinPeriod)
        {
            (string masterYearNumber, string masterPeriodNumber) = FinPeriodUtils.ParseFinPeriodID(prevFinPeriod.FinPeriodID);
            MasterFinYear masterFinYear = FinPeriodRepository.FindMasterFinYearByID(masterYearNumber, clearQueryCache: true);
            string        adjustmentMasterFinPeriodID = $"{masterYearNumber:0000}{masterFinYear.FinPeriods:00}";

            (string yearNumber, string periodNumber) = FinPeriodUtils.ParseFinPeriodID(prevFinPeriod.FinPeriodID);
            periodNumber = $"{int.Parse(periodNumber) + 1:00}";
            OrganizationFinPeriod orgFinPeriod = new OrganizationFinPeriod
            {
                OrganizationID    = organizationID,
                FinPeriodID       = FinPeriodUtils.ComposeFinPeriodID(yearNumber, periodNumber),
                MasterFinPeriodID = adjustmentMasterFinPeriodID,
                FinYear           = yearNumber,
                PeriodNbr         = periodNumber,
                Custom            = prevFinPeriod.Custom,
                DateLocked        = prevFinPeriod.DateLocked,
                StartDate         = prevFinPeriod.EndDate,
                EndDate           = prevFinPeriod.EndDate,

                Status   = prevFinPeriod.Status,
                ARClosed = prevFinPeriod.ARClosed,
                APClosed = prevFinPeriod.APClosed,
                FAClosed = prevFinPeriod.FAClosed,
                CAClosed = prevFinPeriod.CAClosed,
                INClosed = prevFinPeriod.INClosed,

                Descr = Messages.AdjustmentPeriod,
            };

            MasterFinPeriod masterFinPeriod = FinPeriodRepository.FindMasterFinPeriodByID(adjustmentMasterFinPeriodID);

            PXDBLocalizableStringAttribute.CopyTranslations <MasterFinPeriod.descr, OrganizationFinPeriod.descr>(this, masterFinPeriod, orgFinPeriod);

            return(orgFinPeriod);
        }
        /// <summary>
        /// TODO: Share function in <see cref="OrganizationMaint.CreateOrganizationCalendar"/> function
        /// </summary>
        /// <param name="organizationID"></param>
        /// <param name="masterFinPeriod"></param>
        /// <returns></returns>
        protected virtual OrganizationFinPeriod CopyOrganizationFinPeriodFromMaster(
            int organizationID,
            MasterFinPeriod masterFinPeriod,
            FinPeriod orgFinPeriodStatusSource,
            string yearNumber   = null,
            string periodNumber = null)
        {
            bool   isCentralizedManagement = PXAccess.FeatureInstalled <FeaturesSet.centralizedPeriodsManagement>();
            string organizationFinPeriodID = FinPeriodUtils.ComposeFinPeriodID(yearNumber, periodNumber) ?? masterFinPeriod.FinPeriodID;

            OrganizationFinPeriod orgFinPeriod = new OrganizationFinPeriod
            {
                OrganizationID    = organizationID,
                FinPeriodID       = organizationFinPeriodID,
                MasterFinPeriodID = masterFinPeriod.FinPeriodID,
                FinYear           = yearNumber ?? masterFinPeriod.FinYear,
                PeriodNbr         = periodNumber ?? masterFinPeriod.PeriodNbr,
                Custom            = masterFinPeriod.Custom,
                DateLocked        = masterFinPeriod.DateLocked,
                StartDate         = masterFinPeriod.StartDate,
                EndDate           = masterFinPeriod.EndDate,

                Status   = isCentralizedManagement ? masterFinPeriod.Status : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.Status : FinPeriod.status.Inactive,
                ARClosed = isCentralizedManagement ? masterFinPeriod.ARClosed : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.ARClosed : false,
                APClosed = isCentralizedManagement ? masterFinPeriod.APClosed : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.APClosed : false,
                FAClosed = isCentralizedManagement ? masterFinPeriod.FAClosed : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.FAClosed : false,
                CAClosed = isCentralizedManagement ? masterFinPeriod.CAClosed : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.CAClosed : false,
                INClosed = isCentralizedManagement ? masterFinPeriod.INClosed : orgFinPeriodStatusSource != null ? orgFinPeriodStatusSource.INClosed : false,

                Descr = masterFinPeriod.Descr,
            };

            PXDBLocalizableStringAttribute.CopyTranslations <MasterFinPeriod.descr, OrganizationFinPeriod.descr>(this, masterFinPeriod, orgFinPeriod);

            return(orgFinPeriod);
        }
예제 #9
0
        protected virtual void _(Events.FieldUpdating <FeaturesSet.centralizedPeriodsManagement> e)
        {
            e.NewValue = PXBoolAttribute.ConvertValue(e.NewValue);
            FeaturesSet row = (FeaturesSet)e.Row;

            if (row == null)
            {
                return;
            }

            int  messageCount = 0;
            bool isError      = false;

            if (row.CentralizedPeriodsManagement != null && row.CentralizedPeriodsManagement != (bool)e.NewValue && (bool)e.NewValue == true)
            {
                foreach (Organization organization in PXSelect <Organization> .Select(this))
                {
                    foreach (MasterFinPeriod problemPeriod in PXSelectJoin <
                                 MasterFinPeriod,
                                 LeftJoin <OrganizationFinPeriod,
                                           On <MasterFinPeriod.finPeriodID, Equal <OrganizationFinPeriod.masterFinPeriodID>,
                                               And <OrganizationFinPeriod.organizationID, Equal <Required <OrganizationFinPeriod.organizationID> > > > >,
                                 Where <OrganizationFinPeriod.finPeriodID, IsNull> >
                             .Select(this, organization.OrganizationID))
                    {
                        isError = true;
                        if (messageCount <= MAX_FINPERIOD_DISCREPANCY_MESSAGE_COUNT)
                        {
                            PXTrace.WriteError(GL.Messages.DiscrepancyPeriod, organization.OrganizationCD, problemPeriod.FinPeriodID);

                            messageCount++;
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                if (isError)
                {
                    e.Cancel = true;
                    throw new PXSetPropertyException(GL.Messages.DiscrepancyPeriodError);
                }

                Organization etalonOrganization = PXSelect <Organization> .Select(this).First();

                if (etalonOrganization != null)
                {
                    foreach (Organization organization in PXSelect <Organization> .Select(this))
                    {
                        if (organization.OrganizationID == etalonOrganization.OrganizationID)
                        {
                            continue;
                        }

                        foreach (OrganizationFinPeriod problemPeriod in PXSelectJoin <
                                     OrganizationFinPeriod,
                                     LeftJoin <OrganizationFinPeriodStatus,
                                               On <OrganizationFinPeriodStatus.organizationID, Equal <Required <OrganizationFinPeriodStatus.organizationID> >,
                                                   And <OrganizationFinPeriod.finPeriodID, Equal <OrganizationFinPeriodStatus.finPeriodID>,
                                                        And <OrganizationFinPeriod.dateLocked, Equal <OrganizationFinPeriodStatus.dateLocked>,
                                                             And <OrganizationFinPeriod.status, Equal <OrganizationFinPeriodStatus.status>,
                                                                  And <OrganizationFinPeriod.aPClosed, Equal <OrganizationFinPeriodStatus.aPClosed>,
                                                                       And <OrganizationFinPeriod.aRClosed, Equal <OrganizationFinPeriodStatus.aRClosed>,
                                                                            And <OrganizationFinPeriod.iNClosed, Equal <OrganizationFinPeriodStatus.iNClosed>,
                                                                                 And <OrganizationFinPeriod.cAClosed, Equal <OrganizationFinPeriodStatus.cAClosed>,
                                                                                      And <OrganizationFinPeriod.fAClosed, Equal <OrganizationFinPeriodStatus.fAClosed> > > > > > > > > > >,
                                     Where <OrganizationFinPeriodStatus.finPeriodID, IsNull,
                                            And <OrganizationFinPeriod.organizationID, Equal <Required <OrganizationFinPeriod.organizationID> > > > >
                                 .Select(this, organization.OrganizationID, etalonOrganization.OrganizationID))
                        {
                            isError = true;
                            if (messageCount <= MAX_FINPERIOD_DISCREPANCY_MESSAGE_COUNT)
                            {
                                string problemFields = GetProblemFields(organization, problemPeriod);

                                PXTrace.WriteError(GL.Messages.DiscrepancyField,
                                                   etalonOrganization.OrganizationCD,
                                                   organization.OrganizationCD,
                                                   problemFields,
                                                   problemPeriod.FinPeriodID);

                                messageCount++;
                            }
                            else
                            {
                                break;
                            }
                        }
                    }

                    if (isError)
                    {
                        e.Cancel = true;
                        throw new PXSetPropertyException(GL.Messages.DiscrepancyFieldError);
                    }
                }

                foreach (PXResult <MasterFinPeriod, OrganizationFinPeriod> res in MasterFinPeriods.Select(etalonOrganization.OrganizationID))
                {
                    MasterFinPeriod       masterFinPeriod       = res;
                    OrganizationFinPeriod organizationFinPeriod = res;

                    masterFinPeriod.DateLocked = organizationFinPeriod.DateLocked;
                    masterFinPeriod.Status     = organizationFinPeriod.Status;
                    masterFinPeriod.APClosed   = organizationFinPeriod.APClosed;
                    masterFinPeriod.ARClosed   = organizationFinPeriod.ARClosed;
                    masterFinPeriod.INClosed   = organizationFinPeriod.INClosed;
                    masterFinPeriod.CAClosed   = organizationFinPeriod.CAClosed;
                    masterFinPeriod.FAClosed   = organizationFinPeriod.FAClosed;

                    this.MasterFinPeriods.Cache.Update(masterFinPeriod);
                }
            }
        }
        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);
        }