<?php
if(!isset($_SESSION)) 
    { 
   session_start();
	}
   //include('wellcome.php');
	if(!empty($_SESSION['Id'])){
?>



<!DOCTYPE html>
<html lang="en">
<head>
<head>
     <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="shortcut icon" type="image/x-icon" href="upload/icon.png">
    <title>Employee Trn Print</title>

  <!-- Bootstrap CSS CDN -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <!-- Our Custom CSS -->
  <link rel="stylesheet" href="style2.css">
  <!-- Scrollbar Custom CSS -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/malihu-custom-scrollbar-plugin/3.1.5/jquery.mCustomScrollbar.min.css">
  
  


    

    <!-- Bootstrap Core CSS -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
	<link href="css/ss.css" rel="stylesheet">

    <!-- MetisMenu CSS -->
    <link href="css/plugins/metisMenu/metisMenu.min.css" rel="stylesheet">

    <!-- DataTables CSS -->
    <link href="css/plugins/dataTables.bootstrap.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link href="css/sb-admin-2.css" rel="stylesheet">
    <link href="css/custom.css" rel="stylesheet">
    <link href="js/plugins/fullcalender/fullcalendar.css" rel="stylesheet">

     <!-- Datepicker CSS -->
     <link href="css/datepicker.css" rel="stylesheet">

    <!-- Morris Charts CSS -->
    <link href="css/plugins/morris.css" rel="stylesheet">

    <!-- Custom Fonts -->
    <link href="font-awesome-4.1.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">



     <script src="js/jquery-1.11.0.js"></script>
     <script src="js/plugins/metisMenu/metisMenu.js"></script>
	 

  <!--     Fonts and icons     -->
  <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700,200" rel="stylesheet" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <!-- CSS Files -->
 
  <link href="assets/css/now-ui-dashboard.css?v=1.5.0" rel="stylesheet" />
  <!-- CSS Just for demo purpose, don't include it in your project -->
  <link href="assets/demo/demo.css" rel="stylesheet" />

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
	 <style>
	 @media print
	{    
		form.no-print, .no-print {
        display: none !important;
		}
		body{
		font: 7pt Georgia, "Times New Roman", Times, serif;
		
		}
		@page{
		size: A4;
		margin: 1cm;
		}
		tr:nth-child(even){
		background-color: #ddd;
		}
	}

	
	

#customers {
  font-family: Arial, Helvetica, sans-serif;
  border-collapse: collapse;
  width: 100%;
  font-size: 1em;
}

#customers td, #customers th {
  border: 1px solid #ddd;
  padding: 3px;
}

#customers tr:nth-child(even){background-color: #f2f2f2;}

#customers tr:hover {background-color: #ddd;}

#customers th {
  padding-top: 5px;
  padding-bottom: 5px;
  text-align: center;
  background-color: #3fb618;
  color: white;
}	
#hedder th {
  padding-top: 5px;
  padding-bottom: 5px;
  text-align: center;
  background-color: #ddd;
 
}
#hedder {
  font-family: Arial, Helvetica, sans-serif;
  border-collapse: collapse;
  width: 100%;
  font-size: 1em;
}


</style>
</head>
<body>




<?php
// connect to the database
    include('connection.php');
