コード例 #1
0
        private CompanyRecord CreateCompanyRecord(GAFPeriod gafPeriod, GSTAuditFile gstAuditFile, DateTime creationDate)
        {
            var companyRecord = new CompanyRecord();

            var branch      = _gafRepository.GetBranchByID(gafPeriod.BranchID);
            var baccount    = _gafRepository.GetBAccountByID(branch.BAccountID);
            var mainContact = _gafRepository.GetContact(baccount.DefContactID);

            companyRecord.CompanyName      = mainContact.FullName;
            companyRecord.CompanyBRN       = baccount.AcctReferenceNbr;
            companyRecord.CompanyGSTNumber = baccount.TaxRegistrationID;

            var taxPeriod = _gafRepository.GetTaxPeriodByKey(gafPeriod.BranchID, gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID);

            companyRecord.PeriodStartDate = taxPeriod.StartDate.Value;
            companyRecord.PeriodEndDate   = taxPeriod.EndDateUI.Value;

            companyRecord.FileCreationDate = creationDate;

            var acumaticaVersion = _gafRepository.GetAcumaticaVersion();

            companyRecord.ProductVersion = String.Concat("Acumatica", acumaticaVersion.CurrentVersion);
            companyRecord.GAFVersion     = String.Format(GafVersionTemplate, gstAuditFile.MajorVersion, GafVersionDelimiter,
                                                         gstAuditFile.MinorVersion);

            return(companyRecord);
        }
コード例 #2
0
        private void CreateGafRecordsByCADocuments(DocumentIDGroup documentIDGroup,
                                                   GAFPeriod gafPeriod,
                                                   out IList <PurchaseRecord> purchaseRecords,
                                                   out IList <SupplyRecord> supplyRecords)
        {
            purchaseRecords = new List <PurchaseRecord>();
            supplyRecords   = new List <SupplyRecord>();

            var caAdjs = _gafRepository.GetCAAdjsByIDs(documentIDGroup.DocumentType, documentIDGroup.RefNbrs.ToArray());

            var caAdjGroupsByDrCr = caAdjs.GroupBy(caAdj => caAdj.DrCr);

            foreach (var caAdjGroupByDrCr in caAdjGroupsByDrCr)
            {
                var documentGroup = new DocumentGroup <CAAdj>()
                {
                    Module            = documentIDGroup.Module,
                    DocumentType      = documentIDGroup.DocumentType,
                    DocumentsByRefNbr = caAdjGroupByDrCr.ToDictionary(caAdj => caAdj.AdjRefNbr, caAdj => caAdj)
                };

                if (caAdjGroupByDrCr.Key == CADrCr.CACredit)
                {
                    purchaseRecords = _caDocumentPurchaseGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentGroup,
                                                                                                            gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID);
                }
                else
                {
                    supplyRecords = _caDocumentSupplyGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentGroup,
                                                                                                        gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID);
                }
            }
        }
コード例 #3
0
        public int?GetMaxGAFMajorVersion(GAFPeriod gafPeriod)
        {
            var gafPeriodWithMaxMajorVersion = (GAFPeriod)PXSelectGroupBy <GAFPeriod,
                                                                           Where <GAFPeriod.branchID, Equal <Required <GAFPeriod.branchID> >,
                                                                                  And <GAFPeriod.taxAgencyID, Equal <Required <GAFPeriod.taxAgencyID> > > >,
                                                                           Aggregate <Max <GAFPeriod.gafMajorVersion> > >
                                               .Select(_graph, gafPeriod.BranchID, gafPeriod.TaxAgencyID);

            return(gafPeriodWithMaxMajorVersion.GAFMajorVersion);
        }
