src/Controller/EntrepriseController.php line 346
<?phpnamespace App\Controller;use App\Entity\CashJournal;use App\Entity\Entreprise;use App\Entity\Subscription;use App\Entity\SubscriptionPayment;use App\Entity\Invoice;use App\Entity\Pay;use App\Entity\Payment;use App\Entity\Residence;use App\Entity\Template;use App\Entity\TemplateDefault;use App\Entity\TemplateType;use App\Entity\User;use App\Entity\UserEntreprise;use App\Form\EntrepriseType;use App\Form\ResidenceType;use App\Repository\AdminRepository;use App\Repository\CountryRepository;use App\Repository\EntrepriseRepository;use App\Repository\HabitatRepository;use App\Repository\PackageRepository;use App\Repository\PaymentRepository;use App\Repository\PayRepository;use App\Repository\RoleRepository;use App\Repository\SubscriptionRepository;use App\Repository\SubscriptionPaymentRepository;use App\Repository\UserRepository;use App\Service\CashJournalService;use App\Service\CodeService;use App\Service\CSRFProtectionService;use App\Service\EntrepriseService;use App\Service\ImageUploaderService;use App\Service\InvoiceService;use App\Service\MailService;use App\Service\ResidenceService;use App\Service\SmsService;use App\Service\TemplatesService;use App\Service\UploaderService;use Doctrine\ORM\EntityManagerInterface;use Doctrine\Persistence\ManagerRegistry;use Doctrine\Persistence\ObjectManager;use Exception;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpClient\HttpClient;use Symfony\Component\HttpFoundation\File\UploadedFile;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Mailer\Exception\TransportExceptionInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\Security\Http\Attribute\IsGranted;use Symfony\Contracts\HttpClient\HttpClientInterface;#[Route('/admin/entreprise')]class EntrepriseController extends AbstractController{private EntityManagerInterface $em;private MailService $mailService;private CashJournalService $cjs;public function __construct(EntityManagerInterface $em, MailService $mailService, CashJournalService $cjs){$this->em = $em;$this->mailService = $mailService;$this->cjs = $cjs;}private int $perPage = 50;#[Route('/lists', name: 'app_entreprise')]public function index(Request $request,SubscriptionRepository $subscriptionRepository,PackageRepository $packageRepository,HabitatRepository $habitatRepository): Response{$this->syncExpiredSubscriptions($subscriptionRepository);$search = $request->query->get('search', '');$status = $request->query->get('status', 'all');$packageId = $request->query->get('package');$page = max(1, (int) $request->query->get('page', 1));$normalizedStatus = in_array($status, ['all', 'active', 'inactive'], true) ? $status : 'all';$packageId = ctype_digit((string) $packageId) ? (int) $packageId : null;$entries = $this->em->getRepository(Entreprise::class)->findByFilter($search,$normalizedStatus,$packageId,$page,$this->perPage);$pages = ceil($entries->count() / $this->perPage);$entrepriseIds = [];$active = 0;$inactive = 0;foreach ($entries as $e){if ($e->getId() !== null) {$entrepriseIds[] = $e->getId();}if ($e->isStatus()){$active += 1;}else{$inactive += 1;}}$habitatCounts = $habitatRepository->countByEntrepriseIds($entrepriseIds);return $this->render('entreprise/index.html.twig', ['entreprises' => $entries,'page' => $page,'pages' => $pages,'search' => $search,'statusFilter' => $normalizedStatus,'packageFilter' => $packageId,'packages' => $packageRepository->findBy(['publish' => true], ['name' => 'ASC']),'active' => $active,'inactive' => $inactive,'habitatCounts' => $habitatCounts,]);}#[Route('/add/new/entreprise', name: 'app_new_entreprise', methods: ['GET','POST'])]#[IsGranted('IS_AUTHENTICATED_FULLY')]public function newEntreprise(Request $request, AdminRepository $adminRepository, RoleRepository $roleRepository, CodeService $codeService, SmsService $smsService, UserPasswordHasherInterface $passwordHasher, CountryRepository $countryRepository, UserRepository $userRepository, PackageRepository $packageRepository, ImageUploaderService $imageUploaderService): Response{$currentUser = $this->getUser();if (!$currentUser) {return $this->redirectToRoute('app_login');}$error = null;$entreprise = null;if ($request->isMethod('POST')) {// ---- Collect & normalize inputs$companyName = trim((string) $request->request->get('name'));$pseudo = trim((string) $request->request->get('pseudo'));$nbreBien = (int) $request->request->get('nbreBien', 0);$companyEmail = trim((string) $request->request->get('user-email'));$phoneFull = trim((string) $request->request->get('user-phone'));;$adminId = $request->request->get('admin');$countryId = $request->request->get('country');// optional company fields$rccm = trim((string) $request->request->get('rccm'));$idnat = trim((string) $request->request->get('idnat'));$numeroImpot = trim((string) $request->request->get('numeroimpot'));$adress = trim((string) $request->request->get('adress'));$city = trim((string) $request->request->get('city'));$province = trim((string) $request->request->get('province'));// bailleur$ownerFirst = trim((string) $request->request->get('user-name'));$ownerLast = trim((string) $request->request->get('user-lastname'));$ownerEmail = $companyEmail; // you use the bailleur email as company email$useSameAddr = $request->request->get('checkbox') === 'on';$ownerAdress = trim((string) $request->request->get('user-adress'));$ownerCity = trim((string) $request->request->get('user-city'));$ownerProvince = trim((string) $request->request->get('user-province'));$companyCountryId = $request->request->get('country'); // enterprise country$ownerCountryId = $request->request->get('user-country'); // bailleur country$useSameAddr = (bool) $request->request->get('useSameAddress'); // checkbox$error = null;// ---- Basic validationif ($companyName === '' || $pseudo === '' || $nbreBien < 0 || $ownerEmail === '' || $phoneFull === '') {$error = 'Veuillez remplir tous les champs obligatoires.';}// Email uniqueness (use findOneBy; comparing to null is enough)if (!$error) {$existing = $userRepository->findOneBy(['email' => $ownerEmail]);if ($existing) {$error = 'Cet e-mail est déjà utilisé. Essayez un autre.';}}// Country validation// --- Company country (required) ---if (!ctype_digit((string)$companyCountryId)) {$error = "Pays de l’entreprise obligatoire.";} else {$companyCountry = $countryRepository->find((int)$companyCountryId);if (!$companyCountry) {$error = "Pays de l’entreprise introuvable.";}}// --- Owner country ---$ownerCountry = null;if (!$error) {if ($useSameAddr) {// if same address, reuse company country$ownerCountry = $companyCountry;} else {// only validate/lookup when not using same addressif (!ctype_digit((string)$ownerCountryId)) {$error = "Pays du bailleur obligatoire.";} else {$ownerCountry = $countryRepository->find((int)$ownerCountryId);if (!$ownerCountry) {$error = "Pays du bailleur introuvable.";}}}}if (!$error) {try {// ---- Create Entreprise$entreprise = new Entreprise();$entreprise->setCode(md5((string) microtime(true))); // better: use a UUID if possible$entreprise->setName($companyName);$entreprise->setEmail($ownerEmail);$entreprise->setPhone($phoneFull);$entreprise->setPseudo($pseudo);$entreprise->setNbrebiensimmobiliers($nbreBien);$entreprise->setStatus(false);$entreprise->setSmsservice(true);$entreprise->setInvoiceservice(false);$entreprise->setRecallpaymentnotification(false);// relationsif ($adminId) {$adminOwner = $adminRepository->find($adminId);$entreprise->setAdmin($adminOwner ?? $currentUser);} else {$entreprise->setAdmin($currentUser);}$entreprise->setCountry($companyCountry);// optionalsif ($adress !== '') { $entreprise->setAdress($adress); }if ($city !== '') { $entreprise->setCity($city); }if ($province !== '') { $entreprise->setProvince($province); }if ($rccm !== '') { $entreprise->setRccm($rccm); }if ($idnat !== '') { $entreprise->setIdnat($idnat); }if ($numeroImpot !== '') { $entreprise->setNumeroImpot($numeroImpot); }$this->em->persist($entreprise);// ---- Create Bailleur user$user = new User();$user->setEntreprise($entreprise);$user->setCode(md5((string) microtime(true)) . '_' . uniqid('', true));// Prefer finding by role code instead of hard id=1$roleAdmin = $roleRepository->findOneBy(['id' => 1]); // adjust to your needs$user->setRole($roleAdmin);$user->setUsername($ownerEmail);$user->setEmail($ownerEmail);$user->setName($ownerFirst);$user->setLastname($ownerLast);$user->setPhone($phoneFull);if ($useSameAddr) {$user->setAdress($entreprise->getAdress());$user->setCity($entreprise->getCity());$user->setProvince($entreprise->getProvince());$user->setCountry($entreprise->getCountry());} else {$user->setAdress($ownerAdress);$user->setCity($ownerCity);$user->setProvince($ownerProvince);$user->setCountry($ownerCountry);}//entreprise profilif ($request->files->get('icon-'.$entreprise->getId())){/** @var UploadedFile|null $file */$file = $request->files->get('icon-'.$entreprise->getId());$imageUrl = $imageUploaderService->uploadAndResizeImageToS3($file);$entreprise->setIcon($imageUrl);}// base flags$user->setReset(false);$user->setStatus(true);$user->setNotif(true);$user->setLevel(2);$user->setProfil(1);// password$plain = strtoupper($codeService->PasswordCode(8));$user->setPassword($passwordHasher->hashPassword($user, $plain));// notify via SMS; if SMS fails (==0), send email$message = 'Votre mot de passe ' . $entreprise->getName() . ' : ' . $plain;$smsService->smsService($phoneFull, $message);$this->em->persist($user);$this->em->flush();//add enteprise owner$entreprise->setOwner($user);//add to mutilple entreprises$link = new UserEntreprise();$link->setUser($user);$link->setEntreprise($user->getEntreprise());$link->setRole('ADMIN');$link->setStatus(true);$this->em->persist($link);$this->em->flush();//add template$this->addTemplates($entreprise);//add journal$this->addJournal($entreprise);$this->addFlash('success', 'Entreprise et bailleur créés avec succès.');return $this->redirectToRoute('app_entreprise_detail', ['code' => $entreprise->getCode()]);} catch (\Throwable $e) {$error = 'Une erreur est survenue lors de l’enregistrement. Veuillez réessayer plus tard.';}}}// GET or POST w/ error → render$countries = $countryRepository->findBy(['status' => true]);$packages = $packageRepository->findBy(['publish' => true]);return $this->render('entreprise/add_entreprise.html.twig', ['admin' => $currentUser->getId(),'error' => $error,'countries' => $countries,'entreprise' => $entreprise,'packages' => $packages,]);}#[Route('/details/{code}', name: 'app_entreprise_detail')]public function indexMarchandsDetails(Entreprise $entreprise,UserRepository $userRepository,RoleRepository $roleRepository,SubscriptionPaymentRepository $subscriptionPaymentRepository): Response{if(!$entreprise->getOwner()){return $this->redirectToRoute('app_entreprise_only_detail', ['code' => $entreprise->getCode()]);}$subscriptionPayments = $subscriptionPaymentRepository->findBy(['entreprise' => $entreprise],['id' => 'DESC']);return $this->render('entreprise/detail_entreprise.html.twig', ['entreprise' => $entreprise,'bailleur' => $entreprise->getOwner(),'subscriptionPayments' => $subscriptionPayments,]);}#[Route('/subscription/payment/{id}/delete', name: 'app_subscription_payment_delete', methods: ['POST'])]public function deleteSubscriptionPayment(SubscriptionPayment $payment, Request $request): Response{$entreprise = $payment->getEntreprise();$redirectCode = $entreprise?->getCode();$csrfToken = (string) $request->request->get('_csrf_token');if (!$this->isCsrfTokenValid('delete_subscription_payment_' . $payment->getId(), $csrfToken)) {$this->addFlash('danger', 'Jeton CSRF invalide.');return $this->redirectToEntrepriseDetailOrList($redirectCode);}if ($payment->isPaid() === true) {$this->addFlash('warning', 'Impossible de supprimer une facture déjà payée.');return $this->redirectToEntrepriseDetailOrList($redirectCode);}$subscription = $payment->getSubscription();if ($subscription && $subscription->isPaid() !== true && $subscription->getSubscriptionPayments()->count() <= 1) {$this->em->remove($subscription);}$this->em->remove($payment);$this->em->flush();$this->addFlash('success', 'Facture supprimée.');return $this->redirectToEntrepriseDetailOrList($redirectCode);}private function redirectToEntrepriseDetailOrList(?string $code): Response{if ($code) {return $this->redirectToRoute('app_entreprise_detail', ['code' => $code]);}return $this->redirectToRoute('app_entreprise');}private function syncExpiredSubscriptions(SubscriptionRepository $subscriptionRepository): void{$now = new \DateTimeImmutable();$expiredSubscriptions = $subscriptionRepository->findExpiredActiveSubscriptions($now);if (!$expiredSubscriptions) {return;}$entreprisesToCheck = [];foreach ($expiredSubscriptions as $subscription) {$subscription->setStatus(false);$entreprise = $subscription->getEntreprise();if ($entreprise) {$key = $entreprise->getId() ?? spl_object_id($entreprise);$entreprisesToCheck[$key] = $entreprise;}}foreach ($entreprisesToCheck as $entreprise) {if (!$subscriptionRepository->hasActiveSubscriptionForEntreprise($entreprise, $now)) {$entreprise->setStatus(false);}}$this->em->flush();}#[Route('/bailleur/edit/{code}', name: 'app_entreprise_edit')]public function editBailleur(Entreprise $entreprise, Request $request, ManagerRegistry $doctrine, RoleRepository $roleRepository, PackageRepository $packageRepository, CountryRepository $countryRepository, UserRepository $userRepository, ImageUploaderService $imageUploaderService): Response{$error = null;$em = $doctrine->getManager();$role = $roleRepository->findOneBy(['id' => 1]);$user = $userRepository->findOneBy(['role' => $role, 'entreprise' => $entreprise]);if ($request->isMethod('post')) {try {/* entreprise */$entreprise->setName($request->get('name-'.$entreprise->getId()));$entreprise->setEmail($request->get('email-'.$entreprise->getId()));$entreprise->setPhone($request->get('phone-'.$entreprise->getId()));$entreprise->setPseudo($request->get('pseudo-'.$entreprise->getId()));$entreprise->setNbrebiensimmobiliers($request->get('nbreBien-'.$entreprise->getId()));$country_ = $countryRepository->findOneBy(['id' => $request->get('country-'.$entreprise->getId())]);$entreprise->setCountry($country_);if ($request->request->get('adress-'.$entreprise->getId()) != null){$entreprise->setAdress($request->get('adress-'.$entreprise->getId()));}if ($request->request->get('city-'.$entreprise->getId()) != null){$entreprise->setCity($request->get('city-'.$entreprise->getId()));}if ($request->request->get('province-'.$entreprise->getId()) != null){$entreprise->setProvince($request->get('province-'.$entreprise->getId()));}if ($request->request->get('rccm-'.$entreprise->getId()) != null){$entreprise->setRccm($request->get('rccm-'.$entreprise->getId()));}if ($request->request->get('idnat-'.$entreprise->getId()) != null){$entreprise->setIdnat($request->get('idnat-'.$entreprise->getId()));}if ($request->request->get('numeroimpot-'.$entreprise->getId()) != null){$entreprise->setNumeroimpot($request->get('numeroimpot-'.$entreprise->getId()));}//entreprise profilif ($request->files->get('icon-'.$entreprise->getId())){/** @var UploadedFile|null $file */$file = $request->files->get('icon-'.$entreprise->getId());$imageUrl = $imageUploaderService->uploadAndResizeImageToS3($file);$entreprise->setIcon($imageUrl);}$em->persist($entreprise);/* user */$user->setUsername($request->get('user-email-'.$user->getId()));$user->setEmail($request->get('user-email-'.$user->getId()));$user->setName($request->get('user-name-'.$user->getId()));$user->setLastname($request->get('user-lastname-'.$user->getId()));$user->setPhone($request->get('user-phone-'.$user->getId()));if ($request->get('checkbox') !== null){$user->setAdress($entreprise->getAdress());$user->setCity($entreprise->getCity());$user->setProvince($entreprise->getProvince());$user->setCountry($entreprise->getCountry());}else{$country_ = $countryRepository->findOneBy(['id' => $request->get('user-country-'.$user->getId())]);$user->setCountry($country_);$user->setAdress($request->get('user-adress-'.$user->getId()));$user->setCity($request->get('user-city-'.$user->getId()));$user->setProvince($request->get('user-province-'.$user->getId()));}$em->persist($user);$em->flush();return $this->redirectToRoute('app_entreprise_detail', ['code' => $entreprise->getCode()]);}catch (\Exception $e){$error = 'Une erreur est survenu lors de l\'enregistrement, Veuillez réessayer plus tard.';}}$countries = $countryRepository->findBy(['status' => true]);$packages = $packageRepository->findBy(['publish' => true]);return $this->render('entreprise/edit_entreprise.html.twig', ['error' => $error,'countries' => $countries,'entreprise' => $entreprise,'bailleur' => $user,'packages' => $packages]);}#[Route('/bailleur/unable/bailleur/{id}', name: 'app_unable_entreprise')]public function unableEntreprise(Entreprise $entreprise): Response{return $this->render('entreprise/unable_entreprise.html.twig', ['entreprise' => $entreprise,]);}#[Route('/bailleur/unable/{id}/save/changement', name: 'app_unable_entreprise_save_change', methods: ['POST'])]public function unableEntrepriseSave($id, ManagerRegistry $doctrine, CSRFProtectionService $csrf, Request $request, EntrepriseRepository $entrepriseRepository){$em = $doctrine->getManager();if ($csrf->validateCSRFToken($request)) {/* @var $entreprise Entreprise */$entreprise = $entrepriseRepository->find($id);$entreprise->setStatus(false);$em->persist($entreprise);$em->flush();foreach ($entreprise->getUsers() as $user){$user->setStatus(false);$em->persist($user);$em->flush();}}return $this->render('feedback.html.twig', ['error' => false,]);}#[Route('/bailleur/membership/{code}', name: 'app_membership')]public function entrepriseMembership(Entreprise $entreprise, PackageRepository $packageRepository, ManagerRegistry $doctrine, CSRFProtectionService $csrf, Request $request, EntrepriseRepository $entrepriseRepository){$packages = $packageRepository->findAll();if ($entreprise->getPackage() == null){$package = $packageRepository->findOneBy(['id' => 4]);$entreprise->setPackage($package);$em = $doctrine->getManager();$em->persist($entreprise);$em->flush();}return $this->render('entreprise/membership_entreprise.html.twig', ['entreprise' => $entreprise,'packages' => $packages,'months' => 1]);}#[Route('/bailleur/membership/{entreprise}/{package}', name: 'app_membership_change_membership')]public function entrepriseChangeStatus($entreprise, $package, PackageRepository $packageRepository, ManagerRegistry $doctrine, CSRFProtectionService $csrf, Request $request, EntrepriseRepository $entrepriseRepository){$entrepriseGet = $entrepriseRepository->findOneBy(['id' => $entreprise]);$packageGet = $packageRepository->findOneBy(['id' => $package]);$entrepriseGet->setPackage($packageGet);$entrepriseGet->setPeriod('monthly');$em = $doctrine->getManager();$em->persist($entrepriseGet);$em->flush();return $this->redirectToRoute('app_membership', ['code' => $entrepriseGet->getCode()]);}#[Route('/membership/update/subscription/price', name: 'app_membership_subscription_price_cycle', methods: ['POST'])]public function updatePrice(Request $request, EntrepriseRepository $entrepriseRepository, EntityManagerInterface $em): Response{$entreprise = $entrepriseRepository->find($request->request->get('entreprise'));$months = max(1, (int) $request->request->get('monthsToPay', 1));if ($entreprise) {$entreprise->setPeriod('monthly');$em->flush();}return $this->render('entreprise/membership_price.html.twig', ['entreprise' => $entreprise,'months' => $months]);}#[Route('/membership/set/for/free/trail/price/{id}', name: 'app_membership_subscription_for_free_trail')]#[IsGranted('IS_AUTHENTICATED_FULLY')]public function startFreeTrial(Entreprise $entreprise, EntityManagerInterface $em): Response {// Guard: entreprise must have a selected package$package = $entreprise->getPackage();if (!$package) {$this->addFlash('danger', "Aucun forfait n'est associé à cette entreprise.");return $this->redirectToRoute('app_entreprise_detail', ['code' => $entreprise->getCode()]);}// Optional idempotency guard: if already flagged trial or an active sub overlaps, skip creating a new one// (Uncomment/adjust if you have a repository method to check overlap)// if ($entreprise->isFreeTrial() || $subscriptionRepo->hasActiveTrial($entreprise)) { ... }// Dates: 2 months free trial from today (00:00)$startAt = new \DateTimeImmutable('today');$endAt = $startAt->modify('+2 months');// Robust order number / code$orderNumber = bin2hex(random_bytes(16)); // 32-hex chars$subCode = bin2hex(random_bytes(8)); // 16-hex chars$sub = new Subscription();$sub->setCode($subCode);$sub->setOrderNumber($orderNumber);$sub->setEntreprise($entreprise);$sub->setPackage($package);// A trial is free and not paid$sub->setAmount('0.00');$sub->setCurrency('USD');$sub->setPaymenttype('Trial');$sub->setStatus(true); // active$sub->setPaid(false); // not a paid invoice$sub->setStartAt($startAt);$sub->setEndAt($endAt);// Mark entreprise as active and in free trial$entreprise->setStatus(true);if (method_exists($entreprise, 'setFreeTrial')) {$entreprise->setFreeTrial(true);} elseif (method_exists($entreprise, 'setFreeTrail')) {// If your entity still has the old typo, keep this fallback$entreprise->setFreeTrail(true);}$em->persist($sub);$em->flush();$this->addFlash('success', "Période d’essai de 2 mois activée. Fin d’essai le " . $endAt->format('d/m/Y') . ".");return $this->redirectToRoute('app_entreprise_detail', ['code' => $entreprise->getCode()]);}#[Route('/bailleur/reset/password/{code}', name: 'app_entreprise_edit_bailleur_password')]public function resetBailleur(Entreprise $entreprise, ManagerRegistry $doctrine, RoleRepository $roleRepository, UserRepository $userRepository, CodeService $codeService, SmsService $smsService, UserPasswordHasherInterface $passwordHasher): Response{$role = $roleRepository->findOneBy(['id' => 1]);$user = $userRepository->findOneBy(['role' => $role, 'entreprise' => $entreprise]);// password$plain = strtoupper($codeService->PasswordCode(8));$user->setPassword($passwordHasher->hashPassword($user, $plain));$this->em->flush();// notify via SMS; if SMS fails (==0), send email$message = 'Votre mot de passe ' . $entreprise->getName() . ' : ' . $plain;$smsOk = $smsService->smsService($user->getPhone(), $message);if ($smsOk === 0) {$this->addFlash('danger', 'Erreur lors de l\'envoi. réessayer');}else{$this->addFlash('success', 'Le mot de passe a été envoyé avec succès');}if($user->getEmail()){$this->mailService->sendTemplatedMail($user->getEmail(),'Votre mot de passe Bailleur','entreprise/email_password.html.twig',['message' => $message]);}return $this->redirectToRoute('app_entreprise_detail', ['code' => $entreprise->getCode()]);}public function addTemplates(Entreprise $entreprise): void{$templateTypeInvoice = $this->em->getRepository(TemplateType::class)->findOneBy(['name' => 'TEMPLATE_INVOICE_PDF']);$templateDefaultInvoice = $this->em->getRepository(TemplateDefault::class)->find(1);$template = new Template();$template->setParams('{"orientation": "P", "marginLeft": 25, "marginRight": 20, "marginTop": 20, "marginBottom": 20, "marginHeader": 9, "marginFooter": 9}');$template->setIsDefault(true);$template->setName('PDF Quittance');$template->setTemplateType($templateTypeInvoice);$template->setMarchand($entreprise);$template->setText($templateDefaultInvoice->getText());$this->em->persist($template);$this->em->flush();$templateTypeJournal = $this->em->getRepository(TemplateType::class)->findOneBy(['name' => 'TEMPLATE_CASHJOURNAL_PDF']);$templateDefaultJournal = $this->em->getRepository(TemplateDefault::class)->find(2);$template = new Template();$template->setParams('{"orientation": "P", "marginLeft": 25, "marginRight": 20, "marginTop": 20, "marginBottom": 20, "marginHeader": 9, "marginFooter": 9}');$template->setIsDefault(true);$template->setName('PDF Livre de caisse');$template->setTemplateType($templateTypeJournal);$template->setMarchand($entreprise);$template->setText($templateDefaultJournal->getText());$this->em->persist($template);$this->em->flush();}public function addJournal(Entreprise $entreprise): void{$year = date('Y');$month = (new \DateTime('first day of this month'))->format('n');$journal = $this->em->getRepository(CashJournal::class)->findOneBy(['cashYear' => $year,'cashMonth' => $month, 'marchand' => $entreprise]);$youngestJ = $this->em->getRepository(CashJournal::class)->getYoungestJournal($entreprise);if (!$journal){$journal = new CashJournal();if ($youngestJ instanceof CashJournal) {// set last cash end as new cash start$journal->setCashStart($youngestJ->getCashEnd());// set new year and month based on the last entryif (12 == $youngestJ->getCashMonth()) {$journal->setCashYear($youngestJ->getCashYear() + 1);$journal->setCashMonth(1);} else {$journal->setCashYear($youngestJ->getCashYear());$journal->setCashMonth($youngestJ->getCashMonth() + 1);}}else{$journal->setCashYear($year);$journal->setCashMonth($month);}$journal->setMarchand($entreprise);$journal->setCashEnd(0.00);$journal->setCashStart(0.00);$journal->setIsClosed(false);$journal->setIsBooked(false);$this->em->persist($journal);$this->em->flush();// update cash end of journal$this->cjs->recalculateCashEnd($journal);}}}