if (isset($_POST['editemployee'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE employee set Id='" . $_SESSION['Id'] . "',
 ProjectName='" . $_POST['ProjectName'] . "',
 ContactName='" . $_POST['ContactName'] . "',
 Address='" . $_POST['Address'] . "' ,
 Email='" . $_POST['Email'] . "',
 PhoneNo='" . $_POST['PhoneNo'] . "'
 FileName='" . $_POST['FileName'] . "'
 WHERE Id='" . $_POST['id'] . "'");
$message = "Record Modified Successfully";
}
$result = mysqli_query($conn,"SELECT * FROM employee WHERE id='" . $_SESSION['Id'] . "'");
$row= mysqli_fetch_array($result);

?>

	<div class="container">
	<img src='images/powerlogo.png' height='50' width='800'/>
	
	</div>
	
 <div  id="content" style="margin-left: 10%" >


<div style="margin-right: 3%" class="row ContactGeneral">

<div class="row">


<div class="col-md-12 ">
		
	
		
<table id="hedder"><tfoot><tr>
<th style="font-weight:bold; text-align: left;" >
	<div style="font-weight:bold;">Employee ID : <?php echo $row['Id']; ?></div>
	<div style="font-weight:bold;">Employee Name : <?php echo $row['EmployeeName']; ?></div>
	<div style="font-weight:bold;">Phone No : <?php echo $row['PhoneNo']; ?></div>
	</th>
	<th style="font-weight:bold; text-align: left;" >
	
	
	<div style="font-weight:bold;">JobTitle : <?php echo $row['JobTitle']; ?></div>
	
	<div style="font-weight:bold;">Salary : <?php echo $row['Salary']; ?></div>
	<div style="font-weight:bold;">Print Date:  <?php
echo "" . date("d/m/y") . "";

echo " " . date("l");
?></div>
	</th>
	
</tr></tfoot></table>
	</div>

<div>
    <form class="no-print" method="POST" action="">
        <label>Month: </label>
            <select name="month">
			<option value="<?php echo date('m');?>"><?php echo date("F", strtotime('m'));?></option>
            <?php
 
                for ($i = 1; $i <= 12; $i++)
                {
                    $month = date('F', mktime(0, 0, 0, $i, 1, 2011));
                    ?>
                    <option value="<?php echo $i; ?>"><?php echo $month; ?></option>
                    <?php
                }
 
            ?>
            </select>
 
        <label>Year: </label>
            <select name="year">
			<option value="<?php echo date("Y"); ?>"><?php echo date("Y");?></option>
            <?php
                for($n=2014;$n<=2026;$n++){
                    ?>
					
                    <option value="<?php echo $n; ?>"><?php echo $n; ?></option>
                    <?php
                }
            ?>
            </select>
     
   			<button class="btn btn-primary" type="submit"  name="submit"><span class="glyphicon glyphicon-search"></span> Get Data</button> <a href="displayproject.php" type="button" class="btn btn-success"><span class = "glyphicon glyphicon-refresh"><span></a>
			<button class="btn btn-primary glyphicon glyphicon-print" onclick="window.print()">  Print</button>
		</form>
		</div>
	
					<div class="col-md-12">
						<div class="table-responsive">
			
						
					

						
<table id="customers" class="table table-bordered">
				<thead class="alert-info">
				<th role="columnheader" style="font-weight:bold; text-align: center;"  class="alert-info" colspan="6" >Salary Transations</th>
                                        <tr class="alert-info">
                                            <th>Date</th>
						<th>Salary</th>
						<th>Payment</th>
						<th>Project Name</th>
						<th>Note</th>
                                        </tr>
                                    </thead>
                                    <tbody>
        <?php
            if (isset($_POST['submit'])){
                include('connection.php');
                $month=$_POST['month'];
                $year=$_POST['year'];
		$query=mysqli_query($conn, "SELECT project.ProjectName, Remarks, PaymentDate, Salary,PayAmount, project.Id, employee_transations.Id from employee_transations JOIN project on employee_transations.ProjectName=project.Id WHERE EmployeeName ='" . $_GET['Id'] . "' AND month(PaymentDate)='$month' and year(PaymentDate)='$year'") or die(mysqli_error());
		$row=mysqli_num_rows($query);
		if($row>0){
			while($fetch=mysqli_fetch_array($query)){
?>
	<tr>
		<td><?php echo $fetch['PaymentDate']?></td>
		 
		<td><?php echo $fetch['Salary']?></td>
		<td><?php echo $fetch['PayAmount']?></td>
		<td><?php echo $fetch['ProjectName']?></td>
		<td><?php echo $fetch['Remarks']?></td>
	</tr>
	
<?php
			}
		}else{
			echo'
			<tr>
				<td class="alert-info" colspan = "5"><h3 style="font-weight:bold; text-align: center;"><center ><svg xmlns="http://www.w3.org/2000/svg" width="25" height="25" fill="currentColor" class="bi bi-calendar-x-fill" viewBox="0 0 16 16">
  <path d="M4 .5a.5.5 0 0 0-1 0V1H2a2 2 0 0 0-2 2v1h16V3a2 2 0 0 0-2-2h-1V.5a.5.5 0 0 0-1 0V1H4V.5zM16 14V5H0v9a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2zM6.854 8.146 8 9.293l1.146-1.147a.5.5 0 1 1 .708.708L8.707 10l1.147 1.146a.5.5 0 0 1-.708.708L8 10.707l-1.146 1.147a.5.5 0 0 1-.708-.708L7.293 10 6.146 8.854a.5.5 0 1 1 .708-.708z"/>
</svg> Record Not Found!</center></h3></td>
			</tr>';
		}
	}else{
		
		
		$query=mysqli_query($conn, "SELECT project.ProjectName, Remarks, PaymentDate, Salary,PayAmount, project.Id, employee_transations.Id from employee_transations JOIN project on employee_transations.ProjectName=project.Id WHERE EmployeeName ='" . $_GET['Id'] . "' AND month(PaymentDate)=month(now()) and year(PaymentDate)=YEAR(now())") or die(mysqli_error());
		while($fetch=mysqli_fetch_array($query))
		{
?>

	<tr>
		<td><?php echo $fetch['PaymentDate']?></td>
		<td><?php echo $fetch['Salary']?></td>
		<td><?php echo $fetch['PayAmount']?></td>
		<td><?php echo $fetch['ProjectName']?></td>
		<td><?php echo $fetch['Remarks']?></td>
		
		
</tr>


<?php
		}
	}
        ?>
        </tbody>
<tr class="alert-info">
     			  		  		<th  style="font-weight:bold; text-align: center;">
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
	Date: Month-<?php if(isset($_POST["submit"])){echo $_POST["month"];}else{}?></br>/Year-<?php if(isset($_POST["submit"])){echo $_POST["year"];}else{}?></span></h4></th>
			  		<th  style="font-weight:bold; text-align: center;">
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
	<?php 
	if(ISSET($_POST['submit'])){
		
		$sql = "SELECT  SUM(Salary) from employee_transations WHERE EmployeeName ='" . $_GET['Id'] . "' AND month(PaymentDate)='$month' and year(PaymentDate)='$year'";
		$result = $conn->query($sql);
		//display data on web page
		while($row1 = mysqli_fetch_array($result)){
		echo " Total Salary : ". $row1['SUM(Salary)'];
		echo " ";
	}}
	?></span></h4></th>
		  
		  
		  <th  style="font-weight:bold; text-align: center;">
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
	<?php 
	if(ISSET($_POST['submit'])){
		
		$sql = "SELECT  SUM(PayAmount) from employee_transations WHERE EmployeeName ='" . $_GET['Id'] . "' AND month(PaymentDate)='$month' and year(PaymentDate)='$year'";
		$result = $conn->query($sql);
		//display data on web page
		while($row1 = mysqli_fetch_array($result)){
		echo " PayAmount : ". $row1['SUM(PayAmount)'];
		echo " ";
	}}
	?></span></h4></th>
		  
		  		  		<th  style="font-weight:bold; text-align: center;">
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
	<?php 
	if(ISSET($_POST['submit'])){
		
		$sql = "SELECT  SUM(Salary-PayAmount) from employee_transations WHERE EmployeeName ='" . $_GET['Id'] . "' AND month(PaymentDate)='$month' and year(PaymentDate)='$year'";
		$result = $conn->query($sql);
		//display data on web page
		while($row1 = mysqli_fetch_array($result)){
		echo " Total Blance : ". $row1['SUM(Salary-PayAmount)'];
		echo " ";
	}}
	?></span></h4></th>
			  		  		<th  style="font-weight:bold; text-align: center;">
		<h4>
	 <span class="different-text-color" style="font-weight:bold;">
	</span></h4></th>
		  
		 
          
       </tr>
                                </table>
								</div>
                            </div>
                     
						
	
	
	
      

    </div>

	
	
	
</div>
</div>
</div>

			


<script src="jquery/jquery.min.js"></script>
<script src="js/bootstrap.bundle.min.js"></script>
<script>
function myFunction() {
  var input, filter, table, tr, td, i, txtValue;
  input = document.getElementById("myInput");
  filter = input.value.toUpperCase();
  table = document.getElementById("myTable");
  tr = table.getElementsByTagName("tr");
  for (i = 0; i < tr.length; i++) {
    td = tr[i].getElementsByTagName("td")[0];
    if (td) {
      txtValue = td.textContent || td.innerText;
      if (txtValue.toUpperCase().indexOf(filter) > -1) {
        tr[i].style.display = "";
      } else {
        tr[i].style.display = "none";
      }
    }       
  }
}
</script>


<script>
function sortListDir() {
  var list, i, switching, b, shouldSwitch, dir, switchcount = 0;
  list = document.getElementById("id01");
  switching = true;
  // Set the sorting direction to ascending:
  dir = "asc"; 
  // Make a loop that will continue until no switching has been done:
  while (switching) {
    // start by saying: no switching is done:
    switching = false;
    b = list.getElementsByTagName("tr");
    // Loop through all list-items:
    for (i = 0; i < (b.length - 1); i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /* check if the next item should switch place with the current item,
      based on the sorting direction (asc or desc): */
      if (dir == "asc") {
        if (b[i].innerHTML.toLowerCase() > b[i + 1].innerHTML.toLowerCase()) {
          /* if next item is alphabetically lower than current item,
          mark as a switch and break the loop: */
          shouldSwitch = true;
          break;
        }
      } else if (dir == "desc") {
        if (b[i].innerHTML.toLowerCase() < b[i + 1].innerHTML.toLowerCase()) {
          /* if next item is alphabetically higher than current item,
          mark as a switch and break the loop: */
          shouldSwitch= true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      /* If a switch has been marked, make the switch
      and mark that a switch has been done: */
      b[i].parentNode.insertBefore(b[i + 1], b[i]);
      switching = true;
      // Each time a switch is done, increase switchcount by 1:
      switchcount ++;
    } else {
      /* If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again. */
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}
</script>
<script>
$(function() {
    $( "#textfrom" ).datepicker({
        dateFormat: "yy-mm-dd",                 
        changeMonth: true,
        changeYear: true
    });
});

</script>
<script>
$(function() {
    $( "#textfrom1" ).datepicker({
        dateFormat: "yy-mm-dd",                 
        changeMonth: true,
        changeYear: true
    });
});

</script>

</body>
</html>
<?php
	}else{
		header("location:login.php");
	}

?> 