コード例 #4
0
        private void CreateGAFDataByDocumentGroup(DocumentIDGroup documentIDGroup,
                                                  GAFPeriod gafPeriod,
                                                  FooterRecord footerRecord)
        {
            IList <SupplyRecord>   supplyRecords   = new List <SupplyRecord>();
            IList <PurchaseRecord> purchaseRecords = new List <PurchaseRecord>();

            if (documentIDGroup.Module == BatchModule.AP)
            {
                if (documentIDGroup.DocumentType == APDocType.Check)
                {
                    purchaseRecords = CreatePurchaseRecordsByAPPayments(documentIDGroup, gafPeriod);
                }
                else
                {
                    purchaseRecords = CreatePurchaseRecordsByAPInvoices(documentIDGroup, gafPeriod);
                }
            }
            else if (documentIDGroup.Module == BatchModule.AR)
            {
                supplyRecords = CreateSupplyRecordsByARInvoices(documentIDGroup, gafPeriod);
            }
            else if (documentIDGroup.Module == BatchModule.CA)
            {
                CreateGafRecordsByCADocuments(documentIDGroup, gafPeriod, out purchaseRecords, out supplyRecords);
            }
            else if (documentIDGroup.Module == BatchModule.GL &&
                     (documentIDGroup.DocumentTypes.Contains(TaxAdjustmentType.AdjustInput) ||
                      documentIDGroup.DocumentTypes.Contains(TaxAdjustmentType.AdjustOutput)))
            {
                var documentRecordAggregate = _taxAdjustmentGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentIDGroup, gafPeriod.BranchID, gafPeriod.TaxPeriodID);

                supplyRecords   = documentRecordAggregate.SupplyRecords;
                purchaseRecords = documentRecordAggregate.PurchaseRecords;
            }
            else if (documentIDGroup.Module == BatchModule.GL &&
                     documentIDGroup.DocumentTypes.Intersect(_glTaxDocumentTypes).Any())
            {
                var documentRecordAggregate = _glDocumentGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentIDGroup, gafPeriod.BranchID, gafPeriod.TaxPeriodID);

                supplyRecords   = documentRecordAggregate.SupplyRecords;
                purchaseRecords = documentRecordAggregate.PurchaseRecords;
            }

            WritePuchaseRecords(purchaseRecords);
            AddAmountsAndCountToFooterRecord(footerRecord, purchaseRecords);

            WriteSupplyRecords(supplyRecords);
            AddAmountsAndCountToFooterRecord(footerRecord, supplyRecords);
        }
コード例 #5
0
        private void SetGAFVersion(GSTAuditFile gstAuditFile, GAFPeriod gafPeriod)
        {
            if (gafPeriod.GAFMajorVersion == null)
            {
                var maxGAFMajorVersion = _gafRepository.GetMaxGAFMajorVersion(gafPeriod);

                if (maxGAFMajorVersion != null)
                {
                    gstAuditFile.MajorVersion = maxGAFMajorVersion.Value + 1;
                }
                else
                {
                    gstAuditFile.MajorVersion = 1;
                }

                gstAuditFile.MinorVersion = 0;
            }
            else
            {
                gstAuditFile.MajorVersion = gafPeriod.GAFMajorVersion.Value;
                gstAuditFile.MinorVersion = gafPeriod.GAFMinorLastVersion.Value + 1;
            }
        }
コード例 #6
0
        private IList <SupplyRecord> CreateSupplyRecordsByARInvoices(DocumentIDGroup documentIDGroup, GAFPeriod gafPeriod)
        {
            var resultRecords = new List <SupplyRecord>();

            IDocumentGafRecordCreator <ARInvoice, SupplyRecord> documentGafRecordCreator = null;

            var arInvoices = _gafRepository.GetARInvoicesByIDs(documentIDGroup.DocumentType, documentIDGroup.RefNbrs.ToArray());

            //module of taxTran is not honest, it alwayes equals to AR for all Account Receivable documents
            var documentGroupsByModule = arInvoices.GroupBy(apReg => apReg.OrigModule);

            foreach (var documentGroupByModule in documentGroupsByModule)
            {
                var documentGroup = new DocumentGroup <ARInvoice>()
                {
                    Module       = documentIDGroup.Module,
                    DocumentType = documentIDGroup.DocumentType
                };

                if (documentGroupByModule.Key == BatchModule.SO)
                {
                    documentGafRecordCreator = _arInvoiceFromSOGafRecordsCreator;
                }
                else
                {
                    documentGafRecordCreator = _arInvoiceGAFRecordsCreator;
                }

                documentGroup.DocumentsByRefNbr = documentGroupByModule.ToDictionary(invoice => invoice.RefNbr, invoice => invoice);

                var supplyRecords = documentGafRecordCreator.CreateGAFRecordsForDocumentGroup(documentGroup,
                                                                                              gafPeriod.TaxAgencyID,
                                                                                              gafPeriod.TaxPeriodID);

                resultRecords.AddRange(supplyRecords);
            }

            return(resultRecords);
        }
