public async Task <IActionResult> AddEntry( [FromRoute] int tenantId, JournalEntryBaseViewModel journalEntryViewModel) { // TODO: Either in here or in an attribute, verify authorization for the tenant ViewBag.PostBack = true; ViewBag.SuccessfulSave = false; var isJournalEntryValid = ModelState.IsValid; if (isJournalEntryValid) { // Basic view model validation has passed // Perform additional validation (i.e. represents a non-empty, valid, balanced transaction) // TODO: Move most of this to an attribute hopefully isJournalEntryValid = journalEntryViewModel.Validate(ModelState); // TODO: Validate Accounting Period based on Post Date coalesce Entry Date // It is an error to try and add a Journal Entry to a Closed Accounting Period! } if (!isJournalEntryValid) { await HydrateViewBagLookupValues(tenantId); return(View(journalEntryViewModel)); } var contextUserId = User.GetUserId(); var postingUserId = journalEntryViewModel.PostDate.HasValue ? contextUserId : (Guid?)null; var journalEntry = new JournalEntry( tenantId, journalEntryViewModel.EntryDate, journalEntryViewModel.PostDate, journalEntryViewModel.Description, journalEntryViewModel.CheckNumber, contextUserId, postingUserId); if (!string.IsNullOrWhiteSpace(journalEntryViewModel.Note)) { journalEntry.Note = journalEntryViewModel.Note; } journalEntry.Accounts = journalEntryViewModel .Accounts .Select(a => a.ToModel()) .ToList(); var savedJournalEntry = await _journalEntryRepository.CreateJournalEntryAsync(journalEntry); var savedJournalEntryViewModel = JournalEntryDetailedViewModel.FromModel(savedJournalEntry); ViewBag.Tenant = savedJournalEntry.Tenant; ViewBag.SuccessfulSave = true; return(View(savedJournalEntryViewModel)); }
private async Task <IActionResult> HandleJournalEntryDetailsReadRequest(int tenantId, int entryId) { var journalEntry = await _journalEntryRepository.GetDetailedByTenantAndEntryIdAsync(tenantId, entryId); // If null then 404 not found if (journalEntry == null) { return(NotFound()); } var viewModel = JournalEntryDetailedViewModel.FromModel(journalEntry); return(View(viewModel)); }
public async Task <IActionResult> EditEntry(int tenantId, int entryId) { var journalEntry = await _journalEntryRepository.GetDetailedByTenantAndEntryIdAsync(tenantId, entryId); // If null then 404 not found if (journalEntry == null) { return(NotFound()); } await HydrateViewBagLookupValues(tenantId); var viewModel = JournalEntryDetailedViewModel.FromModel(journalEntry); return(View(viewModel)); }
public async Task <IActionResult> PostEntry( int tenantId, int entryId, JournalEntryBaseViewModel journalEntryViewModel) { ViewBag.PostBack = true; ViewBag.SuccessfulSave = false; var isJournalEntryValid = ModelState.IsValid; if (isJournalEntryValid) { // Validate that it has a Post Date ... not normally required for this view model, but required for Posting! if (!journalEntryViewModel.PostDate.HasValue) { ModelState.AddModelError("PostDate", "Post date is required to post the journal entry"); } // TODO: Validate Accounting Period based on Post Date // It is an error to try and add a Journal Entry to a Closed Accounting Period! } if (!isJournalEntryValid) { return(await HandleJournalEntryDetailsReadRequest(tenantId, entryId)); } var contextUserId = User.GetUserId(); var postedEntry = await _journalEntryRepository.PostJournalEntryAsync( journalEntryViewModel.Id, journalEntryViewModel.PostDate.Value, contextUserId, journalEntryViewModel.Note); var postedJournalEntryViewModel = JournalEntryDetailedViewModel.FromModel(postedEntry); ViewBag.Tenant = postedEntry.Tenant; ViewBag.SuccessfulSave = true; return(View(postedJournalEntryViewModel)); }