public async Task <IActionResult> PostJournaliser()//(DtoTGC002InpDC20JournalForCreate dto) { var dto = new DtoTGC002InpDC20JournalForCreate() { DateCompta = DateTime.Now }; var noUser = int.Parse(User.FindFirstValue(ClaimTypes.NameIdentifier)); var noClient = await _authRepo.NoClient(noUser); if (!await _repo.SwJournalisation(noClient, noUser)) { return(BadRequest("Impossible de journaliser un journal vide")); } var items = await _repo.Journalisation(dto, noClient, noUser); var itemsDto = _mapper.Map <DtoTGC002OutDC20JournalForRead>(items); return(Ok(itemsDto)); }
/// <summary> /// Lancer la journalisation /// </summary> /// <param name="dto">Dto avec la date de création du journal</param> /// <returns></returns> public async Task <DC20Journal> Journalisation(DtoTGC002InpDC20JournalForCreate dto, int noClient, int noUtilisateur) { var recordDC20 = new DC20Journal() { NoClient = noClient, DateJournalisation = dto.DateCompta }; // Increment - manuel pour clé composite var lastDC20 = _context.DC20Journal .Where(x => x.NoClient == noClient) .OrderByDescending(x => x.NoJournal) .ToList(); var nextDC20 = 0; foreach (var i in lastDC20) { nextDC20 = i.NoJournal; break; } nextDC20++; recordDC20.NoJournal = nextDC20; Add <DC20Journal>(recordDC20); if (!await SaveAll()) { return(null); } // Lecture de toutes les écritures collective (même si c'est une écriture simple, elle est indexée dans les écritures collective) List <DC31EcritureCollectiveJournal> itemsDC31 = await _context.DC31EcritureCollectiveJournal .Where(x => (x.NoClient == noClient) && (x.NoUtilisateur == noUtilisateur)) .OrderBy(x => x.NoEcritureCollectiveJournal) .ToListAsync(); // Pour rollback var copyItemsDC31 = itemsDC31; foreach (var itemDC31 in itemsDC31) { var recordDC22 = new DC22EcritureCollective() { NoClient = noClient, NoJournal = recordDC20.NoJournal, DateEcriture = itemDC31.DateEcriture }; // Increment - manuel pour clé composite var lastDC22 = _context.DC22EcritureCollective .Where(x => x.NoClient == noClient) .OrderByDescending(x => x.NoEcritureCollective) .ToList(); var nextDC22 = 0; foreach (var i in lastDC22) { nextDC22 = i.NoEcritureCollective; break; } nextDC22++; recordDC22.NoEcritureCollective = nextDC22; Add <DC22EcritureCollective>(recordDC22); if (!await SaveAll()) { return(await RollBackJournalisation(noClient, noUtilisateur, recordDC20.NoJournal, copyItemsDC31)); } // Lecture de toutes les écritures dans l'écriture collective foreach (var item in itemDC31.EcritureJournal) { /// /// Dans le cas d'une écriture simple, le compte débit et crédit est toujours /// allimenté /// /// Mais dans le cas d'une écriture collective on peut avoir /// [Debit] - [Rien ] -> Donc pas de contre partie, la contre partie est collective /// [Rien ] - [Credit] /// [Rien ] - [Credit] /// Première écriture /// Le if est une sécurité pour être sur que la FK NoCompte est allimenté if (item.Montant >= 0 ? item.NoCompteDebit != null : item.NoCompteCredit != null) { var noCompteEcriture1 = item.Montant >= 0 ? (int)item.NoCompteDebit : (int)item.NoCompteCredit; // Increment - manuel pour clé composite var lastDC21 = _context.DC21Ecriture .Where(x => (x.NoClient == noClient) && (x.NoEcritureCollective == recordDC22.NoEcritureCollective)) .OrderByDescending(x => x.NoEcriture) .ToList(); var nextDC21 = 0; foreach (var i in lastDC21) { nextDC21 = i.NoEcriture; break; } nextDC21++; var recordDC21 = new DC21Ecriture() { NoClient = noClient, NoEcritureCollective = recordDC22.NoEcritureCollective, NoEcriture = nextDC21, NoCompte = noCompteEcriture1, ContrePartie = item.Montant >= 0 ? item.NoCompteCredit : item.NoCompteDebit, NoPiece = item.NoPiece, MontantDebit = item.Montant >= 0 ? item.Montant : 0, MontantCredit = item.Montant >= 0 ? 0 : (item.Montant * -1), Libelle1 = item.Libelle1, Libelle2 = item.Libelle2, SwImpressionExtourne = true, NoJournal = recordDC20.NoJournal, }; Add <DC21Ecriture>(recordDC21); if (!await SaveAll()) { return(await RollBackJournalisation(noClient, noUtilisateur, recordDC20.NoJournal, copyItemsDC31)); } } /// Deuxième écriture /// Le if est une sécurité pour être sur que la FK NoCompte est allimenté if (item.Montant >= 0 ? item.NoCompteCredit != null : item.NoCompteDebit != null) { var noCompteEcriture2 = item.Montant >= 0 ? (int)item.NoCompteCredit : (int)item.NoCompteDebit; // Increment - manuel pour clé composite var lastDC21 = _context.DC21Ecriture .Where(x => (x.NoClient == noClient) && (x.NoEcritureCollective == recordDC22.NoEcritureCollective)) .OrderByDescending(x => x.NoEcriture) .ToList(); var nextDC21 = 0; foreach (var i in lastDC21) { nextDC21 = i.NoEcriture; break; } nextDC21++; var recordDC21 = new DC21Ecriture() { NoClient = noClient, NoEcritureCollective = recordDC22.NoEcritureCollective, NoEcriture = nextDC21, NoCompte = noCompteEcriture2, ContrePartie = item.Montant >= 0 ? item.NoCompteDebit : item.NoCompteCredit, NoPiece = item.NoPiece, MontantDebit = item.Montant >= 0 ? 0 : (item.Montant * -1), MontantCredit = item.Montant >= 0 ? item.Montant : 0, Libelle1 = item.Libelle1, Libelle2 = item.Libelle2, SwImpressionExtourne = true, NoJournal = recordDC20.NoJournal, }; Add <DC21Ecriture>(recordDC21); if (!await SaveAll()) { return(await RollBackJournalisation(noClient, noUtilisateur, recordDC20.NoJournal, copyItemsDC31)); } } } // Suppression des écritures à journaliser foreach (var item in itemDC31.EcritureJournal) { // Suppression de l'écriture à journaliser Delete <DC30EcritureJournal>(item); } // Suppression de l'écriture collective à journaliser Delete <DC31EcritureCollectiveJournal>(itemDC31); // Sauvegarde if (!await SaveAll()) { return(await RollBackJournalisation(noClient, noUtilisateur, recordDC20.NoJournal, copyItemsDC31)); } } return(await _context.DC20Journal .Include(x => x.Ecriture) .ThenInclude(x => x.Compte) .Include(x => x.Ecriture) .ThenInclude(x => x.CompteContrePartie) .FirstOrDefaultAsync(x => (x.NoClient == noClient) && (x.NoJournal == recordDC20.NoJournal))); }