コード例 #7
0
        private IList <PurchaseRecord> CreatePurchaseRecordsByAPInvoices(DocumentIDGroup documentIDGroup, GAFPeriod gafPeriod)
        {
            var resultRecords = new List <PurchaseRecord>();

            var apInvoices = _gafRepository.GetAPInvoicesByIDs(documentIDGroup.DocumentType, documentIDGroup.RefNbrs.ToArray());

            //module of taxTran is not honest, it alwayes equals to AP for all Account Payable documents
            var documentGroupsByModule = apInvoices.GroupBy(apReg => apReg.OrigModule);

            foreach (var documentGroupByModule in documentGroupsByModule)
            {
                var documentGroup = new DocumentGroup <APInvoice>()
                {
                    Module            = documentGroupByModule.Key,
                    DocumentType      = documentIDGroup.DocumentType,
                    DocumentsByRefNbr = documentGroupByModule.ToDictionary(invoice => invoice.RefNbr, invoice => invoice)
                };

                var records = _apInvoiceGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentGroup,
                                                                                           gafPeriod.TaxAgencyID,
                                                                                           gafPeriod.TaxPeriodID);

                resultRecords.AddRange(records);
            }

            return(resultRecords);
        }
コード例 #8
0
        private IList <PurchaseRecord> CreatePurchaseRecordsByAPPayments(DocumentIDGroup documentIDGroup, GAFPeriod gafPeriod)
        {
            var apRegistersByRefNbrs = _gafRepository.GetAPRegistersByIDs(documentIDGroup.DocumentType,
                                                                          documentIDGroup.RefNbrs.ToArray())
                                       .ToDictionary(apReg => apReg.RefNbr, apReg => apReg);

            var documentGroup = new DocumentGroup <APRegister>()
            {
                Module            = documentIDGroup.Module,
                DocumentType      = documentIDGroup.DocumentType,
                DocumentsByRefNbr = apRegistersByRefNbrs
            };

            var purchaseRecords = _apPaymentGAFRecordsCreator.CreateGAFRecordsForDocumentGroup(documentGroup,
                                                                                               gafPeriod.TaxAgencyID,
                                                                                               gafPeriod.TaxPeriodID);

            return(purchaseRecords);
        }
