PageRenderTime 45ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/opensourcepos/application/views/procurement/purchase_quote_grid.php

https://bitbucket.org/jit_bec/shopifine
PHP | 735 lines | 629 code | 72 blank | 34 comment | 17 complexity | c6bb300959095bfcb82488d3bd62af15 MD5 | raw file
Possible License(s): LGPL-3.0
  1. <html>
  2. <head>
  3. <?php $this->load->view("common/header"); ?>
  4. <!-- <script type="text/javascript" src="http://jzaefferer.github.com/jquery-validation/jquery.validate.js"></script>-->
  5. <style>
  6. .column {
  7. float: left;
  8. padding: 1em 1em 3em;
  9. width: 26em;
  10. }
  11. #dialog-form *{
  12. font-size:96%;
  13. }
  14. .extra-wide{
  15. width:95%;
  16. }
  17. .field{
  18. width:100%;
  19. }
  20. .ui-widget-header {height:12px;}
  21. .quote-column {
  22. float: left;
  23. padding-bottom: 0.5em;
  24. width: 45em;
  25. }
  26. .ui-combobox-input{
  27. width:23em;
  28. }
  29. #supplierOp-input{
  30. width:10em;
  31. }
  32. #warehouseOp-input{
  33. width:10em;
  34. }
  35. .calculated {
  36. color: green;
  37. font-size: 90%;
  38. }
  39. </style>
  40. <script type="text/javascript">
  41. $(function() {
  42. $.validator.addMethod('minStrict', function (value, el, param) {
  43. return value > param;
  44. },"Price must be more than 0");
  45. $.validator.addMethod('hasItems', function (value, el, param) {
  46. if($("#quoteId").val()!=""){
  47. var noOfRows = myGridPkd.getGridParam("records");
  48. if (noOfRows<1){
  49. return false;
  50. }
  51. }
  52. return true;
  53. },"Items must be added for Quote");
  54. //form validation
  55. $("#quoteForm").validate({
  56. rules:{
  57. quoteId:{
  58. hasItems:true
  59. }
  60. }
  61. }
  62. );
  63. $("#itemForm").validate({rules:{
  64. quantity:{
  65. required:true,
  66. digits:true,
  67. min:1
  68. },
  69. exPrice:{
  70. number:true
  71. }
  72. }}
  73. );
  74. // datepicker for Add Form
  75. $( "#reqdate" ).datepicker({
  76. showOn: "button",
  77. buttonImage: "images/calendar.gif",
  78. buttonImageOnly: true,
  79. dateFormat:"dd/mm/yy",
  80. minDate:0
  81. });
  82. $( "#neededdate" ).datepicker({
  83. showOn: "button",
  84. buttonImage: "images/calendar.gif",
  85. buttonImageOnly: true,
  86. dateFormat:"dd/mm/yy",
  87. minDate:0
  88. });
  89. function quotegriddates(id){
  90. jQuery("#"+id+"_needed_by_date","#quotes").datepicker({dateFormat:"yy-mm-dd",minDate:0});
  91. }
  92. function quoteitemgriddates(id){
  93. jQuery("#"+id+"_needed_by_date","#lineItems").datepicker({dateFormat:"yy-mm-dd",minDate:0});
  94. }
  95. //end datepicker
  96. //com bo boxes
  97. // $("#warehouseOp").combobox();
  98. // $("#supplierOp").combobox();
  99. $("#productOp").combobox({customChange:function(){
  100. console.log("product id = " + $("#productOp").val());
  101. $.ajax({
  102. type:"GET",
  103. url:'index.php/procurement/getCostPrice',
  104. data:{productid:$("#productOp").val()},
  105. success:function (response){
  106. $("#curPrice").text(" The Current Average Cost Price Is " +response );
  107. }
  108. })
  109. }}
  110. );
  111. //end combox
  112. var myGridPkd = $("#lineItems"),lastsel;
  113. var editparametersitems = {
  114. "keys" : true,
  115. "oneditfunc" : quoteitemgriddates,
  116. "successfunc" : function(){
  117. lastsel=undefined;
  118. $("#lineItems").trigger("reloadGrid");
  119. },
  120. "aftersavefunc" : null,
  121. "errorfunc": function(){
  122. lastsel=undefined;
  123. },
  124. "afterrestorefunc" : null,
  125. "restoreAfterError" : true,
  126. "mtype" : "POST"
  127. };
  128. $( "#dialog-form" ).dialog({
  129. autoOpen: false,
  130. height: 'auto',
  131. width: '70%',
  132. modal: true,
  133. buttons: {
  134. "DoneButton": {
  135. id:"doneBtn",
  136. text:"Create Quote",
  137. click:function() {
  138. var isValid = $("#quoteForm").valid();
  139. if (isValid){
  140. $.ajax({url:"index.php/procurement/createRFQ",
  141. type:"POST",
  142. data:{ quoteId:$("#quoteId").val(),
  143. supplierId:$("#supplierOp").val(),
  144. warehouseId:$("#warehouseOp").val(),
  145. reqdate:$("#reqdate").val(),
  146. notes:$("#desc").val()
  147. },
  148. success:function(response)
  149. {
  150. if ($("#quoteId").val()==""){
  151. console.log("if");
  152. if (response !='error'){
  153. $("#quoteId").val(response);
  154. $("#pkdheader").show();
  155. $("#doneBtn > span").text("Done");
  156. $("#lineItems").jqGrid({
  157. url:'index.php/procurement/populateQuoteItems',
  158. datatype: 'json',
  159. mtype: 'POST',
  160. postData:{quoteId: $("#quoteId").val()},
  161. colNames:['Product','Quantity','Need By Date','Expected Price','Estimated Value','Notes'],
  162. colModel :[
  163. {name:'name', index:'name',editable:false, width:80, align:'right'},
  164. {name:'quoted_quantity', index:'quoted_quantity', editable:true,width:140, align:'right'},
  165. {name:'needed_by_date',index:'needed_by_date',editable:true, width:80, align:'right'},
  166. {name:'expected_price',index:'expected_price',editable:true, width:80, align:'right'},
  167. {name:'estimated_value', index:'estimated_value',editable:false, width:80, align:'right'},
  168. {name:'comments', index:'comments',editable:true, width:180, align:'right'}
  169. ],
  170. pager: '#pagerPk',
  171. rowNum:10,
  172. rowList:[5,10,20],
  173. sortname: 'id',
  174. sortorder: 'desc',
  175. viewrecords: true,
  176. gridview: true,
  177. ignoreCase:true,
  178. rownumbers:true,
  179. height:'auto',
  180. width:680,
  181. caption: 'Line Items',
  182. jsonReader : {
  183. root:"quoteitemdata",
  184. page: "page",
  185. total: "total",
  186. records: "records",
  187. cell: "dprow",
  188. id: "id"
  189. },
  190. onSelectRow: function(id){if(id && id!==lastsel){
  191. myGridPkd.restoreRow(lastsel);
  192. myGridPkd.editRow(id,editparametersitems);
  193. lastsel=id;
  194. }
  195. },
  196. editurl:'index.php/procurement/modifyQuoteItem'
  197. }).navGrid("#pagerPk",{edit:false,add:false,del:true,search:false},{},{},{},{},{});
  198. $("#lineItems").jqGrid('navButtonAdd','#pagerPk',{
  199. caption:"",
  200. title:"Add Line Items",
  201. buttonicon:"ui-icon-plus",
  202. id:"add_lineItems",
  203. onClickButton : function () {
  204. //need to pass grid id for dynamic reload;
  205. $( "#dialog-form-item" ).data('grid_id','lineItems').dialog( "open" );
  206. }
  207. });
  208. $("#del_lineItems").insertAfter("#add_lineItems");
  209. }
  210. }
  211. else {
  212. console.log("else");
  213. $("#quoteId").val("");
  214. }
  215. } //end success of Ajax
  216. }) //end ajax
  217. if ($("#quoteId").val()!=""){
  218. $( this ).dialog( "close" );
  219. }
  220. } //end ifvalid
  221. }}, //end of Create button
  222. Cancel: function() {
  223. $.ajax({
  224. method:"POST",
  225. data:{id:$("#quoteId").val(),oper:'del'},
  226. url:'index.php/procurement/modifyQuote'
  227. })
  228. $("#quoteId").val("");
  229. $( this ).dialog( "close" );
  230. }
  231. },//end buttons
  232. close: function(event,ui) {
  233. //allFields.val( "" ).removeClass( "ui-state-error" );
  234. var noOfRec =myGridPkd.getGridParam("records");
  235. if (noOfRec<1){
  236. $.ajax({
  237. method:"POST",
  238. data:{id:$("#quoteId").val()},
  239. url:'index.php/procurement/closeValidate'
  240. })
  241. }
  242. $("#quoteForm").data('validator').resetForm();
  243. $("#quoteForm")[0].reset();
  244. myGridPkd.jqGrid("GridUnload");
  245. $("pkdheader").hide();
  246. $("#doneBtn > span").text("Create Quote");
  247. $("#quotes").trigger("reloadGrid");
  248. }
  249. });
  250. //Line Item Dialog
  251. $( "#dialog-form-item" ).dialog({
  252. autoOpen: false,
  253. height: 'auto',
  254. width: '40%',
  255. position:[350,25],
  256. modal: true,
  257. buttons: {
  258. "Add Item": function() {
  259. var isvalid = $("#itemForm").valid();
  260. var grid = $(this).data('grid_id');
  261. if (isvalid){
  262. $.ajax({
  263. url:"index.php/procurement/addQuoteItem",
  264. type:"POST",
  265. data:{
  266. quoteid:$("#quoteId").val(),
  267. productid:$("#productOp").val(),
  268. needeedByDate:$("#neededdate").val(),
  269. quantity:$("#quantity").val(),
  270. exprice:$("#exPrice").val(),
  271. descItem:$("#descItem").val()
  272. },
  273. success:function (response){
  274. // $("#lineItems").trigger("reloadGrid");
  275. console.log("grid " + grid);
  276. $("#"+grid).trigger("reloadGrid");
  277. }
  278. })
  279. $( this ).dialog( "close" );
  280. }
  281. },
  282. Cancel: function() {
  283. $( this ).dialog( "close" );
  284. }
  285. },
  286. close: function(event,ui) {
  287. //allFields.val( "" ).removeClass( "ui-state-error" );
  288. $("#itemForm").data('validator').resetForm();
  289. $('#itemForm')[0].reset();
  290. $("#estValue").text("");
  291. $("#curPrice").text("");
  292. }
  293. });
  294. // Main Request For Quotation Grid
  295. var myGrid = $("#quotes"),lastsel2;
  296. var editparameters = {
  297. "keys" : true,
  298. "oneditfunc" : quotegriddates,
  299. "successfunc" : function(){
  300. lastsel2=undefined;
  301. myGrid.trigger("reloadGrid");
  302. return true;
  303. },
  304. "aftersavefunc" : null,
  305. "errorfunc": function(){
  306. lastsel2=undefined;
  307. //myGrid.trigger("reloadGrid");
  308. },
  309. "afterrestorefunc" : null,
  310. "restoreAfterError" : true,
  311. "mtype" : "POST"
  312. };
  313. myGrid.jqGrid({
  314. url:'index.php/procurement/populateRFQ?status='+'open',
  315. datatype: 'json',
  316. mtype: 'GET',
  317. // postData:{status:'open'},
  318. colNames:['Actions','Reference','Supplier','Estimated Value',/*'Owner',*/'Status','Raised By','Owner','Needed By Date'],
  319. colModel :[
  320. {name:'act',index:'act',width:70,search:false,align:'center',sortable:false,formatter:'actions',
  321. formatoptions:{
  322. keys: true, // we want use [Enter] key to save the row and [Esc] to cancel editing.
  323. onEdit:quotegriddates,
  324. onSuccess:function(jqXHR) {
  325. myGrid.trigger("reloadGrid");
  326. return true;
  327. }
  328. }},
  329. {name:'reference', index:'reference', width:80, align:'right',editable:false},
  330. {name:'supplier_name', index:'supplier_name', width:140, align:'right',editable:true,edittype:"select",editoptions:{dataUrl:"index.php/procurement/populateSuppliers",buildSelect:function(response)
  331. {
  332. var select = "<select name=" + "mfrPkEdit" + "id =" +"mfrPkEdit" +">" +
  333. "<option value=" + ">Select one..." + response + "</select>";
  334. return select;
  335. }}},
  336. {name:'estimated_value', index:'estimated_value', width:100, align:'right',editable:false,editoptions:{size:"20",maxlength:"30"}},
  337. // {name:'owner', index:'owner', width:140, align:'right',editable:true,editoptions:{size:"20",maxlength:"30"}},
  338. {name:'status', index:'status', width:60, align:'right',editable:false,editoptions:{size:"20",maxlength:"30"}},
  339. {name:'raised_by_name', index:'raised_by_name',editable:false, width:80, align:'right'},
  340. {name:'owner_name', index:'owner_name',editable:false, width:80, align:'right'},
  341. {name:'needed_by_date', index:'needed_by_date',editable:true, width:120, sorttype:'date'}
  342. ],
  343. pager: '#pager',
  344. rowNum:10,
  345. rowList:[5,10,20],
  346. sortname: 'id',
  347. sortorder: 'desc',
  348. viewrecords: true,
  349. gridview: true,
  350. multiselect:true,
  351. ignoreCase:true,
  352. rownumbers:true,
  353. height:'auto',
  354. width:680,
  355. caption: 'Request For Quote',
  356. jsonReader : {
  357. root:"quotedata",
  358. page: "page",
  359. total: "total",
  360. records: "records",
  361. cell: "dprow",
  362. id: "id"
  363. },
  364. editurl:'index.php/procurement/modifyQuote',
  365. subGrid:true,
  366. subGridRowExpanded: function(subgrid_id, row_id) {
  367. // we pass two parameters
  368. // subgrid_id is a id of the div tag created whitin a table data
  369. // the id of this elemenet is a combination of the "sg_" + id of the row
  370. // the row_id is the id of the row
  371. // If we wan to pass additinal parameters to the url we can use
  372. // a method getRowData(row_id) - which returns associative array in type name-value
  373. // here we can easy construct the flowing
  374. var subgrid_table_id, pager_id;
  375. subgrid_table_id = subgrid_id+"_t";
  376. var editparametersitemssubgrid = {
  377. "keys" : true,
  378. "oneditfunc" : null,
  379. "successfunc" : function(){
  380. lastsel=undefined;
  381. myGrid.trigger("reloadGrid");
  382. //$("#"+subgrid_id).trigger("reloadGrid");
  383. return true;
  384. },
  385. "aftersavefunc" : null,
  386. "errorfunc": function(){
  387. lastsel=undefined;
  388. //myGrid.trigger("reloadGrid");
  389. },
  390. "afterrestorefunc" : null,
  391. "restoreAfterError" : true,
  392. "mtype" : "POST"
  393. };
  394. pager_id = "p_"+subgrid_table_id;
  395. $("#quoteId").val(row_id);
  396. $("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
  397. jQuery("#"+subgrid_table_id).jqGrid({
  398. url:'index.php/procurement/populateQuoteItems?q=2&quoteId='+row_id,
  399. datatype: 'json',
  400. colNames:['Product','Quantity','Need By Date','Unit Price','Estimated Value','Notes'],
  401. colModel :[
  402. {name:'name', index:'name',editable:false, width:120, align:'right'},
  403. {name:'quoted_quantity', index:'quoted_quantity', editable:true,width:50, align:'right'},
  404. {name:'needed_by_date',index:'needed_by_date',editable:true, width:80, align:'right'},
  405. {name:'expected_price',index:'expected_price',editable:true, width:50, align:'right'},
  406. {name:'estimated_value', index:'estimated_value',editable:false, width:60, align:'right'},
  407. {name:'comments', index:'comments',editable:true, width:180, align:'right'}
  408. ],
  409. rowNum:20,
  410. pager: pager_id,
  411. sortname: 'id',
  412. sortorder: "asc",
  413. height: '100%',
  414. jsonReader : {
  415. root:"quoteitemdata",
  416. page: "page",
  417. total: "total",
  418. records: "records",
  419. cell: "dprow",
  420. id: "id"
  421. },
  422. editurl:'index.php/procurement/modifyQuoteItem',
  423. onSelectRow: function(id){if(id && id!==lastsel){
  424. $("#"+subgrid_table_id).restoreRow(lastsel);
  425. $("#"+subgrid_table_id).editRow(id,editparametersitemssubgrid);
  426. lastsel=id;
  427. }
  428. }
  429. });
  430. jQuery("#"+subgrid_table_id).jqGrid('navGrid',"#"+pager_id,{edit:false,add:false,del:true,search:false});
  431. jQuery("#"+subgrid_table_id).jqGrid('navButtonAdd',"#"+pager_id,{
  432. caption:"",
  433. title:"Add Line Items",
  434. buttonicon:"ui-icon-plus",
  435. id:"add_lineItems",
  436. onClickButton : function () {
  437. //pass the grid id to dialog very important
  438. $( "#dialog-form-item" ).data('grid_id',subgrid_table_id).dialog( "open" );
  439. }
  440. });
  441. },
  442. subGridRowColapsed: function(subgrid_id, row_id) {
  443. // this function is called before removing the data
  444. //var subgrid_table_id;
  445. //subgrid_table_id = subgrid_id+"_t";
  446. //jQuery("#"+subgrid_table_id).remove();
  447. $("#quoteId").val("");
  448. }
  449. }).navGrid("#pager",{edit:false,add:false,del:true,search:false},{height:280,reloadAfterSubmit:false,closeAfterEdit:true,recreateForm:true,checkOnSubmit:true},{},{},{},{});
  450. myGrid.jqGrid('navButtonAdd','#pager',{
  451. caption:"",
  452. title:"Create Product",
  453. buttonicon:"ui-icon-plus",
  454. id:"add_quotes",
  455. onClickButton : function () {
  456. $( "#dialog-form" ).dialog( "open" );
  457. }
  458. });
  459. myGrid.jqGrid('navButtonAdd','#pager',{
  460. caption:"",
  461. title:"Generate Purchase Order",
  462. buttonicon:"ui-icon-cart",
  463. id:"po_quotes",
  464. onClickButton : function () {
  465. var selectedRows = myGrid.jqGrid('getGridParam', 'selarrrow');
  466. var noOfRows = selectedRows.length;
  467. var error = false;
  468. if (noOfRows == 0){
  469. $( "#dialog-modal-warning" ).dialog("open");
  470. }
  471. else{
  472. $.each(selectedRows, function(index,value){
  473. var val = myGrid.getCell(value,'estimated_value');
  474. if (val ==0){
  475. $("#refIds").text(myGrid.getCell(value,'reference')+" ")
  476. error=true;
  477. }
  478. })
  479. if (error){
  480. $( "#dialog-modal" ).dialog("open");
  481. }
  482. else{
  483. var rowid = myGrid.jqGrid('getGridParam', 'selarrrow');
  484. $.ajax({
  485. method:"POST",
  486. url:"index.php/procurement/generatePOFromRFQ",
  487. data: {ids : rowid},
  488. success: function(){
  489. myGrid.trigger("reloadGrid");
  490. showSuccessMessage("success");
  491. }
  492. })
  493. }
  494. }
  495. //
  496. }
  497. });
  498. myGrid.jqGrid('navButtonAdd','#pager',{
  499. caption:"",
  500. title:"Submit for Approval",
  501. buttonicon:"ui-icon-flag",
  502. id:"approve_quotes",
  503. onClickButton : function () {
  504. var rowid = myGrid.jqGrid('getGridParam', 'selarrrow');
  505. $.ajax({
  506. method:"POST",
  507. url:"index.php/procurement/submitForApproval",
  508. data: {ids : rowid},
  509. success: function(){
  510. myGrid.trigger("reloadGrid");
  511. showSuccessMessage("success");
  512. }
  513. })
  514. }
  515. });
  516. myGrid.jqGrid('filterToolbar', {stringResult: true, searchOnEnter: true, defaultSearch : "cn"});
  517. $("#del_quotes").insertAfter("#add_quotes");
  518. $( "#dialog-modal" ).dialog({
  519. autoOpen:false,
  520. height: 140,
  521. modal: true
  522. });
  523. $( "#dialog-modal-warning" ).dialog({
  524. autoOpen:false,
  525. height: 80,
  526. modal: true
  527. });
  528. });
  529. </script>
  530. </head>
  531. <body>
  532. <?php $this->load->view("common/menubar"); ?>
  533. <div id="dialog-modal" title="Error">
  534. <p>Reference Number(s) <span id="refIds" style="font-weight:bold;"></span> Does Not Have Estimated Value. Please Check The Quantity Or Price Of Line Items</p>
  535. </div>
  536. <div id="dialog-modal-warning" title="Warning">
  537. <p>Please Select At Least A Row</p>
  538. </div>
  539. <div id ="dialog-form">
  540. <h1 id="formHeader">Create Request For Quotation</h1>
  541. <form id="quoteForm">
  542. <fieldset>
  543. <div class="row">
  544. <div class="column">
  545. <div class="field">
  546. <label for="supplierOp">Supplier:</label>
  547. <select name="supplierOp" id ="supplierOp" class="required">
  548. <option value="">Choose
  549. <?= $supplierOptions ?>
  550. </select>
  551. </div>
  552. </div>
  553. <div class="column">
  554. <div class="field">
  555. <label for="warehouseOp">Warehouse:</label>
  556. <select name="warehouseOp" id ="warehouseOp">
  557. <option value="">Choose
  558. <?= $warehouseOptions ?>
  559. </select>
  560. </div>
  561. </div>
  562. <div class="column" style="width:35em;">
  563. <div class="field">
  564. <label for="reqdate">Request By Date:</label>
  565. <input id="reqdate" name ="reqdate" type="text" class="dateValidate"/>
  566. </div>
  567. </div>
  568. </div>
  569. <div class="row">
  570. <div class="column extra-wide">
  571. <div class="field">
  572. <label for="desc">Notes:</label>
  573. <textarea id="desc" name ="desc" rows="4" cols="120"></textarea>
  574. </div>
  575. </div>
  576. </div>
  577. <input id="quoteId" name ="quoteId" type="hidden" value=""/>
  578. </fieldset>
  579. </form>
  580. <div class="table-grid">
  581. <h1 id="pkdheader" style="display:none">Add Line Items</h1>
  582. <table id="lineItems"><tr><td/></tr></table>
  583. <div id="pagerPk"></div>
  584. </div>
  585. </div>
  586. <div id ="dialog-form-item">
  587. <h1 id="formHeader">Add New Line Item</h1>
  588. <form id="itemForm">
  589. <fieldset>
  590. <div class="row single-column-row">
  591. <div class="column quote-column single-column">
  592. <div class="field">
  593. <label for="productOp">Products:</label>
  594. <select name="productOp" id ="productOp" class="required">
  595. <option value="">Choose
  596. <?= $productOptions ?>
  597. </select>
  598. </div>
  599. </div>
  600. </div>
  601. <div class="row single-column-row">
  602. <div class="column quote-column single-column">
  603. <div class="field">
  604. <label for="neededdate">Needed By Date:</label>
  605. <input id="neededdate" name ="neededdate" type="text"/>
  606. </div>
  607. </div>
  608. </div>
  609. <div class="row single-column-row">
  610. <div class="column quote-column single-column">
  611. <div class="field">
  612. <label for="quantity">Quantity:</label>
  613. <input id="quantity" name="quantity" class="calinput"/>
  614. </div>
  615. </div>
  616. </div>
  617. <div class="row single-column-row">
  618. <div class="column quote-column single-column">
  619. <div class="field">
  620. <label for="exPrice">Expected Price:</label>
  621. <input id="exPrice" name="exPrice" class="calinput"/>
  622. </div>
  623. <div class="field">
  624. <label style="width:100%;" id="curPrice" name="curPrice" class="calculated"/>
  625. </div>
  626. </div>
  627. </div>
  628. <div class="row single-column-row">
  629. <div class="column quote-column single-column">
  630. <div class="field">
  631. <label for="estValue">Estimated Value:</label>
  632. <label id="estValue" name="estValue" class="calculated"/>
  633. </div>
  634. </div>
  635. </div>
  636. <div class="row single-column-row">
  637. <div class="column quote-column single-column">
  638. <div class="field">
  639. <label for="descItem">Notes:</label>
  640. <input id="descItem" name="descItem" size="40" maxlength="60"/>
  641. </div>
  642. </div>
  643. </div>
  644. </fieldset>
  645. </form>
  646. </div>
  647. <div style="display: block;height: 100%;" class="shopifine-ui-dialog ui-widget ui-widget-content ui-corner-all" tabindex="-1" role="dialog" aria-labelledby="ui-dialog-title-dialog-form">
  648. <?php $this->load->view("common/message"); ?>
  649. <div class="table-grid">
  650. <h1 id="table header">Request For Quotations</h1>
  651. <table id="quotes"><tr><td/></tr></table>
  652. <div id="pager"></div>
  653. </div>
  654. </div>
  655. <?php $this->load->view("partial/footer"); ?>
  656. </body>
  657. </html>
  658. <script>
  659. $(".calinput").change(function(){
  660. var exprice =$("#quantity").val()*$("#exPrice").val();
  661. $("#estValue").text(exprice);
  662. });
  663. </script>