

<?php
// connect to the database
//Project Add Actions
    //include('connection.php');
	include ('includes/db.php');
	

if (isset($_POST['projectsave'])) { // if save button on the form is clicked
    // name of the uploaded file
	
	$ProjectName = $_POST['ProjectName'];
	$ContactName = $_POST['ContactName'];
	$PhoneNo = $_POST['PhoneNo'];
	$SortAddress = $_POST['SortAddress'];
	$Address = $_POST['Address'];
	$Email = $_POST['Email'];
	$status = $_POST['status'];	
    $filename = $_FILES['myfile']['name'];
	
	
	
    // destination of the file on the server
    $destination = 'upload/' . $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 project (ProjectName, ContactName, PhoneNo, SortAddress, Address, Email, status, FileName, size, downloads) VALUES
			('$ProjectName', '$ContactName', '$PhoneNo', '$SortAddress','$Address', '$Email','$status', '$filename', $size, 0)";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            }
        } else {
            echo "Failed to upload file.";
			
        }
    }
}
header("location:displayproject.php");
?>
<?php
// connect to the database
//Project Edit Actions
    include('connection.php');
	
	
	if (isset($_POST['editproject'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE project set id='" . $_POST['id'] . "',
 ProjectName='" . $_POST['ProjectName'] . "',
 ContactName='" . $_POST['ContactName'] . "',
  SortAddress='" . $_POST['SortAddress'] . "' ,
 Address='" . $_POST['Address'] . "' ,
 Email='" . $_POST['Email'] . "',
 
 PhoneNo='" . $_POST['PhoneNo'] . "'
 WHERE Id='" . $_POST['id'] . "'");
$message = "Record Modified Successfully";
}
$result = mysqli_query($conn,"SELECT * FROM project WHERE Id='" . $_GET['Id'] . "'");
$row= mysqli_fetch_array($result);

header("location:displayproject.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'];
	$ProjectName = $_POST['ProjectName'];
	$Amount = $_POST['Amount'];
	$paymentmethod = $_POST['paymentmethod'];
	$Remarks = $_POST['Remarks'];		
    $ReceivedBy = $_POST['ReceivedBy']; 
	$PaymentBy = $_POST['PaymentBy'];
	
	

			
            $sql = "INSERT INTO project_transations (PaymentDate, ProjectName, Amount, paymentmethod, Remarks, ReceivedBy, PaymentBy ) VALUES
			('$PaymentDate', '$ProjectName', '$Amount', '$paymentmethod', '$Remarks', '$ReceivedBy', '$PaymentBy')";
            if (mysqli_query($conn, $sql)) {
                echo "File uploaded successfully";
            
        } else {
            echo "Failed to upload file.";
			
        }
    }

header("location:displayproject.php");
?>

<?php
// connect to the database
    include('connection.php');
	

	
	if (isset($_POST['project_tran_edit'])){
//if(count($_POST)>0) {
mysqli_query($conn,"UPDATE project_transations set id='" . $_POST['id'] . "',
 PaymentDate='" . $_POST['PaymentDate'] . "',
 ProjectName='" . $_POST['ProjectName'] . "',
 Amount='" . $_POST['Amount'] . "' ,
 paymentmethod='" . $_POST['paymentmethod'] . "',

 
 Remarks='" . $_POST['Remarks'] . "',
 ReceivedBy='" . $_POST['ReceivedBy'] . "',
 PaymentBy='" . $_POST['PaymentBy'] . "'
 WHERE Id='" . $_POST['id'] . "'");
$message = "Record Modified Successfully";
}
$result = mysqli_query($conn,"SELECT * FROM project_transations WHERE Id='" . $_GET['Id'] . "'");
$row= mysqli_fetch_array($result);

header("location:displayproject.php");

?>
