<?php
namespace App\Controller\Rh;
use Knp\Snappy\Pdf;
use App\Entity\User;
use App\Entity\RhPaySlip;
use App\Form\Rh\RhPaySlipType;
use App\Entity\RhSalaryPaySlip;
use App\Entity\RhPaySlipTaxableItem;
use App\Entity\RhPaySlipRetainedItem;
use App\Service\SalaryContractManage;
use App\Entity\RhPaySlipNonTaxableItem;
use App\Repository\RhPaySlipRepository;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use App\Repository\RhTaxableItemRepository;
use Knp\Component\Pager\PaginatorInterface;
use App\Repository\RhRetainedItemRepository;
use App\Repository\RhSalaryPaySlipRepository;
use App\Repository\SalaryBandScaleRepository;
use Symfony\Component\HttpFoundation\Request;
use App\Repository\RhSalaryContractRepository;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Collections\ArrayCollection;
use App\Repository\TaxReductionSheduleRepository;
use App\Repository\RhSalaryCreditShedulRepository;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Knp\Bundle\SnappyBundle\Snappy\Response\PdfResponse;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/rh/paySlip")
*/
class RhPaySlipController extends AbstractController
{
public const LABEL_RATE_NOT_PERMANANT = 'RIBNC';
/**
* @Route("/index", name="rh_pay_slip_index", methods={"GET"})
*/
public function index(Request $request, PaginatorInterface $paginator, RhPaySlipRepository $rhPaySlipRepository): Response
{
$establishment = $this->getUser()->getEstablishment();
$rh_pay_slips = $paginator->paginate(
$rhPaySlipRepository->createQueryBuilder('entity')
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $establishment)
->orderBy('entity.id', 'desc')
->getQuery(),
$request->query->getInt('page', 1),
1000
);
return $this->render('rh/rh_pay_slip/index.html.twig', [
'rh_pay_slips' => $rh_pay_slips,
]);
}
/**
* @Route("/new", name="rh_pay_slip_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$establishment = $this->getUser()->getEstablishment();
$rhPaySlip = new RhPaySlip();
$form = $this->createForm(RhPaySlipType::class, $rhPaySlip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$rhPaySlip->setEstablishment($establishment);
$rhPaySlip->setCode(str_replace(' ', '-', $rhPaySlip->getLabel()." ".$establishment->getId()));
$rhPaySlip->setDay($rhPaySlip->getDateEnd()->format('Y-m-d'));
$rhPaySlip->setMonth($rhPaySlip->getDateEnd()->format('Y-m'));
$rhPaySlip->setYear($rhPaySlip->getDateEnd()->format('Y'));
$entityManager->persist($rhPaySlip);
try {
$entityManager->flush();
$this->addFlash('success', "Enrégistrement effectué.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Enrégistrement non effectué.");
$this->addFlash('info', $th->getMessage());
return $this->redirectToRoute('rh_pay_slip_new');
}
return $this->redirectToRoute('rh_pay_slip_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('rh/rh_pay_slip/new.html.twig', [
'rh_pay_slip' => $rhPaySlip,
'form' => $form,
]);
}
/**
* @Route("/{id}/show", name="rh_pay_slip_show", methods={"GET"})
*/
public function show(RhPaySlip $rhPaySlip, RhSalaryPaySlipRepository $rhSalaryPaySlipRepository, TaxReductionSheduleRepository $taxReductionSheduleRepository, SalaryBandScaleRepository $salaryBandScaleRepository): Response
{
/**@var User $user */
$user = $this->getUser();
$establishment = $user->getEstablishment();
$schoolYear = $user->getSchoolYear();
foreach ($rhPaySlip->getRhSalaryPaySlips() as $key => $salaryPaySlip) {
if (!$salaryPaySlip->getIsValidated()) {
$salaryPaySlip->setGrossTotal(0);
$salaryPaySlip->setTaxGross(0);
$salaryPaySlip->setSocialGross(0);
$salaryPaySlip->setPatronalWithholdingTax(0);
$salaryPaySlip->setWithholdingTax(0);
$salaryPaySlip->setOthersRetained(0);
$salaryPaySlip->setGrossTaxable(0);
foreach ($salaryPaySlip->getRhPaySlipTaxableItems() as $key => $taxableItem) {
$paySlipTaxableItem = SalaryContractManage::setPaySlipTaxableItem($salaryPaySlip->getRhSalaryContract(), $taxableItem, null);
$salaryPaySlip->setGrossTaxable($salaryPaySlip->getGrossTaxable() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setTaxGross($salaryPaySlip->getTaxGross() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipTaxableItem->getProfit());
}
foreach ($salaryPaySlip->getRhPaySlipNonTaxableItems() as $key => $nonTaxableItem) {
$nonTaxableItem = SalaryContractManage::setPaySlipNonTaxableItem($salaryPaySlip->getRhSalaryContract(), $nonTaxableItem, null);
/* le transport n'est pas inclus dans le brut social */
if (!str_contains($nonTaxableItem->getLabel(), 'TRANSPORT')) {
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $nonTaxableItem->getProfit());
}
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $nonTaxableItem->getProfit());
}
foreach ($salaryPaySlip->getRhPaySlipRetainedItems() as $key => $retainedItem) {
if ($retainedItem->getComputeMethod() == 'ITS') {
$retainedItem = SalaryContractManage::setITS($salaryPaySlip->getRhSalaryContract(), $salaryPaySlip, $retainedItem, null, $taxReductionSheduleRepository, $salaryBandScaleRepository);
}else {
$retainedItem = SalaryContractManage::setPaySlipRetainedItem($salaryPaySlip->getRhSalaryContract(), $salaryPaySlip, $retainedItem, null);
}
if ($retainedItem->getPart() == 'SALARIALE') {
$salaryPaySlip->setWithholdingTax($salaryPaySlip->getWithholdingTax() + $retainedItem->getProfit());
}else {
$salaryPaySlip->setPatronalWithholdingTax($salaryPaySlip->getPatronalWithholdingTax() + $retainedItem->getProfit());
}
}
$salaryPaySlip->setNetSalary($salaryPaySlip->getGrossTotal() - ($salaryPaySlip->getWithholdingTax() + $salaryPaySlip->getOthersRetained()));
try {
$this->getDoctrine()->getManager()->flush();
} catch (\Throwable $th) {
//$this->addFlash('warning', $this->getParameter('sm.entity_updating_error_message'));
}
}
}
$banks = $rhSalaryPaySlipRepository->createQueryBuilder('entity')
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $establishment)
->andWhere('entity.rhPaySlip = :rhPaySlip')
->setParameter('rhPaySlip', $rhPaySlip)
->innerJoin('entity.rhSalary', 'rhSalary')
->addSelect('rhSalary')
/* ->andWhere('rhSalary.bank_name = :bank_name')
->setParameter('bank_name', $request->get('bankName')) */
->groupBy('rhSalary.bank_name')
->orderBy('rhSalary.last_name', 'ASC')
->getQuery()
->getResult();
return $this->render('rh/rh_pay_slip/show.html.twig', [
'banks' => $banks,
'rh_pay_slip' => $rhPaySlip,
]);
}
/**
* @Route("/{id}/edit", name="rh_pay_slip_edit", methods={"GET","POST"})
*/
public function edit(Request $request, RhPaySlip $rhPaySlip): Response
{
$form = $this->createForm(RhPaySlipType::class, $rhPaySlip);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$rhPaySlip->setDay($rhPaySlip->getDateEnd()->format('Y-m-d'));
$rhPaySlip->setMonth($rhPaySlip->getDateEnd()->format('Y-m'));
$rhPaySlip->setYear($rhPaySlip->getDateEnd()->format('Y'));
try {
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success', "Modification effectuée.");
} catch (\Throwable $th) {
$this->addFlash('warning', "Modification non effectuée.");
}
return $this->redirectToRoute('rh_pay_slip_index', [], Response::HTTP_SEE_OTHER);
}
return $this->renderForm('rh/rh_pay_slip/edit.html.twig', [
'rh_pay_slip' => $rhPaySlip,
'form' => $form,
]);
}
/**
* @Route("/delete-selection", name="rh_pay_slips_selected_delete", methods={"GET"})
*/
public function deleteSelected(Request $request, RhPaySlipRepository $entityRepository): Response
{
$list = $request->get('entities');
$entityManager = $this->getDoctrine()->getManager();
$errors = 0;
$success = 0;
foreach ($list as $key => $id) {
$entity = $entityRepository->findOneBy(['id' => intval($id)], []);
if ($entity != null) {
if (count($entity->getRhSalaryPaySlips()) <= 0) {
$entityManager->remove($entity);
$success = $success + 1;
}else {
$errors = $errors + 1;
}
}
}
try {
$entityManager->flush();
if ($success > 0) {
$this->addFlash('success', "Suppression effectuée.");
}
if ($errors > 0) {
$this->addFlash('warning', $errors." ligne(s) ne peuvent être supprimés pour l'instant car elles sont liées à d'autres entités.");
}
return $this->json(['code' => 200, 'message' => "Suppression effectuée."], 200);
} catch (\Throwable $th) {
//$th->getMessage()
}
$this->addFlash('warning', "Suppression non effectuée.");
return $this->json(['code' => 500, 'message' => "Suppression non effectuée."], 200);
}
/**
* @Route("/{id}/regenerateSalaryPaySlip", name="rh_pay_slip_regenerate_salary_pay_slip", methods={"GET"})
*/
public function OnRegenerateSalaryPaySlipClicked(RhPaySlip $paySlip, RhTaxableItemRepository $taxableItemRepository, RhRetainedItemRepository $retainedItemRepository, RhSalaryPaySlipRepository $salaryPaySlipRepository, RhSalaryContractRepository $rhSalaryContractRepository, RhSalaryCreditShedulRepository $rhSalaryCreditShedulRepository, TaxReductionSheduleRepository $taxReductionSheduleRepository, SalaryBandScaleRepository $salaryBandScaleRepository): Response
{
$establishment = $this->getUser()->getEstablishment();
$entityManager = $this->getDoctrine()->getManager();
$rhSalaryContracts = $rhSalaryContractRepository->createQueryBuilder('entity')
->innerJoin('entity.rhSalary', 'rhSalary')
->addSelect('rhSalary')
->andWhere('entity.is_closed = :is_closed')
->setParameter('is_closed', 0)
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $establishment)
->andWhere('rhSalary.is_permanent = :is_permanent')
->setParameter('is_permanent', $paySlip->getIsForPermanent())
->orderBy('entity.id', 'DESC')
->getQuery()
->getResult();
//dd($rhSalaryContracts);
foreach ($rhSalaryContracts as $key => $salaryContract) {
if ($salaryContract->getStartDate() < $paySlip->getDateEnd() && ($salaryContract->getEndDate() == null || $salaryContract->getEndDate() > $paySlip->getDateStart())) {
if (null == $salaryPaySlipRepository->findOneBy(['rhPaySlip' => $paySlip, 'rhSalaryContract' => $salaryContract], [])) {
//if ($salaryContract->getRhSalary()->getIsPermanent() == $paySlip->getIsForPermanent()) {
$salaryPaySlip = new RhSalaryPaySlip();
$salaryPaySlip->setRhPaySlip($paySlip);
$salaryPaySlip->setRhSalary($salaryContract->getRhSalary());
$salaryPaySlip->setLabel($paySlip->getLabel());
$salaryPaySlip->setCode($paySlip->getLabel()."-".$salaryContract->getId());
$salaryPaySlip->setDay($paySlip->getCreatedAt()->format('Y-m-d'));
$salaryPaySlip->setMonth($paySlip->getCreatedAt()->format('Y-m'));
$salaryPaySlip->setYear($paySlip->getCreatedAt()->format('Y'));
$salaryPaySlip->setEstablishment($paySlip->getEstablishment());
$salaryPaySlip->setHourlyRate($salaryContract->getHourlyRate());
$salaryPaySlip->setNumberHourPerformed($salaryContract->getHoursWorked());
if (!$salaryContract->getRhSalary()->getIsPermanent()) {
$salaryPaySlip->setNumberHourPerformed($salaryContract->getWorkingTime($paySlip->getDateStart(), $paySlip->getDateEnd()));
}
$salaryPaySlip->setRhSalaryContract($salaryContract);
$salaryPaySlip->setBaseSalary($salaryPaySlip->getHourlyRate() * $salaryPaySlip->getNumberHourPerformed());
$salaryPaySlip->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$salaryPaySlip->setMonth($paySlip->getDateEnd()->format('Y-m'));
$salaryPaySlip->setYear($paySlip->getDateEnd()->format('Y'));
if ($salaryContract->getRhSalary()->getIsPermanent()) {
foreach ($taxableItemRepository->findBy([], ['num' => 'ASC']) as $key => $taxableItem) {
$paySlipTaxableItem = new RhPaySlipTaxableItem();
$paySlipTaxableItem->setComputeMethod($taxableItem->getComputeMethod());
$paySlipTaxableItem->setLabel($taxableItem->getLabel());
$paySlipTaxableItem->setCode($taxableItem->getLabel());
$paySlipTaxableItem->setNum($taxableItem->getNum());
$paySlipTaxableItem->setRhSalaryPaySlip($salaryPaySlip);
if (null != $salaryPaySlip->getHourlyRate()) {
$paySlipTaxableItem->setBased($salaryPaySlip->getHourlyRate());
}else {
$paySlipTaxableItem->setBased(0);
}
if (null != $salaryPaySlip->getNumberHourPerformed()) {
$paySlipTaxableItem->setRate($salaryPaySlip->getNumberHourPerformed());
}else {
$paySlipTaxableItem->setRate(1);
}
$paySlipTaxableItem = SalaryContractManage::setPaySlipTaxableItem($salaryContract, $paySlipTaxableItem, $taxableItem);
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setTaxGross($salaryPaySlip->getTaxGross() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipTaxableItem->getProfit());
$paySlipTaxableItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipTaxableItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipTaxableItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipTaxableItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipTaxableItem);
}
}else {
foreach ($taxableItemRepository->findBy([], ['num' => 'ASC']) as $key => $taxableItem) {
if ($taxableItem->getComputeMethod() != 'PRIME ANCIENNETE') {
$paySlipTaxableItem = new RhPaySlipTaxableItem();
$paySlipTaxableItem->setComputeMethod($taxableItem->getComputeMethod());
$paySlipTaxableItem->setLabel($taxableItem->getLabel());
$paySlipTaxableItem->setCode($taxableItem->getLabel());
$paySlipTaxableItem->setNum($taxableItem->getNum());
$paySlipTaxableItem->setRhSalaryPaySlip($salaryPaySlip);
if (null != $salaryPaySlip->getHourlyRate()) {
$paySlipTaxableItem->setBased($salaryPaySlip->getHourlyRate());
}else {
$paySlipTaxableItem->setBased(0);
}
if (null != $salaryPaySlip->getNumberHourPerformed()) {
$paySlipTaxableItem->setRate($salaryPaySlip->getNumberHourPerformed());
}else {
$paySlipTaxableItem->setRate(1);
}
$paySlipTaxableItem = SalaryContractManage::setPaySlipTaxableItem($salaryContract, $paySlipTaxableItem, $taxableItem);
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setTaxGross($salaryPaySlip->getTaxGross() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipTaxableItem->getProfit());
$paySlipTaxableItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipTaxableItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipTaxableItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipTaxableItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipTaxableItem);
}
}
}
foreach ($salaryContract->getRhSalaryContractItems([], ['num' => 'ASC']) as $key => $salaryContractItem) {
if ($salaryContractItem->getType() == 'IMPOSABLE') {
$paySlipTaxableItem = new RhPaySlipTaxableItem();
$paySlipTaxableItem->setComputeMethod('DEFAUT');
$paySlipTaxableItem->setLabel($salaryContractItem->getLabel());
$paySlipTaxableItem->setCode($salaryContractItem->getLabel());
$paySlipTaxableItem->setNum($salaryContractItem->getNum());
$paySlipTaxableItem->setRhSalaryPaySlip($salaryPaySlip);
$paySlipTaxableItem->setRate(1);
$paySlipTaxableItem->setBased($salaryContractItem->getBased());
$paySlipTaxableItem = SalaryContractManage::setPaySlipTaxableItem($salaryContract, $paySlipTaxableItem, null);
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setTaxGross($salaryPaySlip->getTaxGross() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipTaxableItem->getProfit());
$paySlipTaxableItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipTaxableItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipTaxableItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipTaxableItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipTaxableItem);
}else {
if ($salaryContractItem->getBased() > $salaryContractItem->getAmountLimit()) {
$paySlipTaxableItem = new RhPaySlipTaxableItem();
$paySlipTaxableItem->setComputeMethod('DEFAUT');
$paySlipTaxableItem->setLabel($salaryContractItem->getLabel()." imposable");
$paySlipTaxableItem->setCode($salaryContractItem->getLabel()." imposable");
$paySlipTaxableItem->setNum($salaryContractItem->getNum());
$paySlipTaxableItem->setRhSalaryPaySlip($salaryPaySlip);
$paySlipTaxableItem->setRate(1);
$paySlipTaxableItem->setBased($salaryContractItem->getBased() - $salaryContractItem->getAmountLimit());
$paySlipTaxableItem = SalaryContractManage::setPaySlipTaxableItem($salaryContract, $paySlipTaxableItem, null);
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setTaxGross($salaryPaySlip->getTaxGross() + $paySlipTaxableItem->getProfit());
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipTaxableItem->getProfit());
$paySlipTaxableItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipTaxableItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipTaxableItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipTaxableItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipTaxableItem);
}
$paySlipNonTaxableItem = new RhPaySlipNonTaxableItem();
$paySlipNonTaxableItem->setComputeMethod('DEFAUT');
$paySlipNonTaxableItem->setLabel($salaryContractItem->getLabel());
$paySlipNonTaxableItem->setCode($salaryContractItem->getLabel());
$paySlipNonTaxableItem->setNum($salaryContractItem->getNum());
$paySlipNonTaxableItem->setRhSalaryPaySlip($salaryPaySlip);
$paySlipNonTaxableItem->setRate(1);
$paySlipNonTaxableItem->setBased($salaryContractItem->getAmountLimit());
$paySlipNonTaxableItem = SalaryContractManage::setPaySlipNonTaxableItem($salaryContract, $paySlipNonTaxableItem, $salaryContractItem);
$salaryPaySlip->setGrossTotal($salaryPaySlip->getGrossTotal() + $paySlipNonTaxableItem->getProfit());
/* le transport n'est pas inclus dans le brut social */
if (!str_contains($salaryContractItem->getLabel(), 'TRANSPORT')) {
$salaryPaySlip->setSocialGross($salaryPaySlip->getSocialGross() + $paySlipNonTaxableItem->getProfit());
}
$paySlipNonTaxableItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipNonTaxableItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipNonTaxableItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipNonTaxableItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipNonTaxableItem);
}
}
if ($salaryContract->getRhSalary()->getIsPermanent()) {
foreach ($retainedItemRepository->findBy([], ['num' => 'ASC']) as $key => $retainedItem) {
if ($retainedItem->getComputeMethod() != self::LABEL_RATE_NOT_PERMANANT) {
$paySlipRetainedItem = new RhPaySlipRetainedItem();
$paySlipRetainedItem->setType($retainedItem->getType());
$paySlipRetainedItem->setPart($retainedItem->getPart());
$paySlipRetainedItem->setComputeMethod($retainedItem->getComputeMethod());
$paySlipRetainedItem->setLabel($retainedItem->getLabel());
$paySlipRetainedItem->setCode($retainedItem->getLabel());
$paySlipRetainedItem->setNum($retainedItem->getNum());
$paySlipRetainedItem->setRhSalaryPaySlip($salaryPaySlip);
if ($retainedItem->getComputeMethod() == 'ITS') {
$paySlipRetainedItem = SalaryContractManage::setITS($salaryContract, $salaryPaySlip, $paySlipRetainedItem, $retainedItem, $taxReductionSheduleRepository, $salaryBandScaleRepository);
}else {
$paySlipRetainedItem = SalaryContractManage::setPaySlipRetainedItem($salaryContract, $salaryPaySlip, $paySlipRetainedItem, $retainedItem);
}
if ($retainedItem->getPart() == 'SALARIALE') {
$salaryPaySlip->setWithholdingTax($salaryPaySlip->getWithholdingTax() + $paySlipRetainedItem->getProfit());
}else {
$salaryPaySlip->setPatronalWithholdingTax($salaryPaySlip->getPatronalWithholdingTax() + $paySlipRetainedItem->getProfit());
}
$paySlipRetainedItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipRetainedItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipRetainedItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipRetainedItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipRetainedItem);
}
}
}else {
foreach ($retainedItemRepository->findBy([], ['num' => 'ASC']) as $key => $retainedItem) {
if ($retainedItem->getComputeMethod() == self::LABEL_RATE_NOT_PERMANANT) {
$paySlipRetainedItem = new RhPaySlipRetainedItem();
$paySlipRetainedItem->setType($retainedItem->getType());
$paySlipRetainedItem->setPart($retainedItem->getPart());
$paySlipRetainedItem->setComputeMethod($retainedItem->getComputeMethod());
$paySlipRetainedItem->setLabel($retainedItem->getLabel());
$paySlipRetainedItem->setCode($retainedItem->getLabel());
$paySlipRetainedItem->setNum($retainedItem->getNum());
$paySlipRetainedItem->setRhSalaryPaySlip($salaryPaySlip);
if ($retainedItem->getComputeMethod() == 'ITS') {
$paySlipRetainedItem = SalaryContractManage::setITS($salaryContract, $salaryPaySlip, $paySlipRetainedItem, $retainedItem, $taxReductionSheduleRepository, $salaryBandScaleRepository);
}else {
$paySlipRetainedItem = SalaryContractManage::setPaySlipRetainedItem($salaryContract, $salaryPaySlip, $paySlipRetainedItem, $retainedItem);
}
if ($retainedItem->getPart() == 'SALARIALE') {
$salaryPaySlip->setWithholdingTax($salaryPaySlip->getWithholdingTax() + $paySlipRetainedItem->getProfit());
}else {
$salaryPaySlip->setPatronalWithholdingTax($salaryPaySlip->getPatronalWithholdingTax() + $paySlipRetainedItem->getProfit());
}
$paySlipRetainedItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipRetainedItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipRetainedItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipRetainedItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipRetainedItem);
}
}
}
$rhSalaryCreditSheduls = $rhSalaryCreditShedulRepository->createQueryBuilder('entity')
->innerJoin('entity.rhSalaryCredit', 'rhSalaryCredit')
->addSelect('rhSalaryCredit')
->andWhere('entity.date_due BETWEEN :dateStart AND :dateEnd')
->setParameter('dateStart', $paySlip->getDateStart())
->setParameter('dateEnd', $paySlip->getDateEnd())
->andWhere('rhSalaryCredit.rhSalary = :rhSalary')
->setParameter('rhSalary', $salaryContract->getRhSalary())
->getQuery()
->getResult();
foreach ($rhSalaryCreditSheduls as $key => $rhSalaryCreditShedul) {
if ($rhSalaryCreditShedul->amountRestToPaid() > 0) {
$paySlipRetainedItem = new RhPaySlipRetainedItem();
$paySlipRetainedItem->setType('AUTRES');
$paySlipRetainedItem->setPart('SALARIALE');
$paySlipRetainedItem->setComputeMethod("DEFAUT");
$paySlipRetainedItem->setLabel('Retenue Echéancié Prêt du '.$rhSalaryCreditShedul->getDateDue()->format('d/m/Y'));
$paySlipRetainedItem->setCode("EP-".$rhSalaryCreditShedul->getId().'-du-'.$rhSalaryCreditShedul->getDateDue()->format('d-m-Y'));
$paySlipRetainedItem->setNum('99');
$paySlipRetainedItem->setRhSalaryPaySlip($salaryPaySlip);
$paySlipRetainedItem->setRate(1);
$paySlipRetainedItem->setBased($rhSalaryCreditShedul->amountRestToPaid());
$paySlipRetainedItem->setProfit($rhSalaryCreditShedul->amountRestToPaid());
$paySlipRetainedItem = SalaryContractManage::setPaySlipRetainedItem($salaryContract, $salaryPaySlip, $paySlipRetainedItem, null);
$salaryPaySlip->setWithholdingTax($salaryPaySlip->getWithholdingTax() + $paySlipRetainedItem->getProfit());
$paySlipRetainedItem->setRhSalaryCreditShedul($rhSalaryCreditShedul);
$paySlipRetainedItem->setDay($paySlip->getDateEnd()->format('Y-m-s'));
$paySlipRetainedItem->setMonth($paySlip->getDateEnd()->format('Y-m'));
$paySlipRetainedItem->setYear($paySlip->getDateEnd()->format('Y'));
$paySlipRetainedItem->setEstablishment($paySlip->getEstablishment());
$entityManager->persist($paySlipRetainedItem);
}
}
$salaryPaySlip->setCode('PAIE-'.$salaryContract->getId().$paySlip->getId());
$salaryPaySlip->setNetSalary($salaryPaySlip->getGrossTotal() - ($salaryPaySlip->getWithholdingTax() + $salaryPaySlip->getOthersRetained()));
$entityManager->persist($salaryPaySlip);
//}
}
}
}
try {
$entityManager->flush();
$this->addFlash('info', "les ligne(s) ont été générées avec succès.");
} catch (\Throwable $th) {
//$th->getMessage()
$this->addFlash('info', $th->getMessage());
}
return $this->redirectToRoute('rh_pay_slip_show', [
'id' => $paySlip->getId()
]);
}
/**
* @Route("/print/{id}", name="rh_pay_slip_print", methods={"GET"})
*/
public function print(Request $request, Pdf $knpSnappyPdf, RhPaySlip $paySlip, RhSalaryPaySlipRepository $salaryPaySlipRepository)
{
$establishment = $this->getUser()->getEstablishment();
$setting = $establishment;
$salaryPaySlips = $salaryPaySlipRepository->createQueryBuilder('entity')
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $setting)
->andWhere('entity.rhPaySlip = :rhPaySlip')
->setParameter('rhPaySlip', $paySlip)
->innerJoin('entity.rhSalary', 'rhSalary')
->addSelect('rhSalary')
/* ->andWhere('rhSalary.bank_name = :bank_name')
->setParameter('bank_name', $request->get('bankName')) */
->orderBy('rhSalary.last_name', 'ASC')
->getQuery()
->getResult();
$paySlipLines = new ArrayCollection();
$netToPay = 0;
foreach ($salaryPaySlips as $key => $salaryPaySlip) {
if (strlen($request->get('bankName')) > 0) {
if ($salaryPaySlip->getRhSalary()->getBankName() == $request->get('bankName')) {
$paySlipLines->add(
[
'fullName' => $salaryPaySlip->getRhSalary()->getName(),
'bankName' => $salaryPaySlip->getRhSalary()->getBankName(),
'bankCode' => $salaryPaySlip->getRhSalary()->getBankCode(),
'bankCounterCode' => $salaryPaySlip->getRhSalary()->getCounterCode(),
'job' => $salaryPaySlip->getRhSalaryContract()->getService(),
'bankAccountNumber' => $salaryPaySlip->getRhSalary()->getBankAccountNumber(),
'finetAccountNumber' => $salaryPaySlip->getRhSalary()->getFinetAccountNumber(),
'netToPay' => $salaryPaySlip->getNetSalary(),
'taxGross' => $salaryPaySlip->getTaxGross(),
'pTransport' => $salaryPaySlip->getPTransport()
]
);
$netToPay = $netToPay + $salaryPaySlip->getNetSalary();
}
}else {
$paySlipLines->add(
[
'fullName' => $salaryPaySlip->getRhSalary()->getName(),
'bankName' => $salaryPaySlip->getRhSalary()->getBankName(),
'bankCode' => $salaryPaySlip->getRhSalary()->getBankCode(),
'bankCounterCode' => $salaryPaySlip->getRhSalary()->getCounterCode(),
'job' => $salaryPaySlip->getRhSalaryContract()->getService(),
'bankAccountNumber' => $salaryPaySlip->getRhSalary()->getBankAccountNumber(),
'finetAccountNumber' => $salaryPaySlip->getRhSalary()->getFinetAccountNumber(),
'netToPay' => $salaryPaySlip->getNetSalary(),
'taxGross' => $salaryPaySlip->getTaxGross(),
'pTransport' => $salaryPaySlip->getPTransport()
]
);
$netToPay = $netToPay + $salaryPaySlip->getNetSalary();
}
}
$iterator = $paySlipLines->getIterator();
$iterator->uasort(function ($first, $second) {
if ($first === $second) {
return 0;
}
return $first['fullName'] < $second['fullName'] ? -1 : 1;
});
$paySlipLines = new ArrayCollection(iterator_to_array($iterator));
$html = $this->renderView('rh/rh_pay_slip/print/order.html.twig', [
'paySlip' => $paySlip,
'paySlipLines' => $paySlipLines,
'netToPay' => $netToPay,
'bankName' => $request->get('bankName'),
'setting' => $setting,
]);
$file_name = "OV_".$paySlip->getId().".pdf";
$footer = $this->renderView('print/footer.html.twig', ['setting' => $establishment]);
$header = $this->renderView('print/header.html.twig', ['setting' => $establishment]);
$options = [
'orientation' => 'Portrait',
'header-html' => $header
//'footer-html' => $footer
];
$knpSnappyPdf->generateFromHtml($html, $this->getParameter('app.app_directory').'/downloads/payslips/' . $file_name, $options, true);
return $this->redirectToRoute('preview', [
'file' => $file_name,
'dir' => 'payslips',
]);
}
/**
* @Route("/export/{id}", name="rh_pay_slip_export", methods={"GET"})
*/
public function export(RhPaySlip $paySlip)
{
$setting = $this->getUser()->getEstablishment();
$paySlipInCompanyBankLines = new ArrayCollection();
foreach ($paySlip->getRhSalaryPaySlips() as $key => $salaryPaySlip) {
//if ($salaryPaySlip->getRhSalary()->getBankCode() == $setting->getBankCode()) {
$paySlipInCompanyBankLines->add(
[
'companyName' => $setting->getName(),
'fullName' => $salaryPaySlip->getRhSalary()->getName(),
'counter' => $salaryPaySlip->getRhSalary()->getCounterCode(),
'bankAccountNumber' => $salaryPaySlip->getRhSalary()->getBankAccountNumber(),
'finetAccountNumber' => $salaryPaySlip->getRhSalary()->getFinetAccountNumber(),
'netToPaid' => number_format($salaryPaySlip->getNetSalary(), 0, ',', ''),
'label' => $paySlip->getLabel(),
'bank' => $salaryPaySlip->getRhSalary()->getBankCode()
]
);
//}
}
$iterator = $paySlipInCompanyBankLines->getIterator();
$iterator->uasort(function ($first, $second) {
if ($first === $second) {
return 0;
}
return $first['bankAccountNumber'] < $second['bankAccountNumber'] ? -1 : 1;
});
$paySlipInCompanyBankLines = new ArrayCollection(iterator_to_array($iterator));
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'ETABLISSEMENT');
$sheet->setCellValue('B1', 'NOM ET PRENOMS');
$sheet->setCellValue('C1', 'GUICHE');
$sheet->setCellValue('D1', 'N° COMPTE BANCAIRE');
$sheet->setCellValue('E1', 'N° FINCARTE');
$sheet->setCellValue('F1', 'MONTANT');
$sheet->setCellValue('G1', 'LIBELLE');
$sheet->setCellValue('H1', 'BANQUE');
$index = 2;
$loopIndex = 1;
foreach ($paySlipInCompanyBankLines as $key => $paySlipInCompanyBankLine) {
$sheet->setCellValue('A' . $index, $paySlipInCompanyBankLine['companyName']);
$sheet->setCellValue('B' . $index, $paySlipInCompanyBankLine['fullName']);
$sheet->setCellValue('C' . $index, $paySlipInCompanyBankLine['counter']);
$sheet->setCellValue('D' . $index, $paySlipInCompanyBankLine['bankAccountNumber']);
$sheet->setCellValue('E' . $index, $paySlipInCompanyBankLine['finetAccountNumber']);
$sheet->setCellValue('F' . $index, $paySlipInCompanyBankLine['netToPaid']);
$sheet->setCellValue('G' . $index, $paySlipInCompanyBankLine['label']);
$sheet->setCellValue('H' . $index, $paySlipInCompanyBankLine['bank']);
$index = $index + 1;
$loopIndex = $loopIndex + 1;
}
$sheet->setCellValue('A' . $index, '');
$sheet->setCellValue('B' . $index, '');
$sheet->setCellValue('C' . $index, '');
$sheet->setCellValue('D' . $index, '');
$sheet->setCellValue('E' . $index, '');
$sheet->setCellValue('F' . $index, '');
$sheet->setCellValue('G' . $index, '');
$sheet->setCellValue('H' . $index, '');
$index = $index + 1;
$loopIndex = $loopIndex + 1;
$sheet->setTitle('OV-' . $paySlip->getId());
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = 'OV-' . $paySlip->getLabel() . '.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
/**
* @Route("/validated/{id}", name="rh_pay_slip_validated", methods={"GET"})
*/
public function validated(RhPaySlip $paySlip): Response
{
$entityManager = $this->getDoctrine()->getManager();
foreach ($paySlip->getRhSalaryPaySlips() as $key => $salaryPaySlip) {
$salaryPaySlip->setIsValidated(true);
}
$paySlip->setIsValidated(true);
try {
$entityManager->flush();
return $this->json(['code' => 200, 'message' => "Validation effectuée"], 200);
} catch (\Throwable $th) {
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Validation non effectuée.");
return $this->json(['code' => 500, 'message' => "Validation non effectuée."], 200);
}
/**
* @Route("/cancel/{id}", name="rh_pay_slip_cancel", methods={"GET"})
*/
public function cancel(RhPaySlip $paySlip): Response
{
$entityManager = $this->getDoctrine()->getManager();
foreach ($paySlip->getRhSalaryPaySlips() as $key => $salaryPaySlip) {
$salaryPaySlip->setIsValidated(false);
}
$paySlip->setIsValidated(false);
try {
$entityManager->flush();
return $this->json(['code' => 200, 'message' => "Annulation effectuée"], 200);
} catch (\Throwable $th) {
$this->addFlash('warning', $th->getMessage());
}
$this->addFlash('warning', "Annulation non effectuée.");
return $this->json(['code' => 500, 'message' => "Annulation non effectuée."], 200);
}
/**
* @Route("/paysheet/{id}/print", name="rh_pay_slip_paysheet_print", methods={"GET"})
*/
public function paysheet_print(Pdf $knpSnappyPdf, RhPaySlip $paySlip, RhSalaryPaySlipRepository $rhSalaryPaySlipRepository)
{
/**@var User $user */
$user = $this->getUser();
$establishment = $user->getEstablishment();
$setting = $establishment;
$rhSalaryPaySlips = $rhSalaryPaySlipRepository->createQueryBuilder('entity')
->innerJoin('entity.rhSalary', 'rhSalary')
->addSelect('rhSalary')
->andWhere('entity.rhPaySlip = :rhPaySlip')
->setParameter('rhPaySlip', $paySlip)
->andWhere('entity.establishment = :establishment')
->setParameter('establishment', $establishment)
->orderBy('rhSalary.last_name', 'ASC')
->getQuery()
->getResult();
$html = $this->renderView('rh/rh_pay_slip/print/paysheet.html.twig', [
'paySlip' => $paySlip,
'rhSalaryPaySlips' => $rhSalaryPaySlips,
'setting' => $setting,
]);
$footer = $this->renderView('print/footer.html.twig', ['setting' => $setting,]);
$header = $this->renderView('print/header.html.twig', ['setting' => $setting,]);
$options = [
'orientation' => 'Landscape'
//'header-html' => $header
//'footer-html' => $footer
];
$file_name = "LIVRE_PAIE_".$paySlip->getId().".pdf";
try {
$knpSnappyPdf->generateFromHtml($html, $this->getParameter('app.app_directory').'/downloads/payslips/' . $file_name, $options, true);
} catch (\Throwable $th) {
$this->addFlash('info', "Effectué");
}
return $this->redirectToRoute('preview', [
'file' => $file_name,
'dir' => 'payslips',
]);
}
/**
* @Route("/cnps-declaration/export/{id}", name="rh_pay_slip_cnps_declaration_export", methods={"GET"})
*/
public function cnps_declaration_expor(RhPaySlip $paySlip, RhSalaryPaySlipRepository $rhSalaryPaySlipRepository)
{
/**@var User $user */
$user = $this->getUser();
$establishment = $user->getEstablishment();
$setting = $establishment;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'NUMERO CNPS');
$sheet->setCellValue('B1', 'NOM');
$sheet->setCellValue('C1', 'PRENOMS');
$sheet->setCellValue('D1', 'ANNEE DE NAISSANCE');
$sheet->setCellValue('E1', 'DATE D\'EMBAUCHE');
$sheet->setCellValue('F1', 'DATE DE DEPART');
$sheet->setCellValue('G1', 'TYPE SALARIE M: Mensuel J : Journalier H: Horaire');
$sheet->setCellValue('H1', 'DUREE TRAVAILLEE');
$sheet->setCellValue('I1', 'SALAIRE BRUT');
$index = 2;
$loopIndex = 1;
$tax_gross = 0;
$rhSalaryPaySlips = $rhSalaryPaySlipRepository->createQueryBuilder('entity')
->innerJoin('entity.rhSalary', 'rhSalary')
->addSelect('rhSalary')
->andWhere('rhSalary.is_declared = :is_declared')
->setParameter('is_declared', 1)
->andWhere('entity.rhPaySlip = :rhPaySlip')
->setParameter('rhPaySlip', $paySlip)
->orderBy('rhSalary.social_number', 'DESC')
->getQuery()
->getResult();
foreach ($rhSalaryPaySlips as $key => $salaryPaySlip) {
if ($salaryPaySlip->getRhSalary()->getIsDeclared()) {
$sheet->setCellValue('A' . $index, ' '.$salaryPaySlip->getRhSalary()->getSocialNumber());
$sheet->setCellValue('B' . $index, $salaryPaySlip->getRhSalary()->getLastName());
$sheet->setCellValue('C' . $index, $salaryPaySlip->getRhSalary()->getFirstName());
$sheet->setCellValue('D' . $index, $salaryPaySlip->getRhSalary()->getBirthDay() ? $salaryPaySlip->getRhSalary()->getBirthDay()->format('Y') : '');
$sheet->setCellValue('E' . $index, $salaryPaySlip->getRhSalaryContract()->getStartDate() ? $salaryPaySlip->getRhSalaryContract()->getStartDate()->format('d/m/Y') : '');
$sheet->setCellValue('F' . $index, $salaryPaySlip->getRhSalaryContract()->getEndDate() ? $salaryPaySlip->getRhSalaryContract()->getEndDate()->format('d/m/Y') : '');
$sheet->setCellValue('G' . $index, 'M');
$sheet->setCellValue('H' . $index, '1');
$sheet->setCellValue('I' . $index, $salaryPaySlip->getSocialGross());
$index += 1;
$loopIndex += 1;
$tax_gross += $salaryPaySlip->getSocialGross();
}
}
$sheet->setCellValue('A' . $index, '');
$sheet->setCellValue('B' . $index, '');
$sheet->setCellValue('C' . $index, '');
$sheet->setCellValue('D' . $index, '');
$sheet->setCellValue('E' . $index, '');
$sheet->setCellValue('F' . $index, '');
$sheet->setCellValue('G' . $index, '');
$sheet->setCellValue('H' . $index, '');
$sheet->setCellValue('I' . $index, $tax_gross);
$index = $index + 1;
$loopIndex = $loopIndex + 1;
$sheet->setTitle('DECL_CNPS' . $paySlip->getId());
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = 'DECL_CNPS_' . $paySlip->getLabel() . '_' . str_replace(' ', '_', $setting->getEstablishmentGroup()->getName()) . '.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
$writer->save($temp_file);
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
}