



<!DOCTYPE html>
<html lang="en">
<head>
<head>
     <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="description" content="">
    <meta name="author" content="">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0">
    <link rel="shortcut icon" type="image/x-icon" href="upload/icon.png">
    <title>Project 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;
}

#editableTable {
  width: 100%;
  border: 1px solid black;
}
.bottom {
  height: 100px;
  vertical-align: bottom;
}	


</style>
</head>
<body>

		<div class="container">
	
	<img src='Money Receipt.png' height="80" width="100%">

	
	
<div  id="content" style="margin-left: 75%" >


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



		
</div>
</div>


<table   id="editableTable" class="table table-bordered" style="font-size:1.5vw;" >
	<thead>
	
		<tr>
<th style="width: 50%">

		<div >ReceivedID :
		
		</div>
	</th><th style="width: 50%">	
		<div>Payment Date :
    </div>
</th>
</tr>

		<tr>
<th style="width: 65%">

		<div >Received From :
		
		</div>
	</th><th style="width: 35%">	
		<div>Amount Tk :
    </div>
</th>
</tr>



	<tr><th>
	
	<div>Amount Of BDT :
   </div>
	</th><th>

	<div>Payment Method :
	Cash</div>
   </th></tr>
   

   
   <tr><th  colspan="2">
   
	<div>For Payment Of :
  </div> </th></tr>
  
  
   <tr><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

	Received By
    <div></div>
	</td><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

Payment By
 <div></div>
	</td></tr>
    </thead>
	
</table>    

</div>

		<div class="container">
	<img src='add.png' height='20' width='100%'/>
</div>
<hr>
		<div class="container">
	
	<img src='Money Receipt.png' height="80" width="100%">

	
	
<div  id="content" style="margin-left: 75%" >


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



		
</div>
</div>


<table   id="editableTable" class="table table-bordered" style="font-size:1.5vw;" >
	<thead>
	
		<tr>
<th style="width: 50%">

		<div >ReceivedID :
		
		</div>
	</th><th style="width: 50%">	
		<div>Payment Date :
    </div>
</th>
</tr>

		<tr>
<th style="width: 65%">

		<div >Received From :
		
		</div>
	</th><th style="width: 35%">	
		<div>Amount Tk :
    </div>
</th>
</tr>



	<tr><th>
	
	<div>Amount Of BDT :
   </div>
	</th><th>

	<div>Payment Method :
	Cash</div>
   </th></tr>
   

   
   <tr><th  colspan="2">
   
	<div>For Payment Of :
  </div> </th></tr>
  
  
   <tr><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

	Received By
    <div></div>
	</td><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

Payment By
 <div></div>
	</td></tr>
    </thead>
	
</table>    

</div>

		<div class="container">
	<img src='add.png' height='20' width='100%'/>
</div>
<hr>
	
	<div class="container">
	
	<img src='Money Receipt.png' height="80" width="100%">

	
	
<div  id="content" style="margin-left: 75%" >


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



		
</div>
</div>


<table   id="editableTable" class="table table-bordered" style="font-size:1.5vw;" >
	<thead>
	
		<tr>
<th style="width: 50%">

		<div >ReceivedID :
		
		</div>
	</th><th style="width: 50%">	
		<div>Payment Date :
    </div>
</th>
</tr>

		<tr>
<th style="width: 65%">

		<div >Received From :
		
		</div>
	</th><th style="width: 35%">	
		<div>Amount Tk :
    </div>
</th>
</tr>



	<tr><th>
	
	<div>Amount Of BDT :
   </div>
	</th><th>

	<div>Payment Method :
	Cash</div>
   </th></tr>
   

   
   <tr><th  colspan="2">
   
	<div>For Payment Of :
  </div> </th></tr>
  
  
   <tr><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

	Received By
    <div></div>
	</td><td style="height: 70px; vertical-align:bottom; text-align:center; text-decoration: underline;">

Payment By
 <div></div>
	</td></tr>
    </thead>
	
</table>    

</div>

		<div class="container">
	<img src='add.png' height='20' width='100%'/>
</div>








<div class="col-lg-8 ">
		<form class="no-print" method="POST" action="">
	
			<button class="btn btn-primary glyphicon glyphicon-print" onclick="window.print()">  Print</button>
		</form>
	
</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>


   <script src="js/jquery-1.10.2.js"></script>
    <!-- BOOTSTRAP SCRIPTS -->
    <script src="js/bootstrap.js"></script>
    <!-- METISMENU SCRIPTS -->
    <script src="js/jquery.metisMenu.js"></script>
       <!-- CUSTOM SCRIPTS -->
    <script src="js/custom1.js"></script>

</body>
</html>
 





<?php
class numbertowordconvertsconver {
    function convert_number($number) 
    {
        if (($number < 0) || ($number > 999999999)) 
        {
            throw new Exception("Number is out of range");
        }
        $giga = floor($number / 1000000);
        // Millions (giga)
        $number -= $giga * 1000000;
        $kilo = floor($number / 1000);
        // Thousands (kilo)
        $number -= $kilo * 1000;
        $hecto = floor($number / 100);
        // Hundreds (hecto)
        $number -= $hecto * 100;
        $deca = floor($number / 10);
        // Tens (deca)
        $n = $number % 10;
        // Ones
        $result = "";
        if ($giga) 
        {
            $result .= $this->convert_number($giga) .  "Million";
        }
        if ($kilo) 
        {
            $result .= (empty($result) ? "" : " ") .$this->convert_number($kilo) . " Thousand";
        }
        if ($hecto) 
        {
            $result .= (empty($result) ? "" : " ") .$this->convert_number($hecto) . " Hundred";
        }
        $ones = array("", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eightteen", "Nineteen");
        $tens = array("", "", "Twenty", "Thirty", "Fourty", "Fifty", "Sixty", "Seventy", "Eigthy", "Ninety");
        if ($deca || $n) {
            if (!empty($result)) 
            {
                $result .= "  ";
            }
            if ($deca < 2) 
            {
                $result .= $ones[$deca * 10 + $n];
            } else {
                $result .= $tens[$deca];
                if ($n) 
                {
                    $result .= "-" . $ones[$n];
                }
            }
        }
        if (empty($result)) 
        {
            $result = "zero";
        }
        return $result;
    }
}
?>