コード例 #9
0
        /// <summary>
        /// Creates GST File data.
        /// </summary>
        public GSTAuditFile Create(GAFPeriod gafPeriod, DateTime creationDate)
        {
            if (gafPeriod == null)
            {
                throw new ArgumentNullException(nameof(gafPeriod));
            }

            var validationResult = _gafValidator.ValidateTaxYearStructure(_gafRepository.GetTaxPeriodByKey(gafPeriod.BranchID, gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID));

            validationResult.RaiseIfHasError();

            var documentIds = _gafRepository.GetReportedDocuments(gafPeriod.BranchID, gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID)
                              .ToArray();

            if (!documentIds.Any())
            {
                return(null);
            }


            #region Initialization

            var glDocumentIds = documentIds.Where(documentId => _glTaxDocumentTypes.Contains(documentId.DocType))
                                .ToArray();

            var documentGroups = SplitToDocumentGroups(documentIds.Except(glDocumentIds));

            if (glDocumentIds.Any())
            {
                var glDocumentGroup = BuildGLDocumentGroup(glDocumentIds);

                documentGroups.Add(glDocumentGroup);
            }

            var documentProcessingQueue = new GAFDocumentProcessingQueue(documentGroups);

            var gafDataStringBuilder = new StringBuilder();

            _purchaseGAFDataStringBuilder = new StringBuilder();
            _supplyGAFDataStringBuilder   = new StringBuilder();

            var footerRecord = new FooterRecord();
            var gstAuditFile = new GSTAuditFile();

            #endregion


            #region Processing

            SetGAFVersion(gstAuditFile, gafPeriod);

            var companyRecord = CreateCompanyRecord(gafPeriod, gstAuditFile, creationDate);
            _gafRecordWriter.WriteCompanyRecord(companyRecord, gafDataStringBuilder);

            #region Documents

            var documentGroup = documentProcessingQueue.GetNextDocumentGroup();

            while (documentGroup != null)
            {
                CreateGAFDataByDocumentGroup(documentGroup, gafPeriod, footerRecord);

                _gafRepository.ClearCaches();

                documentGroup = documentProcessingQueue.GetNextDocumentGroup();
            }

            gafDataStringBuilder.Append(_purchaseGAFDataStringBuilder);
            gafDataStringBuilder.Append(_supplyGAFDataStringBuilder);

            #endregion


            #region Ledger

            var ledgerRecords = _glgafLedgerRecordsCreator.CreateLedgerRecords(gafPeriod);

            AddAmountsAndCountToFooterRecord(footerRecord, ledgerRecords);

            foreach (var ledgerRecord in ledgerRecords)
            {
                _gafRecordWriter.WriteLedgerRecord(ledgerRecord, gafDataStringBuilder);
            }

            #endregion


            _gafRecordWriter.WriteFooterRecord(footerRecord, gafDataStringBuilder);

            #endregion


            gstAuditFile.Data = gafDataStringBuilder.ToString();

            var branch = _gafRepository.GetBranchByID(gafPeriod.BranchID);

            gstAuditFile.FileName = string.Concat(branch.BranchCD.Trim(), "_",
                                                  string.Format(GafVersionTemplate, gstAuditFile.MajorVersion, GafVersionDelimiterForFileName,
                                                                gstAuditFile.MinorVersion), ".txt");

            return(gstAuditFile);
        }
コード例 #10
0
        /// <summary>
        /// Creates L record elements. Exports GL transactions and account balances.
        /// </summary>
        public IList <LedgerRecord> CreateLedgerRecords(GAFPeriod gafPeriod)
        {
            var taxPeriod = _gafRepository.GetTaxPeriodByKey(gafPeriod.BranchID, gafPeriod.TaxAgencyID, gafPeriod.TaxPeriodID);

            var finPeriods = _gafRepository.GetFinPeriodsInInterval(taxPeriod.StartDate, taxPeriod.EndDate)
                             .ToList();

            var finYears = finPeriods.Select(finPeriod => finPeriod.FinYear)
                           .Distinct();

            var lastYearPeriod = finYears.Select(finYear => _gafRepository.FindLastYearNotAdjustmentPeriod(finYear))
                                 .SingleOrDefault();

            if (lastYearPeriod != null && finPeriods.Select(finPeriod => finPeriod.FinPeriodID).Contains(lastYearPeriod.FinPeriodID))
            {
                finPeriods.AddRange(_gafRepository.GetAdjustmentFinPeriods(lastYearPeriod.FinYear));
            }

            var records = new List <LedgerRecord>();

            var branch = _gafRepository.GetBranchByID(gafPeriod.BranchID);

            var minFinPeriod = finPeriods.First();

            var accountsWithGLHistoryData = _gafRepository.GetAccountsWithDataToCalcBeginBalancesExcludingYTDNetIncAcc(branch.BranchID, branch.LedgerID, minFinPeriod.FinPeriodID);

            foreach (var accountWithGLHistoryData in accountsWithGLHistoryData)
            {
                var account = (Account)accountWithGLHistoryData;
                var glHistoryForLastActivityPeriod = (AH)accountWithGLHistoryData;
                var glHistoryForSelectedPeriod     = (GLHistory)accountWithGLHistoryData;

                decimal?beginBalanceForPeriod = 0m;

                if (glHistoryForLastActivityPeriod.FinPeriodID != null)
                {
                    var selectedPeriodPtdCreditTotal = glHistoryForSelectedPeriod.FinPtdCredit ?? 0m;
                    var selectedPeriodPtdDebitTotal  = glHistoryForSelectedPeriod.FinPtdDebit ?? 0m;
                    var selectedPeriodPtdSaldo       = AccountRules.CalcSaldo(account.Type, selectedPeriodPtdDebitTotal, selectedPeriodPtdCreditTotal);

                    beginBalanceForPeriod = GetBalanceSign(account.Type) * (glHistoryForLastActivityPeriod.FinYtdBalance - selectedPeriodPtdSaldo);
                }

                var balanceRecord = BuildLedgerRecordForBalance(account, minFinPeriod.StartDate, beginBalanceForPeriod.Value);
                records.Add(balanceRecord);

                foreach (var finPeriod in finPeriods)
                {
                    var glTrans = _gafRepository.GetPostedGLTrans(branch.BranchID, branch.LedgerID, account.AccountID, finPeriod.FinPeriodID);

                    foreach (var glTran in glTrans)
                    {
                        var record = BuildLedgerRecordForTran(account, glTran, records.LastOrDefault());

                        records.Add(record);
                    }

                    _gafRepository.ClearCaches();
                }
            }

            return(records);
        }
