private async Task <bool> CheckIfDocumentDateAccountingPeriodValid(ManualJournalDocument manualJournalDocument, AccountingSetupDto accountingSetup) { bool allChecksPassed = true; bool isPostOpClosedPrivilege = false; isPostOpClosedPrivilege = await CheckPrivileges(); if (manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.JL) { if (IsLastMonthForAccountingOpen(accountingSetup.LastMonthClosed, manualJournalDocument.AccountingPeriod, accountingSetup.NumberOfOpenPeriod, accountingSetup.LastMonthClosedForOperation)) { if (!isPostOpClosedPrivilege) { if (IsPeriodBeforeLastMonthForOperation(accountingSetup.LastMonthClosedForOperation, manualJournalDocument.AccountingPeriod)) { allChecksPassed = false; } } } else { allChecksPassed = false; } } else if (manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.TA) { bool checkAccountingPeriod = IsLastMonthForAccountingOpen(accountingSetup.LastMonthClosed, manualJournalDocument.AccountingPeriod, accountingSetup.NumberOfOpenPeriod, accountingSetup.LastMonthClosedForOperation); bool checkDocumentDate = IsLastMonthForAccountingOpen(accountingSetup.LastMonthClosed, manualJournalDocument.DocumentDate, accountingSetup.NumberOfOpenPeriod, accountingSetup.LastMonthClosedForOperation); if (checkAccountingPeriod && checkDocumentDate) { if (!isPostOpClosedPrivilege) { bool checkAccountingPeriodInlastMonthOperations = IsPeriodBeforeLastMonthForOperation(accountingSetup.LastMonthClosedForOperation, manualJournalDocument.AccountingPeriod); bool checkDocumentDateInlastMonthOperations = IsPeriodBeforeLastMonthForOperation(accountingSetup.LastMonthClosedForOperation, manualJournalDocument.DocumentDate); if (checkAccountingPeriodInlastMonthOperations || checkDocumentDateInlastMonthOperations) { allChecksPassed = false; } } } else { allChecksPassed = false; } } return(allChecksPassed); }
/// <summary> /// Saves a journal document (including its lines) /// </summary> /// <param name="manualJournalDocument"></param> /// <param name="company"></param> /// <returns></returns> public async Task <ManualJournalResponse> CreateManualJournal(ManualJournalDocument manualJournalDocument, string company) { DynamicParameters queryParameters = new DynamicParameters(); queryParameters.Add(DataVersionIdParameter, null); queryParameters.Add("@TransactionDocumentId", manualJournalDocument.TransactionDocumentId); queryParameters.Add("@DocumentDate", manualJournalDocument.DocumentDate.Date); queryParameters.Add("@ValueDate", manualJournalDocument.ValueDate); queryParameters.Add("@AccountingPeriod", manualJournalDocument.AccountingPeriod.Date); queryParameters.Add("@CompanyId", company); queryParameters.Add("@CurrencyCode", manualJournalDocument.CurrencyCode); queryParameters.Add("@TransactionDocumentTypeId", manualJournalDocument.TransactionDocumentTypeId); queryParameters.Add("@AuthorizedForPosting", manualJournalDocument.AuthorizedForPosting); queryParameters.Add("@ToInterface", manualJournalDocument.ToInterface); queryParameters.Add("@PhysicalDocumentId", manualJournalDocument.PhysicalDocumentId); queryParameters.Add("@DocumentReference", manualJournalDocument.DocumentReference); queryParameters.Add("@YearNumber", manualJournalDocument.YearNumber); queryParameters.Add("@Year", manualJournalDocument.Year); queryParameters.Add("@JLTypeId", manualJournalDocument.JLTypeId); queryParameters.Add("@TATypeId", manualJournalDocument.TATypeId); queryParameters.Add("@JournalLines", ToArrayTVP(manualJournalDocument.ManualJournalLines)); return(await ExecuteQueryFirstOrDefaultAsync <ManualJournalResponse>(StoredProcedureNames.CreateManualJournalDocument, queryParameters, true)); }
public async Task <ManualJournalResponse> Handle(CreateManualJournalDocumentCommand request, CancellationToken cancellationToken) { _unitOfWork.BeginTransaction(); AccountingSetupDto accountingSetup = null; Company company = null; try { string documentLabel = string.Empty; string year = string.Empty; int documentReferenceYear = 0; string documentReferenceYearValue = string.Empty; ManualJournalDocument manualJournalDocument = request.ManualJournal; company = await _masterDataService.GetCompanyByIdAsync(request.Company); CommonRules commonRules = new CommonRules(_accountingQueries, _authorizationService, _identityService); if (manualJournalDocument.AccountingPeriod.Year < manualJournalDocument.DocumentDate.Year || (manualJournalDocument.AccountingPeriod.Year <= manualJournalDocument.DocumentDate.Year && manualJournalDocument.AccountingPeriod.Month < manualJournalDocument.DocumentDate.Month)) { throw new AtlasBusinessException("A/c period should not be before doc. Date"); } accountingSetup = await _accountingQueries.GetAccountingSetup(request.Company); if (accountingSetup != null) { if (await CheckIfDocumentDateAccountingPeriodValid(manualJournalDocument, accountingSetup)) { if (company.IsProvinceEnable) { foreach (var item in manualJournalDocument.ManualJournalLines) { item.ProvinceId = company.DefaultProvinceId; item.BranchId = company.DefaultBranchId; } } else { foreach (var item in manualJournalDocument.ManualJournalLines) { item.ProvinceId = item.BranchId = null; } } if (manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.TA || manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.JL) { documentLabel = Enum.GetName(typeof(MasterDocumentType), manualJournalDocument.TransactionDocumentTypeId); year = manualJournalDocument.DocumentDate.Year.ToString(CultureInfo.InvariantCulture).Substring(2, 2); documentReferenceYear = await commonRules.GetDocumentReferenceYear(manualJournalDocument.DocumentDate, request.Company); documentReferenceYearValue = documentReferenceYear.ToString(System.Globalization.CultureInfo.InvariantCulture).Substring(2, 2); } if (manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.JL) { manualJournalDocument.JLTypeId = (int)JLType.ManualRegularJournal; } else if (manualJournalDocument.TransactionDocumentTypeId == (int)MasterDocumentType.TA) { if (manualJournalDocument.TATypeId != null) { manualJournalDocument.TATypeId = (int)TAType.ManualMarkToMarket; } else { manualJournalDocument.TATypeId = (int)TAType.ManualTemporaryAdjustment; } } int referencenumber = await _manualJournalQueries.GetManualDocumentReferenceValues(request.Company, (int)manualJournalDocument.TransactionDocumentTypeId, documentReferenceYear); manualJournalDocument.YearNumber = referencenumber; manualJournalDocument.Year = documentReferenceYear; manualJournalDocument.DocumentReference = string.Concat(documentLabel, documentReferenceYearValue, string.Format(CultureInfo.InvariantCulture, "{0:D5}", referencenumber)); var objResponse = await _manualJournalRepository.CreateManualJournal(manualJournalDocument, request.Company); var authorizationResult = await _authorizationService.AuthorizeAsync(_identityService.GetUser(), Policies.PostOpClosedPolicy); var content = new JObject(); content.Add(new JProperty("docId", objResponse.TransactionDocumentId)); content.Add(new JProperty("postOpClosedPolicy", authorizationResult.Succeeded)); Atlas.Application.Core.Entities.ProcessMessage message = new Atlas.Application.Core.Entities.ProcessMessage { ProcessTypeId = (long)Atlas.Application.Core.Entities.ProcessType.AtlasAccountingDocumentProcessor, CompanyId = request.Company, Content = content.ToString(), }; await _processMessageService.SendMessage(message); _unitOfWork.Commit(); return(objResponse); } else { throw new AtlasSecurityException($"Please check the document date and accounting period"); } } else { throw new AtlasSecurityException($"No Accounting Setup found"); } } catch { _unitOfWork.Rollback(); throw; } }