

<?php
// connect to the database
    include('connection.php');
	

if (isset($_POST['Employeesave'])) { // if save button on the form is clicked
    // name of the uploaded file
	
	$EmployeeName = $_POST['EmployeeName'];
	$PhoneNo = $_POST['PhoneNo'];
	$Email = $_POST['Email'];
	$Address = $_POST['Address'];
	$JobTitle = $_POST['JobTitle'];	
	$Salary = $_POST['Salary'];	
    $filename = $_FILES['myfile']['name'];
	
	
	
    // destination of the file on the server
    $destination = 'EmployeeImage/' . $filename;

    // get the file extension
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // the physical file on a temporary uploads directory on the server
    $file = $_FILES['myfile']['tmp_name'];
    $size = $_FILES['myfile']['size'];

    if (!in_array($extension, ['zip', 'pdf', 'txt', 'doc', 'docx', 'png', 'jpg', 'jpeg',  'gif'])) {
        echo "You file extension must be .zip, .pdf, .txt, .doc, .docx, .png, .jpg, .jpeg or .gif";
    } elseif ($_FILES['myfile']['size'] > 1000000) { // file shouldn't be larger than 1Megabyte
        echo "File too large!";
    } else {
		
		
        // move the uploaded (temporary) file to the specified destination
        if (move_uploaded_file($file, $destination))

			{
            $sql = "INSERT INTO employee (EmployeeName, PhoneNo, Email, Address, JobTitle, Salary, FileName, size, downloads) VALUES
			('$EmployeeName', '$PhoneNo', '$Email', '$Address', '$JobTitle', '$Salary', '$filename', $size, 0)";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            }
        } else {
            echo "Failed to upload file.";
			
        }
    }
}
header("location:Employeedisplay.php");
?>

<?php
// connect to the database
    include('connection.php');
	
	
	if (isset($_POST['editemployee'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE employee set id='" . $_POST['id'] . "',
 EmployeeName='" . $_POST['EmployeeName'] . "',
 PhoneNo='" . $_POST['PhoneNo'] . "',
 Email='" . $_POST['Email'] . "' ,
 Address='" . $_POST['Address'] . "',
 
 JobTitle='" . $_POST['JobTitle'] . "',
 Salary='" . $_POST['Salary'] . "'
 WHERE Id='" . $_POST['id'] . "'");
$message = "Record Modified Successfully";
}
$result = mysqli_query($conn,"SELECT * FROM employee WHERE Id='" . $_GET['Id'] . "'");
$row= mysqli_fetch_array($result);

header("location:Employeedisplay.php");
?>

<?php
// connect to the database
    include('connection.php');
	

if (isset($_POST['jobtitlessave'])) { // if save button on the form is clicked
    // name of the uploaded file
	
	$JobTitle = $_POST['JobTitle'];
	
	
	

			
            $sql = "INSERT INTO jobtitles (JobTitle) VALUES ('$JobTitle')";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            
        } else {
            echo "Failed to upload file.";
			
        }
    }

header("location:Employeedisplay.php");
?>



////////////////////////////////////////////////

<?php
//Transations Add Actions
// connect to the database
    include('connection.php');
	

if (isset($_POST['savetransations'])) { // if save button on the form is clicked
    // name of the uploaded file
	
	$PaymentDate = $_POST['PaymentDate'];
	$EmployeeName = $_POST['EmployeeName'];
	$Salary = $_POST['Salary'];
	$PayAmount = $_POST['PayAmount'];
	$Paymentmethod = $_POST['Paymentmethod'];
	$ProjectName = $_POST['ProjectName'];
	$Remarks = $_POST['Remarks'];	
    $ReceivedBy = $_POST['ReceivedBy']; 
	$PaymentBy = $_POST['PaymentBy'];
	
	

			
            $sql = "INSERT INTO employee_transations (PaymentDate, EmployeeName, Salary, PayAmount, Paymentmethod, ProjectName, Remarks, ReceivedBy, PaymentBy ) VALUES
			('$PaymentDate', '$EmployeeName', '$Salary', '$PayAmount', '$Paymentmethod', '$ProjectName', '$Remarks', '$ReceivedBy', '$PaymentBy')";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            
        } else {
            echo "Failed to upload file.";
			
        }
    }

header("location:Employeedisplay.php");
?> 