コード例 #11
0
        private static void GenerateProc(GAFPeriod gafPeriod)
        {
            var gafGenerationProcess = PXGraph.CreateInstance <GAFGenerationProcess>();

            IGAFRepository gafRepository               = new GAFRepository(gafGenerationProcess);
            var            recordBuilderByVendorData   = new PurchaseRecordBuilderByVendorData(gafRepository);
            var            recordBuilderByCustomerData = new SupplyRecordBuilderByCustomerData(gafRepository);
            var            recordBuilderByRegister     = new GafRecordBuilderByRegister(gafRepository);
            var            recordCountryBuilderForSO   = new SupplyRecordCountryBuilderForSOInvoice(gafRepository);
            var            recordCountryBuilderForAR   = new SupplyRecordCountryBuilderForARInvoice(gafRepository);


            var apInvoiceGAFRecordsCreator = new APInvoiceGAFRecordsCreator(gafRepository,
                                                                            new PurchaseRecordBuilderByInvoiceTran(gafRepository, recordBuilderByVendorData, recordBuilderByRegister),
                                                                            new PurchaseRecordBuilderByTaxTranFromTaxDocument(gafRepository, recordBuilderByVendorData, recordBuilderByRegister),
                                                                            new PurchaseRecordBuilderByAPInvoiceTaxTranForTaxCalcedOnDocumentAmt(gafRepository, recordBuilderByRegister, recordBuilderByVendorData));

            var arInvoiceGAFRecordsCreator = new ARInvoiceGAFRecordsCreator(gafRepository,
                                                                            new SupplyRecordBuilderByARInvoice(gafRepository,
                                                                                                               recordBuilderByRegister,
                                                                                                               recordBuilderByCustomerData,
                                                                                                               recordCountryBuilderForAR),
                                                                            new SupplyRecordBuilderByARInvoiceTaxTranForTaxCalcedOnDocumentAmt(gafRepository,
                                                                                                                                               recordBuilderByRegister,
                                                                                                                                               recordBuilderByCustomerData,
                                                                                                                                               recordCountryBuilderForAR));

            var arInvoiceFromSOGAFRecordsCreator = new ARInvoiceFromSOGAFRecordsCreator(gafRepository,
                                                                                        new SupplyRecordBuilderBySOInvoice(gafRepository,
                                                                                                                           recordBuilderByRegister,
                                                                                                                           recordBuilderByCustomerData,
                                                                                                                           recordCountryBuilderForSO),
                                                                                        new SupplyRecordBuilderBySOInvoiceTaxTranForTaxCalcedOnDocumentAmt(gafRepository,
                                                                                                                                                           recordBuilderByRegister,
                                                                                                                                                           recordBuilderByCustomerData,
                                                                                                                                                           recordCountryBuilderForSO));

            var apPaymentGAFRecordsCreator = new APPaymentGAFRecordsCreator(gafRepository,
                                                                            new PurchaseRecordBuilderByTaxTranOfAPPayment(gafRepository, recordBuilderByVendorData, recordBuilderByRegister));

            var caDocumentPurchaseGAFRecordsCreator = new CADocumentPurchaseGAFRecordsCreator(gafRepository,
                                                                                              new PurchaseRecordBuilderByCADocument(gafRepository, recordBuilderByRegister),
                                                                                              new PurchaseRecordBuilderByCADocumentTaxTranForTaxCalcedOnDocumentAmt(gafRepository, recordBuilderByRegister));

            var caDocumentSupplyGAFRecordsCreator = new CADocumentSupplyGAFRecordsCreator(gafRepository,
                                                                                          new SupplyRecordBuilderByCADocument(gafRepository, recordBuilderByRegister),
                                                                                          new SupplyRecordBuilderByCADocumentTaxTranForTaxCalcedOnDocumentAmt(gafRepository, recordBuilderByRegister));

            var taxAdjustmentGafRecordsCreator = new TaxAdjustmentGAFRecordsCreator(gafRepository,
                                                                                    new GafRecordBuilderByTaxAdjustmentTaxTran(gafRepository));

            var glDocumentGAFRecordsCreator = new GLDocumentGAFRecordsCreator(gafRepository,
                                                                              new GafRecordBuilderByGLTranAndTaxTran(gafRepository));

            var gafCreationHelper = new GAFValidator(gafRepository);

            var gafDataCreator = new GAFDataCreator(gafRepository,
                                                    gafCreationHelper,
                                                    new GLGAFLedgerRecordsCreator(gafRepository),
                                                    apInvoiceGAFRecordsCreator,
                                                    arInvoiceGAFRecordsCreator,
                                                    arInvoiceFromSOGAFRecordsCreator,
                                                    apPaymentGAFRecordsCreator,
                                                    caDocumentPurchaseGAFRecordsCreator,
                                                    caDocumentSupplyGAFRecordsCreator,
                                                    taxAdjustmentGafRecordsCreator,
                                                    glDocumentGAFRecordsCreator,
                                                    new GafRecordWriter(gafRepository));



            var gafPeriodFromDB = gafRepository.FindGAFPeriodByKey(gafPeriod.BranchID, gafPeriod.TaxAgencyID,
                                                                   gafPeriod.TaxPeriodID);

            gafPeriod = gafPeriodFromDB ?? gafGenerationProcess.GAFPeriodView.Insert(gafPeriod);

            var gstAuditFile = gafDataCreator.Create(gafPeriod, gafGenerationProcess.Accessinfo.BusinessDate.Value);

            if (gstAuditFile == null)
            {
                return;
            }

            gafPeriod.GAFMajorVersion     = gstAuditFile.MajorVersion;
            gafPeriod.GAFMinorLastVersion = gstAuditFile.MinorVersion;

            gafGenerationProcess.GAFPeriodView.Update(gafPeriod);

            using (var ts = new PXTransactionScope())
            {
                PX.Objects.Common.Tools.UploadFileHelper.AttachDataAsFile(gstAuditFile.FileName, gstAuditFile.Data, gafPeriod,
                                                                          gafGenerationProcess);

                gafGenerationProcess.Actions.PressSave();

                ts.Complete();
            }
        }
コード例 #12
0
 public int?GetMaxGAFMajorVersion(GAFPeriod gafPeriod)
 {
     throw new NotImplementedException();
 }