Sign In
Sign Up
Search is temporarily disabled. See
ticket
for more info.
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
List overview
Download
webzash-developers
March 2011
----- 2024 -----
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
webzash-developers@lists.fedorahosted.org
1 participants
1 discussions
Start a n
N
ew thread
47 commits - db-update.txt system/application
by pshah
16 Mar '11
16 Mar '11
db-update.txt | 54 system/application/assets/css/custom.css | 6 system/application/assets/css/tables.css | 27 system/application/controllers/admin/create.php | 2 system/application/controllers/admin/schema.sql | 47 system/application/controllers/inventory/account.php | 24 system/application/controllers/inventory/stockgroup.php | 302 + system/application/controllers/inventory/stockitem.php | 434 ++ system/application/controllers/inventory/stocktransfer.php | 1175 +++++++ system/application/controllers/inventory/stockunit.php | 292 + system/application/controllers/inventory/stockvoucher.php | 1550 ++++++++++ system/application/controllers/inventory/welcome.php | 18 system/application/controllers/ledger.php | 96 system/application/controllers/setting/cf.php | 2 system/application/controllers/setting/vouchertypes.php | 35 system/application/controllers/voucher.php | 61 system/application/controllers/welcome.php | 39 system/application/helpers/MY_form_helper.php | 44 system/application/helpers/access_helper.php | 57 system/application/helpers/custom_helper.php | 10 system/application/libraries/Accountlist.php | 4 system/application/libraries/General.php | 5 system/application/libraries/MY_Form_validation.php | 36 system/application/libraries/Startup.php | 2 system/application/libraries/Stockstree.php | 139 system/application/models/ledger_model.php | 86 system/application/models/stock_group_model.php | 37 system/application/models/stock_item_model.php | 116 system/application/models/stock_unit_model.php | 21 system/application/views/admin/create.php | 8 system/application/views/group/add.php | 2 system/application/views/group/edit.php | 2 system/application/views/inventory/account/index.php | 28 system/application/views/inventory/stockgroup/add.php | 22 system/application/views/inventory/stockgroup/edit.php | 22 system/application/views/inventory/stockitem/add.php | 97 system/application/views/inventory/stockitem/edit.php | 97 system/application/views/inventory/stocktransfer/add.php | 401 ++ system/application/views/inventory/stocktransfer/downloadpreview.php | 125 system/application/views/inventory/stocktransfer/edit.php | 401 ++ system/application/views/inventory/stocktransfer/email.php | 54 system/application/views/inventory/stocktransfer/emailpreview.php | 70 system/application/views/inventory/stocktransfer/printpreview.php | 74 system/application/views/inventory/stocktransfer/view.php | 71 system/application/views/inventory/stockunit/add.php | 31 system/application/views/inventory/stockunit/edit.php | 31 system/application/views/inventory/stockvoucher/add.php | 473 +++ system/application/views/inventory/stockvoucher/downloadpreview.php | 166 + system/application/views/inventory/stockvoucher/edit.php | 473 +++ system/application/views/inventory/stockvoucher/email.php | 54 system/application/views/inventory/stockvoucher/emailpreview.php | 107 system/application/views/inventory/stockvoucher/printpreview.php | 115 system/application/views/inventory/stockvoucher/view.php | 119 system/application/views/ledger/add.php | 36 system/application/views/ledger/edit.php | 35 system/application/views/report/balancesheet.php | 4 system/application/views/report/trialbalance.php | 2 system/application/views/setting/vouchertypes/add.php | 43 system/application/views/setting/vouchertypes/edit.php | 23 system/application/views/template.php | 3 system/application/views/voucher/add.php | 2 system/application/views/voucher/downloadpreview.php | 2 system/application/views/voucher/edit.php | 2 system/application/views/voucher/emailpreview.php | 2 system/application/views/voucher/index.php | 38 system/application/views/voucher/printpreview.php | 2 system/application/views/voucher/view.php | 6 system/application/views/welcome.php | 2 68 files changed, 7863 insertions(+), 103 deletions(-) New commits: commit bea2661db18740953573897de86ef46ece13893f Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Mar 16 19:35:41 2011 +0530 Changed A/C to Account Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/libraries/Accountlist.php b/system/application/libraries/Accountlist.php index bd53cec..b7b2acf 100644 --- a/system/application/libraries/Accountlist.php +++ b/system/application/libraries/Accountlist.php @@ -124,7 +124,7 @@ class Accountlist else echo " " . $this->name; echo "</td>"; - echo "<td>Group A/C</td>"; + echo "<td>Group</td>"; echo "<td>-</td>"; echo "<td>-</td>"; @@ -153,7 +153,7 @@ class Accountlist echo $this->print_space($this->counter); echo " " . anchor('report/ledgerst/' . $data['id'], $data['name'], array('title' => $data['name'] . ' Ledger Statement', 'style' => 'color:#000000')); echo "</td>"; - echo "<td>Ledger A/C</td>"; + echo "<td>Ledger</td>"; echo "<td>" . convert_opening($data['opbalance'], $data['optype']) . "</td>"; echo "<td>" . convert_amount_dc($data['total']) . "</td>"; echo "<td class=\"td-actions\">" . anchor('ledger/edit/' . $data['id'], 'Edit', array('title' => "Edit Ledger", 'class' => 'red-link')); diff --git a/system/application/views/group/add.php b/system/application/views/group/add.php index e6a91b9..c6584dc 100644 --- a/system/application/views/group/add.php +++ b/system/application/views/group/add.php @@ -30,7 +30,7 @@ $(document).ready(function() { echo "<span id=\"tooltip-target-1\">"; echo form_checkbox('affects_gross', 1, $affects_gross) . " Affects Gross Profit/Loss Calculations"; echo "</span>"; - echo "<span id=\"tooltip-content-1\">If selected the Group A/C will affect Gross Profit and Loss calculations, otherwise it will affect only Net Profit and Loss calculations.</span>"; + echo "<span id=\"tooltip-content-1\">If selected the Group Account will affect Gross Profit and Loss calculations, otherwise it will affect only Net Profit and Loss calculations.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/group/edit.php b/system/application/views/group/edit.php index a5aac01..6b88c85 100644 --- a/system/application/views/group/edit.php +++ b/system/application/views/group/edit.php @@ -30,7 +30,7 @@ $(document).ready(function() { echo "<span id=\"tooltip-target-1\">"; echo form_checkbox('affects_gross', 1, $affects_gross) . " Affects Gross Profit/Loss Calculations"; echo "</span>"; - echo "<span id=\"tooltip-content-1\">If selected the Group A/C will affect Gross Profit and Loss calculations, otherwise it will affect only Net Profit and Loss calculations.</span>"; + echo "<span id=\"tooltip-content-1\">If selected the Group Account will affect Gross Profit and Loss calculations, otherwise it will affect only Net Profit and Loss calculations.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index bd77279..0926e66 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -310,7 +310,7 @@ $(document).ready(function() { echo "<table border=0 cellpadding=2>"; echo "<tr>"; echo "<td align=\"right\">"; - echo form_label('Purchase Ledger A/C', 'main_account'); + echo form_label('Purchase Ledger', 'main_account'); echo "</td>"; echo "<td>"; echo form_input_ledger('main_account', $main_account_active, '', $type = 'purchase'); @@ -332,7 +332,7 @@ $(document).ready(function() { echo "<table border=0 cellpadding=2>"; echo "<tr>"; echo "<td align=\"right\">"; - echo form_label('Sales Ledger A/C', 'main_account'); + echo form_label('Sales Ledger', 'main_account'); echo "</td>"; echo "<td>"; echo form_input_ledger('main_account', $main_account_active, '', $type = 'sale'); @@ -411,7 +411,7 @@ $(document).ready(function() { echo "<br />"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Type</th><th>Ledger Account</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($ledger_dc as $i => $ledger) { diff --git a/system/application/views/inventory/stockvoucher/downloadpreview.php b/system/application/views/inventory/stockvoucher/downloadpreview.php index 31987c0..2ce3e19 100644 --- a/system/application/views/inventory/stockvoucher/downloadpreview.php +++ b/system/application/views/inventory/stockvoucher/downloadpreview.php @@ -74,9 +74,9 @@ <td align=\"right\"> <?php if ($current_voucher_type['stock_voucher_type'] == '1') - echo "Purchase Ledger A/C :"; + echo "Purchase Ledger :"; else - echo "Sale Ledger A/C :"; + echo "Sale Ledger :"; ?> </td> <td class="last-item"> @@ -130,7 +130,7 @@ <table class="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th>><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger Account</th>><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/inventory/stockvoucher/edit.php b/system/application/views/inventory/stockvoucher/edit.php index d58d6c3..3650f5c 100644 --- a/system/application/views/inventory/stockvoucher/edit.php +++ b/system/application/views/inventory/stockvoucher/edit.php @@ -310,7 +310,7 @@ $(document).ready(function() { echo "<table border=0 cellpadding=2>"; echo "<tr>"; echo "<td align=\"right\">"; - echo form_label('Purchase Ledger A/C', 'main_account'); + echo form_label('Purchase Ledger', 'main_account'); echo "</td>"; echo "<td>"; echo form_input_ledger('main_account', $main_account_active, '', $type = 'purchase'); @@ -332,7 +332,7 @@ $(document).ready(function() { echo "<table border=0 cellpadding=2>"; echo "<tr>"; echo "<td align=\"right\">"; - echo form_label('Sales Ledger A/C', 'main_account'); + echo form_label('Sales Ledger', 'main_account'); echo "</td>"; echo "<td>"; echo form_input_ledger('main_account', $main_account_active, '', $type = 'sale'); @@ -411,7 +411,7 @@ $(document).ready(function() { echo "<br />"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Type</th><th>Ledger Account</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($ledger_dc as $i => $ledger) { diff --git a/system/application/views/inventory/stockvoucher/emailpreview.php b/system/application/views/inventory/stockvoucher/emailpreview.php index e256c94..3424536 100644 --- a/system/application/views/inventory/stockvoucher/emailpreview.php +++ b/system/application/views/inventory/stockvoucher/emailpreview.php @@ -15,9 +15,9 @@ <td align=\"right\"> <?php if ($current_voucher_type['stock_voucher_type'] == '1') - echo "Purchase Ledger A/C :"; + echo "Purchase Ledger :"; else - echo "Sale Ledger A/C :"; + echo "Sale Ledger :"; ?> </td> <td> @@ -71,7 +71,7 @@ <table border=1 cellpadding=6> <thead> - <tr><th align="left">Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr><th align="left">Ledger Account</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/inventory/stockvoucher/printpreview.php b/system/application/views/inventory/stockvoucher/printpreview.php index cdb545d..0d30975 100644 --- a/system/application/views/inventory/stockvoucher/printpreview.php +++ b/system/application/views/inventory/stockvoucher/printpreview.php @@ -20,9 +20,9 @@ <td align=\"right\"> <?php if ($current_voucher_type['stock_voucher_type'] == '1') - echo "Purchase Ledger A/C"; + echo "Purchase Ledger"; else - echo "Sale Ledger A/C"; + echo "Sale Ledger"; ?> </td> <td> @@ -76,7 +76,7 @@ <table id="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger Account</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/inventory/stockvoucher/view.php b/system/application/views/inventory/stockvoucher/view.php index b46092d..665a06e 100644 --- a/system/application/views/inventory/stockvoucher/view.php +++ b/system/application/views/inventory/stockvoucher/view.php @@ -8,9 +8,9 @@ Voucher Date : <span class="bold"><?php echo date_mysql_to_php_display($cur_vouc <td align=\"right\"> <?php if ($current_voucher_type['stock_voucher_type'] == '1') - echo "Purchase Ledger A/C :"; + echo "Purchase Ledger :"; else - echo "Sale Ledger A/C :"; + echo "Sale Ledger :"; ?> </td> <td> @@ -60,7 +60,7 @@ foreach ($cur_voucher_stock_items->result() as $row) <br /> <table border=0 cellpadding=5 class="simple-table voucher-view-table"> -<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> +<thead><tr><th>Type</th><th>Ledger Account</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> <?php foreach ($cur_voucher_ledgers->result() as $row) { diff --git a/system/application/views/ledger/add.php b/system/application/views/ledger/add.php index bd1fa38..be7d10b 100644 --- a/system/application/views/ledger/add.php +++ b/system/application/views/ledger/add.php @@ -55,7 +55,7 @@ $(document).ready(function() { echo "<span id=\"tooltip-target-2\">"; echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank, 'id="ledger_type_cashbank"') . " Bank or Cash Account"; echo "</span>"; - echo "<span id=\"tooltip-content-2\">Select if Ledger A/C is a Bank A/C or a Cash A/C.</span>"; + echo "<span id=\"tooltip-content-2\">Select if Ledger Account is of type Bank or Cash Account.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/ledger/edit.php b/system/application/views/ledger/edit.php index abf2e49..8ad4cfd 100644 --- a/system/application/views/ledger/edit.php +++ b/system/application/views/ledger/edit.php @@ -54,7 +54,7 @@ $(document).ready(function() { echo "<span id=\"tooltip-target-2\">"; echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank, 'id="ledger_type_cashbank"') . " Bank or Cash Account"; echo "</span>"; - echo "<span id=\"tooltip-content-2\">Select if Ledger A/C is a Bank A/C or a Cash A/C.</span>"; + echo "<span id=\"tooltip-content-2\">Select if Ledger Account is of type Bank or Cash Account.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/report/balancesheet.php b/system/application/views/report/balancesheet.php index a2fa868..ce19d41 100644 --- a/system/application/views/report/balancesheet.php +++ b/system/application/views/report/balancesheet.php @@ -57,7 +57,7 @@ { $total += $pandl; echo "<tr valign=\"top\">"; - echo "<td class=\"bold\">Profit & Loss A/C (Net Profit)</td>"; + echo "<td class=\"bold\">Profit & Loss Account (Net Profit)</td>"; echo "<td align=\"right\" class=\"bold\">" . convert_cur($pandl) . "</td>"; echo "</tr>"; } else { @@ -116,7 +116,7 @@ } else { $total += -$pandl; echo "<tr valign=\"top\">"; - echo "<td class=\"bold\">Profit & Loss A/C (Net Loss)</td>"; + echo "<td class=\"bold\">Profit & Loss Account (Net Loss)</td>"; echo "<td align=\"right\" class=\"bold\">" . convert_cur(-$pandl) . "</td>"; echo "</tr>"; } diff --git a/system/application/views/report/trialbalance.php b/system/application/views/report/trialbalance.php index 5fe7878..438096f 100644 --- a/system/application/views/report/trialbalance.php +++ b/system/application/views/report/trialbalance.php @@ -3,7 +3,7 @@ $temp_cr_total = 0; echo "<table border=0 cellpadding=5 class=\"simple-table trial-balance-table\">"; - echo "<thead><tr><th>Ledger A/C</th><th>O/P Balance</th><th>C/L Balance</th><th>Dr Total</th><th>Cr Total</th></tr></thead>"; + echo "<thead><tr><th>Ledger Account</th><th>O/P Balance</th><th>C/L Balance</th><th>Dr Total</th><th>Cr Total</th></tr></thead>"; $this->load->model('Ledger_model'); $all_ledgers = $this->Ledger_model->get_all_ledgers(); $odd_even = "odd"; diff --git a/system/application/views/voucher/add.php b/system/application/views/voucher/add.php index 06d2b97..8e9109a 100644 --- a/system/application/views/voucher/add.php +++ b/system/application/views/voucher/add.php @@ -213,7 +213,7 @@ $(document).ready(function() { echo "</p>"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Type</th><th>Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($ledger_dc as $i => $ledger) { diff --git a/system/application/views/voucher/downloadpreview.php b/system/application/views/voucher/downloadpreview.php index 61b3f52..7a8bd40 100644 --- a/system/application/views/voucher/downloadpreview.php +++ b/system/application/views/voucher/downloadpreview.php @@ -70,7 +70,7 @@ <br /> <table id="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/voucher/edit.php b/system/application/views/voucher/edit.php index 3eb7b60..4bddf0f 100644 --- a/system/application/views/voucher/edit.php +++ b/system/application/views/voucher/edit.php @@ -210,7 +210,7 @@ $(document).ready(function() { echo "</p>"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th><th colspan=2>Actions</th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Type</th><th>Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th><th colspan=2>Actions</th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($ledger_dc as $i => $ledger) { diff --git a/system/application/views/voucher/emailpreview.php b/system/application/views/voucher/emailpreview.php index 0b0febd..e694213 100644 --- a/system/application/views/voucher/emailpreview.php +++ b/system/application/views/voucher/emailpreview.php @@ -11,7 +11,7 @@ <p><?php echo $current_voucher_type['name']; ?> Voucher Date : <strong><?php echo $voucher_date; ?></strong></p> <table border=1 cellpadding=6> <thead> - <tr><th align="left">Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr><th align="left">Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/voucher/index.php b/system/application/views/voucher/index.php index 1e064c1..099d362 100644 --- a/system/application/views/voucher/index.php +++ b/system/application/views/voucher/index.php @@ -4,15 +4,7 @@ <table border=0 cellpadding=5 class="simple-table"> <thead> - <tr> - <th>Date</th> - <th>No</th> - <th>Ledger A/C</th> - <th>Type</th> - <th>DR Amount</th> - <th>CR Amount</th> - <th></th> - </tr> + <tr><th>Date</th><th>No.</th><th>Ledger Account</th><th>Type</th><th>DR Amount</th><th>CR Amount</th><th></th></tr> </thead> <tbody> <?php diff --git a/system/application/views/voucher/printpreview.php b/system/application/views/voucher/printpreview.php index 2d8f4a6..3c1a554 100644 --- a/system/application/views/voucher/printpreview.php +++ b/system/application/views/voucher/printpreview.php @@ -16,7 +16,7 @@ <br /> <table id="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php diff --git a/system/application/views/voucher/view.php b/system/application/views/voucher/view.php index 15e3f7d..c7cd107 100644 --- a/system/application/views/voucher/view.php +++ b/system/application/views/voucher/view.php @@ -4,7 +4,7 @@ Voucher Date : <span class="bold"><?php echo date_mysql_to_php_display($cur_vouc </p> <table border=0 cellpadding=5 class="simple-table voucher-view-table"> -<thead><tr><th>Type</th><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> +<thead><tr><th>Type</th><th>Ledger Account</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> <?php $odd_even = "odd"; foreach ($cur_voucher_ledgers->result() as $row) diff --git a/system/application/views/welcome.php b/system/application/views/welcome.php index 6198805..0955ef5 100644 --- a/system/application/views/welcome.php +++ b/system/application/views/welcome.php @@ -103,7 +103,7 @@ jQuery(document).ready(function () { </div> <div class="clear"></div> <div id="dashboard-cash-bank" class="dashboard-item"> - <div class="dashboard-title">Bank and Cash A/C's</div> + <div class="dashboard-title">Bank and Cash Accounts</div> <div class="dashboard-content"> <?php if ($bank_cash_account) commit ba46e68f4f1c2e2614c16dbabf838ad0b8bb4f60 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Mon Mar 14 22:32:02 2011 +0530 Updated stock transfer - Show the rate of item value on first load - View stock transfer shows correct source and destination Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index bf462b9..458ad56 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -49,13 +49,13 @@ class StockTransfer extends Controller { } /* Load current stock items details */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); $cur_voucher_source_stock_items = $this->db->get(); if ($cur_voucher_source_stock_items->num_rows() < 1) { $this->messages->add('Voucher has no associated source stock items.', 'error'); } - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); $cur_voucher_dest_stock_items = $this->db->get(); if ($cur_voucher_dest_stock_items->num_rows() < 1) { diff --git a/system/application/views/inventory/stocktransfer/add.php b/system/application/views/inventory/stocktransfer/add.php index cd31321..2c836f8 100644 --- a/system/application/views/inventory/stocktransfer/add.php +++ b/system/application/views/inventory/stocktransfer/add.php @@ -2,6 +2,8 @@ $(document).ready(function() { + var firstTime = true; + /************************ SOURCE STOCK ITEM ***************************/ /* Stock Item dropdown changed */ $('.stock-item-dropdown').live('change', function() { @@ -30,18 +32,20 @@ $(document).ready(function() { } }); - $.ajax({ - url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, - success: function(data) { - var sell_price = parseFloat(data); - if (isNaN(sell_price)) - sell_price = 0; - if (sell_price <= 0) - rowid.parent().next().next().children().val(""); - else - rowid.parent().next().next().children().val(sell_price); - } - }); + if (!firstTime) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } } else { rowid.parent().next().next().next().next().next().next().children().text(""); } @@ -155,18 +159,20 @@ $(document).ready(function() { } }); - $.ajax({ - url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, - success: function(data) { - var sell_price = parseFloat(data); - if (isNaN(sell_price)) - sell_price = 0; - if (sell_price <= 0) - rowid.parent().next().next().children().val(""); - else - rowid.parent().next().next().children().val(sell_price); - } - }); + if (!firstTime) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } } else { rowid.parent().next().next().next().next().next().next().children().text(""); } @@ -253,6 +259,7 @@ $(document).ready(function() { $('.stock-item-dropdown').trigger('change'); $('table td .dest-recalculate').trigger('click'); $('table td .source-recalculate').trigger('click'); + firstTime = false; }); </script> diff --git a/system/application/views/inventory/stocktransfer/edit.php b/system/application/views/inventory/stocktransfer/edit.php index 32586d4..ba7ee0c 100644 --- a/system/application/views/inventory/stocktransfer/edit.php +++ b/system/application/views/inventory/stocktransfer/edit.php @@ -2,6 +2,8 @@ $(document).ready(function() { + var firstTime = true; + /************************ SOURCE STOCK ITEM ***************************/ /* Stock Item dropdown changed */ $('.stock-item-dropdown').live('change', function() { @@ -30,18 +32,20 @@ $(document).ready(function() { } }); - $.ajax({ - url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, - success: function(data) { - var sell_price = parseFloat(data); - if (isNaN(sell_price)) - sell_price = 0; - if (sell_price <= 0) - rowid.parent().next().next().children().val(""); - else - rowid.parent().next().next().children().val(sell_price); - } - }); + if (!firstTime) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } } else { rowid.parent().next().next().next().next().next().next().children().text(""); } @@ -155,18 +159,20 @@ $(document).ready(function() { } }); - $.ajax({ - url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, - success: function(data) { - var sell_price = parseFloat(data); - if (isNaN(sell_price)) - sell_price = 0; - if (sell_price <= 0) - rowid.parent().next().next().children().val(""); - else - rowid.parent().next().next().children().val(sell_price); - } - }); + if (!firstTime) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } } else { rowid.parent().next().next().next().next().next().next().children().text(""); } @@ -253,6 +259,7 @@ $(document).ready(function() { $('.stock-item-dropdown').trigger('change'); $('table td .dest-recalculate').trigger('click'); $('table td .source-recalculate').trigger('click'); + firstTime = false; }); </script> commit 236d7baf0609797ec86d1fb4f14a9f5882dad637 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Mar 13 22:33:52 2011 +0530 Added edit stock transfer Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index 6455c42..bf462b9 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -467,7 +467,7 @@ class StockTransfer extends Controller { return; } - /* Form fields - Voucher */ + /* Form fields */ $data['voucher_number'] = array( 'name' => 'voucher_number', 'id' => 'voucher_number', @@ -489,70 +489,52 @@ class StockTransfer extends Controller { 'rows' => '4', 'value' => $cur_voucher->narration, ); + $data['voucher_id'] = $voucher_id; - $data['main_account_active'] = 0; - $data['main_entity_active'] = 0; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; $data['voucher_tag'] = $cur_voucher->tag_id; $data['voucher_tags'] = $this->Tag_model->get_all_tags(); - $data['has_reconciliation'] = FALSE; /* Load current ledger details if not $_POST */ if ( ! $_POST) { - /* main - account */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1); - $cur_main_account_q = $this->db->get(); - $cur_main_account = $cur_main_account_q->row(); - $data['main_account_active'] = $cur_main_account->ledger_id; - - /* main - entity */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2); - $cur_main_entity_q = $this->db->get(); - $cur_main_entity = $cur_main_entity_q->row(); - $data['main_entity_active'] = $cur_main_entity->ledger_id; - - /* ledgers */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3); - $cur_ledgers_q = $this->db->get(); + /* source stock items */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2); + $cur_stock_item_q = $this->db->get(); $counter = 0; - foreach ($cur_ledgers_q->result() as $row) + foreach ($cur_stock_item_q->result() as $row) { - $data['ledger_dc'][$counter] = $row->dc; - $data['ledger_id'][$counter] = $row->ledger_id; - $data['rate_item'][$counter] = $row->stock_rate; - $data['amount_item'][$counter] = $row->amount; - if ($row->reconciliation_date) - $data['has_reconciliation'] = TRUE; + $data['source_stock_item_id'][$counter] = $row->stock_item_id; + $data['source_stock_item_quantity'][$counter] = $row->quantity; + $data['source_stock_item_rate_per_unit'][$counter] = $row->rate_per_unit; + $data['source_stock_item_amount'][$counter] = $row->total; $counter++; } /* one extra rows */ - $data['ledger_dc'][$counter] = 'D'; - $data['ledger_id'][$counter] = 0; - $data['rate_item'][$counter] = ""; - $data['amount_item'][$counter] = ""; + $data['source_stock_item_id'][$counter] = '0'; + $data['source_stock_item_quantity'][$counter] = ""; + $data['source_stock_item_rate_per_unit'][$counter] = ""; + $data['source_stock_item_amount'][$counter] = ""; $counter++; - /* stock items */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id); + /* destination stock items */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1); $cur_stock_item_q = $this->db->get(); $counter = 0; foreach ($cur_stock_item_q->result() as $row) { - $data['stock_item_id'][$counter] = $row->stock_item_id; - $data['stock_item_quantity'][$counter] = $row->quantity; - $data['stock_item_rate_per_unit'][$counter] = $row->rate_per_unit; - $data['stock_item_discount'][$counter] = $row->discount; - $data['stock_item_amount'][$counter] = $row->total; + $data['dest_stock_item_id'][$counter] = $row->stock_item_id; + $data['dest_stock_item_quantity'][$counter] = $row->quantity; + $data['dest_stock_item_rate_per_unit'][$counter] = $row->rate_per_unit; + $data['dest_stock_item_amount'][$counter] = $row->total; $counter++; } /* one extra rows */ - $data['stock_item_id'][$counter] = '0'; - $data['stock_item_quantity'][$counter] = ""; - $data['stock_item_rate_per_unit'][$counter] = ""; - $data['stock_item_discount'][$counter] = ""; - $data['stock_item_amount'][$counter] = ""; + $data['dest_stock_item_id'][$counter] = '0'; + $data['dest_stock_item_quantity'][$counter] = ""; + $data['dest_stock_item_rate_per_unit'][$counter] = ""; + $data['dest_stock_item_amount'][$counter] = ""; $counter++; } @@ -562,31 +544,24 @@ class StockTransfer extends Controller { else $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->form_validation->set_rules('main_account', 'Purchase Ledger A/C', 'trim|required'); - $this->form_validation->set_rules('main_entity', 'Creditors (Supplier)', 'trim|required'); - } else { - $this->form_validation->set_rules('main_account', 'Sale Ledger A/C', 'trim|required'); - $this->form_validation->set_rules('main_entity', 'Debtor (Customer)', 'trim|required'); - } + $this->form_validation->set_rules('voucher_narration', 'trim'); $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); /* Debit and Credit amount validation */ if ($_POST) { - foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + foreach ($this->input->post('source_stock_item_id', TRUE) as $id => $stock_data) { - $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); - $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); - $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); - $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + $this->form_validation->set_rules('source_stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('source_stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('source_stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); } - foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + foreach ($this->input->post('dest_stock_item_id', TRUE) as $id => $stock_data) { - $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); - $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); + $this->form_validation->set_rules('dest_stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('dest_stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('dest_stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); } } @@ -597,21 +572,16 @@ class StockTransfer extends Controller { $data['voucher_date']['value'] = $this->input->post('voucher_date', TRUE); $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); - $data['has_reconciliation'] = $this->input->post('has_reconciliation', TRUE); - - $data['main_account_active'] = $this->input->post('main_account', TRUE); - $data['main_entity_active'] = $this->input->post('main_entity', TRUE); - $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); - $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); - $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); - $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); - $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + $data['source_stock_item_id'] = $this->input->post('source_stock_item_id', TRUE); + $data['source_stock_item_quantity'] = $this->input->post('source_stock_item_quantity', TRUE); + $data['source_stock_item_rate_per_unit'] = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data['source_stock_item_amount'] = $this->input->post('source_stock_item_amount', TRUE); - $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); - $data['ledger_id'] = $this->input->post('ledger_id', TRUE); - $data['rate_item'] = $this->input->post('rate_item', TRUE); - $data['amount_item'] = $this->input->post('amount_item', TRUE); + $data['dest_stock_item_id'] = $this->input->post('dest_stock_item_id', TRUE); + $data['dest_stock_item_quantity'] = $this->input->post('dest_stock_item_quantity', TRUE); + $data['dest_stock_item_rate_per_unit'] = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data['dest_stock_item_amount'] = $this->input->post('dest_stock_item_amount', TRUE); } if ($this->form_validation->run() == FALSE) @@ -619,21 +589,15 @@ class StockTransfer extends Controller { $this->messages->add(validation_errors(), 'error'); $this->template->load('template', 'inventory/stocktransfer/edit', $data); } else { - $data_main_account = $this->input->post('main_account', TRUE); - $data_main_entity = $this->input->post('main_entity', TRUE); - - $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); - $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); - $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); - $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); - $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); - - $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_rate_item = $this->input->post('rate_item', TRUE); - $data_all_amount_item = $this->input->post('amount_item', TRUE); + $data_all_source_stock_item_id = $this->input->post('source_stock_item_id', TRUE); + $data_all_source_stock_item_quantity = $this->input->post('source_stock_item_quantity', TRUE); + $data_all_source_stock_item_rate_per_unit = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data_all_source_stock_item_amount = $this->input->post('source_stock_item_amount', TRUE); - $data_total_amount = 0; + $data_all_dest_stock_item_id = $this->input->post('dest_stock_item_id', TRUE); + $data_all_dest_stock_item_quantity = $this->input->post('dest_stock_item_quantity', TRUE); + $data_all_dest_stock_item_rate_per_unit = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data_all_dest_stock_item_amount = $this->input->post('dest_stock_item_amount', TRUE); /* Setting Stock Item type */ if ($current_voucher_type['stock_voucher_type'] == '1') @@ -641,100 +605,69 @@ class StockTransfer extends Controller { else $data_stock_item_type = 2; - /* Checking for Valid Stock Ledger A/C - account */ - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); - else - $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); - $valid_main_account_q = $this->db->get(); - if ($valid_main_account_q->num_rows() < 1) - { - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); - else - $this->messages->add('Invalid Sale Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); - return; - } - /* Checking for Valid Stock Ledger A/C - entity */ - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); - else - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); - $valid_main_account_q = $this->db->get(); - if ($valid_main_account_q->num_rows() < 1) - { - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->messages->add('Invalid Creditor (Supplier).', 'error'); - else - $this->messages->add('Invalid Debtor (Customer).', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); - return; - } - - /* Checking for Valid Stock Item A/C */ - $stock_item_present = FALSE; - $data_total_stock_amount = 0; - foreach ($data_all_stock_item_id as $id => $stock_data) + /* Checking for Valid Stock Item */ + $source_stock_item_present = FALSE; + $data_total_source_stock_amount = 0; + foreach ($data_all_source_stock_item_id as $id => $stock_data) { - if ($data_all_stock_item_id[$id] < 1) + if ($data_all_source_stock_item_id[$id] < 1) continue; /* Check for valid stock item id */ - $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $this->db->from('stock_items')->where('id', $data_all_source_stock_item_id[$id]); $valid_stock_item_q = $this->db->get(); if ($valid_stock_item_q->num_rows() < 1) { - $this->messages->add('Invalid Stock Item.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('Invalid Source Stock Item.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - $stock_item_present = TRUE; - $data_total_stock_amount += $data_all_stock_item_amount[$id]; + $source_stock_item_present = TRUE; + $data_total_source_stock_amount += $data_all_source_stock_item_amount[$id]; } - if ( ! $stock_item_present) + if ( ! $source_stock_item_present) { - $this->messages->add('No Stock Item selected.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('No Soruce Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - - /* Checking for Valid Ledgers A/C */ - $data_total_ledger_amount = 0; - foreach ($data_all_ledger_dc as $id => $ledger_data) + $dest_stock_item_present = FALSE; + $data_total_dest_stock_amount = 0; + foreach ($data_all_dest_stock_item_id as $id => $stock_data) { - if ($data_all_ledger_id[$id] < 1) + if ($data_all_dest_stock_item_id[$id] < 1) continue; - /* Check for valid ledger id */ - $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); - $valid_ledger_q = $this->db->get(); - if ($valid_ledger_q->num_rows() < 1) + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_dest_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) { - $this->messages->add('Invalid Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('Invalid Destination Stock Item.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - if ($data_all_ledger_dc[$id] == 'D') - $data_total_ledger_amount += $data_all_amount_item[$id]; - else - $data_total_ledger_amount -= $data_all_amount_item[$id]; + $dest_stock_item_present = TRUE; + $data_total_dest_stock_amount += $data_all_dest_stock_item_amount[$id]; + } + if ( ! $dest_stock_item_present) + { + $this->messages->add('No Destination Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; } /* Total amount calculations */ - if ($current_voucher_type['stock_voucher_type'] == '1') + if ($data_total_source_stock_amount < 0) { - $data_main_account_total = $data_total_stock_amount; - $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; - } else { - $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; - $data_main_entity_total = $data_total_stock_amount; + $this->messages->add('Source total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; } - $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; - if ($data_total_amount < 0) + if ($data_total_dest_stock_amount < 0) { - $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('Destination total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } @@ -754,7 +687,6 @@ class StockTransfer extends Controller { $data_tag = NULL; $data_type = $voucher_type_id; $data_date = date_php_to_mysql($data_date); // Converting date to MySQL - $data_has_reconciliation = $this->input->post('has_reconciliation', TRUE); $this->db->trans_start(); $update_data = array( @@ -762,17 +694,19 @@ class StockTransfer extends Controller { 'date' => $data_date, 'narration' => $data_narration, 'tag_id' => $data_tag, + 'dr_total' => $data_total_source_stock_amount, + 'cr_total' => $data_total_dest_stock_amount, ); if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) { $this->db->trans_rollback(); - $this->messages->add('Error updating Voucher A/C.', 'error'); + $this->messages->add('Error updating Voucher.', 'error'); $this->logger->write_message("error", "Error updating voucher details for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } - /* TODO : Deleting all old ledger data, Bad solution */ + /* TODO : Deleting all old stock item */ if ( ! $this->db->delete('stock_voucher_items', array('voucher_id' => $voucher_id))) { $this->db->trans_rollback(); @@ -782,151 +716,78 @@ class StockTransfer extends Controller { return; } - if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))->where('stock_type', 3)) - { - $this->db->trans_rollback(); - $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); - $this->logger->write_message("error", "Error deleting previous voucher items for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); - return; - } - - /* Updating main - account */ - $update_data = array( - 'ledger_id' => $data_main_account, - 'amount' => $data_main_account_total, - 'dc' => '', - 'reconciliation_date' => NULL, - 'stock_type' => 1, - 'stock_rate' => '', - ); - if ($current_voucher_type['stock_voucher_type'] == '1') - $update_data['dc'] = 'D'; - else - $update_data['dc'] = 'C'; - if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 1)->update('voucher_items', $update_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error updating Purchase Ledger A/C of Voucher.', 'error'); - $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating purchase ledger " . "[id:" . $data_main_account . "]"); - } else { - $this->messages->add('Error updating Sale Ledger A/C of Voucher.', 'error'); - $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger " . "[id:" . $data_main_account . "]"); - } - $this->template->load('template', 'inventory/stocktransfer/edit', $data); - return; - } - - /* Updating main - entity */ - $update_data = array( - 'ledger_id' => $data_main_entity, - 'amount' => $data_main_entity_total, - 'dc' => '', - 'reconciliation_date' => NULL, - 'stock_type' => 2, - 'stock_rate' => '', - ); - if ($current_voucher_type['stock_voucher_type'] == '1') - $insert_data['dc'] = 'C'; - else - $insert_data['dc'] = 'D'; - if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 2)->update('voucher_items', $update_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error updating Creditor (Supplier) of Voucher.', 'error'); - $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating creditor ledger " . "[id:" . $data_main_entity . "]"); - } else { - $this->messages->add('Error updating Debtor (Customer) of Voucher.', 'error'); - $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor ledger " . "[id:" . $data_main_entity . "]"); - } - $this->template->load('template', 'inventory/stocktransfer/edit', $data); - return; - } - - /* Adding stock items */ - $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); - $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); - $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); - $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); - $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + /* Adding source stock items */ + $data_all_source_stock_item_id = $this->input->post('source_stock_item_id', TRUE); + $data_all_source_stock_item_quantity = $this->input->post('source_stock_item_quantity', TRUE); + $data_all_source_stock_item_rate_per_unit = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data_all_source_stock_item_amount = $this->input->post('source_stock_item_amount', TRUE); - foreach ($data_all_stock_item_id as $id => $stock_data) + foreach ($data_all_source_stock_item_id as $id => $stock_data) { - $data_stock_item_id = $data_all_stock_item_id[$id]; + $data_source_stock_item_id = $data_all_source_stock_item_id[$id]; - if ($data_stock_item_id < 1) + if ($data_source_stock_item_id < 1) continue; - $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; - $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; - $data_stock_item_discount = $data_all_stock_item_discount[$id]; - $data_stock_item_amount = $data_all_stock_item_amount[$id]; + $data_source_stock_item_quantity = $data_all_source_stock_item_quantity[$id]; + $data_source_stock_item_rate_per_unit = $data_all_source_stock_item_rate_per_unit[$id]; + $data_source_stock_item_amount = $data_all_source_stock_item_amount[$id]; $insert_stock_data = array( 'voucher_id' => $voucher_id, - 'stock_item_id' => $data_stock_item_id, - 'quantity' => $data_stock_item_quantity, - 'rate_per_unit' => $data_stock_item_rate_per_unit, - 'discount' => $data_stock_item_discount, - 'total' => $data_stock_item_amount, - 'type' => $data_stock_item_type, + 'stock_item_id' => $data_source_stock_item_id, + 'quantity' => $data_source_stock_item_quantity, + 'rate_per_unit' => $data_source_stock_item_rate_per_unit, + 'discount' => '', + 'total' => $data_source_stock_item_amount, + 'type' => '2', ); if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { $this->db->trans_rollback(); - $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('Error adding Stock Item - ' . $data_source_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_source_stock_item_id . "]"); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } } - /* Adding ledger accounts */ - $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_rate_item = $this->input->post('rate_item', TRUE); - $data_all_amount_item = $this->input->post('amount_item', TRUE); + /* Adding destination stock items */ + $data_all_dest_stock_item_id = $this->input->post('dest_stock_item_id', TRUE); + $data_all_dest_stock_item_quantity = $this->input->post('dest_stock_item_quantity', TRUE); + $data_all_dest_stock_item_rate_per_unit = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data_all_dest_stock_item_amount = $this->input->post('dest_stock_item_amount', TRUE); - foreach ($data_all_ledger_dc as $id => $ledger_data) + foreach ($data_all_dest_stock_item_id as $id => $stock_data) { - $data_ledger_dc = $data_all_ledger_dc[$id]; - $data_ledger_id = $data_all_ledger_id[$id]; + $data_dest_stock_item_id = $data_all_dest_stock_item_id[$id]; - if ($data_ledger_id < 1) + if ($data_dest_stock_item_id < 1) continue; - $data_rate = $data_all_rate_item[$id]; - $data_amount = $data_all_amount_item[$id]; + $data_dest_stock_item_quantity = $data_all_dest_stock_item_quantity[$id]; + $data_dest_stock_item_rate_per_unit = $data_all_dest_stock_item_rate_per_unit[$id]; + $data_dest_stock_item_amount = $data_all_dest_stock_item_amount[$id]; - $insert_ledger_data = array( + $insert_stock_data = array( 'voucher_id' => $voucher_id, - 'ledger_id' => $data_ledger_id, - 'amount' => $data_amount, - 'dc' => $data_ledger_dc, - 'reconciliation_date' => NULL, - 'stock_type' => 3, - 'stock_rate' => $data_rate, + 'stock_item_id' => $data_dest_stock_item_id, + 'quantity' => $data_dest_stock_item_quantity, + 'rate_per_unit' => $data_dest_stock_item_rate_per_unit, + 'discount' => '', + 'total' => $data_dest_stock_item_amount, + 'type' => '1', ); - if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { $this->db->trans_rollback(); - $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stocktransfer/edit', $data); + $this->messages->add('Error adding Stock Item - ' . $data_dest_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_dest_stock_item_id . "]"); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } } - /* Updating Debit and Credit Total - vouchers */ - $update_data = array( - 'dr_total' => $data_total_amount, - 'cr_total' => $data_total_amount, - ); - if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) { $this->db->trans_rollback(); @@ -945,10 +806,7 @@ class StockTransfer extends Controller { $this->session->set_userdata('voucher_updated_type_label', $current_voucher_type['label']); $this->session->set_userdata('voucher_updated_type_name', $current_voucher_type['name']); $this->session->set_userdata('voucher_updated_number', $data_number); - if ($data_has_reconciliation) - $this->session->set_userdata('voucher_updated_has_reconciliation', TRUE); - else - $this->session->set_userdata('voucher_updated_has_reconciliation', FALSE); + $this->session->set_userdata('voucher_updated_has_reconciliation', FALSE); /* Showing success message in show() method since message is too long for storing it in session */ $this->logger->write_message("success", "Updated " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); diff --git a/system/application/views/inventory/stocktransfer/edit.php b/system/application/views/inventory/stocktransfer/edit.php new file mode 100644 index 0000000..32586d4 --- /dev/null +++ b/system/application/views/inventory/stocktransfer/edit.php @@ -0,0 +1,394 @@ +<script type="text/javascript"> + +$(document).ready(function() { + + /************************ SOURCE STOCK ITEM ***************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().children().text(data); + } + }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .source-quantity-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + $('table td .source-rate-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) + { + /* calculating total amount for each stock item */ + var item_amount; + item_amount = (item_quantity * item_rate_per_unit); + + /* displaying total amount for each stock item */ + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + $('.source-recalculate').trigger('click'); + } + + $('table td .source-amount-stock-item').live('change', function() { + $('.source-recalculate').trigger('click'); + }); + + /* calculating stock total */ + var calculateSourceStockTotal = function() { + var stock_total = 0; + $('table td .source-amount-stock-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; + } + }); + return stock_total; + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stocktransfer/addstockrow/source') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + $('.stock-item-dropdown').trigger('change'); + + /* Recalculate Source Total */ + $('table td .source-recalculate').live('click', function() { + var sourceTotal = calculateSourceStockTotal(); + $("table tr #source-total").text(sourceTotal); + if (sourceTotal >= 0) + $("table tr #source-total").css("background-color", "#FFFF99"); + else + $("table tr #source-total").css("background-color", "#FFE9E8"); + }); + + /************************** DEST STOCK ITEM ***************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().children().text(data); + } + }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .dest-quantity-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + $('table td .dest-rate-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) + { + /* calculating total amount for each stock item */ + var item_amount; + item_amount = (item_quantity * item_rate_per_unit); + + /* displaying total amount for each stock item */ + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + $('.dest-recalculate').trigger('click'); + } + + $('table td .dest-amount-stock-item').live('change', function() { + $('.dest-recalculate').trigger('click'); + }); + + /* calculating stock total */ + var calculateDestStockTotal = function() { + var stock_total = 0; + $('table td .dest-amount-stock-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; + } + }); + return stock_total; + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stocktransfer/addstockrow/dest') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + /* Recalculate Dest Total */ + $('table td .dest-recalculate').live('click', function() { + var destTotal = calculateDestStockTotal(); + $("table tr #dest-total").text(destTotal); + if (destTotal >= 0) + $("table tr #dest-total").css("background-color", "#FFFF99"); + else + $("table tr #dest-total").css("background-color", "#FFE9E8"); + }); + + $('.stock-item-dropdown').trigger('change'); + $('table td .dest-recalculate').trigger('click'); + $('table td .source-recalculate').trigger('click'); +}); + +</script> + +<?php + echo form_open('inventory/stocktransfer/edit/' . $current_voucher_type['label'] . '/' . $voucher_id); + echo "<p>"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Voucher Number', 'voucher_number'); + echo " "; + echo $current_voucher_type['prefix'] . form_input($voucher_number) . $current_voucher_type['suffix']; + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Leave Voucher Number empty for auto numbering</span>"; + echo " "; + echo "<span id=\"tooltip-target-2\">"; + echo form_label('Voucher Date', 'voucher_date'); + echo " "; + echo form_input_date_restrict($voucher_date); + echo "</span>"; + echo "<span id=\"tooltip-content-2\">Date format is " . $this->config->item('account_date_format') . ".</span>"; + echo "</p>"; + + echo "<h3>Source</h3>"; + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($source_stock_item_id as $i => $row) + { + $source_stock_item_quantity_item = array( + 'name' => 'source_stock_item_quantity[' . $i . ']', + 'id' => 'source_stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($source_stock_item_quantity[$i]) ? $source_stock_item_quantity[$i] : '', + 'class' => 'source-quantity-stock-item', + ); + $source_stock_item_rate_per_unit_item = array( + 'name' => 'source_stock_item_rate_per_unit[' . $i . ']', + 'id' => 'source_stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($source_stock_item_rate_per_unit[$i]) ? $source_stock_item_rate_per_unit[$i] : '', + 'class' => 'source-rate-stock-item', + ); + $source_stock_item_amount_item = array( + 'name' => 'source_stock_item_amount[' . $i . ']', + 'id' => 'source_stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($source_stock_item_amount[$i]) ? $source_stock_item_amount[$i] : '', + 'class' => 'source-amount-stock-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('source_stock_item_id[' . $i . ']', isset($source_stock_item_id[$i]) ? $source_stock_item_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($source_stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($source_stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($source_stock_item_amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"source-stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "<tr id=\"source-total\"><td colspan=3><strong>Total</strong></td><td id=\"source-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'source-recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; + echo "</table>"; + + echo "<h3>Destination</h3>"; + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($dest_stock_item_id as $i => $row) + { + $dest_stock_item_quantity_item = array( + 'name' => 'dest_stock_item_quantity[' . $i . ']', + 'id' => 'dest_stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($dest_stock_item_quantity[$i]) ? $dest_stock_item_quantity[$i] : '', + 'class' => 'dest-quantity-stock-item', + ); + $dest_stock_item_rate_per_unit_item = array( + 'name' => 'dest_stock_item_rate_per_unit[' . $i . ']', + 'id' => 'dest_stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($dest_stock_item_rate_per_unit[$i]) ? $dest_stock_item_rate_per_unit[$i] : '', + 'class' => 'dest-rate-stock-item', + ); + $dest_stock_item_amount_item = array( + 'name' => 'dest_stock_item_amount[' . $i . ']', + 'id' => 'dest_stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($dest_stock_item_amount[$i]) ? $dest_stock_item_amount[$i] : '', + 'class' => 'dest-amount-stock-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('dest_stock_item_id[' . $i . ']', isset($dest_stock_item_id[$i]) ? $dest_stock_item_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($dest_stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($dest_stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($dest_stock_item_amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"dest-stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "<tr id=\"dest-total\"><td colspan=3><strong>Total</strong></td><td id=\"dest-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'dest-recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; + echo "</table>"; + + echo "<br />"; + echo "<br />"; + + echo "<p>"; + echo form_label('Narration', 'voucher_narration'); + echo "<br />"; + echo form_textarea($voucher_narration); + echo "</p>"; + + echo "<p>"; + echo form_label('Tag', 'voucher_tag'); + echo " "; + echo form_dropdown('voucher_tag', $voucher_tags, $voucher_tag); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Update'); + echo " "; + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo "</p>"; + + echo form_close(); + commit 66cd712d147ff0807c2107d5c674ba9a58a3d85b Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Mar 12 22:14:53 2011 +0530 Added stock trasfer download, email and print views Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index e8fe15a..6455c42 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -85,7 +85,7 @@ class StockTransfer extends Controller { if ($this->config->item('account_locked') == 1) { $this->messages->add('Account is locked.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -434,7 +434,7 @@ class StockTransfer extends Controller { if ( ! check_access('edit stock voucher')) { $this->messages->add('Permission denied.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -617,7 +617,7 @@ class StockTransfer extends Controller { if ($this->form_validation->run() == FALSE) { $this->messages->add(validation_errors(), 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); } else { $data_main_account = $this->input->post('main_account', TRUE); $data_main_entity = $this->input->post('main_entity', TRUE); @@ -653,7 +653,7 @@ class StockTransfer extends Controller { $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); else $this->messages->add('Invalid Sale Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } /* Checking for Valid Stock Ledger A/C - entity */ @@ -668,7 +668,7 @@ class StockTransfer extends Controller { $this->messages->add('Invalid Creditor (Supplier).', 'error'); else $this->messages->add('Invalid Debtor (Customer).', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -686,7 +686,7 @@ class StockTransfer extends Controller { if ($valid_stock_item_q->num_rows() < 1) { $this->messages->add('Invalid Stock Item.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } $stock_item_present = TRUE; @@ -695,7 +695,7 @@ class StockTransfer extends Controller { if ( ! $stock_item_present) { $this->messages->add('No Stock Item selected.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -712,7 +712,7 @@ class StockTransfer extends Controller { if ($valid_ledger_q->num_rows() < 1) { $this->messages->add('Invalid Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } if ($data_all_ledger_dc[$id] == 'D') @@ -734,7 +734,7 @@ class StockTransfer extends Controller { if ($data_total_amount < 0) { $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -768,7 +768,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error updating Voucher A/C.', 'error'); $this->logger->write_message("error", "Error updating voucher details for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -778,7 +778,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error deleting previous stock items from Voucher.', 'error'); $this->logger->write_message("error", "Error deleting previous stock items from " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -787,7 +787,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); $this->logger->write_message("error", "Error deleting previous voucher items for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -815,7 +815,7 @@ class StockTransfer extends Controller { $this->messages->add('Error updating Sale Ledger A/C of Voucher.', 'error'); $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger " . "[id:" . $data_main_account . "]"); } - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -843,7 +843,7 @@ class StockTransfer extends Controller { $this->messages->add('Error updating Debtor (Customer) of Voucher.', 'error'); $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor ledger " . "[id:" . $data_main_entity . "]"); } - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -880,7 +880,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } } @@ -916,7 +916,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } } @@ -932,7 +932,7 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error updating Voucher total.', 'error'); $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); - $this->template->load('template', 'inventory/stockvoucher/edit', $data); + $this->template->load('template', 'inventory/stocktransfer/edit', $data); return; } @@ -965,7 +965,7 @@ class StockTransfer extends Controller { if ( ! check_access('delete stock voucher')) { $this->messages->add('Permission denied.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -1029,7 +1029,7 @@ class StockTransfer extends Controller { if ( ! check_access('download stock voucher')) { $this->messages->add('Permission denied.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -1059,45 +1059,29 @@ class StockTransfer extends Controller { return; } - /* Load current voucher details - account, entity, ledgers */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); - $cur_voucher_main_account = $this->db->get(); - if ($cur_voucher_main_account->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); - $cur_voucher_main_entity = $this->db->get(); - if ($cur_voucher_main_entity->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); - $cur_voucher_ledgers = $this->db->get(); - if ($cur_voucher_ledgers->num_rows() < 1) + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); + $cur_voucher_source_stock_items = $this->db->get(); + if ($cur_voucher_source_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + $this->messages->add('Voucher has no associated source stock items.', 'error'); } - - /* Load current stock items details */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); - $cur_voucher_stock_items = $this->db->get(); - if ($cur_voucher_stock_items->num_rows() < 1) + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); + $cur_voucher_dest_stock_items = $this->db->get(); + if ($cur_voucher_dest_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated stock items.', 'error'); + $this->messages->add('Voucher has no associated destination stock items.', 'error'); } $data['cur_voucher'] = $cur_voucher; - $data['cur_voucher_main_account'] = $cur_voucher_main_account; - $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; - $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; - $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['cur_voucher_source_stock_items'] = $cur_voucher_source_stock_items; + $data['cur_voucher_dest_stock_items'] = $cur_voucher_dest_stock_items; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; /* Download Voucher */ $file_name = $current_voucher_type['name'] . '_voucher_' . $cur_voucher->number . ".html"; - $download_data = $this->load->view('inventory/stockvoucher/downloadpreview', $data, TRUE); + $download_data = $this->load->view('inventory/stocktransfer/downloadpreview', $data, TRUE); force_download($file_name, $download_data); return; } @@ -1110,7 +1094,7 @@ class StockTransfer extends Controller { if ( ! check_access('print stock voucher')) { $this->messages->add('Permission denied.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -1140,43 +1124,27 @@ class StockTransfer extends Controller { return; } - /* Load current voucher details - account, entity, ledgers */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); - $cur_voucher_main_account = $this->db->get(); - if ($cur_voucher_main_account->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); - $cur_voucher_main_entity = $this->db->get(); - if ($cur_voucher_main_entity->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); - $cur_voucher_ledgers = $this->db->get(); - if ($cur_voucher_ledgers->num_rows() < 1) + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); + $cur_voucher_source_stock_items = $this->db->get(); + if ($cur_voucher_source_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + $this->messages->add('Voucher has no associated source stock items.', 'error'); } - - /* Load current stock items details */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); - $cur_voucher_stock_items = $this->db->get(); - if ($cur_voucher_stock_items->num_rows() < 1) + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); + $cur_voucher_dest_stock_items = $this->db->get(); + if ($cur_voucher_dest_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated stock items.', 'error'); + $this->messages->add('Voucher has no associated destination stock items.', 'error'); } $data['cur_voucher'] = $cur_voucher; - $data['cur_voucher_main_account'] = $cur_voucher_main_account; - $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; - $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; - $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['cur_voucher_source_stock_items'] = $cur_voucher_source_stock_items; + $data['cur_voucher_dest_stock_items'] = $cur_voucher_dest_stock_items; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; - $this->load->view('inventory/stockvoucher/printpreview', $data); + $this->load->view('inventory/stocktransfer/printpreview', $data); return; } @@ -1189,7 +1157,7 @@ class StockTransfer extends Controller { if ( ! check_access('email stock voucher')) { $this->messages->add('Permission denied.', 'error'); - redirect('inventory/stockvoucher/show/' . $voucher_type); + redirect('inventory/stocktransfer/show/' . $voucher_type); return; } @@ -1214,32 +1182,18 @@ class StockTransfer extends Controller { return; } - /* Load current voucher details - account, entity, ledgers */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); - $cur_voucher_main_account = $this->db->get(); - if ($cur_voucher_main_account->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); - $cur_voucher_main_entity = $this->db->get(); - if ($cur_voucher_main_entity->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); - $cur_voucher_ledgers = $this->db->get(); - if ($cur_voucher_ledgers->num_rows() < 1) + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); + $cur_voucher_source_stock_items = $this->db->get(); + if ($cur_voucher_source_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + $this->messages->add('Voucher has no associated source stock items.', 'error'); } - - /* Load current stock items details */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); - $cur_voucher_stock_items = $this->db->get(); - if ($cur_voucher_stock_items->num_rows() < 1) + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); + $cur_voucher_dest_stock_items = $this->db->get(); + if ($cur_voucher_dest_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated stock items.', 'error'); + $this->messages->add('Voucher has no associated destination stock items.', 'error'); } $data['voucher_type_id'] = $voucher_type_id; @@ -1265,19 +1219,17 @@ class StockTransfer extends Controller { if ($this->form_validation->run() == FALSE) { $data['error'] = validation_errors(); - $this->load->view('inventory/stockvoucher/email', $data); + $this->load->view('inventory/stocktransfer/email', $data); return; } else { $data['cur_voucher'] = $cur_voucher; - $data['cur_voucher_main_account'] = $cur_voucher_main_account; - $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; - $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; - $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['cur_voucher_source_stock_items'] = $cur_voucher_source_stock_items; + $data['cur_voucher_dest_stock_items'] = $cur_voucher_dest_stock_items; /* Preparing message */ - $message = $this->load->view('inventory/stockvoucher/emailpreview', $data, TRUE); + $message = $this->load->view('inventory/stocktransfer/emailpreview', $data, TRUE); /* Getting email configuration */ $config['smtp_timeout'] = '30'; @@ -1309,7 +1261,7 @@ class StockTransfer extends Controller { $data['error'] = "Error sending email. Check you email settings."; $this->logger->write_message("error", "Error emailing " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); } - $this->load->view('inventory/stockvoucher/email', $data); + $this->load->view('inventory/stocktransfer/email', $data); return; } return; diff --git a/system/application/views/inventory/stocktransfer/downloadpreview.php b/system/application/views/inventory/stocktransfer/downloadpreview.php new file mode 100644 index 0000000..3a3d55d --- /dev/null +++ b/system/application/views/inventory/stocktransfer/downloadpreview.php @@ -0,0 +1,125 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title><?php $current_voucher_type['name']; ?> Voucher Number <?php echo $voucher_number; ?></title> + +<style type="text/css"> + body { + color:#000000; + font:14px "Helvetica Neue","Lucida Grande","Helvetica Neue",Arial,sans-serif; + margin:20px; + padding:0; + } + + #print-account-name { + text-align:center; + font-size:17px; + } + + #print-account-address { + text-align:center; + font-size:14px; + } + + #print-voucher-type { + text-align:center; + font-size:15px; + } + + table.print-voucher-table { + border:1px solid #000000; + border-collapse: collapse; + } + + table.print-voucher-table tr.tr-title { + text-align:left; + border:1px solid #000000; + padding:5px 0 5px 2px; + } + + table.print-voucher-table tr.tr-title th { + padding:5px 0 5px 5px; + } + + table.print-voucher-table td { + padding:5px 0 5px 5px; + } + + table.print-voucher-table td.item { + padding-right:35px; + } + + table.print-voucher-table td.last-item { + padding-right:5px; + } + + table.print-voucher-table tr.tr-total { + border:1px solid #000000; + } +</style> + +</head> +<body> + <div id="print-account-name"><span class="value"><?php echo $this->config->item('account_name'); ?></span></div> + <div id="print-account-address"><span class="value"><?php echo $this->config->item('account_address'); ?></span></div> + <br /> + <div id="print-voucher-type"><span class="value"><?php echo $current_voucher_type['name']; ?> Voucher</span></div> + <br /> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Number : <span class="value"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span></div> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Date : <span class="value"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span></div> + <br /> + + <h3>Source</h3> + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + $source_total = 0; + foreach ($cur_voucher_source_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $source_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $source_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + + <h3>Destination</h3> + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $dest_total = 0; + foreach ($cur_voucher_dest_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $dest_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $dest_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + <div id="print-voucher-narration">Narration : <span class="value"><?php echo $cur_voucher->narration; ?></span></div> + <br /> +</body> +</html> diff --git a/system/application/views/inventory/stocktransfer/email.php b/system/application/views/inventory/stocktransfer/email.php new file mode 100644 index 0000000..5ef5b74 --- /dev/null +++ b/system/application/views/inventory/stocktransfer/email.php @@ -0,0 +1,54 @@ +<style type="text/css"> +#error-box { + border:solid 1px #C34A2C; + background:#FFBABA; + color:#222222; + padding:0 10px 0 10px; + margin:0 0 10px 0; + text-align:left; +} + +#message-box { + border:solid 1px #FFEC8B; + background:#FFF8C6; + color:#222222; + padding:0 10px 0 10px; + margin:0 0 10px 0; + text-align:left; +} +</style> +<?php + if (isset($error) && $error) + { + echo "<div id=\"error-box\">"; + echo "<ul>"; + echo ($error); + echo "</ul>"; + echo "</div>"; + } + + if (isset($message) && $message) + { + echo "<div id=\"message-box\">"; + echo "<ul>"; + echo ($message); + echo "</ul>"; + echo "</div>"; + } + + echo form_open('inventory/stocktransfer/email/' . $current_voucher_type['label'] . "/" . $voucher_id); + + echo "Emailing " . $current_voucher_type['name'] . " Voucher No. " . $voucher_number . "<br />"; + + echo "<p>"; + echo form_label('Email to', 'email_to'); + echo "<br />"; + echo form_input($email_to); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Send Email'); + echo "</p>"; + + echo form_close(); + diff --git a/system/application/views/inventory/stocktransfer/emailpreview.php b/system/application/views/inventory/stocktransfer/emailpreview.php new file mode 100644 index 0000000..4a279ac --- /dev/null +++ b/system/application/views/inventory/stocktransfer/emailpreview.php @@ -0,0 +1,70 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title>Email - <?php echo $current_voucher_type['name']; ?> Voucher Number <?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></title> +</head> +<body> + <p><?php echo $this->config->item('account_name'); ?></p> + <p><?php echo $this->config->item('account_address'); ?></p> + <p><strong><?php echo $current_voucher_type['name']; ?> Voucher</strong></p> + <p><?php echo $current_voucher_type['name']; ?> Voucher Number : <strong><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></strong></p> + <p><?php echo $current_voucher_type['name']; ?> Voucher Date : <strong><?php echo date_mysql_to_php_display($cur_voucher->date); ?></strong></p> + + <br /> + + <h3>Source</h3> + <table border=1 cellpadding=6> + <thead> + <tr><th align="left">Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + $source_total = 0; + foreach ($cur_voucher_source_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $source_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $source_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + + <h3>Destination</h3> + <table border=1 cellpadding=6> + <thead> + <tr><th align="left">Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + $source_total = 0; + foreach ($cur_voucher_dest_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $source_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $source_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + + <p>Narration : <span class="value"><?php echo $cur_voucher->narration; ?></p> + <br /> +</body> +</html> diff --git a/system/application/views/inventory/stocktransfer/printpreview.php b/system/application/views/inventory/stocktransfer/printpreview.php new file mode 100644 index 0000000..7b15e00 --- /dev/null +++ b/system/application/views/inventory/stocktransfer/printpreview.php @@ -0,0 +1,74 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title>Print - <?php echo $current_voucher_type['name']; ?> Voucher Number <?php echo $voucher_number; ?></title> +<?php echo link_tag(asset_url() . 'images/favicon.ico', 'shortcut icon', 'image/ico'); ?> +<link type="text/css" rel="stylesheet" href="<?php echo asset_url(); ?>css/printvoucher.css"> +</head> +<body> + <div id="print-account-name"><span class="value"><?php echo $this->config->item('account_name'); ?></span></div> + <div id="print-account-address"><span class="value"><?php echo $this->config->item('account_address'); ?></span></div> + <br /> + <div id="print-voucher-type"><span class="value"><?php echo $current_voucher_type['name']; ?> Voucher</span></div> + <br /> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Number : <span class="value"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span></div> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Date : <span class="value"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span></div> + <br /> + + <h3>Source</h3> + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + $source_total = 0; + foreach ($cur_voucher_source_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $source_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $source_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + + <h3>Destination</h3> + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr> + </thead> + <tbody> + <?php + $dest_total = 0; + foreach ($cur_voucher_dest_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + $dest_total += $row->total; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"3\">Total</td><td class=\"total-amount\">" . $currency . " " . $dest_total . "</td></tr>"; + ?> + </tbody> + </table> + + <br /> + <div id="print-voucher-narration">Narration : <span class="value"><?php echo $cur_voucher->narration; ?></span></div> + <br /> + <form> + <input class="hide-print" type="button" onClick="window.print()" value="Print voucher"> + </form> +</body> +</html> commit 4e9b7cf14862b72250a70c9f0397f00618223754 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Mar 9 22:57:50 2011 +0530 Updated view stock transfer Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index add65ef..e8fe15a 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -48,42 +48,26 @@ class StockTransfer extends Controller { return; } - /* Load current voucher details - account, entity, ledgers */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); - $cur_voucher_main_account = $this->db->get(); - if ($cur_voucher_main_account->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); - $cur_voucher_main_entity = $this->db->get(); - if ($cur_voucher_main_entity->num_rows() < 1) - { - $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); - } - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); - $cur_voucher_ledgers = $this->db->get(); - if ($cur_voucher_ledgers->num_rows() < 1) + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 1)->order_by('id', 'asc'); + $cur_voucher_source_stock_items = $this->db->get(); + if ($cur_voucher_source_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + $this->messages->add('Voucher has no associated source stock items.', 'error'); } - - /* Load current stock items details */ - $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); - $cur_voucher_stock_items = $this->db->get(); - if ($cur_voucher_stock_items->num_rows() < 1) + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->where('type', 2)->order_by('id', 'asc'); + $cur_voucher_dest_stock_items = $this->db->get(); + if ($cur_voucher_dest_stock_items->num_rows() < 1) { - $this->messages->add('Voucher has no associated stock items.', 'error'); + $this->messages->add('Voucher has no associated destination stock items.', 'error'); } $data['cur_voucher'] = $cur_voucher; - $data['cur_voucher_main_account'] = $cur_voucher_main_account; - $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; - $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; - $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['cur_voucher_source_stock_items'] = $cur_voucher_source_stock_items; + $data['cur_voucher_dest_stock_items'] = $cur_voucher_dest_stock_items; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; - $this->template->load('template', 'inventory/stockvoucher/view', $data); + $this->template->load('template', 'inventory/stocktransfer/view', $data); return; } diff --git a/system/application/views/inventory/stocktransfer/view.php b/system/application/views/inventory/stocktransfer/view.php new file mode 100644 index 0000000..210bb2b --- /dev/null +++ b/system/application/views/inventory/stocktransfer/view.php @@ -0,0 +1,71 @@ +<p>Voucher Number : <span class="bold"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span> + +Voucher Date : <span class="bold"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span> +</p> + +<h3>Source</h3> +<table border=0 cellpadding=5 class="simple-table voucher-view-table"> +<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr></thead> +<?php +$stock_total = 0; +foreach ($cur_voucher_source_stock_items->result() as $row) +{ + echo "<tr>"; + echo "<td>" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td>" . $row->quantity . "</td>"; + echo "<td>" . $row->rate_per_unit . "</td>"; + echo "<td>" . $row->total . "</td>"; + echo "</tr>"; + $stock_total += $row->total; +} +?> +<tr class="voucher-total"><td colspan=3><strong>Total</strong></td><td id="stock-total"><?php echo convert_cur($stock_total); ?></td></tr> +</table> + +<h3>Destination</h3> +<table border=0 cellpadding=5 class="simple-table voucher-view-table"> +<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Total</th></tr></thead> +<?php +$stock_total = 0; +foreach ($cur_voucher_dest_stock_items->result() as $row) +{ + echo "<tr>"; + echo "<td>" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td>" . $row->quantity . "</td>"; + echo "<td>" . $row->rate_per_unit . "</td>"; + echo "<td>" . $row->total . "</td>"; + echo "</tr>"; + $stock_total += $row->total; +} +?> +<tr class="voucher-total"><td colspan=3><strong>Total</strong></td><td id="stock-total"><?php echo convert_cur($stock_total); ?></td></tr> +</table> + +<br /> + +<p>Narration :<br /> +<span class="bold"><?php echo $cur_voucher->narration; ?></span> +</p> +<p> +Tag : +<?php +$cur_voucher_tag = $this->Tag_model->show_voucher_tag($cur_voucher->tag_id); +if ($cur_voucher_tag == "") + echo "(None)"; +else + echo $cur_voucher_tag; +?> +</p> +<?php + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo " | "; + echo anchor('inventory/stocktransfer/edit/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Edit', array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher')); + echo " | "; + echo anchor('inventory/stocktransfer/delete/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Delete', array('class' => "confirmClick", 'title' => "Delete voucher", 'title' => 'Delete this ' . $current_voucher_type['name'] . ' Voucher')); + echo " | "; + echo anchor_popup('inventory/stocktransfer/printpreview/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Print', array('title' => 'Print this ' . $current_voucher_type['name'] . ' Voucher', 'width' => '600', 'height' => '600')); + echo " | "; + echo anchor_popup('inventory/stocktransfer/email/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Email', array('title' => 'Email this ' . $current_voucher_type['name'] . ' Voucher', 'width' => '400', 'height' => '200')); + echo " | "; + echo anchor('inventory/stocktransfer/download/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Download', array('title' => "Download voucher", 'title' => 'Download this ' . $current_voucher_type['name'] . ' Voucher')); + commit 5ebbdfe002fcdaec590856dbb5fe084e48b30a06 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Mar 9 22:53:20 2011 +0530 Verified edit stock voucher database transactions Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 6a10242..ffd887e 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -918,7 +918,8 @@ class StockVoucher extends Controller { return; } - if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))->where('stock_type', 3)) + $this->db->where('stock_type', 3); + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) { $this->db->trans_rollback(); $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); diff --git a/system/application/views/inventory/stockvoucher/edit.php b/system/application/views/inventory/stockvoucher/edit.php index 79ea9b4..d58d6c3 100644 --- a/system/application/views/inventory/stockvoucher/edit.php +++ b/system/application/views/inventory/stockvoucher/edit.php @@ -464,7 +464,7 @@ $(document).ready(function() { echo "</p>"; echo "<p>"; - echo form_submit('submit', 'Create'); + echo form_submit('submit', 'Update'); echo " "; echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); echo "</p>"; commit 00d42a5ec8434faa36a3f0d34c4e28956078bd7c Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Tue Mar 8 22:08:02 2011 +0530 Udpate add stock voucher check database transactions Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 2e84d71..6a10242 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -486,8 +486,8 @@ class StockVoucher extends Controller { if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { $this->db->trans_rollback(); - $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->messages->add('Error adding Stock Item - ' . $data_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_stock_item_id . "]"); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; } @@ -1014,8 +1014,8 @@ class StockVoucher extends Controller { if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { $this->db->trans_rollback(); - $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->messages->add('Error adding Stock Item - ' . $data_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_stock_item_id . "]"); $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; } commit eae2c95f34c08084d6866d4302f2903104b3a532 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Tue Mar 8 21:38:28 2011 +0530 Updated stock voucher new row to include proper class Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index a24ba74..2e84d71 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -1468,7 +1468,7 @@ class StockVoucher extends Controller { 'maxlength' => '5', 'size' => '5', 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", - 'class' => 'dr-item', + 'class' => 'rate-item', ); $amount_item = array( 'name' => 'amount_item[' . $i . ']', @@ -1476,9 +1476,9 @@ class StockVoucher extends Controller { 'maxlength' => '15', 'size' => '15', 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", - 'class' => 'cr-item', + 'class' => 'amount-item', ); - echo "<tr>"; + echo '<tr class="new-row">'; echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', 'D') . "</td>"; echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', '0') . "</td>"; echo "<td>" . form_input($rate_item) . "</td>"; @@ -1499,7 +1499,7 @@ class StockVoucher extends Controller { 'maxlength' => '15', 'size' => '9', 'value' => '', - 'class' => 'quantity-item', + 'class' => 'quantity-stock-item', ); $stock_item_rate_per_unit = array( 'name' => 'stock_item_rate_per_unit[' . $i . ']', @@ -1507,7 +1507,7 @@ class StockVoucher extends Controller { 'maxlength' => '15', 'size' => '9', 'value' => '', - 'class' => 'rate-item', + 'class' => 'rate-stock-item', ); $stock_item_discount = array( 'name' => 'stock_item_discount[' . $i . ']', @@ -1515,7 +1515,7 @@ class StockVoucher extends Controller { 'maxlength' => '15', 'size' => '9', 'value' => '', - 'class' => 'discount-item', + 'class' => 'discount-stock-item', ); $stock_item_amount = array( 'name' => 'stock_item_amount[' . $i . ']', @@ -1523,7 +1523,7 @@ class StockVoucher extends Controller { 'maxlength' => '15', 'size' => '15', 'value' => '', - 'class' => 'rate-item', + 'class' => 'amount-stock-item', ); echo '<tr class="new-row">'; @@ -1545,5 +1545,5 @@ class StockVoucher extends Controller { } } -/* End of file voucher.php */ +/* End of file stockvoucher.php */ /* Location: ./system/application/controllers/inventory/stockvoucher.php */ commit 905db5a81b9d2e21fc928b883e5b5a5d8269e63f Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Mon Mar 7 22:54:02 2011 +0530 Updated add stock transfer Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index 7be72a4..add65ef 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -235,8 +235,6 @@ class StockTransfer extends Controller { $data_all_dest_stock_item_rate_per_unit = $this->input->post('dest_stock_item_rate_per_unit', TRUE); $data_all_dest_stock_item_amount = $this->input->post('dest_stock_item_amount', TRUE); - $data_total_amount = 0; - /* Setting Stock Item type */ if ($current_voucher_type['stock_voucher_type'] == '1') $data_stock_item_type = 1; @@ -296,12 +294,6 @@ class StockTransfer extends Controller { } /* Total amount calculations */ - if ($data_total_source_stock_amount != $data_total_dest_stock_amount) - { - $this->messages->add('Source total does not match with Destination total.', 'error'); - $this->template->load('template', 'inventory/stocktransfer/add', $data); - return; - } if ($data_total_source_stock_amount < 0) { $this->messages->add('Source total cannot be negative.', 'error'); @@ -314,7 +306,6 @@ class StockTransfer extends Controller { $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - $data_total_amount = $data_total_source_stock_amount; /* Adding main voucher */ if ($current_voucher_type['numbering'] == '2') @@ -348,8 +339,8 @@ class StockTransfer extends Controller { 'narration' => $data_narration, 'voucher_type' => $data_type, 'tag_id' => $data_tag, - 'dr_total' => $data_total_amount, - 'cr_total' => $data_total_amount, + 'dr_total' => $data_total_source_stock_amount, + 'cr_total' => $data_total_dest_stock_amount, ); if ( ! $this->db->insert('vouchers', $insert_data)) { @@ -1030,14 +1021,6 @@ class StockTransfer extends Controller { redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); return; } - if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) - { - $this->db->trans_rollback(); - $this->messages->add('Error deleting Voucher - Ledger A/C\'s.', 'error'); - $this->logger->write_message("error", "Error deleting ledger entries for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); - redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); - return; - } if ( ! $this->db->delete('vouchers', array('id' => $voucher_id))) { $this->db->trans_rollback(); diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index 53096e5..2807b07 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -126,6 +126,14 @@ class Ledger_model extends Model { { /* Selecting whether to show debit side Ledger or credit side Ledger */ $current_voucher_type = voucher_type_info($voucher_type_id); + + /* If Stock Transfer */ + if ($current_voucher_type['stock_voucher_type'] == '3') + { + $html = anchor('inventory/stocktransfer/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "[Stock Transfer]", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + return $html; + } + $ledger_type = 'C'; if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') @@ -151,18 +159,12 @@ class Ledger_model extends Model { if ($current_voucher_type['base_type'] == '1') $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else - if ($current_voucher_type['stock_voucher_type'] == '3') - $html .= anchor('inventory/stocktransfer/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); - else - $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else if ($current_voucher_type['base_type'] == '1') $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else - if ($current_voucher_type['stock_voucher_type'] == '3') - $html .= anchor('inventory/stocktransfer/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); - else - $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); return $html; } return; diff --git a/system/application/views/inventory/stocktransfer/add.php b/system/application/views/inventory/stocktransfer/add.php index e0af0a2..cd31321 100644 --- a/system/application/views/inventory/stocktransfer/add.php +++ b/system/application/views/inventory/stocktransfer/add.php @@ -74,15 +74,15 @@ $(document).ready(function() { itemrow.next().next().next().children().val(item_amount); itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } - $('.recalculate').trigger('click'); + $('.source-recalculate').trigger('click'); } $('table td .source-amount-stock-item').live('change', function() { - $('.recalculate').trigger('click'); + $('.source-recalculate').trigger('click'); }); /* calculating stock total */ - var calculateStockTotal = function() { + var calculateSourceStockTotal = function() { var stock_total = 0; $('table td .source-amount-stock-item').each(function(index) { if ($(this).val() != "") @@ -117,6 +117,16 @@ $(document).ready(function() { $('.stock-item-dropdown').trigger('change'); + /* Recalculate Source Total */ + $('table td .source-recalculate').live('click', function() { + var sourceTotal = calculateSourceStockTotal(); + $("table tr #source-total").text(sourceTotal); + if (sourceTotal >= 0) + $("table tr #source-total").css("background-color", "#FFFF99"); + else + $("table tr #source-total").css("background-color", "#FFE9E8"); + }); + /************************** DEST STOCK ITEM ***************************/ /* Stock Item dropdown changed */ $('.stock-item-dropdown').live('change', function() { @@ -189,15 +199,15 @@ $(document).ready(function() { itemrow.next().next().next().children().val(item_amount); itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } - $('.recalculate').trigger('click'); + $('.dest-recalculate').trigger('click'); } $('table td .dest-amount-stock-item').live('change', function() { - $('.recalculate').trigger('click'); + $('.dest-recalculate').trigger('click'); }); /* calculating stock total */ - var calculateStockTotal = function() { + var calculateDestStockTotal = function() { var stock_total = 0; $('table td .dest-amount-stock-item').each(function(index) { if ($(this).val() != "") @@ -230,13 +240,25 @@ $(document).ready(function() { $(this).parent().parent().remove(); }); + /* Recalculate Dest Total */ + $('table td .dest-recalculate').live('click', function() { + var destTotal = calculateDestStockTotal(); + $("table tr #dest-total").text(destTotal); + if (destTotal >= 0) + $("table tr #dest-total").css("background-color", "#FFFF99"); + else + $("table tr #dest-total").css("background-color", "#FFE9E8"); + }); + $('.stock-item-dropdown').trigger('change'); + $('table td .dest-recalculate').trigger('click'); + $('table td .source-recalculate').trigger('click'); }); </script> <?php - echo form_open('inventory/stockvoucher/add/' . $current_voucher_type['label']); + echo form_open('inventory/stocktransfer/add/' . $current_voucher_type['label']); echo "<p>"; echo "<span id=\"tooltip-target-1\">"; echo form_label('Voucher Number', 'voucher_number'); @@ -297,6 +319,7 @@ $(document).ready(function() { echo "</tr>"; } + echo "<tr id=\"source-total\"><td colspan=3><strong>Total</strong></td><td id=\"source-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'source-recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; echo "</table>"; echo "<h3>Destination</h3>"; @@ -343,6 +366,7 @@ $(document).ready(function() { echo "</tr>"; } + echo "<tr id=\"dest-total\"><td colspan=3><strong>Total</strong></td><td id=\"dest-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'dest-recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; echo "</table>"; echo "<br />"; commit e5a06b95d56ffd4ad94ac598336586d11a3b3eac Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Mar 4 22:42:48 2011 +0530 Updated stock transfer add javascript Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index 6cd1f0a..7be72a4 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -1348,63 +1348,24 @@ class StockTransfer extends Controller { return; } - function addrow() - { - $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); - $rate_item = array( - 'name' => 'rate_item[' . $i . ']', - 'id' => 'rate_item[' . $i . ']', - 'maxlength' => '5', - 'size' => '5', - 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", - 'class' => 'dr-item', - ); - $amount_item = array( - 'name' => 'amount_item[' . $i . ']', - 'id' => 'amount_item[' . $i . ']', - 'maxlength' => '15', - 'size' => '15', - 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", - 'class' => 'cr-item', - ); - echo "<tr>"; - echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', 'D') . "</td>"; - echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', '0') . "</td>"; - echo "<td>" . form_input($rate_item) . "</td>"; - echo "<td>" . form_input($amount_item) . "</td>"; - echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; - echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; - echo "<td class=\"ledger-balance\"><div></div></td>"; - echo "</tr>"; - return; - } - - function addstockrow() + function addstockrow($type) { $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); $stock_item_quantity = array( - 'name' => 'stock_item_quantity[' . $i . ']', - 'id' => 'stock_item_quantity[' . $i . ']', + 'name' => $type . '_stock_item_quantity[' . $i . ']', + 'id' => $type . '_stock_item_quantity[' . $i . ']', 'maxlength' => '15', 'size' => '9', 'value' => '', - 'class' => 'quantity-item', + 'class' => $type . '-quantity-stock-item', ); $stock_item_rate_per_unit = array( - 'name' => 'stock_item_rate_per_unit[' . $i . ']', - 'id' => 'stock_item_rate_per_unit[' . $i . ']', - 'maxlength' => '15', - 'size' => '9', - 'value' => '', - 'class' => 'rate-item', - ); - $stock_item_discount = array( - 'name' => 'stock_item_discount[' . $i . ']', - 'id' => 'stock_item_discount[' . $i . ']', + 'name' => $type . '_stock_item_rate_per_unit[' . $i . ']', + 'id' => $type . '_stock_item_rate_per_unit[' . $i . ']', 'maxlength' => '15', 'size' => '9', 'value' => '', - 'class' => 'discount-item', + 'class' => $type . '-rate-stock-item', ); $stock_item_amount = array( 'name' => 'stock_item_amount[' . $i . ']', @@ -1412,14 +1373,13 @@ class StockTransfer extends Controller { 'maxlength' => '15', 'size' => '15', 'value' => '', - 'class' => 'rate-item', + 'class' => $type . '-amount-stock-item', ); echo '<tr class="new-row">'; echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; echo "<td>" . form_input($stock_item_quantity) . "</td>"; echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; - echo "<td>" . form_input($stock_item_discount) . "</td>"; echo "<td>" . form_input($stock_item_amount) . "</td>"; echo '<td>'; echo img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Stock Item', 'class' => 'addstockrow')); @@ -1434,5 +1394,5 @@ class StockTransfer extends Controller { } } -/* End of file voucher.php */ +/* End of file stocktransfer.php */ /* Location: ./system/application/controllers/inventory/stocktransfer.php */ diff --git a/system/application/views/inventory/stocktransfer/add.php b/system/application/views/inventory/stocktransfer/add.php index 2ec94f2..e0af0a2 100644 --- a/system/application/views/inventory/stocktransfer/add.php +++ b/system/application/views/inventory/stocktransfer/add.php @@ -2,18 +2,16 @@ $(document).ready(function() { - /***************************** STOCK ITEM *****************************/ + /************************ SOURCE STOCK ITEM ***************************/ /* Stock Item dropdown changed */ $('.stock-item-dropdown').live('change', function() { if ($(this).val() == "0") { $(this).parent().next().children().attr('value', ""); $(this).parent().next().next().children().attr('value', ""); $(this).parent().next().next().next().children().attr('value', ""); - $(this).parent().next().next().next().next().children().attr('value', ""); $(this).parent().next().children().attr('disabled', 'disabled'); $(this).parent().next().next().children().attr('disabled', 'disabled'); $(this).parent().next().next().next().children().attr('disabled', 'disabled'); - $(this).parent().next().next().next().next().children().attr('disabled', 'disabled'); } else { $(this).parent().next().children().attr('disabled', ''); $(this).parent().next().next().children().attr('disabled', ''); @@ -27,8 +25,8 @@ $(document).ready(function() { $.ajax({ url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, success: function(data) { - rowid.parent().next().next().next().next().next().next().next().children().text(data); - rowid.parent().next().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().children().text(data); } }); @@ -45,70 +43,163 @@ $(document).ready(function() { } }); } else { - rowid.parent().next().next().next().next().next().next().next().children().text(""); + rowid.parent().next().next().next().next().next().next().children().text(""); } }); - $('table td .quantity-stock-item').live('change', function() { + $('table td .source-quantity-stock-item').live('change', function() { var rowid = $(this); calculateRowTotal(rowid.parent().prev()); }); - $('table td .rate-stock-item').live('change', function() { + $('table td .source-rate-stock-item').live('change', function() { var rowid = $(this); calculateRowTotal(rowid.parent().prev().prev()); }); - $('table td .discount-stock-item').live('change', function() { - var rowid = $(this); - calculateRowTotal(rowid.parent().prev().prev().prev()); - }); - var calculateRowTotal = function(itemrow) { var item_quantity = itemrow.next().children().val(); var item_rate_per_unit = itemrow.next().next().children().val(); - var item_discount = itemrow.next().next().next().children().val(); - var is_percent = false; - /* check whether discount is in percent or absolute value */ - if (item_discount != "") { - if (item_discount.match(/%$/)) + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) + { + /* calculating total amount for each stock item */ + var item_amount; + item_amount = (item_quantity * item_rate_per_unit); + + /* displaying total amount for each stock item */ + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + $('.recalculate').trigger('click'); + } + + $('table td .source-amount-stock-item').live('change', function() { + $('.recalculate').trigger('click'); + }); + + /* calculating stock total */ + var calculateStockTotal = function() { + var stock_total = 0; + $('table td .source-amount-stock-item').each(function(index) { + if ($(this).val() != "") { - is_percent = true; + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; } + }); + return stock_total; + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stocktransfer/addstockrow/source') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + $('.stock-item-dropdown').trigger('change'); + + /************************** DEST STOCK ITEM ***************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().children().text(data); + } + }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .dest-quantity-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + $('table td .dest-rate-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + item_quantity = parseFloat(item_quantity); item_rate_per_unit = parseFloat(item_rate_per_unit); - item_discount = parseFloat(item_discount); - if (isNaN(item_discount)) - item_discount = 0; + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) { /* calculating total amount for each stock item */ var item_amount; - if (is_percent) { - if (item_discount <= 100) - item_amount = ((item_quantity * item_rate_per_unit) * (100 - item_discount)) / 100; - } else { - item_amount = (item_quantity * item_rate_per_unit) - item_discount; - } + item_amount = (item_quantity * item_rate_per_unit); + /* displaying total amount for each stock item */ - itemrow.next().next().next().next().children().val(item_amount); - itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } - updateLedgerRowTotal(); $('.recalculate').trigger('click'); } - $('table td .amount-stock-item').live('change', function() { - updateLedgerRowTotal(); + $('table td .dest-amount-stock-item').live('change', function() { $('.recalculate').trigger('click'); }); /* calculating stock total */ var calculateStockTotal = function() { var stock_total = 0; - $('table td .amount-stock-item').each(function(index) { + $('table td .dest-amount-stock-item').each(function(index) { if ($(this).val() != "") { var item_amount = parseFloat($(this).val()); @@ -125,7 +216,7 @@ $(document).ready(function() { var add_image_url = $(cur_obj).attr('src'); $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); $.ajax({ - url: <?php echo '\'' . site_url('inventory/stockvoucher/addstockrow') . '\''; ?>, + url: <?php echo '\'' . site_url('inventory/stocktransfer/addstockrow/dest') . '\''; ?>, success: function(data) { $(cur_obj).parent().parent().after(data); $(cur_obj).attr('src', add_image_url); commit 07c5b5e5d10965fa2cd37f8378239f707b687f58 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Mar 2 22:59:53 2011 +0530 Updated stock transfer add Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index 035494e..6cd1f0a 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -363,38 +363,72 @@ class StockTransfer extends Controller { } /* Adding source stock items */ - $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); - $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); - $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); - $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); - $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + $data_all_source_stock_item_id = $this->input->post('source_stock_item_id', TRUE); + $data_all_source_stock_item_quantity = $this->input->post('source_stock_item_quantity', TRUE); + $data_all_source_stock_item_rate_per_unit = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data_all_source_stock_item_amount = $this->input->post('source_stock_item_amount', TRUE); - foreach ($data_all_stock_item_id as $id => $stock_data) + foreach ($data_all_source_stock_item_id as $id => $stock_data) { - $data_stock_item_id = $data_all_stock_item_id[$id]; + $data_source_stock_item_id = $data_all_source_stock_item_id[$id]; - if ($data_stock_item_id < 1) + if ($data_source_stock_item_id < 1) continue; - $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; - $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; - $data_stock_item_discount = $data_all_stock_item_discount[$id]; - $data_stock_item_amount = $data_all_stock_item_amount[$id]; + $data_source_stock_item_quantity = $data_all_source_stock_item_quantity[$id]; + $data_source_stock_item_rate_per_unit = $data_all_source_stock_item_rate_per_unit[$id]; + $data_source_stock_item_amount = $data_all_source_stock_item_amount[$id]; $insert_stock_data = array( 'voucher_id' => $voucher_id, - 'stock_item_id' => $data_stock_item_id, - 'quantity' => $data_stock_item_quantity, - 'rate_per_unit' => $data_stock_item_rate_per_unit, - 'discount' => $data_stock_item_discount, - 'total' => $data_stock_item_amount, - 'type' => $data_stock_item_type, + 'stock_item_id' => $data_source_stock_item_id, + 'quantity' => $data_source_stock_item_quantity, + 'rate_per_unit' => $data_source_stock_item_rate_per_unit, + 'discount' => '', + 'total' => $data_source_stock_item_amount, + 'type' => '2', ); if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { $this->db->trans_rollback(); - $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->messages->add('Error adding Stock Item - ' . $data_source_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_source_stock_item_id . "]"); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; + } + } + + /* Adding destination stock items */ + $data_all_dest_stock_item_id = $this->input->post('dest_stock_item_id', TRUE); + $data_all_dest_stock_item_quantity = $this->input->post('dest_stock_item_quantity', TRUE); + $data_all_dest_stock_item_rate_per_unit = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data_all_dest_stock_item_amount = $this->input->post('dest_stock_item_amount', TRUE); + + foreach ($data_all_dest_stock_item_id as $id => $stock_data) + { + $data_dest_stock_item_id = $data_all_dest_stock_item_id[$id]; + + if ($data_dest_stock_item_id < 1) + continue; + + $data_dest_stock_item_quantity = $data_all_dest_stock_item_quantity[$id]; + $data_dest_stock_item_rate_per_unit = $data_all_dest_stock_item_rate_per_unit[$id]; + $data_dest_stock_item_amount = $data_all_dest_stock_item_amount[$id]; + + $insert_stock_data = array( + 'voucher_id' => $voucher_id, + 'stock_item_id' => $data_dest_stock_item_id, + 'quantity' => $data_dest_stock_item_quantity, + 'rate_per_unit' => $data_dest_stock_item_rate_per_unit, + 'discount' => '', + 'total' => $data_dest_stock_item_amount, + 'type' => '1', + ); + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Stock Item - ' . $data_dest_stock_item_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_dest_stock_item_id . "]"); $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } @@ -414,7 +448,6 @@ class StockTransfer extends Controller { /* Showing success message in show() method since message is too long for storing it in session */ $this->logger->write_message("success", "Added " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); redirect('voucher/show/' . $current_voucher_type['label']); - $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } return; diff --git a/system/application/controllers/voucher.php b/system/application/controllers/voucher.php index 312728f..f3b2e27 100644 --- a/system/application/controllers/voucher.php +++ b/system/application/controllers/voucher.php @@ -52,7 +52,10 @@ class Voucher extends Controller { if ($current_voucher_type['base_type'] == '1') $this->template->set('nav_links', array('voucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); else - $this->template->set('nav_links', array('inventory/stockvoucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); + if ($current_voucher_type['stock_voucher_type'] == '3') + $this->template->set('nav_links', array('inventory/stocktransfer/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); + else + $this->template->set('nav_links', array('inventory/stockvoucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); } } commit 58d781d7b325efc0f4fe6c173574f802740d9439 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Tue Mar 1 23:09:46 2011 +0530 Added basic add stock transfer voucher Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php index 1dec9bd..035494e 100644 --- a/system/application/controllers/inventory/stocktransfer.php +++ b/system/application/controllers/inventory/stocktransfer.php @@ -161,25 +161,25 @@ class StockTransfer extends Controller { $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); if ($current_voucher_type['stock_voucher_type'] == '3') { - + /* TODO */ } $this->form_validation->set_rules('voucher_narration', 'trim'); $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); - /* Debit and Credit amount validation */ + /* stock item validation */ if ($_POST) { - foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + foreach ($this->input->post('source_stock_item_id', TRUE) as $id => $stock_data) { - $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); - $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); - $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); - $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + $this->form_validation->set_rules('source_stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('source_stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('source_stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); } - foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + foreach ($this->input->post('dest_stock_item_id', TRUE) as $id => $stock_data) { - $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); - $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); + $this->form_validation->set_rules('dest_stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('dest_stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('dest_stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); } } @@ -191,58 +191,49 @@ class StockTransfer extends Controller { $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); - $data['main_account_active'] = $this->input->post('main_account', TRUE); - $data['main_entity_active'] = $this->input->post('main_entity', TRUE); - - $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); - $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); - $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); - $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); - $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + $data['source_stock_item_id'] = $this->input->post('source_stock_item_id', TRUE); + $data['source_stock_item_quantity'] = $this->input->post('source_stock_item_quantity', TRUE); + $data['source_stock_item_rate_per_unit'] = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data['source_stock_item_amount'] = $this->input->post('source_stock_item_amount', TRUE); - $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); - $data['ledger_id'] = $this->input->post('ledger_id', TRUE); - $data['rate_item'] = $this->input->post('rate_item', TRUE); - $data['amount_item'] = $this->input->post('amount_item', TRUE); + $data['dest_stock_item_id'] = $this->input->post('dest_stock_item_id', TRUE); + $data['dest_stock_item_quantity'] = $this->input->post('dest_stock_item_quantity', TRUE); + $data['dest_stock_item_rate_per_unit'] = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data['dest_stock_item_amount'] = $this->input->post('dest_stock_item_amount', TRUE); } else { for ($count = 0; $count <= 3; $count++) { - $data['stock_item_id'][$count] = '0'; - $data['stock_item_quantity'][$count] = ''; - $data['stock_item_rate_per_unit'][$count] = ''; - $data['stock_item_discount'][$count] = ''; - $data['stock_item_amount'][$count] = ''; + $data['source_stock_item_id'][$count] = '0'; + $data['source_stock_item_quantity'][$count] = ''; + $data['source_stock_item_rate_per_unit'][$count] = ''; + $data['source_stock_item_amount'][$count] = ''; } - for ($count = 0; $count <= 1; $count++) + for ($count = 0; $count <= 3; $count++) { - $data['ledger_dc'][$count] = "D"; - $data['ledger_id'][$count] = 0; - $data['rate_item'][$count] = ""; - $data['amount_item'][$count] = ""; + $data['dest_stock_item_id'][$count] = '0'; + $data['dest_stock_item_quantity'][$count] = ''; + $data['dest_stock_item_rate_per_unit'][$count] = ''; + $data['dest_stock_item_amount'][$count] = ''; } } if ($this->form_validation->run() == FALSE) { $this->messages->add(validation_errors(), 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } else { - $data_main_account = $this->input->post('main_account', TRUE); - $data_main_entity = $this->input->post('main_entity', TRUE); + $data_all_source_stock_item_id = $this->input->post('source_stock_item_id', TRUE); + $data_all_source_stock_item_quantity = $this->input->post('source_stock_item_quantity', TRUE); + $data_all_source_stock_item_rate_per_unit = $this->input->post('source_stock_item_rate_per_unit', TRUE); + $data_all_source_stock_item_amount = $this->input->post('source_stock_item_amount', TRUE); - $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); - $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); - $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); - $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); - $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); - - $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_rate_item = $this->input->post('rate_item', TRUE); - $data_all_amount_item = $this->input->post('amount_item', TRUE); + $data_all_dest_stock_item_id = $this->input->post('dest_stock_item_id', TRUE); + $data_all_dest_stock_item_quantity = $this->input->post('dest_stock_item_quantity', TRUE); + $data_all_dest_stock_item_rate_per_unit = $this->input->post('dest_stock_item_rate_per_unit', TRUE); + $data_all_dest_stock_item_amount = $this->input->post('dest_stock_item_amount', TRUE); $data_total_amount = 0; @@ -252,102 +243,78 @@ class StockTransfer extends Controller { else $data_stock_item_type = 2; - /* Checking for Valid Stock Ledger A/C - account */ - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); - else - $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); - $valid_main_account_q = $this->db->get(); - if ($valid_main_account_q->num_rows() < 1) + /* Checking for Valid Stock Item */ + $source_stock_item_present = FALSE; + $data_total_source_stock_amount = 0; + foreach ($data_all_source_stock_item_id as $id => $stock_data) { - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); - else - $this->messages->add('Invalid Sale Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - /* Checking for Valid Stock Ledger A/C - entity */ - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); - else - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); - $valid_main_account_q = $this->db->get(); - if ($valid_main_account_q->num_rows() < 1) - { - if ($current_voucher_type['stock_voucher_type'] == '1') - $this->messages->add('Invalid Creditor (Supplier).', 'error'); - else - $this->messages->add('Invalid Debtor (Customer).', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - - /* Checking for Valid Stock Item A/C */ - $stock_item_present = FALSE; - $data_total_stock_amount = 0; - foreach ($data_all_stock_item_id as $id => $stock_data) - { - if ($data_all_stock_item_id[$id] < 1) + if ($data_all_source_stock_item_id[$id] < 1) continue; /* Check for valid stock item id */ - $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $this->db->from('stock_items')->where('id', $data_all_source_stock_item_id[$id]); $valid_stock_item_q = $this->db->get(); if ($valid_stock_item_q->num_rows() < 1) { - $this->messages->add('Invalid Stock Item.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->messages->add('Invalid Source Stock Item.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - $stock_item_present = TRUE; - $data_total_stock_amount += $data_all_stock_item_amount[$id]; + $source_stock_item_present = TRUE; + $data_total_source_stock_amount += $data_all_source_stock_item_amount[$id]; } - if ( ! $stock_item_present) + if ( ! $source_stock_item_present) { - $this->messages->add('No Stock Item selected.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->messages->add('No Soruce Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - - /* Checking for Valid Ledgers A/C */ - $data_total_ledger_amount = 0; - foreach ($data_all_ledger_dc as $id => $ledger_data) + $dest_stock_item_present = FALSE; + $data_total_dest_stock_amount = 0; + foreach ($data_all_dest_stock_item_id as $id => $stock_data) { - if ($data_all_ledger_id[$id] < 1) + if ($data_all_dest_stock_item_id[$id] < 1) continue; - /* Check for valid ledger id */ - $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); - $valid_ledger_q = $this->db->get(); - if ($valid_ledger_q->num_rows() < 1) + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_dest_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) { - $this->messages->add('Invalid Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->messages->add('Invalid Destination Stock Item.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } - if ($data_all_ledger_dc[$id] == 'D') - $data_total_ledger_amount += $data_all_amount_item[$id]; - else - $data_total_ledger_amount -= $data_all_amount_item[$id]; + $dest_stock_item_present = TRUE; + $data_total_dest_stock_amount += $data_all_dest_stock_item_amount[$id]; + } + if ( ! $dest_stock_item_present) + { + $this->messages->add('No Destination Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; } /* Total amount calculations */ - if ($current_voucher_type['stock_voucher_type'] == '1') + if ($data_total_source_stock_amount != $data_total_dest_stock_amount) { - $data_main_account_total = $data_total_stock_amount; - $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; - } else { - $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; - $data_main_entity_total = $data_total_stock_amount; + $this->messages->add('Source total does not match with Destination total.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; } - $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; - if ($data_total_amount < 0) + if ($data_total_source_stock_amount < 0) { - $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->messages->add('Source total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } + if ($data_total_dest_stock_amount < 0) + { + $this->messages->add('Destination total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stocktransfer/add', $data); + return; + } + $data_total_amount = $data_total_source_stock_amount; /* Adding main voucher */ if ($current_voucher_type['numbering'] == '2') @@ -381,81 +348,21 @@ class StockTransfer extends Controller { 'narration' => $data_narration, 'voucher_type' => $data_type, 'tag_id' => $data_tag, + 'dr_total' => $data_total_amount, + 'cr_total' => $data_total_amount, ); if ( ! $this->db->insert('vouchers', $insert_data)) { $this->db->trans_rollback(); $this->messages->add('Error addding Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher"); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } else { $voucher_id = $this->db->insert_id(); } - /* Adding main - account */ - $insert_data = array( - 'voucher_id' => $voucher_id, - 'ledger_id' => $data_main_account, - 'amount' => $data_main_account_total, - 'dc' => '', - 'reconciliation_date' => NULL, - 'stock_type' => 1, - 'stock_rate' => '', - ); - if ($current_voucher_type['stock_voucher_type'] == '1') - $insert_data['dc'] = 'D'; - else - $insert_data['dc'] = 'C'; - if ( ! $this->db->insert('voucher_items', $insert_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error adding Purchase Ledger A/C to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting purchase ledger " . "[id:" . $data_main_account . "]"); - } else { - $this->messages->add('Error adding Sale Ledger A/C to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting sale ledger " . "[id:" . $data_main_account . "]"); - } - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } else { - $main_voucher_id = $this->db->insert_id(); - } - - /* Adding main - entity */ - $insert_data = array( - 'voucher_id' => $voucher_id, - 'ledger_id' => $data_main_entity, - 'amount' => $data_main_entity_total, - 'dc' => '', - 'reconciliation_date' => NULL, - 'stock_type' => 2, - 'stock_rate' => '', - ); - if ($current_voucher_type['stock_voucher_type'] == '1') - $insert_data['dc'] = 'C'; - else - $insert_data['dc'] = 'D'; - if ( ! $this->db->insert('voucher_items', $insert_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error adding Creditor (Supplier) to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting creditor ledger " . "[id:" . $data_main_entity . "]"); - } else { - $this->messages->add('Error adding Debtor (Customer) - to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting debtor ledger " . "[id:" . $data_main_entity . "]"); - } - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } else { - $entity_voucher_id = $this->db->insert_id(); - } - - /* Adding stock items */ + /* Adding source stock items */ $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); @@ -488,62 +395,11 @@ class StockTransfer extends Controller { $this->db->trans_rollback(); $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - } - - /* Adding ledger accounts */ - $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_rate_item = $this->input->post('rate_item', TRUE); - $data_all_amount_item = $this->input->post('amount_item', TRUE); - - foreach ($data_all_ledger_dc as $id => $ledger_data) - { - $data_ledger_dc = $data_all_ledger_dc[$id]; - $data_ledger_id = $data_all_ledger_id[$id]; - - if ($data_ledger_id < 1) - continue; - - $data_rate = $data_all_rate_item[$id]; - $data_amount = $data_all_amount_item[$id]; - - $insert_ledger_data = array( - 'voucher_id' => $voucher_id, - 'ledger_id' => $data_ledger_id, - 'amount' => $data_amount, - 'dc' => $data_ledger_dc, - 'reconciliation_date' => NULL, - 'stock_type' => 3, - 'stock_rate' => $data_rate, - ); - if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) - { - $this->db->trans_rollback(); - $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } } - /* Updating Debit and Credit Total - vouchers */ - $update_data = array( - 'dr_total' => $data_total_amount, - 'cr_total' => $data_total_amount, - ); - - if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) - { - $this->db->trans_rollback(); - $this->messages->add('Error updating Voucher total.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - /* Success */ $this->db->trans_complete(); @@ -558,7 +414,7 @@ class StockTransfer extends Controller { /* Showing success message in show() method since message is too long for storing it in session */ $this->logger->write_message("success", "Added " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); redirect('voucher/show/' . $current_voucher_type['label']); - $this->template->load('template', 'inventory/stockvoucher/add', $data); + $this->template->load('template', 'inventory/stocktransfer/add', $data); return; } return; diff --git a/system/application/views/inventory/stocktransfer/add.php b/system/application/views/inventory/stocktransfer/add.php new file mode 100644 index 0000000..2ec94f2 --- /dev/null +++ b/system/application/views/inventory/stocktransfer/add.php @@ -0,0 +1,279 @@ +<script type="text/javascript"> + +$(document).ready(function() { + + /***************************** STOCK ITEM *****************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + rowid.parent().next().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); + } + }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .quantity-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + $('table td .rate-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + $('table td .discount-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + var item_discount = itemrow.next().next().next().children().val(); + var is_percent = false; + + /* check whether discount is in percent or absolute value */ + if (item_discount != "") { + if (item_discount.match(/%$/)) + { + is_percent = true; + } + } + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + item_discount = parseFloat(item_discount); + if (isNaN(item_discount)) + item_discount = 0; + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) + { + /* calculating total amount for each stock item */ + var item_amount; + if (is_percent) { + if (item_discount <= 100) + item_amount = ((item_quantity * item_rate_per_unit) * (100 - item_discount)) / 100; + } else { + item_amount = (item_quantity * item_rate_per_unit) - item_discount; + } + /* displaying total amount for each stock item */ + itemrow.next().next().next().next().children().val(item_amount); + itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + updateLedgerRowTotal(); + $('.recalculate').trigger('click'); + } + + $('table td .amount-stock-item').live('change', function() { + updateLedgerRowTotal(); + $('.recalculate').trigger('click'); + }); + + /* calculating stock total */ + var calculateStockTotal = function() { + var stock_total = 0; + $('table td .amount-stock-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; + } + }); + return stock_total; + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockvoucher/addstockrow') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + $('.stock-item-dropdown').trigger('change'); +}); + +</script> + +<?php + echo form_open('inventory/stockvoucher/add/' . $current_voucher_type['label']); + echo "<p>"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Voucher Number', 'voucher_number'); + echo " "; + echo $current_voucher_type['prefix'] . form_input($voucher_number) . $current_voucher_type['suffix']; + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Leave Voucher Number empty for auto numbering</span>"; + echo " "; + echo "<span id=\"tooltip-target-2\">"; + echo form_label('Voucher Date', 'voucher_date'); + echo " "; + echo form_input_date_restrict($voucher_date); + echo "</span>"; + echo "<span id=\"tooltip-content-2\">Date format is " . $this->config->item('account_date_format') . ".</span>"; + echo "</p>"; + + echo "<h3>Source</h3>"; + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($source_stock_item_id as $i => $row) + { + $source_stock_item_quantity_item = array( + 'name' => 'source_stock_item_quantity[' . $i . ']', + 'id' => 'source_stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($source_stock_item_quantity[$i]) ? $source_stock_item_quantity[$i] : '', + 'class' => 'source-quantity-stock-item', + ); + $source_stock_item_rate_per_unit_item = array( + 'name' => 'source_stock_item_rate_per_unit[' . $i . ']', + 'id' => 'source_stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($source_stock_item_rate_per_unit[$i]) ? $source_stock_item_rate_per_unit[$i] : '', + 'class' => 'source-rate-stock-item', + ); + $source_stock_item_amount_item = array( + 'name' => 'source_stock_item_amount[' . $i . ']', + 'id' => 'source_stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($source_stock_item_amount[$i]) ? $source_stock_item_amount[$i] : '', + 'class' => 'source-amount-stock-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('source_stock_item_id[' . $i . ']', isset($source_stock_item_id[$i]) ? $source_stock_item_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($source_stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($source_stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($source_stock_item_amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"source-stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "</table>"; + + echo "<h3>Destination</h3>"; + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($dest_stock_item_id as $i => $row) + { + $dest_stock_item_quantity_item = array( + 'name' => 'dest_stock_item_quantity[' . $i . ']', + 'id' => 'dest_stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($dest_stock_item_quantity[$i]) ? $dest_stock_item_quantity[$i] : '', + 'class' => 'dest-quantity-stock-item', + ); + $dest_stock_item_rate_per_unit_item = array( + 'name' => 'dest_stock_item_rate_per_unit[' . $i . ']', + 'id' => 'dest_stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($dest_stock_item_rate_per_unit[$i]) ? $dest_stock_item_rate_per_unit[$i] : '', + 'class' => 'dest-rate-stock-item', + ); + $dest_stock_item_amount_item = array( + 'name' => 'dest_stock_item_amount[' . $i . ']', + 'id' => 'dest_stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($dest_stock_item_amount[$i]) ? $dest_stock_item_amount[$i] : '', + 'class' => 'dest-amount-stock-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('dest_stock_item_id[' . $i . ']', isset($dest_stock_item_id[$i]) ? $dest_stock_item_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($dest_stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($dest_stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($dest_stock_item_amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"dest-stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "</table>"; + + echo "<br />"; + echo "<br />"; + + echo "<p>"; + echo form_label('Narration', 'voucher_narration'); + echo "<br />"; + echo form_textarea($voucher_narration); + echo "</p>"; + + echo "<p>"; + echo form_label('Tag', 'voucher_tag'); + echo " "; + echo form_dropdown('voucher_tag', $voucher_tags, $voucher_tag); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo "</p>"; + + echo form_close(); + commit 2b8a1f44400c7bee9b4ac8d3d705d6666e91e7b8 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Mon Feb 28 23:02:34 2011 +0530 Added basic links for stock transfer Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stocktransfer.php b/system/application/controllers/inventory/stocktransfer.php new file mode 100644 index 0000000..1dec9bd --- /dev/null +++ b/system/application/controllers/inventory/stocktransfer.php @@ -0,0 +1,1549 @@ +<?php + +class StockTransfer extends Controller { + + function StockTransfer() + { + parent::Controller(); + $this->load->model('Voucher_model'); + $this->load->model('Ledger_model'); + $this->load->model('Stock_Item_model'); + $this->load->model('Tag_model'); + return; + } + + function index() + { + redirect('voucher/show/all'); + return; + } + + function view($voucher_type, $voucher_id = 0) + { + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + + $this->template->set('page_title', 'View ' . $current_voucher_type['name'] . ' Voucher'); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $this->template->load('template', 'inventory/stockvoucher/view', $data); + return; + } + + function add($voucher_type) + { + /* Check access */ + if ( ! check_access('create stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + if ($current_voucher_type['stock_voucher_type'] != '3') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + + $this->template->set('page_title', 'New ' . $current_voucher_type['name'] . ' Voucher'); + + /* Form fields */ + $data['voucher_number'] = array( + 'name' => 'voucher_number', + 'id' => 'voucher_number', + 'maxlength' => '11', + 'size' => '11', + 'value' => '', + ); + $data['voucher_date'] = array( + 'name' => 'voucher_date', + 'id' => 'voucher_date', + 'maxlength' => '11', + 'size' => '11', + 'value' => date_today_php(), + ); + $data['voucher_narration'] = array( + 'name' => 'voucher_narration', + 'id' => 'voucher_narration', + 'cols' => '50', + 'rows' => '4', + 'value' => '', + ); + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_tags'] = $this->Tag_model->get_all_tags(); + $data['voucher_tag'] = 0; + + /* Form validations */ + if ($current_voucher_type['numbering'] == '2') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + else if ($current_voucher_type['numbering'] == '3') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + else + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + if ($current_voucher_type['stock_voucher_type'] == '3') + { + + } + $this->form_validation->set_rules('voucher_narration', 'trim'); + $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); + + /* Debit and Credit amount validation */ + if ($_POST) + { + foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + { + $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); + $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + } + foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + { + $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); + $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); + } + } + + /* Repopulating form */ + if ($_POST) + { + $data['voucher_number']['value'] = $this->input->post('voucher_number', TRUE); + $data['voucher_date']['value'] = $this->input->post('voucher_date', TRUE); + $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); + $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); + + $data['main_account_active'] = $this->input->post('main_account', TRUE); + $data['main_entity_active'] = $this->input->post('main_entity', TRUE); + + $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); + $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); + $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); + $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); + $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); + $data['ledger_id'] = $this->input->post('ledger_id', TRUE); + $data['rate_item'] = $this->input->post('rate_item', TRUE); + $data['amount_item'] = $this->input->post('amount_item', TRUE); + } else { + for ($count = 0; $count <= 3; $count++) + { + $data['stock_item_id'][$count] = '0'; + $data['stock_item_quantity'][$count] = ''; + $data['stock_item_rate_per_unit'][$count] = ''; + $data['stock_item_discount'][$count] = ''; + $data['stock_item_amount'][$count] = ''; + } + for ($count = 0; $count <= 1; $count++) + { + $data['ledger_dc'][$count] = "D"; + $data['ledger_id'][$count] = 0; + $data['rate_item'][$count] = ""; + $data['amount_item'][$count] = ""; + } + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + else + { + $data_main_account = $this->input->post('main_account', TRUE); + $data_main_entity = $this->input->post('main_entity', TRUE); + + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); + + $data_total_amount = 0; + + /* Setting Stock Item type */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $data_stock_item_type = 1; + else + $data_stock_item_type = 2; + + /* Checking for Valid Stock Ledger A/C - account */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); + else + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); + else + $this->messages->add('Invalid Sale Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + /* Checking for Valid Stock Ledger A/C - entity */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); + else + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Creditor (Supplier).', 'error'); + else + $this->messages->add('Invalid Debtor (Customer).', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Checking for Valid Stock Item A/C */ + $stock_item_present = FALSE; + $data_total_stock_amount = 0; + foreach ($data_all_stock_item_id as $id => $stock_data) + { + if ($data_all_stock_item_id[$id] < 1) + continue; + + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Item.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + $stock_item_present = TRUE; + $data_total_stock_amount += $data_all_stock_item_amount[$id]; + } + if ( ! $stock_item_present) + { + $this->messages->add('No Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Checking for Valid Ledgers A/C */ + $data_total_ledger_amount = 0; + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + if ($data_all_ledger_id[$id] < 1) + continue; + + /* Check for valid ledger id */ + $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); + $valid_ledger_q = $this->db->get(); + if ($valid_ledger_q->num_rows() < 1) + { + $this->messages->add('Invalid Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + if ($data_all_ledger_dc[$id] == 'D') + $data_total_ledger_amount += $data_all_amount_item[$id]; + else + $data_total_ledger_amount -= $data_all_amount_item[$id]; + } + + /* Total amount calculations */ + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $data_main_account_total = $data_total_stock_amount; + $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + } else { + $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; + $data_main_entity_total = $data_total_stock_amount; + } + $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; + if ($data_total_amount < 0) + { + $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Adding main voucher */ + if ($current_voucher_type['numbering'] == '2') + { + $data_number = $this->input->post('voucher_number', TRUE); + } else if ($current_voucher_type['numbering'] == '3') { + $data_number = $this->input->post('voucher_number', TRUE); + if ( ! $data_number) + $data_number = NULL; + } else { + if ($this->input->post('voucher_number', TRUE)) + $data_number = $this->input->post('voucher_number', TRUE); + else + $data_number = $this->Voucher_model->next_voucher_number($voucher_type_id); + } + + $data_date = $this->input->post('voucher_date', TRUE); + $data_narration = $this->input->post('voucher_narration', TRUE); + $data_tag = $this->input->post('voucher_tag', TRUE); + if ($data_tag < 1) + $data_tag = NULL; + $data_type = $voucher_type_id; + $data_date = date_php_to_mysql($data_date); // Converting date to MySQL + $voucher_id = NULL; + + /* Adding Voucher */ + $this->db->trans_start(); + $insert_data = array( + 'number' => $data_number, + 'date' => $data_date, + 'narration' => $data_narration, + 'voucher_type' => $data_type, + 'tag_id' => $data_tag, + ); + if ( ! $this->db->insert('vouchers', $insert_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error addding Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else { + $voucher_id = $this->db->insert_id(); + } + + /* Adding main - account */ + $insert_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_main_account, + 'amount' => $data_main_account_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 1, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'D'; + else + $insert_data['dc'] = 'C'; + if ( ! $this->db->insert('voucher_items', $insert_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error adding Purchase Ledger A/C to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting purchase ledger " . "[id:" . $data_main_account . "]"); + } else { + $this->messages->add('Error adding Sale Ledger A/C to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting sale ledger " . "[id:" . $data_main_account . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else { + $main_voucher_id = $this->db->insert_id(); + } + + /* Adding main - entity */ + $insert_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_main_entity, + 'amount' => $data_main_entity_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 2, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'C'; + else + $insert_data['dc'] = 'D'; + if ( ! $this->db->insert('voucher_items', $insert_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error adding Creditor (Supplier) to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting creditor ledger " . "[id:" . $data_main_entity . "]"); + } else { + $this->messages->add('Error adding Debtor (Customer) - to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting debtor ledger " . "[id:" . $data_main_entity . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else { + $entity_voucher_id = $this->db->insert_id(); + } + + /* Adding stock items */ + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + foreach ($data_all_stock_item_id as $id => $stock_data) + { + $data_stock_item_id = $data_all_stock_item_id[$id]; + + if ($data_stock_item_id < 1) + continue; + + $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; + $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; + $data_stock_item_discount = $data_all_stock_item_discount[$id]; + $data_stock_item_amount = $data_all_stock_item_amount[$id]; + + $insert_stock_data = array( + 'voucher_id' => $voucher_id, + 'stock_item_id' => $data_stock_item_id, + 'quantity' => $data_stock_item_quantity, + 'rate_per_unit' => $data_stock_item_rate_per_unit, + 'discount' => $data_stock_item_discount, + 'total' => $data_stock_item_amount, + 'type' => $data_stock_item_type, + ); + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } + + /* Adding ledger accounts */ + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); + + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + $data_ledger_dc = $data_all_ledger_dc[$id]; + $data_ledger_id = $data_all_ledger_id[$id]; + + if ($data_ledger_id < 1) + continue; + + $data_rate = $data_all_rate_item[$id]; + $data_amount = $data_all_amount_item[$id]; + + $insert_ledger_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_ledger_id, + 'amount' => $data_amount, + 'dc' => $data_ledger_dc, + 'reconciliation_date' => NULL, + 'stock_type' => 3, + 'stock_rate' => $data_rate, + ); + if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } + + /* Updating Debit and Credit Total - vouchers */ + $update_data = array( + 'dr_total' => $data_total_amount, + 'cr_total' => $data_total_amount, + ); + + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Success */ + $this->db->trans_complete(); + + $this->session->set_userdata('voucher_added_show_action', TRUE); + $this->session->set_userdata('voucher_added_id', $voucher_id); + $this->session->set_userdata('voucher_added_type_id', $voucher_type_id); + $this->session->set_userdata('voucher_added_type_label', $current_voucher_type['label']); + $this->session->set_userdata('voucher_added_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_added_type_base_type', $current_voucher_type['base_type']); + $this->session->set_userdata('voucher_added_number', $data_number); + + /* Showing success message in show() method since message is too long for storing it in session */ + $this->logger->write_message("success", "Added " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + redirect('voucher/show/' . $current_voucher_type['label']); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + return; + } + + function edit($voucher_type, $voucher_id = 0) + { + /* Check access */ + if ( ! check_access('edit stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $this->template->set('page_title', 'Edit ' . $current_voucher_type['name'] . ' Voucher'); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Form fields - Voucher */ + $data['voucher_number'] = array( + 'name' => 'voucher_number', + 'id' => 'voucher_number', + 'maxlength' => '11', + 'size' => '11', + 'value' => $cur_voucher->number, + ); + $data['voucher_date'] = array( + 'name' => 'voucher_date', + 'id' => 'voucher_date', + 'maxlength' => '11', + 'size' => '11', + 'value' => date_mysql_to_php($cur_voucher->date), + ); + $data['voucher_narration'] = array( + 'name' => 'voucher_narration', + 'id' => 'voucher_narration', + 'cols' => '50', + 'rows' => '4', + 'value' => $cur_voucher->narration, + ); + $data['voucher_id'] = $voucher_id; + $data['main_account_active'] = 0; + $data['main_entity_active'] = 0; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_tag'] = $cur_voucher->tag_id; + $data['voucher_tags'] = $this->Tag_model->get_all_tags(); + $data['has_reconciliation'] = FALSE; + + /* Load current ledger details if not $_POST */ + if ( ! $_POST) + { + /* main - account */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1); + $cur_main_account_q = $this->db->get(); + $cur_main_account = $cur_main_account_q->row(); + $data['main_account_active'] = $cur_main_account->ledger_id; + + /* main - entity */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2); + $cur_main_entity_q = $this->db->get(); + $cur_main_entity = $cur_main_entity_q->row(); + $data['main_entity_active'] = $cur_main_entity->ledger_id; + + /* ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3); + $cur_ledgers_q = $this->db->get(); + $counter = 0; + foreach ($cur_ledgers_q->result() as $row) + { + $data['ledger_dc'][$counter] = $row->dc; + $data['ledger_id'][$counter] = $row->ledger_id; + $data['rate_item'][$counter] = $row->stock_rate; + $data['amount_item'][$counter] = $row->amount; + if ($row->reconciliation_date) + $data['has_reconciliation'] = TRUE; + $counter++; + } + /* one extra rows */ + $data['ledger_dc'][$counter] = 'D'; + $data['ledger_id'][$counter] = 0; + $data['rate_item'][$counter] = ""; + $data['amount_item'][$counter] = ""; + $counter++; + + /* stock items */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id); + $cur_stock_item_q = $this->db->get(); + $counter = 0; + foreach ($cur_stock_item_q->result() as $row) + { + $data['stock_item_id'][$counter] = $row->stock_item_id; + $data['stock_item_quantity'][$counter] = $row->quantity; + $data['stock_item_rate_per_unit'][$counter] = $row->rate_per_unit; + $data['stock_item_discount'][$counter] = $row->discount; + $data['stock_item_amount'][$counter] = $row->total; + $counter++; + } + /* one extra rows */ + $data['stock_item_id'][$counter] = '0'; + $data['stock_item_quantity'][$counter] = ""; + $data['stock_item_rate_per_unit'][$counter] = ""; + $data['stock_item_discount'][$counter] = ""; + $data['stock_item_amount'][$counter] = ""; + $counter++; + } + + /* Form validations */ + if ($current_voucher_type['numbering'] == '3') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); + else + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); + $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->form_validation->set_rules('main_account', 'Purchase Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Creditors (Supplier)', 'trim|required'); + } else { + $this->form_validation->set_rules('main_account', 'Sale Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Debtor (Customer)', 'trim|required'); + } + $this->form_validation->set_rules('voucher_narration', 'trim'); + $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); + + /* Debit and Credit amount validation */ + if ($_POST) + { + foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + { + $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); + $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + } + foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + { + $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); + $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); + } + } + + /* Repopulating form */ + if ($_POST) + { + $data['voucher_number']['value'] = $this->input->post('voucher_number', TRUE); + $data['voucher_date']['value'] = $this->input->post('voucher_date', TRUE); + $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); + $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); + $data['has_reconciliation'] = $this->input->post('has_reconciliation', TRUE); + + $data['main_account_active'] = $this->input->post('main_account', TRUE); + $data['main_entity_active'] = $this->input->post('main_entity', TRUE); + + $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); + $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); + $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); + $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); + $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); + $data['ledger_id'] = $this->input->post('ledger_id', TRUE); + $data['rate_item'] = $this->input->post('rate_item', TRUE); + $data['amount_item'] = $this->input->post('amount_item', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + } else { + $data_main_account = $this->input->post('main_account', TRUE); + $data_main_entity = $this->input->post('main_entity', TRUE); + + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); + + $data_total_amount = 0; + + /* Setting Stock Item type */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $data_stock_item_type = 1; + else + $data_stock_item_type = 2; + + /* Checking for Valid Stock Ledger A/C - account */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); + else + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); + else + $this->messages->add('Invalid Sale Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + /* Checking for Valid Stock Ledger A/C - entity */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); + else + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Creditor (Supplier).', 'error'); + else + $this->messages->add('Invalid Debtor (Customer).', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Checking for Valid Stock Item A/C */ + $stock_item_present = FALSE; + $data_total_stock_amount = 0; + foreach ($data_all_stock_item_id as $id => $stock_data) + { + if ($data_all_stock_item_id[$id] < 1) + continue; + + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Item.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + $stock_item_present = TRUE; + $data_total_stock_amount += $data_all_stock_item_amount[$id]; + } + if ( ! $stock_item_present) + { + $this->messages->add('No Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Checking for Valid Ledgers A/C */ + $data_total_ledger_amount = 0; + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + if ($data_all_ledger_id[$id] < 1) + continue; + + /* Check for valid ledger id */ + $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); + $valid_ledger_q = $this->db->get(); + if ($valid_ledger_q->num_rows() < 1) + { + $this->messages->add('Invalid Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + if ($data_all_ledger_dc[$id] == 'D') + $data_total_ledger_amount += $data_all_amount_item[$id]; + else + $data_total_ledger_amount -= $data_all_amount_item[$id]; + } + + /* Total amount calculations */ + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $data_main_account_total = $data_total_stock_amount; + $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + } else { + $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; + $data_main_entity_total = $data_total_stock_amount; + } + $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; + if ($data_total_amount < 0) + { + $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Updating main voucher */ + if ($current_voucher_type['numbering'] == '3') { + $data_number = $this->input->post('voucher_number', TRUE); + if ( ! $data_number) + $data_number = NULL; + } else { + $data_number = $this->input->post('voucher_number', TRUE); + } + + $data_date = $this->input->post('voucher_date', TRUE); + $data_narration = $this->input->post('voucher_narration', TRUE); + $data_tag = $this->input->post('voucher_tag', TRUE); + if ($data_tag < 1) + $data_tag = NULL; + $data_type = $voucher_type_id; + $data_date = date_php_to_mysql($data_date); // Converting date to MySQL + $data_has_reconciliation = $this->input->post('has_reconciliation', TRUE); + + $this->db->trans_start(); + $update_data = array( + 'number' => $data_number, + 'date' => $data_date, + 'narration' => $data_narration, + 'tag_id' => $data_tag, + ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher A/C.', 'error'); + $this->logger->write_message("error", "Error updating voucher details for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* TODO : Deleting all old ledger data, Bad solution */ + if ( ! $this->db->delete('stock_voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting previous stock items from Voucher.', 'error'); + $this->logger->write_message("error", "Error deleting previous stock items from " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))->where('stock_type', 3)) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); + $this->logger->write_message("error", "Error deleting previous voucher items for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Updating main - account */ + $update_data = array( + 'ledger_id' => $data_main_account, + 'amount' => $data_main_account_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 1, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $update_data['dc'] = 'D'; + else + $update_data['dc'] = 'C'; + if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 1)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Purchase Ledger A/C of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating purchase ledger " . "[id:" . $data_main_account . "]"); + } else { + $this->messages->add('Error updating Sale Ledger A/C of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger " . "[id:" . $data_main_account . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Updating main - entity */ + $update_data = array( + 'ledger_id' => $data_main_entity, + 'amount' => $data_main_entity_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 2, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'C'; + else + $insert_data['dc'] = 'D'; + if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 2)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Creditor (Supplier) of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating creditor ledger " . "[id:" . $data_main_entity . "]"); + } else { + $this->messages->add('Error updating Debtor (Customer) of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor ledger " . "[id:" . $data_main_entity . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Adding stock items */ + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + foreach ($data_all_stock_item_id as $id => $stock_data) + { + $data_stock_item_id = $data_all_stock_item_id[$id]; + + if ($data_stock_item_id < 1) + continue; + + $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; + $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; + $data_stock_item_discount = $data_all_stock_item_discount[$id]; + $data_stock_item_amount = $data_all_stock_item_amount[$id]; + + $insert_stock_data = array( + 'voucher_id' => $voucher_id, + 'stock_item_id' => $data_stock_item_id, + 'quantity' => $data_stock_item_quantity, + 'rate_per_unit' => $data_stock_item_rate_per_unit, + 'discount' => $data_stock_item_discount, + 'total' => $data_stock_item_amount, + 'type' => $data_stock_item_type, + ); + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + } + + /* Adding ledger accounts */ + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); + + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + $data_ledger_dc = $data_all_ledger_dc[$id]; + $data_ledger_id = $data_all_ledger_id[$id]; + + if ($data_ledger_id < 1) + continue; + + $data_rate = $data_all_rate_item[$id]; + $data_amount = $data_all_amount_item[$id]; + + $insert_ledger_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_ledger_id, + 'amount' => $data_amount, + 'dc' => $data_ledger_dc, + 'reconciliation_date' => NULL, + 'stock_type' => 3, + 'stock_rate' => $data_rate, + ); + if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + } + + /* Updating Debit and Credit Total - vouchers */ + $update_data = array( + 'dr_total' => $data_total_amount, + 'cr_total' => $data_total_amount, + ); + + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher total.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Success */ + $this->db->trans_complete(); + + $this->session->set_userdata('voucher_updated_show_action', TRUE); + $this->session->set_userdata('voucher_updated_id', $voucher_id); + $this->session->set_userdata('voucher_updated_type_id', $voucher_type_id); + $this->session->set_userdata('voucher_updated_type_label', $current_voucher_type['label']); + $this->session->set_userdata('voucher_updated_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_updated_number', $data_number); + if ($data_has_reconciliation) + $this->session->set_userdata('voucher_updated_has_reconciliation', TRUE); + else + $this->session->set_userdata('voucher_updated_has_reconciliation', FALSE); + + /* Showing success message in show() method since message is too long for storing it in session */ + $this->logger->write_message("success", "Updated " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + return; + } + + function delete($voucher_type, $voucher_id = 0) + { + /* Check access */ + if ( ! check_access('delete stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + $this->db->trans_start(); + if ( ! $this->db->delete('stock_voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Stock Items.', 'error'); + $this->logger->write_message("error", "Error deleting stock item entries for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Voucher - Ledger A/C\'s.', 'error'); + $this->logger->write_message("error", "Error deleting ledger entries for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } + if ( ! $this->db->delete('vouchers', array('id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Voucher entry.', 'error'); + $this->logger->write_message("error", "Error deleting Voucher entry for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } + $this->db->trans_complete(); + $this->messages->add('Deleted ' . $current_voucher_type['name'] . ' Voucher.', 'success'); + $this->logger->write_message("success", "Deleted " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + function download($voucher_type, $voucher_id = 0) + { + $this->load->helper('download'); + $this->load->model('Setting_model'); + + /* Check access */ + if ( ! check_access('download stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + + /* Download Voucher */ + $file_name = $current_voucher_type['name'] . '_voucher_' . $cur_voucher->number . ".html"; + $download_data = $this->load->view('inventory/stockvoucher/downloadpreview', $data, TRUE); + force_download($file_name, $download_data); + return; + } + + function printpreview($voucher_type, $voucher_id = 0) + { + $this->load->model('Setting_model'); + + /* Check access */ + if ( ! check_access('print stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + + $this->load->view('inventory/stockvoucher/printpreview', $data); + return; + } + + function email($voucher_type, $voucher_id = 0) + { + $this->load->model('Setting_model'); + $this->load->library('email'); + + /* Check access */ + if ( ! check_access('email stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $account_data = $this->Setting_model->get_current(); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_id'] = $voucher_id; + $data['voucher_number'] = $cur_voucher->number; + $data['email_to'] = array( + 'name' => 'email_to', + 'id' => 'email_to', + 'size' => '40', + 'value' => '', + ); + + /* Form validations */ + $this->form_validation->set_rules('email_to', 'Email to', 'trim|valid_emails|required'); + + /* Repopulating form */ + if ($_POST) + { + $data['email_to']['value'] = $this->input->post('email_to', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $data['error'] = validation_errors(); + $this->load->view('inventory/stockvoucher/email', $data); + return; + } + else + { + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + + /* Preparing message */ + $message = $this->load->view('inventory/stockvoucher/emailpreview', $data, TRUE); + + /* Getting email configuration */ + $config['smtp_timeout'] = '30'; + $config['charset'] = 'utf-8'; + $config['newline'] = "\r\n"; + $config['mailtype'] = "html"; + if ($account_data) + { + $config['protocol'] = $account_data->email_protocol; + $config['smtp_host'] = $account_data->email_host; + $config['smtp_port'] = $account_data->email_port; + $config['smtp_user'] = $account_data->email_username; + $config['smtp_pass'] = $account_data->email_password; + } else { + $data['error'] = 'Invalid account settings.'; + } + $this->email->initialize($config); + + /* Sending email */ + $this->email->from('', 'Webzash'); + $this->email->to($this->input->post('email_to', TRUE)); + $this->email->subject($current_voucher_type['name'] . ' Voucher No. ' . full_voucher_number($voucher_type_id, $cur_voucher->number)); + $this->email->message($message); + if ($this->email->send()) + { + $data['message'] = "Email sent."; + $this->logger->write_message("success", "Emailed " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + } else { + $data['error'] = "Error sending email. Check you email settings."; + $this->logger->write_message("error", "Error emailing " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + } + $this->load->view('inventory/stockvoucher/email', $data); + return; + } + return; + } + + function addrow() + { + $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); + $rate_item = array( + 'name' => 'rate_item[' . $i . ']', + 'id' => 'rate_item[' . $i . ']', + 'maxlength' => '5', + 'size' => '5', + 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", + 'class' => 'dr-item', + ); + $amount_item = array( + 'name' => 'amount_item[' . $i . ']', + 'id' => 'amount_item[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", + 'class' => 'cr-item', + ); + echo "<tr>"; + echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', 'D') . "</td>"; + echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', '0') . "</td>"; + echo "<td>" . form_input($rate_item) . "</td>"; + echo "<td>" . form_input($amount_item) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; + echo "<td class=\"ledger-balance\"><div></div></td>"; + echo "</tr>"; + return; + } + + function addstockrow() + { + $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); + $stock_item_quantity = array( + 'name' => 'stock_item_quantity[' . $i . ']', + 'id' => 'stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'quantity-item', + ); + $stock_item_rate_per_unit = array( + 'name' => 'stock_item_rate_per_unit[' . $i . ']', + 'id' => 'stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'rate-item', + ); + $stock_item_discount = array( + 'name' => 'stock_item_discount[' . $i . ']', + 'id' => 'stock_item_discount[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'discount-item', + ); + $stock_item_amount = array( + 'name' => 'stock_item_amount[' . $i . ']', + 'id' => 'stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => '', + 'class' => 'rate-item', + ); + + echo '<tr class="new-row">'; + echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; + echo "<td>" . form_input($stock_item_quantity) . "</td>"; + echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; + echo "<td>" . form_input($stock_item_discount) . "</td>"; + echo "<td>" . form_input($stock_item_amount) . "</td>"; + echo '<td>'; + echo img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Stock Item', 'class' => 'addstockrow')); + echo '</td>'; + echo '<td>'; + echo img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Stock Item', 'class' => 'deletestockrow')); + echo '</td>'; + echo '<td class="stock-item-balance"><div></div>'; + echo '</td>'; + echo '</tr>'; + return; + } +} + +/* End of file voucher.php */ +/* Location: ./system/application/controllers/inventory/stocktransfer.php */ diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 57859f9..a24ba74 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -1546,4 +1546,4 @@ class StockVoucher extends Controller { } /* End of file voucher.php */ -/* Location: ./system/application/controllers/voucher.php */ +/* Location: ./system/application/controllers/inventory/stockvoucher.php */ diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index 9a26499..53096e5 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -151,12 +151,18 @@ class Ledger_model extends Model { if ($current_voucher_type['base_type'] == '1') $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else - $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + if ($current_voucher_type['stock_voucher_type'] == '3') + $html .= anchor('inventory/stocktransfer/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + else + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else if ($current_voucher_type['base_type'] == '1') $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else - $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + if ($current_voucher_type['stock_voucher_type'] == '3') + $html .= anchor('inventory/stocktransfer/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + else + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); return $html; } return; diff --git a/system/application/views/voucher/index.php b/system/application/views/voucher/index.php index 3285cf5..1e064c1 100644 --- a/system/application/views/voucher/index.php +++ b/system/application/views/voucher/index.php @@ -42,11 +42,20 @@ echo " " . anchor_popup('voucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; echo " " . anchor('voucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; } else { - echo "<td>" . anchor('inventory/stockvoucher/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; - echo " " . anchor('inventory/stockvoucher/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; - echo " " . anchor_popup('inventory/stockvoucher/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; - echo " " . anchor_popup('inventory/stockvoucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; - echo " " . anchor('inventory/stockvoucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + if ($current_voucher_type['stock_voucher_type'] == '3') + { + echo "<td>" . anchor('inventory/stocktransfer/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; + echo " " . anchor('inventory/stocktransfer/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; + echo " " . anchor_popup('inventory/stocktransfer/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; + echo " " . anchor_popup('inventory/stocktransfer/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; + echo " " . anchor('inventory/stocktransfer/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + } else { + echo "<td>" . anchor('inventory/stockvoucher/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; + echo " " . anchor('inventory/stockvoucher/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; + echo " " . anchor_popup('inventory/stockvoucher/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; + echo " " . anchor_popup('inventory/stockvoucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; + echo " " . anchor('inventory/stockvoucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + } } echo "</tr>"; commit ca0c3d8fd4697cdc2f4da1913b9e21157f3b2d20 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Feb 23 22:17:14 2011 +0530 Added stock voucher edit Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index e284ac4..57859f9 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -567,7 +567,7 @@ class StockVoucher extends Controller { function edit($voucher_type, $voucher_id = 0) { /* Check access */ - if ( ! check_access('edit voucher')) + if ( ! check_access('edit stock voucher')) { $this->messages->add('Permission denied.', 'error'); redirect('inventory/stockvoucher/show/' . $voucher_type); @@ -626,6 +626,8 @@ class StockVoucher extends Controller { 'value' => $cur_voucher->narration, ); $data['voucher_id'] = $voucher_id; + $data['main_account_active'] = 0; + $data['main_entity_active'] = 0; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; $data['voucher_tag'] = $cur_voucher->tag_id; @@ -635,39 +637,58 @@ class StockVoucher extends Controller { /* Load current ledger details if not $_POST */ if ( ! $_POST) { - $this->db->from('voucher_items')->where('voucher_id', $voucher_id); + /* main - account */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1); + $cur_main_account_q = $this->db->get(); + $cur_main_account = $cur_main_account_q->row(); + $data['main_account_active'] = $cur_main_account->ledger_id; + + /* main - entity */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2); + $cur_main_entity_q = $this->db->get(); + $cur_main_entity = $cur_main_entity_q->row(); + $data['main_entity_active'] = $cur_main_entity->ledger_id; + + /* ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3); $cur_ledgers_q = $this->db->get(); - if ($cur_ledgers_q->num_rows <= 0) - { - $this->messages->add('No Ledger A/C\'s found!', 'error'); - } $counter = 0; foreach ($cur_ledgers_q->result() as $row) { $data['ledger_dc'][$counter] = $row->dc; $data['ledger_id'][$counter] = $row->ledger_id; - if ($row->dc == "D") - { - $data['dr_amount'][$counter] = $row->amount; - $data['cr_amount'][$counter] = ""; - } else { - $data['dr_amount'][$counter] = ""; - $data['cr_amount'][$counter] = $row->amount; - } + $data['rate_item'][$counter] = $row->stock_rate; + $data['amount_item'][$counter] = $row->amount; if ($row->reconciliation_date) $data['has_reconciliation'] = TRUE; $counter++; } - /* Two extra rows */ + /* one extra rows */ $data['ledger_dc'][$counter] = 'D'; $data['ledger_id'][$counter] = 0; - $data['dr_amount'][$counter] = ""; - $data['cr_amount'][$counter] = ""; + $data['rate_item'][$counter] = ""; + $data['amount_item'][$counter] = ""; $counter++; - $data['ledger_dc'][$counter] = 'D'; - $data['ledger_id'][$counter] = 0; - $data['dr_amount'][$counter] = ""; - $data['cr_amount'][$counter] = ""; + + /* stock items */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id); + $cur_stock_item_q = $this->db->get(); + $counter = 0; + foreach ($cur_stock_item_q->result() as $row) + { + $data['stock_item_id'][$counter] = $row->stock_item_id; + $data['stock_item_quantity'][$counter] = $row->quantity; + $data['stock_item_rate_per_unit'][$counter] = $row->rate_per_unit; + $data['stock_item_discount'][$counter] = $row->discount; + $data['stock_item_amount'][$counter] = $row->total; + $counter++; + } + /* one extra rows */ + $data['stock_item_id'][$counter] = '0'; + $data['stock_item_quantity'][$counter] = ""; + $data['stock_item_rate_per_unit'][$counter] = ""; + $data['stock_item_discount'][$counter] = ""; + $data['stock_item_amount'][$counter] = ""; $counter++; } @@ -677,16 +698,31 @@ class StockVoucher extends Controller { else $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->form_validation->set_rules('main_account', 'Purchase Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Creditors (Supplier)', 'trim|required'); + } else { + $this->form_validation->set_rules('main_account', 'Sale Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Debtor (Customer)', 'trim|required'); + } $this->form_validation->set_rules('voucher_narration', 'trim'); $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); /* Debit and Credit amount validation */ if ($_POST) { + foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + { + $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); + $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + } foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) { - $this->form_validation->set_rules('dr_amount[' . $id . ']', 'Debit Amount', 'trim|currency'); - $this->form_validation->set_rules('cr_amount[' . $id . ']', 'Credit Amount', 'trim|currency'); + $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); + $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); } } @@ -699,26 +735,108 @@ class StockVoucher extends Controller { $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); $data['has_reconciliation'] = $this->input->post('has_reconciliation', TRUE); + $data['main_account_active'] = $this->input->post('main_account', TRUE); + $data['main_entity_active'] = $this->input->post('main_entity', TRUE); + + $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); + $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); + $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); + $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); + $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); $data['ledger_id'] = $this->input->post('ledger_id', TRUE); - $data['dr_amount'] = $this->input->post('dr_amount', TRUE); - $data['cr_amount'] = $this->input->post('cr_amount', TRUE); + $data['rate_item'] = $this->input->post('rate_item', TRUE); + $data['amount_item'] = $this->input->post('amount_item', TRUE); } if ($this->form_validation->run() == FALSE) { $this->messages->add(validation_errors(), 'error'); - $this->template->load('template', 'voucher/edit', $data); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); } else { - /* Checking for Valid Ledgers A/C and Debit and Credit Total */ + $data_main_account = $this->input->post('main_account', TRUE); + $data_main_entity = $this->input->post('main_entity', TRUE); + + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_dr_amount = $this->input->post('dr_amount', TRUE); - $data_all_cr_amount = $this->input->post('cr_amount', TRUE); - $dr_total = 0; - $cr_total = 0; - $bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is Bank or Cash A/C */ - $non_bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is NOT a Bank or Cash A/C */ + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); + + $data_total_amount = 0; + + /* Setting Stock Item type */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $data_stock_item_type = 1; + else + $data_stock_item_type = 2; + + /* Checking for Valid Stock Ledger A/C - account */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); + else + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); + else + $this->messages->add('Invalid Sale Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + /* Checking for Valid Stock Ledger A/C - entity */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); + else + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Creditor (Supplier).', 'error'); + else + $this->messages->add('Invalid Debtor (Customer).', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Checking for Valid Stock Item A/C */ + $stock_item_present = FALSE; + $data_total_stock_amount = 0; + foreach ($data_all_stock_item_id as $id => $stock_data) + { + if ($data_all_stock_item_id[$id] < 1) + continue; + + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Item.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + $stock_item_present = TRUE; + $data_total_stock_amount += $data_all_stock_item_amount[$id]; + } + if ( ! $stock_item_present) + { + $this->messages->add('No Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Checking for Valid Ledgers A/C */ + $data_total_ledger_amount = 0; foreach ($data_all_ledger_dc as $id => $ledger_data) { if ($data_all_ledger_id[$id] < 1) @@ -730,91 +848,30 @@ class StockVoucher extends Controller { if ($valid_ledger_q->num_rows() < 1) { $this->messages->add('Invalid Ledger A/C.', 'error'); - $this->template->load('template', 'voucher/edit', $data); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; - } else { - /* Check for valid ledger type */ - $valid_ledger = $valid_ledger_q->row(); - if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') - { - if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) - { - $bank_cash_present = TRUE; - } - if ($valid_ledger->type != 1) - $non_bank_cash_present = TRUE; - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') - { - if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) - { - $bank_cash_present = TRUE; - } - if ($valid_ledger->type != 1) - $non_bank_cash_present = TRUE; - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') - { - if ($valid_ledger->type != 1) - { - $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') - { - if ($valid_ledger->type == 1) - { - $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } - } - } - if ($data_all_ledger_dc[$id] == "D") - { - $dr_total += $data_all_dr_amount[$id]; - } else { - $cr_total += $data_all_cr_amount[$id]; } + if ($data_all_ledger_dc[$id] == 'D') + $data_total_ledger_amount += $data_all_amount_item[$id]; + else + $data_total_ledger_amount -= $data_all_amount_item[$id]; } - if ($dr_total != $cr_total) + + /* Total amount calculations */ + if ($current_voucher_type['stock_voucher_type'] == '1') { - $this->messages->add('Debit and Credit Total does not match!', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } else if ($dr_total == 0 && $cr_total == 0) { - $this->messages->add('Cannot save empty Voucher.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; + $data_main_account_total = $data_total_stock_amount; + $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + } else { + $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; + $data_main_entity_total = $data_total_stock_amount; } - /* Check if atleast one Bank or Cash Ledger A/C is present */ - if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') - { - if ( ! $bank_cash_present) - { - $this->messages->add('Need to Debit atleast one Bank or Cash A/C.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } - if ( ! $non_bank_cash_present) - { - $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; + if ($data_total_amount < 0) { - if ( ! $bank_cash_present) - { - $this->messages->add('Need to Credit atleast one Bank or Cash A/C.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } - if ( ! $non_bank_cash_present) - { - $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); - $this->template->load('template', 'voucher/edit', $data); - return; - } + $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; } /* Updating main voucher */ @@ -847,71 +904,171 @@ class StockVoucher extends Controller { $this->db->trans_rollback(); $this->messages->add('Error updating Voucher A/C.', 'error'); $this->logger->write_message("error", "Error updating voucher details for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'voucher/edit', $data); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; } /* TODO : Deleting all old ledger data, Bad solution */ - if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) + if ( ! $this->db->delete('stock_voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting previous stock items from Voucher.', 'error'); + $this->logger->write_message("error", "Error deleting previous stock items from " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))->where('stock_type', 3)) { $this->db->trans_rollback(); $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); $this->logger->write_message("error", "Error deleting previous voucher items for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'voucher/edit', $data); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Updating main - account */ + $update_data = array( + 'ledger_id' => $data_main_account, + 'amount' => $data_main_account_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 1, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $update_data['dc'] = 'D'; + else + $update_data['dc'] = 'C'; + if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 1)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Purchase Ledger A/C of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating purchase ledger " . "[id:" . $data_main_account . "]"); + } else { + $this->messages->add('Error updating Sale Ledger A/C of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger " . "[id:" . $data_main_account . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + + /* Updating main - entity */ + $update_data = array( + 'ledger_id' => $data_main_entity, + 'amount' => $data_main_entity_total, + 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 2, + 'stock_rate' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'C'; + else + $insert_data['dc'] = 'D'; + if ( ! $this->db->where('voucher_id', $voucher_id)->where('stock_type', 2)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Creditor (Supplier) of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating creditor ledger " . "[id:" . $data_main_entity . "]"); + } else { + $this->messages->add('Error updating Debtor (Customer) of Voucher.', 'error'); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor ledger " . "[id:" . $data_main_entity . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; } + /* Adding stock items */ + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + foreach ($data_all_stock_item_id as $id => $stock_data) + { + $data_stock_item_id = $data_all_stock_item_id[$id]; + + if ($data_stock_item_id < 1) + continue; + + $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; + $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; + $data_stock_item_discount = $data_all_stock_item_discount[$id]; + $data_stock_item_amount = $data_all_stock_item_amount[$id]; + + $insert_stock_data = array( + 'voucher_id' => $voucher_id, + 'stock_item_id' => $data_stock_item_id, + 'quantity' => $data_stock_item_quantity, + 'rate_per_unit' => $data_stock_item_rate_per_unit, + 'discount' => $data_stock_item_discount, + 'total' => $data_stock_item_amount, + 'type' => $data_stock_item_type, + ); + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); + return; + } + } + /* Adding ledger accounts */ $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_dr_amount = $this->input->post('dr_amount', TRUE); - $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); - $dr_total = 0; - $cr_total = 0; foreach ($data_all_ledger_dc as $id => $ledger_data) { $data_ledger_dc = $data_all_ledger_dc[$id]; $data_ledger_id = $data_all_ledger_id[$id]; + if ($data_ledger_id < 1) continue; - $data_amount = 0; - if ($data_all_ledger_dc[$id] == "D") - { - $data_amount = $data_all_dr_amount[$id]; - $dr_total += $data_all_dr_amount[$id]; - } else { - $data_amount = $data_all_cr_amount[$id]; - $cr_total += $data_all_cr_amount[$id]; - } + + $data_rate = $data_all_rate_item[$id]; + $data_amount = $data_all_amount_item[$id]; $insert_ledger_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_ledger_id, 'amount' => $data_amount, 'dc' => $data_ledger_dc, + 'reconciliation_date' => NULL, + 'stock_type' => 3, + 'stock_rate' => $data_rate, ); if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) { $this->db->trans_rollback(); $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding Ledger A/C item [id:" . $data_ledger_id . "] for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'voucher/edit', $data); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; } } - /* Updating Debit and Credit Total in vouchers table */ + /* Updating Debit and Credit Total - vouchers */ $update_data = array( - 'dr_total' => $dr_total, - 'cr_total' => $cr_total, + 'dr_total' => $data_total_amount, + 'cr_total' => $data_total_amount, ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) { $this->db->trans_rollback(); $this->messages->add('Error updating Voucher total.', 'error'); - $this->logger->write_message("error", "Error updating voucher total for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); - $this->template->load('template', 'voucher/edit', $data); + $this->logger->write_message("error", "Error updating " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); + $this->template->load('template', 'inventory/stockvoucher/edit', $data); return; } diff --git a/system/application/views/inventory/stockvoucher/edit.php b/system/application/views/inventory/stockvoucher/edit.php new file mode 100644 index 0000000..79ea9b4 --- /dev/null +++ b/system/application/views/inventory/stockvoucher/edit.php @@ -0,0 +1,473 @@ +<script type="text/javascript"> + +$(document).ready(function() { + + /***************************** STOCK ITEM *****************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + rowid.parent().next().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); + } + }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .quantity-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + $('table td .rate-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + $('table td .discount-stock-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + var item_discount = itemrow.next().next().next().children().val(); + var is_percent = false; + + /* check whether discount is in percent or absolute value */ + if (item_discount != "") { + if (item_discount.match(/%$/)) + { + is_percent = true; + } + } + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + item_discount = parseFloat(item_discount); + if (isNaN(item_discount)) + item_discount = 0; + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) + { + /* calculating total amount for each stock item */ + var item_amount; + if (is_percent) { + if (item_discount <= 100) + item_amount = ((item_quantity * item_rate_per_unit) * (100 - item_discount)) / 100; + } else { + item_amount = (item_quantity * item_rate_per_unit) - item_discount; + } + /* displaying total amount for each stock item */ + itemrow.next().next().next().next().children().val(item_amount); + itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + updateLedgerRowTotal(); + $('.recalculate').trigger('click'); + } + + $('table td .amount-stock-item').live('change', function() { + updateLedgerRowTotal(); + $('.recalculate').trigger('click'); + }); + + /* calculating stock total */ + var calculateStockTotal = function() { + var stock_total = 0; + $('table td .amount-stock-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; + } + }); + return stock_total; + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockvoucher/addstockrow') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + /******************************* LEDGER *******************************/ + /* Dr - Cr dropdown changed */ + $('.dc-dropdown').live('change', function() { + $('.recalculate').trigger('click'); + }); + + /* Ledger dropdown changed */ + $('.ledger-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + + var ledgerid = $(this).val(); + var rowid = $(this); + if (ledgerid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('ledger/balance') . '/\''; ?> + ledgerid, + success: function(data) { + var ledger_bal = parseFloat(data); + if (isNaN(ledger_bal)) + ledger_bal = 0; + if (ledger_bal == 0) + rowid.parent().next().next().next().next().next().children().text("0"); + else if (ledger_bal < 0) + rowid.parent().next().next().next().next().next().children().text("Cr " + -data); + else + rowid.parent().next().next().next().next().next().children().text("Dr " + data); + } + }); + } else { + rowid.parent().next().next().next().next().next().children().text(""); + } + }); + + $('table td .rate-item').live('change', function() { + var rowid = $(this); + calculateLedgerRowTotal(rowid.parent().prev().prev()); + }); + + /* calculating ledger item amount */ + var calculateLedgerRowTotal = function(itemrow) { + var item_rate = itemrow.next().next().children().val(); + var is_percent = false; + var stock_total = calculateStockTotal(); + + /* check whether rate is in percent */ + if (item_rate != "") { + if (item_rate.match(/%$/)) + { + is_percent = true; + } + } + + item_rate = parseFloat(item_rate); + + if (!isNaN(item_rate)) + { + var item_amount; + if (is_percent) { + if (item_rate <= 100) { + item_amount = (((stock_total) * (100 + item_rate)) / 100) - (stock_total); + } + /* displaying total amount for each stock item */ + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + } + $('.recalculate').trigger('click'); + } + + /* updating ledger total */ + var updateLedgerRowTotal = function() { + $('table td .rate-item').each(function(index) { + var rowid = $(this); + calculateLedgerRowTotal(rowid.parent().prev().prev()); + }); + } + + $('table td .amount-item').live('change', function() { + $('.recalculate').trigger('click'); + }); + + /* calculating ledger total */ + var calculateLedgerTotal = function() { + var ledger_total = 0; + $('table td .amount-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + { + if ($(this).parent().prev().prev().prev().children().val() == 'D') { + ledger_total += item_amount; + } else if ($(this).parent().prev().prev().prev().children().val() == 'C') { + ledger_total -= item_amount; + } + } + } + }); + return ledger_total; + } + + /* Recalculate Total */ + $('table td .recalculate').live('click', function() { + var voucherTotal = calculateLedgerTotal() + calculateStockTotal(); + $("table tr #vr-total").text(voucherTotal); + if (voucherTotal >= 0) + $("table tr #vr-total").css("background-color", "#FFFF99"); + else + $("table tr #vr-total").css("background-color", "#FFE9E8"); + }); + + /* Delete ledger row */ + $('table td .deleterow').live('click', function() { + $(this).parent().parent().remove(); + }); + + /* Add ledger row */ + $('table td .addrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockvoucher/addrow') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.ledger-dropdown').trigger('change'); + } + }); + }); + + /* On page load initiate all triggers */ + $('.dc-dropdown').trigger('change'); + $('.ledger-dropdown').trigger('change'); + $('.stock-item-dropdown').trigger('change'); +}); + +</script> + +<?php + echo form_open('inventory/stockvoucher/edit/' . $current_voucher_type['label'] . "/" . $voucher_id); + echo "<p>"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Voucher Number', 'voucher_number'); + echo " "; + echo $current_voucher_type['prefix'] . form_input($voucher_number) . $current_voucher_type['suffix']; + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Leave Voucher Number empty for auto numbering</span>"; + echo " "; + echo "<span id=\"tooltip-target-2\">"; + echo form_label('Voucher Date', 'voucher_date'); + echo " "; + echo form_input_date_restrict($voucher_date); + echo "</span>"; + echo "<span id=\"tooltip-content-2\">Date format is " . $this->config->item('account_date_format') . ".</span>"; + echo "</p>"; + + if ($current_voucher_type['stock_voucher_type'] == '1') + { + echo "<p>"; + echo "<table border=0 cellpadding=2>"; + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Purchase Ledger A/C', 'main_account'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_account', $main_account_active, '', $type = 'purchase'); + echo "</td>"; + echo "</tr>"; + + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Creditor (Supplier)', 'main_entity'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_entity', $main_entity_active, '', $type = 'creditor'); + echo "</td>"; + echo "</tr>"; + echo "</table>"; + echo "</p>"; + } else { + echo "<p>"; + echo "<table border=0 cellpadding=2>"; + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Sales Ledger A/C', 'main_account'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_account', $main_account_active, '', $type = 'sale'); + echo "</td>"; + echo "</tr>"; + + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Debtor (Customer)', 'main_entity'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_entity', $main_entity_active, '', $type = 'debtor'); + echo "</td>"; + echo "</tr>"; + echo "</table>"; + echo "</p>"; + } + + echo "<p></p>"; + + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Discount %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($stock_item_id as $i => $row) + { + $stock_item_quantity_item = array( + 'name' => 'stock_item_quantity[' . $i . ']', + 'id' => 'stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($stock_item_quantity[$i]) ? $stock_item_quantity[$i] : '', + 'class' => 'quantity-stock-item', + ); + $stock_item_rate_per_unit_item = array( + 'name' => 'stock_item_rate_per_unit[' . $i . ']', + 'id' => 'stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($stock_item_rate_per_unit[$i]) ? $stock_item_rate_per_unit[$i] : '', + 'class' => 'rate-stock-item', + ); + $stock_item_discount_item = array( + 'name' => 'stock_item_discount[' . $i . ']', + 'id' => 'stock_item_discount[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => isset($stock_item_discount[$i]) ? $stock_item_discount[$i] : '', + 'class' => 'discount-stock-item', + ); + $stock_item_amount_item = array( + 'name' => 'stock_item_amount[' . $i . ']', + 'id' => 'stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($stock_item_amount[$i]) ? $stock_item_amount[$i] : '', + 'class' => 'amount-stock-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', isset($stock_item_id[$i]) ? $stock_item_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($stock_item_discount_item) . "</td>"; + echo "<td>" . form_input($stock_item_amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "</table>"; + + echo "<br />"; + echo "<br />"; + + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($ledger_dc as $i => $ledger) + { + $rate_item_item = array( + 'name' => 'rate_item[' . $i . ']', + 'id' => 'rate_item[' . $i . ']', + 'maxlength' => '5', + 'size' => '5', + 'value' => isset($rate_item[$i]) ? $rate_item[$i] : '', + 'class' => 'rate-item', + ); + $amount_item_item = array( + 'name' => 'amount_item[' . $i . ']', + 'id' => 'amount_item[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($amount_item[$i]) ? $amount_item[$i] : '', + 'class' => 'amount-item', + ); + echo "<tr>"; + + echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', isset($ledger_dc[$i]) ? $ledger_dc[$i] : "D") . "</td>"; + echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', isset($ledger_id[$i]) ? $ledger_id[$i] : 0) . "</td>"; + echo "<td>" . form_input($rate_item_item) . "</td>"; + echo "<td>" . form_input($amount_item_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; + + echo "<td class=\"ledger-balance\"><div></div></td>"; + + echo "</tr>"; + } + + echo "<tr><td colspan=\"7\"></td></tr>"; + echo "<tr id=\"voucher-total\"><td colspan=3><strong>Total</strong></td><td id=\"vr-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; + + echo "</table>"; + + echo "<p>"; + echo form_label('Narration', 'voucher_narration'); + echo "<br />"; + echo form_textarea($voucher_narration); + echo "</p>"; + + echo "<p>"; + echo form_label('Tag', 'voucher_tag'); + echo " "; + echo form_dropdown('voucher_tag', $voucher_tags, $voucher_tag); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo "</p>"; + + echo form_close(); + commit 28be2077192507420054a21938192cec60437e7b Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Tue Feb 22 22:12:15 2011 +0530 Updated stock voucher for sales Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 6405fe4..e284ac4 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -333,8 +333,14 @@ class StockVoucher extends Controller { } /* Total amount calculations */ - $data_main_account_total = $data_total_stock_amount; - $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $data_main_account_total = $data_total_stock_amount; + $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + } else { + $data_main_account_total = $data_total_stock_amount + $data_total_ledger_amount; + $data_main_entity_total = $data_total_stock_amount; + } $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; if ($data_total_amount < 0) { commit 7437b4caf65f4f5ba76bc00e9b703789cf541573 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Mon Feb 21 22:45:17 2011 +0530 Added display of stock item closing quantity Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockitem.php b/system/application/controllers/inventory/stockitem.php index 0da4c4f..0da564b 100644 --- a/system/application/controllers/inventory/stockitem.php +++ b/system/application/controllers/inventory/stockitem.php @@ -412,9 +412,11 @@ class StockItem extends Controller { function balance($stock_ledger_id = 0) { if ($stock_ledger_id > 0) - echo $this->Stock_Item_model->get_stock_item_balance($stock_ledger_id); - else + { + echo $this->Stock_Item_model->get_closing_quantity($stock_ledger_id); + } else { echo ""; + } return; } diff --git a/system/application/models/stock_item_model.php b/system/application/models/stock_item_model.php index c92d143..cb66ddf 100644 --- a/system/application/models/stock_item_model.php +++ b/system/application/models/stock_item_model.php @@ -30,9 +30,78 @@ class Stock_Item_model extends Model { return "(Error)"; } - function get_stock_item_balance($stock_item_id) + function get_closing_quantity($stock_item_id) { - return '100'; + $this->db->from('stock_items')->where('id', $stock_item_id)->limit(1); + $stock_item_q = $this->db->get(); + if ( ! $stock_item = $stock_item_q->row()) + return 0; + + /* closing quantity */ + $opening_quantity = $stock_item->op_balance_quantity; + + $in_quantity = 0; + $this->db->select_sum('quantity', 'inquantity')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 1); + $in_quantity_q = $this->db->get(); + if ($in_quantity_d = $in_quantity_q->row()) + $in_quantity = $in_quantity_d->inquantity; + + $out_quantity = 0; + $this->db->select_sum('quantity', 'outquantity')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 2); + $out_quantity_q = $this->db->get(); + if ($out_quantity_d = $out_quantity_q->row()) + $out_quantity = $out_quantity_d->outquantity; + + $closing_quantity = $opening_quantity + $in_quantity - $out_quantity; + return $closing_quantity; + } + + /* TODO */ + function get_balance($stock_item_id) + { + $this->db->from('stock_items')->where('id', $stock_item_id)->limit(1); + $stock_item_q = $this->db->get(); + if ( ! $stock_item = $stock_item_q->row()) + return array(0, 0); + + /* closing quantity */ + $opening_quantity = $stock_item->op_balance_quantity; + $in_quantity = 0; + $this->db->select_sum('quantity', 'inquantity')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 1); + $in_quantity_q = $this->db->get(); + if ($in_quantity_d = $in_quantity_q->row()) + $in_quantity = $in_quantity_d->inquantity; + + $out_quantity = 0; + $this->db->select_sum('quantity', 'outquantity')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 2); + $out_quantity_q = $this->db->get(); + if ($out_quantity_d = $out_quantity_q->row()) + $out_quantity = $out_quantity_d->outquantity; + + $closing_quantity = $opening_quantity + $in_quantity - $out_quantity; + + /* closing profit or loss */ + $opening_amount = $stock_item->op_balance_total_value; + + /* standard method */ + if ($stock_item->costing_method == 1) + { + $in_amount = 0; + $this->db->select_sum('total', 'inamount')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 1); + $in_amount_q = $this->db->get(); + if ($in_amount_d = $in_amount_q->row()) + $in_amount = $in_amount_d->inamount; + + $out_amount = 0; + $this->db->select_sum('total', 'outamount')->from('stock_voucher_items')->where('stock_item_id', $stock_item_id)->where('type', 2); + $out_amount_q = $this->db->get(); + if ($out_amount_d = $out_amount_q->row()) + $out_amount = $out_amount_d->outamount; + + $closing_amount = $opening_amount + $in_amount - $out_amount; + + return array($closing_amount, $closing_quantity); + } } function get_selling_price($stock_item_id) diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 58ef702..bd77279 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -27,15 +27,8 @@ $(document).ready(function() { $.ajax({ url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, success: function(data) { - var stock_bal = parseFloat(data); - if (isNaN(stock_bal)) - stock_bal = 0; - if (stock_bal == 0) - rowid.parent().next().next().next().next().next().next().children().text("0"); - else if (stock_bal < 0) - rowid.parent().next().next().next().next().next().next().next().children().text(data); - else - rowid.parent().next().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); } }); commit a6ba939245a30e25faf4f644da68f51a1c858853 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 21:11:37 2011 +0530 Showing default selling price in stock voucher add Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockitem.php b/system/application/controllers/inventory/stockitem.php index 2d68c61..0da4c4f 100644 --- a/system/application/controllers/inventory/stockitem.php +++ b/system/application/controllers/inventory/stockitem.php @@ -417,6 +417,15 @@ class StockItem extends Controller { echo ""; return; } + + function sellprice($stock_ledger_id = 0) + { + if ($stock_ledger_id > 0) + echo $this->Stock_Item_model->get_selling_price($stock_ledger_id); + else + echo ""; + return; + } } /* End of file stockitem.php */ diff --git a/system/application/models/stock_item_model.php b/system/application/models/stock_item_model.php index 1b4ae88..c92d143 100644 --- a/system/application/models/stock_item_model.php +++ b/system/application/models/stock_item_model.php @@ -34,4 +34,14 @@ class Stock_Item_model extends Model { { return '100'; } + + function get_selling_price($stock_item_id) + { + $this->db->from('stock_items')->where('id', $stock_item_id)->limit(1); + $stock_item_q = $this->db->get(); + if ($stock_item = $stock_item_q->row()) + return $stock_item->default_sell_price; + else + return ""; + } } diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index efb9e64..58ef702 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -38,6 +38,19 @@ $(document).ready(function() { rowid.parent().next().next().next().next().next().next().next().children().text(data); } }); + + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/sellprice') . '/\''; ?> + stockid, + success: function(data) { + var sell_price = parseFloat(data); + if (isNaN(sell_price)) + sell_price = 0; + if (sell_price <= 0) + rowid.parent().next().next().children().val(""); + else + rowid.parent().next().next().children().val(sell_price); + } + }); } else { rowid.parent().next().next().next().next().next().next().next().children().text(""); } commit 9c848550ff6c0954b9c348dce4ee4b336c2d7f73 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 17:23:56 2011 +0530 Documented database constants used in the application Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/welcome.php b/system/application/controllers/welcome.php index 8e3be2f..e52ebf2 100644 --- a/system/application/controllers/welcome.php +++ b/system/application/controllers/welcome.php @@ -1,5 +1,42 @@ <?php +/** + * DATABASE CONSTANTS USED IN THE APPLICATION + * + * table: ledgers + * column : type + * 0 = General + * 1 = Bank or Cash A/C + * 2 = Purchase A/C + * 3 = Sale A/C + * 4 = Creditor + * 5 = Debtor + * + * table: voucher_types + * column : base_type + * 1 = Normal Voucher + * 2 = Stock Voucher + * column : stock_voucher_type + * 1 = Purchase + * 2 = Sale + * 3 = Stock Transfer + * + * table: voucher_items + * column : stock_type + * 0 = Not Applicable + * 1 = Account Ledger + * 2 = Entity Ledger + * 3 = Others Ledger + * + * table: stock_items + * column : costing_method + * + * table: stock_voucher_items + * column : type + * 1 = Incoming + * 2 = Outgoing + * + */ class Welcome extends Controller { function Welcome() commit 1ac5ca8eb70ea1e85216960f6b583c689c2ecc7a Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 17:10:38 2011 +0530 Updated voucher types making some options readonly - base_type cannot be changed later - stock_voucher_type cannot be changed later - added appropriate warning messages Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/assets/css/custom.css b/system/application/assets/css/custom.css index 8a3ecfd..9024c72 100644 --- a/system/application/assets/css/custom.css +++ b/system/application/assets/css/custom.css @@ -56,6 +56,12 @@ a.anchor-link-b { font-weight:italic; } +.form-warning-text { + font-size:12px; + font-weight:italic; + color:#FF0000; +} + /******************************** PAGINATION **********************************/ #pagination-container { margin-top:20px; diff --git a/system/application/controllers/setting/vouchertypes.php b/system/application/controllers/setting/vouchertypes.php index c76bab7..1458303 100644 --- a/system/application/controllers/setting/vouchertypes.php +++ b/system/application/controllers/setting/vouchertypes.php @@ -291,7 +291,21 @@ class VoucherTypes extends Controller { 'value' => $voucher_type_data->zero_padding, ); - $data['voucher_type_base_types'] = array('1' => 'Normal Vocuher', '2' => 'Stock Voucher'); + switch ($voucher_type_data->base_type) + { + case 1: $data['base_type'] = 'Normal Vocuher'; $data['is_normal_voucher'] = TRUE; break; + case 2: $data['base_type'] = 'Stock Voucher'; $data['is_normal_voucher'] = FALSE; break; + default: $data['base_type'] = '(Invalid)'; $data['is_normal_voucher'] = TRUE; break; + } + + switch ($voucher_type_data->stock_voucher_type) + { + case 1: $data['stock_voucher_type'] = 'Purchase'; break; + case 2: $data['stock_voucher_type'] = 'Sale'; break; + case 3: $data['stock_voucher_type'] = 'Stock Transfer'; break; + default: $data['stock_voucher_type'] = '(Invalid)'; break; + } + $data['voucher_type_numberings'] = array('1' => 'Auto', '2' => 'Manual (required)', '3' => 'Manual (optional)'); $data['bank_cash_ledger_restrictions'] = array( '1' => 'Unrestricted', @@ -300,16 +314,9 @@ class VoucherTypes extends Controller { '4' => 'Only Bank or Cash A/C can be present on both Debit and Credit side', '5' => 'Only NON Bank or Cash A/C can be present on both Debit and Credit side', ); - $data['stock_voucher_types'] = array( - '1' => 'Purchase', - '2' => 'Sale', - '3' => 'Stock Transfer', - ); - $data['voucher_type_base_type_active'] = $voucher_type_data->base_type; $data['voucher_type_numbering_active'] = $voucher_type_data->numbering; $data['bank_cash_ledger_restriction_active'] = $voucher_type_data->bank_cash_ledger_restriction; - $data['stock_voucher_type_active'] = $voucher_type_data->stock_voucher_type; $data['voucher_type_id'] = $id; /* Repopulating form */ @@ -322,10 +329,8 @@ class VoucherTypes extends Controller { $data['voucher_type_suffix']['value'] = $this->input->post('voucher_type_suffix', TRUE); $data['voucher_type_zero_padding']['value'] = $this->input->post('voucher_type_zero_padding', TRUE); - $data['voucher_type_base_type_active'] = $this->input->post('voucher_type_base_type', TRUE); $data['voucher_type_numbering_active'] = $this->input->post('voucher_type_numbering', TRUE); $data['bank_cash_ledger_restriction_active'] = $this->input->post('bank_cash_ledger_restriction', TRUE); - $data['stock_voucher_type_active'] = $this->input->post('stock_voucher_type', TRUE); } /* Form validations */ @@ -352,13 +357,8 @@ class VoucherTypes extends Controller { $data_voucher_type_prefix = $this->input->post('voucher_type_prefix', TRUE); $data_voucher_type_suffix = $this->input->post('voucher_type_suffix', TRUE); $data_voucher_type_zero_padding = $this->input->post('voucher_type_zero_padding', TRUE); - $data_voucher_type_base_type = $this->input->post('voucher_type_base_type', TRUE); $data_voucher_type_numbering = $this->input->post('voucher_type_numbering', TRUE); $data_bank_cash_ledger_restriction = $this->input->post('bank_cash_ledger_restriction', TRUE); - $data_stock_voucher_type = $this->input->post('stock_voucher_type', TRUE); - - if (($data_voucher_type_base_type < 1) or ($data_voucher_type_base_type > 2)) - $data_voucher_type_base_type = 1; if (($data_voucher_type_numbering < 1) or ($data_voucher_type_numbering > 3)) $data_voucher_type_numbering = 1; @@ -366,21 +366,16 @@ class VoucherTypes extends Controller { if (($data_bank_cash_ledger_restriction < 1) or ($data_bank_cash_ledger_restriction > 5)) $data_bank_cash_ledger_restriction = 1; - if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 3)) - $data_stock_voucher_type = 1; - $this->db->trans_start(); $update_data = array( 'label' => $data_voucher_type_label, 'name' => $data_voucher_type_name, 'description' => $data_voucher_type_description, - 'base_type' => $data_voucher_type_base_type, 'numbering' => $data_voucher_type_numbering, 'prefix' => $data_voucher_type_prefix, 'suffix' => $data_voucher_type_suffix, 'zero_padding' => $data_voucher_type_zero_padding, 'bank_cash_ledger_restriction' => $data_bank_cash_ledger_restriction, - 'stock_voucher_type' => $data_stock_voucher_type, ); if ( ! $this->db->where('id', $data_voucher_type_id)->update('voucher_types', $update_data)) { diff --git a/system/application/views/admin/create.php b/system/application/views/admin/create.php index 130c295..04ccdc5 100644 --- a/system/application/views/admin/create.php +++ b/system/application/views/admin/create.php @@ -44,7 +44,9 @@ echo "<br />"; echo form_input_date($fy_start); echo "<br />"; - echo "<span class=\"form-help-text\">Warning : Financial Year Start cannot be changed later.<br />Format as per 'Date Foramt' selected abobe.</span>"; + echo "<span class=\"form-warning-text\">Warning: This option cannot be changed later.</span>"; + echo "<br />"; + echo "<span class=\"form-help-text\">Note: Format as per 'Date Foramt' selected abobe.</span>"; echo "</p>"; echo "<p>"; @@ -52,7 +54,9 @@ echo "<br />"; echo form_input_date($fy_end); echo "<br />"; - echo "<span class=\"form-help-text\">Warning : Financial Year End cannot be changed later.<br />Format as per 'Date Foramt' selected abobe.</span>"; + echo "<span class=\"form-warning-text\">Warning: This option cannot be changed later.</span>"; + echo "<br />"; + echo "<span class=\"form-help-text\">Note: Format as per 'Date Foramt' selected abobe.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/setting/vouchertypes/add.php b/system/application/views/setting/vouchertypes/add.php index cb87bd6..94c0ac7 100644 --- a/system/application/views/setting/vouchertypes/add.php +++ b/system/application/views/setting/vouchertypes/add.php @@ -44,6 +44,8 @@ $(document).ready(function() { echo form_label('Base Type', 'voucher_type_base_type'); echo "<br />"; echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active, 'id="voucher_type_base_type"'); + echo "<br />"; + echo "<span class=\"form-warning-text\">Warning: This option cannot be changed later.</span>"; echo "</p>"; echo "<p id=\"bank_cash_ledger_restriction\">"; @@ -56,6 +58,8 @@ $(document).ready(function() { echo form_label('Stock Voucher Type', 'stock_voucher_type'); echo "<br />"; echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); + echo "<br />"; + echo "<span class=\"form-warning-text\">Warning: This option cannot be changed later.</span>"; echo "</p>"; echo "<p>"; diff --git a/system/application/views/setting/vouchertypes/edit.php b/system/application/views/setting/vouchertypes/edit.php index a2eadfd..8414963 100644 --- a/system/application/views/setting/vouchertypes/edit.php +++ b/system/application/views/setting/vouchertypes/edit.php @@ -1,22 +1,3 @@ -<script type="text/javascript"> -$(document).ready(function() { - $('#voucher_type_base_type').change(function() { - if ($(this).val() == "1") { - $('#bank_cash_ledger_restriction').show(); - $('#stock_voucher_type').hide(); - } else if ($(this).val() == "2") { - $('#bank_cash_ledger_restriction').hide(); - $('#stock_voucher_type').show(); - } else { - $('#bank_cash_ledger_restriction').show(); - $('#stock_voucher_type').show(); - } - }); - /* initialize */ - $('#voucher_type_base_type').trigger('change'); -}); -</script> - <?php echo form_open('setting/vouchertypes/edit/' . $voucher_type_id); @@ -43,20 +24,23 @@ $(document).ready(function() { echo "<p>"; echo form_label('Base Type', 'voucher_type_base_type'); echo "<br />"; - echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active, 'id="voucher_type_base_type"'); - echo "</p>"; - - echo "<p id=\"bank_cash_ledger_restriction\">"; - echo form_label('Restrictions', 'bank_cash_ledger_restriction'); - echo "<br />"; - echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); + echo $base_type; echo "</p>"; - echo "<p id=\"stock_voucher_type\">"; - echo form_label('Stock Voucher Type', 'stock_voucher_type'); - echo "<br />"; - echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); - echo "</p>"; + if ($is_normal_voucher) + { + echo "<p id=\"bank_cash_ledger_restriction\">"; + echo form_label('Restrictions', 'bank_cash_ledger_restriction'); + echo "<br />"; + echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); + echo "</p>"; + } else { + echo "<p id=\"stock_voucher_type\">"; + echo form_label('Stock Voucher Type', 'stock_voucher_type'); + echo "<br />"; + echo $stock_voucher_type; + echo "</p>"; + } echo "<p>"; echo form_label('Voucher Numbering', 'voucher_type_numbering'); commit 141d376c218473a9d3222bb5f0230265ae18955e Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 16:51:37 2011 +0530 Added stock transfer voucher type Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/setting/vouchertypes.php b/system/application/controllers/setting/vouchertypes.php index 9506bac..c76bab7 100644 --- a/system/application/controllers/setting/vouchertypes.php +++ b/system/application/controllers/setting/vouchertypes.php @@ -101,8 +101,9 @@ class VoucherTypes extends Controller { '5' => 'Only NON Bank or Cash A/C can be present on both Debit and Credit side', ); $data['stock_voucher_types'] = array( - '1' => 'Purchases', - '2' => 'Sales', + '1' => 'Purchase', + '2' => 'Sale', + '3' => 'Stock Transfer', ); $data['voucher_type_base_type_active'] = '1'; @@ -163,7 +164,7 @@ class VoucherTypes extends Controller { if (($data_bank_cash_ledger_restriction < 1) or ($data_bank_cash_ledger_restriction > 5)) $data_bank_cash_ledger_restriction = 1; - if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 2)) + if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 3)) $data_stock_voucher_type = 1; /* Calculating Voucher Type Id */ @@ -300,8 +301,9 @@ class VoucherTypes extends Controller { '5' => 'Only NON Bank or Cash A/C can be present on both Debit and Credit side', ); $data['stock_voucher_types'] = array( - '1' => 'Purchases', - '2' => 'Sales', + '1' => 'Purchase', + '2' => 'Sale', + '3' => 'Stock Transfer', ); $data['voucher_type_base_type_active'] = $voucher_type_data->base_type; @@ -364,7 +366,7 @@ class VoucherTypes extends Controller { if (($data_bank_cash_ledger_restriction < 1) or ($data_bank_cash_ledger_restriction > 5)) $data_bank_cash_ledger_restriction = 1; - if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 2)) + if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 3)) $data_stock_voucher_type = 1; $this->db->trans_start(); commit 586b560483116619bf752b03b1e6161e1b97bd03 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 16:38:59 2011 +0530 Added type to stock_voucher_items table Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 1f0f404..ca9d8bf 100644 --- a/db-update.txt +++ b/db-update.txt @@ -48,6 +48,7 @@ CREATE TABLE IF NOT EXISTS stock_voucher_items ( rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', discount varchar(15) NOT NULL, total decimal(15,2) NOT NULL DEFAULT '0.00', + type int(2) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index fe23b30..ae1c25f 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -141,5 +141,6 @@ CREATE TABLE IF NOT EXISTS stock_voucher_items ( rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', discount varchar(15) NOT NULL, total decimal(15,2) NOT NULL DEFAULT '0.00', + type int(2) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 2cf3386..6405fe4 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -246,6 +246,12 @@ class StockVoucher extends Controller { $data_total_amount = 0; + /* Setting Stock Item type */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $data_stock_item_type = 1; + else + $data_stock_item_type = 2; + /* Checking for Valid Stock Ledger A/C - account */ if ($current_voucher_type['stock_voucher_type'] == '1') $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); @@ -469,6 +475,7 @@ class StockVoucher extends Controller { 'rate_per_unit' => $data_stock_item_rate_per_unit, 'discount' => $data_stock_item_discount, 'total' => $data_stock_item_amount, + 'type' => $data_stock_item_type, ); if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) { commit 1f71e09c769291fcc1df2924702662437fa403ec Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 16:25:44 2011 +0530 Added automatic calculation of total value of opening stock Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/views/inventory/stockitem/add.php b/system/application/views/inventory/stockitem/add.php index f10f5bd..011eba3 100644 --- a/system/application/views/inventory/stockitem/add.php +++ b/system/application/views/inventory/stockitem/add.php @@ -1,3 +1,36 @@ +<script type="text/javascript"> +$(document).ready(function() { + + /********************** STOCK ITEM TOTAL ******************************/ + $('#stock_item_op_quantity').live('change', function() { + updateTotalValue(); + }); + + $('#stock_item_op_rate_per_unit').live('change', function() { + updateTotalValue(); + }); + + var updateTotalValue = function() { + var quantity = $('#stock_item_op_quantity').val(); + var rate_per_unit = $('#stock_item_op_rate_per_unit').val(); + + quantity = parseFloat(quantity); + rate_per_unit = parseFloat(rate_per_unit); + + if ((!isNaN(quantity)) && (!isNaN(rate_per_unit))) + { + /* calculating total amount */ + var total_value; + total_value = quantity * rate_per_unit; + + /* displaying total amount for each stock item */ + $('#stock_item_op_total').val(total_value); + $('#stock_item_op_total').fadeTo('slow', 0.1).fadeTo('slow', 1); + } + } +}); +</script> + <?php echo form_open('inventory/stockitem/add'); diff --git a/system/application/views/inventory/stockitem/edit.php b/system/application/views/inventory/stockitem/edit.php index 0835134..884bbb8 100644 --- a/system/application/views/inventory/stockitem/edit.php +++ b/system/application/views/inventory/stockitem/edit.php @@ -1,3 +1,36 @@ +<script type="text/javascript"> +$(document).ready(function() { + + /********************** STOCK ITEM TOTAL ******************************/ + $('#stock_item_op_quantity').live('change', function() { + updateTotalValue(); + }); + + $('#stock_item_op_rate_per_unit').live('change', function() { + updateTotalValue(); + }); + + var updateTotalValue = function() { + var quantity = $('#stock_item_op_quantity').val(); + var rate_per_unit = $('#stock_item_op_rate_per_unit').val(); + + quantity = parseFloat(quantity); + rate_per_unit = parseFloat(rate_per_unit); + + if ((!isNaN(quantity)) && (!isNaN(rate_per_unit))) + { + /* calculating total amount */ + var total_value; + total_value = quantity * rate_per_unit; + + /* displaying total amount for each stock item */ + $('#stock_item_op_total').val(total_value); + $('#stock_item_op_total').fadeTo('slow', 0.1).fadeTo('slow', 1); + } + } +}); +</script> + <?php echo form_open('inventory/stockitem/edit/' . $stock_item_id); commit 29a83817fe50fdbb01da998d3cfb7851bf1f315d Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 20 16:10:16 2011 +0530 Added default selling price for stock items Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index defcf60..1f0f404 100644 --- a/db-update.txt +++ b/db-update.txt @@ -36,6 +36,7 @@ CREATE TABLE IF NOT EXISTS stock_items ( op_balance_quantity float NOT NULL, op_balance_rate_per_unit decimal(15,2) NOT NULL, op_balance_total_value decimal(15,2) NOT NULL, + default_sell_price decimal(15,2) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index c833b94..fe23b30 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -129,6 +129,7 @@ CREATE TABLE IF NOT EXISTS stock_items ( op_balance_quantity float NOT NULL, op_balance_rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', op_balance_total_value decimal(15,2) NOT NULL DEFAULT '0.00', + default_sell_price decimal(15,2) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/inventory/stockitem.php b/system/application/controllers/inventory/stockitem.php index 5193c51..2d68c61 100644 --- a/system/application/controllers/inventory/stockitem.php +++ b/system/application/controllers/inventory/stockitem.php @@ -66,6 +66,13 @@ class StockItem extends Controller { 'size' => '40', 'value' => '', ); + $data['stock_item_default_sell_price'] = array( + 'name' => 'stock_item_default_sell_price', + 'id' => 'stock_item_default_sell_price', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); $data['stock_item_costing_methods'] = array( '1' => 'Last In First Out (LIFO)', '2' => 'First In First Out (FIFO)', @@ -84,6 +91,7 @@ class StockItem extends Controller { $this->form_validation->set_rules('stock_item_op_quantity', 'Opening Balance Quantity', 'trim|quantity'); $this->form_validation->set_rules('stock_item_op_rate_per_unit', 'Opening Balance Rate per unit', 'trim|currency'); $this->form_validation->set_rules('stock_item_op_total', 'Opening Balance Total value', 'trim|currency'); + $this->form_validation->set_rules('stock_item_default_sell_price', 'Default Selling Price', 'trim|currency'); /* Re-populating form */ if ($_POST) @@ -95,6 +103,7 @@ class StockItem extends Controller { $data['stock_item_op_quantity']['value'] = $this->input->post('stock_item_op_quantity', TRUE); $data['stock_item_op_rate_per_unit']['value'] = $this->input->post('stock_item_op_rate_per_unit', TRUE); $data['stock_item_op_total']['value'] = $this->input->post('stock_item_op_total', TRUE); + $data['stock_item_default_sell_price']['value'] = $this->input->post('stock_item_default_sell_price', TRUE); } if ($this->form_validation->run() == FALSE) @@ -112,6 +121,7 @@ class StockItem extends Controller { $data_stock_item_op_quantity = $this->input->post('stock_item_op_quantity', TRUE); $data_stock_item_op_rate_per_unit = $this->input->post('stock_item_op_rate_per_unit', TRUE); $data_stock_item_op_total = $this->input->post('stock_item_op_total', TRUE); + $data_stock_item_default_sell_price = $this->input->post('stock_item_default_sell_price', TRUE); /* Check if stock group present */ $this->db->select('id')->from('stock_groups')->where('id', $data_stock_item_group_id); @@ -143,6 +153,7 @@ class StockItem extends Controller { 'op_balance_quantity' => $data_stock_item_op_quantity, 'op_balance_rate_per_unit' => $data_stock_item_op_rate_per_unit, 'op_balance_total_value' => $data_stock_item_op_total, + 'default_sell_price' => $data_stock_item_default_sell_price, ); if ( ! $this->db->insert('stock_items', $insert_data)) { @@ -231,6 +242,13 @@ class StockItem extends Controller { 'size' => '40', 'value' => $stock_item_data->op_balance_total_value, ); + $data['stock_item_default_sell_price'] = array( + 'name' => 'stock_item_default_sell_price', + 'id' => 'stock_item_default_sell_price', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_item_data->default_sell_price, + ); $data['stock_item_costing_methods'] = array( '1' => 'Last In First Out (LIFO)', '2' => 'First In First Out (FIFO)', @@ -250,6 +268,7 @@ class StockItem extends Controller { $this->form_validation->set_rules('stock_item_op_quantity', 'Opening Balance Quantity', 'trim|quantity'); $this->form_validation->set_rules('stock_item_op_rate_per_unit', 'Opening Balance Rate per unit', 'trim|currency'); $this->form_validation->set_rules('stock_item_op_total', 'Opening Balance Total value', 'trim|currency'); + $this->form_validation->set_rules('stock_item_default_sell_price', 'Default Selling Price', 'trim|currency'); /* Re-populating form */ if ($_POST) @@ -261,6 +280,7 @@ class StockItem extends Controller { $data['stock_item_op_quantity']['value'] = $this->input->post('stock_item_op_quantity', TRUE); $data['stock_item_op_rate_per_unit']['value'] = $this->input->post('stock_item_op_rate_per_unit', TRUE); $data['stock_item_op_total']['value'] = $this->input->post('stock_item_op_total', TRUE); + $data['stock_item_default_sell_price']['value'] = $this->input->post('stock_item_default_sell_price', TRUE); } if ($this->form_validation->run() == FALSE) @@ -278,6 +298,7 @@ class StockItem extends Controller { $data_stock_item_op_quantity = $this->input->post('stock_item_op_quantity', TRUE); $data_stock_item_op_rate_per_unit = $this->input->post('stock_item_op_rate_per_unit', TRUE); $data_stock_item_op_total = $this->input->post('stock_item_op_total', TRUE); + $data_stock_item_default_sell_price = $this->input->post('stock_item_default_sell_price', TRUE); $data_id = $id; /* Check if stock group present */ @@ -310,6 +331,7 @@ class StockItem extends Controller { 'op_balance_quantity' => $data_stock_item_op_quantity, 'op_balance_rate_per_unit' => $data_stock_item_op_rate_per_unit, 'op_balance_total_value' => $data_stock_item_op_total, + 'default_sell_price' => $data_stock_item_default_sell_price, ); if ( ! $this->db->where('id', $data_id)->update('stock_items', $update_data)) { diff --git a/system/application/views/inventory/stockitem/add.php b/system/application/views/inventory/stockitem/add.php index e9e8652..f10f5bd 100644 --- a/system/application/views/inventory/stockitem/add.php +++ b/system/application/views/inventory/stockitem/add.php @@ -50,6 +50,12 @@ echo "</p>"; echo "<p>"; + echo form_label('Default selling price', 'stock_item_default_sell_price'); + echo "<br />"; + echo form_input($stock_item_default_sell_price); + echo "</p>"; + + echo "<p>"; echo form_submit('submit', 'Create'); echo " "; echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); diff --git a/system/application/views/inventory/stockitem/edit.php b/system/application/views/inventory/stockitem/edit.php index f5fd1be..0835134 100644 --- a/system/application/views/inventory/stockitem/edit.php +++ b/system/application/views/inventory/stockitem/edit.php @@ -50,6 +50,12 @@ echo "</p>"; echo "<p>"; + echo form_label('Default selling price', 'stock_item_default_sell_price'); + echo "<br />"; + echo form_input($stock_item_default_sell_price); + echo "</p>"; + + echo "<p>"; echo form_submit('submit', 'Update'); echo " "; echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); commit 4b762f403f4b1002943f8e05c2b5e9f758262a63 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 19 22:40:13 2011 +0530 Added voucher item stock_rate column Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 3d39387..defcf60 100644 --- a/db-update.txt +++ b/db-update.txt @@ -10,6 +10,7 @@ ALTER TABLE voucher_types ADD stock_voucher_type INT(2) NOT NULL DEFAULT '1'; ALTER TABLE voucher_types CHANGE bank_cash_ledger_restriction bank_cash_ledger_restriction INT(2) NOT NULL DEFAULT '1'; ALTER TABLE voucher_items ADD stock_type INT(1) NOT NULL; +ALTER TABLE voucher_items ADD stock_rate VARCHAR(15) NOT NULL; CREATE TABLE IF NOT EXISTS stock_units ( id int(11) NOT NULL AUTO_INCREMENT, diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index fc8de14..c833b94 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -52,6 +52,7 @@ CREATE TABLE IF NOT EXISTS voucher_items ( dc char(1) NOT NULL, reconciliation_date datetime NULL, stock_type int(1) NOT NULL, + stock_rate varchar(15) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index eb9dda3..2cf3386 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -205,13 +205,6 @@ class StockVoucher extends Controller { $data['rate_item'] = $this->input->post('rate_item', TRUE); $data['amount_item'] = $this->input->post('amount_item', TRUE); } else { - for ($count = 0; $count <= 1; $count++) - { - $data['ledger_dc'][$count] = "D"; - $data['ledger_id'][$count] = 0; - $data['rate_item'][$count] = ""; - $data['amount_item'][$count] = ""; - } for ($count = 0; $count <= 3; $count++) { $data['stock_item_id'][$count] = '0'; @@ -220,6 +213,13 @@ class StockVoucher extends Controller { $data['stock_item_discount'][$count] = ''; $data['stock_item_amount'][$count] = ''; } + for ($count = 0; $count <= 1; $count++) + { + $data['ledger_dc'][$count] = "D"; + $data['ledger_id'][$count] = 0; + $data['rate_item'][$count] = ""; + $data['amount_item'][$count] = ""; + } } if ($this->form_validation->run() == FALSE) @@ -332,7 +332,6 @@ class StockVoucher extends Controller { $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; if ($data_total_amount < 0) { - $this->db->trans_rollback(); $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; @@ -390,6 +389,7 @@ class StockVoucher extends Controller { 'dc' => '', 'reconciliation_date' => NULL, 'stock_type' => 1, + 'stock_rate' => '', ); if ($current_voucher_type['stock_voucher_type'] == '1') $insert_data['dc'] = 'D'; @@ -420,6 +420,7 @@ class StockVoucher extends Controller { 'dc' => '', 'reconciliation_date' => NULL, 'stock_type' => 2, + 'stock_rate' => '', ); if ($current_voucher_type['stock_voucher_type'] == '1') $insert_data['dc'] = 'C'; @@ -489,11 +490,13 @@ class StockVoucher extends Controller { { $data_ledger_dc = $data_all_ledger_dc[$id]; $data_ledger_id = $data_all_ledger_id[$id]; - $data_amount = $data_all_amount_item[$id]; if ($data_ledger_id < 1) continue; + $data_rate = $data_all_rate_item[$id]; + $data_amount = $data_all_amount_item[$id]; + $insert_ledger_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_ledger_id, @@ -501,6 +504,7 @@ class StockVoucher extends Controller { 'dc' => $data_ledger_dc, 'reconciliation_date' => NULL, 'stock_type' => 3, + 'stock_rate' => $data_rate, ); if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) { diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 095dc03..efb9e64 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -90,10 +90,12 @@ $(document).ready(function() { itemrow.next().next().next().next().children().val(item_amount); itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } + updateLedgerRowTotal(); $('.recalculate').trigger('click'); } $('table td .amount-stock-item').live('change', function() { + updateLedgerRowTotal(); $('.recalculate').trigger('click'); }); @@ -149,8 +151,6 @@ $(document).ready(function() { $(this).parent().next().next().children().attr('disabled', ''); $(this).parent().prev().children().trigger('change'); } - $(this).parent().next().children().trigger('change'); - $(this).parent().next().next().children().trigger('change'); var ledgerid = $(this).val(); var rowid = $(this); @@ -174,6 +174,50 @@ $(document).ready(function() { } }); + $('table td .rate-item').live('change', function() { + var rowid = $(this); + calculateLedgerRowTotal(rowid.parent().prev().prev()); + }); + + /* calculating ledger item amount */ + var calculateLedgerRowTotal = function(itemrow) { + var item_rate = itemrow.next().next().children().val(); + var is_percent = false; + var stock_total = calculateStockTotal(); + + /* check whether rate is in percent */ + if (item_rate != "") { + if (item_rate.match(/%$/)) + { + is_percent = true; + } + } + + item_rate = parseFloat(item_rate); + + if (!isNaN(item_rate)) + { + var item_amount; + if (is_percent) { + if (item_rate <= 100) { + item_amount = (((stock_total) * (100 + item_rate)) / 100) - (stock_total); + } + /* displaying total amount for each stock item */ + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + } + $('.recalculate').trigger('click'); + } + + /* updating ledger total */ + var updateLedgerRowTotal = function() { + $('table td .rate-item').each(function(index) { + var rowid = $(this); + calculateLedgerRowTotal(rowid.parent().prev().prev()); + }); + } + $('table td .amount-item').live('change', function() { $('.recalculate').trigger('click'); }); diff --git a/system/application/views/inventory/stockvoucher/downloadpreview.php b/system/application/views/inventory/stockvoucher/downloadpreview.php index 52ee803..31987c0 100644 --- a/system/application/views/inventory/stockvoucher/downloadpreview.php +++ b/system/application/views/inventory/stockvoucher/downloadpreview.php @@ -130,7 +130,7 @@ <table class="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger A/C</th>><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php @@ -144,6 +144,7 @@ } else { echo "<td class=\"ledger-name item\">Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; } + echo "<td class=\"item\">" . $row->stock_rate . "</td>"; if ($row->dc == "D") { echo "<td class=\"ledger-dr item\">" . $currency . " " . $row->amount . "</td>"; @@ -154,7 +155,7 @@ } echo "</tr>"; } - echo "<tr class=\"tr-total\"><td class=\"total-name\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"2\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; ?> </tbody> </table> diff --git a/system/application/views/inventory/stockvoucher/emailpreview.php b/system/application/views/inventory/stockvoucher/emailpreview.php index a1f0bcc..e256c94 100644 --- a/system/application/views/inventory/stockvoucher/emailpreview.php +++ b/system/application/views/inventory/stockvoucher/emailpreview.php @@ -71,7 +71,7 @@ <table border=1 cellpadding=6> <thead> - <tr><th align="left">Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr><th align="left">Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php @@ -85,6 +85,7 @@ } else { echo "<td>Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; } + echo "<td>" . $row->stock_rate . "</td>"; if ($row->dc == "D") { echo "<td>" . $currency . " " . $row->amount . "</td>"; @@ -95,7 +96,7 @@ } echo "</tr>"; } - echo "<tr><td>Total</td><td>" . $currency . " " . $cur_voucher->dr_total . "</td><td>" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + echo "<tr><td colspan=\"2\">Total</td><td>" . $currency . " " . $cur_voucher->dr_total . "</td><td>" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; ?> </tbody> </table> diff --git a/system/application/views/inventory/stockvoucher/printpreview.php b/system/application/views/inventory/stockvoucher/printpreview.php index a7cd8e1..cdb545d 100644 --- a/system/application/views/inventory/stockvoucher/printpreview.php +++ b/system/application/views/inventory/stockvoucher/printpreview.php @@ -76,7 +76,7 @@ <table id="print-voucher-table"> <thead> - <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + <tr class="tr-title"><th>Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr> </thead> <tbody> <?php @@ -86,21 +86,22 @@ echo "<tr class=\"tr-ledger\">"; if ($row->dc == "D") { - echo "<td class=\"ledger-name item\">Dr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + echo "<td class=\"item\">Dr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; } else { - echo "<td class=\"ledger-name item\">Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + echo "<td class=\"item\">Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; } + echo "<td class=\"item\">" . $row->stock_rate . "</td>"; if ($row->dc == "D") { - echo "<td class=\"ledger-dr item\">" . $currency . " " . $row->amount . "</td>"; - echo "<td class=\"ledger-cr last-item\"></td>"; + echo "<td class=\"item\">" . $currency . " " . $row->amount . "</td>"; + echo "<td class=\"item last-item\"></td>"; } else { - echo "<td class=\"ledger-dr item\"></td>"; - echo "<td class=\"ledger-cr last-item\">" . $currency . " " . $row->amount . "</td>"; + echo "<td class=\"item\"></td>"; + echo "<td class=\"item last-item\">" . $currency . " " . $row->amount . "</td>"; } echo "</tr>"; } - echo "<tr class=\"tr-total\"><td class=\"total-name\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + echo "<tr class=\"tr-total\"><td class=\"total-name\" colspan=\"2\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; ?> </tbody> </table> diff --git a/system/application/views/inventory/stockvoucher/view.php b/system/application/views/inventory/stockvoucher/view.php index 8448522..b46092d 100644 --- a/system/application/views/inventory/stockvoucher/view.php +++ b/system/application/views/inventory/stockvoucher/view.php @@ -60,13 +60,14 @@ foreach ($cur_voucher_stock_items->result() as $row) <br /> <table border=0 cellpadding=5 class="simple-table voucher-view-table"> -<thead><tr><th>Type</th><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> +<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> <?php foreach ($cur_voucher_ledgers->result() as $row) { echo "<tr>"; echo "<td>" . convert_dc($row->dc) . "</td>"; echo "<td>" . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + echo "<td>" . $row->stock_rate . "</td>"; if ($row->dc == "D") { echo "<td>Dr " . $row->amount . "</td>"; @@ -78,7 +79,7 @@ foreach ($cur_voucher_ledgers->result() as $row) echo "</tr>"; } ?> -<tr class="voucher-total"><td colspan=2><strong>Total</strong></td><td id=dr-total>Dr <?php echo $cur_voucher->dr_total; ?></td><td id=cr-total">Cr <?php echo $cur_voucher->cr_total; ?></td></tr> +<tr class="voucher-total"><td colspan=3><strong>Total</strong></td><td id=dr-total>Dr <?php echo $cur_voucher->dr_total; ?></td><td id=cr-total">Cr <?php echo $cur_voucher->cr_total; ?></td></tr> <?php if ($cur_voucher->dr_total != $cur_voucher->cr_total) { commit e175ed300ca3bb85b373ee9327cb82a41ddeb436 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 18 19:36:05 2011 +0530 Updated stock voucher total calculations Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 62fe401..eb9dda3 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -279,6 +279,7 @@ class StockVoucher extends Controller { /* Checking for Valid Stock Item A/C */ $stock_item_present = FALSE; + $data_total_stock_amount = 0; foreach ($data_all_stock_item_id as $id => $stock_data) { if ($data_all_stock_item_id[$id] < 1) @@ -294,6 +295,7 @@ class StockVoucher extends Controller { return; } $stock_item_present = TRUE; + $data_total_stock_amount += $data_all_stock_item_amount[$id]; } if ( ! $stock_item_present) { @@ -303,6 +305,7 @@ class StockVoucher extends Controller { } /* Checking for Valid Ledgers A/C */ + $data_total_ledger_amount = 0; foreach ($data_all_ledger_dc as $id => $ledger_data) { if ($data_all_ledger_id[$id] < 1) @@ -317,6 +320,22 @@ class StockVoucher extends Controller { $this->template->load('template', 'inventory/stockvoucher/add', $data); return; } + if ($data_all_ledger_dc[$id] == 'D') + $data_total_ledger_amount += $data_all_amount_item[$id]; + else + $data_total_ledger_amount -= $data_all_amount_item[$id]; + } + + /* Total amount calculations */ + $data_main_account_total = $data_total_stock_amount; + $data_main_entity_total = $data_total_stock_amount + $data_total_ledger_amount; + $data_total_amount = $data_total_stock_amount + $data_total_ledger_amount; + if ($data_total_amount < 0) + { + $this->db->trans_rollback(); + $this->messages->add($current_voucher_type['name'] . ' Voucher total cannot be negative.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; } /* Adding main voucher */ @@ -341,7 +360,6 @@ class StockVoucher extends Controller { $data_tag = NULL; $data_type = $voucher_type_id; $data_date = date_php_to_mysql($data_date); // Converting date to MySQL - $data_total_amount = 0; $voucher_id = NULL; /* Adding Voucher */ @@ -368,7 +386,7 @@ class StockVoucher extends Controller { $insert_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_main_account, - 'amount' => $data_total_amount, + 'amount' => $data_main_account_total, 'dc' => '', 'reconciliation_date' => NULL, 'stock_type' => 1, @@ -398,7 +416,7 @@ class StockVoucher extends Controller { $insert_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_main_entity, - 'amount' => $data_total_amount, + 'amount' => $data_main_entity_total, 'dc' => '', 'reconciliation_date' => NULL, 'stock_type' => 2, @@ -443,8 +461,6 @@ class StockVoucher extends Controller { $data_stock_item_discount = $data_all_stock_item_discount[$id]; $data_stock_item_amount = $data_all_stock_item_amount[$id]; - $data_total_amount += $data_stock_item_amount; - $insert_stock_data = array( 'voucher_id' => $voucher_id, 'stock_item_id' => $data_stock_item_id, @@ -473,16 +489,11 @@ class StockVoucher extends Controller { { $data_ledger_dc = $data_all_ledger_dc[$id]; $data_ledger_id = $data_all_ledger_id[$id]; + $data_amount = $data_all_amount_item[$id]; if ($data_ledger_id < 1) continue; - $data_amount = $data_all_amount_item[$id]; - if ($data_ledger_dc == "D") - $data_total_amount += $data_amount; - else - $data_total_amount -= $data_amount; - $insert_ledger_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_ledger_id, @@ -501,20 +512,12 @@ class StockVoucher extends Controller { } } - if ($data_total_amount < 0) - { - $this->db->trans_rollback(); - $this->messages->add('Voucher total cannot be negative.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since voucher total is negative."); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - /* Updating Debit and Credit Total - vouchers */ $update_data = array( 'dr_total' => $data_total_amount, 'cr_total' => $data_total_amount, ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) { $this->db->trans_rollback(); @@ -524,44 +527,6 @@ class StockVoucher extends Controller { return; } - /* Updating Debit and Credit Total - main account */ - $update_data = array( - 'amount' => $data_total_amount, - ); - if ( ! $this->db->where('id', $main_voucher_id)->update('voucher_items', $update_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error updating Purchase Ledger A/C total.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating purchase ledger total"); - } else { - $this->messages->add('Error updating Sale Ledger A/C total.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger total"); - } - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - - /* Updating Debit and Credit Total - entity account */ - $update_data = array( - 'amount' => $data_total_amount, - ); - if ( ! $this->db->where('id', $entity_voucher_id)->update('voucher_items', $update_data)) - { - $this->db->trans_rollback(); - if ($current_voucher_type['stock_voucher_type'] == '1') - { - $this->messages->add('Error updating Creditor (Supplier) total.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating creditor (supplier) total"); - } else { - $this->messages->add('Error updating Debtor (Customer) total.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor (customer) total"); - } - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - /* Success */ $this->db->trans_complete(); diff --git a/system/application/views/inventory/stockvoucher/view.php b/system/application/views/inventory/stockvoucher/view.php index 3bf649d..8448522 100644 --- a/system/application/views/inventory/stockvoucher/view.php +++ b/system/application/views/inventory/stockvoucher/view.php @@ -41,6 +41,7 @@ Voucher Date : <span class="bold"><?php echo date_mysql_to_php_display($cur_vouc <table border=0 cellpadding=5 class="simple-table voucher-view-table"> <thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Discount</th><th>Total</th></tr></thead> <?php +$stock_total = 0; foreach ($cur_voucher_stock_items->result() as $row) { echo "<tr>"; @@ -50,8 +51,10 @@ foreach ($cur_voucher_stock_items->result() as $row) echo "<td>" . $row->discount . "</td>"; echo "<td>" . $row->total . "</td>"; echo "</tr>"; + $stock_total += $row->total; } ?> +<tr class="voucher-total"><td colspan=4><strong>Total</strong></td><td id="stock-total"><?php echo convert_cur($stock_total); ?></td></tr> </table> <br /> commit 6ea9ca8590eca53492f74803da8498f27819e4a7 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 18 19:04:01 2011 +0530 Updated voucher name for stock vouchers Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index aa6291b..9a26499 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -132,7 +132,14 @@ class Ledger_model extends Model { $ledger_type = 'D'; $this->db->select('ledgers.name as name'); - $this->db->from('voucher_items')->join('ledgers', 'voucher_items.ledger_id = ledgers.id')->where('voucher_items.voucher_id', $voucher_id)->where('voucher_items.dc', $ledger_type); + $this->db->from('voucher_items')->join('ledgers', 'voucher_items.ledger_id = ledgers.id')->where('voucher_items.voucher_id', $voucher_id); + if ($current_voucher_type['base_type'] == '2') + { + $this->db->where('voucher_items.stock_type', 2); + } else { + $this->db->where('voucher_items.dc', $ledger_type); + } + $ledger_q = $this->db->get(); if ( ! $ledger = $ledger_q->row()) { commit 62ff937b60ace61eeb0ea121182da3b186cfafe1 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Thu Feb 17 22:24:30 2011 +0530 Updated check for valid database tables Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/libraries/General.php b/system/application/libraries/General.php index eab6e19..677fdeb 100644 --- a/system/application/libraries/General.php +++ b/system/application/libraries/General.php @@ -71,7 +71,7 @@ class General { if ($CI->db->query("SHOW TABLES")) { /* Check for valid webzash database */ - $table_names = array('groups', 'ledgers', 'vouchers', 'voucher_items', 'tags', 'logs', 'settings'); + $table_names = array('groups', 'ledgers', 'voucher_types', 'vouchers', 'voucher_items', 'stock_units', 'stock_groups', 'stock_items', 'stock_voucher_items', 'tags', 'logs', 'settings'); foreach ($table_names as $id => $tbname) { $valid_db_q = mysql_query('DESC ' . $tbname); commit 316774aec22cc32655c93a41255be5e53e61800e Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Thu Feb 17 22:05:41 2011 +0530 Udpated stock voucher total Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index a677545..62fe401 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -501,6 +501,15 @@ class StockVoucher extends Controller { } } + if ($data_total_amount < 0) + { + $this->db->trans_rollback(); + $this->messages->add('Voucher total cannot be negative.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since voucher total is negative."); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + /* Updating Debit and Credit Total - vouchers */ $update_data = array( 'dr_total' => $data_total_amount, diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index b3f814d..095dc03 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -90,6 +90,7 @@ $(document).ready(function() { itemrow.next().next().next().next().children().val(item_amount); itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } + $('.recalculate').trigger('click'); } $('table td .amount-stock-item').live('change', function() { @@ -201,6 +202,10 @@ $(document).ready(function() { $('table td .recalculate').live('click', function() { var voucherTotal = calculateLedgerTotal() + calculateStockTotal(); $("table tr #vr-total").text(voucherTotal); + if (voucherTotal >= 0) + $("table tr #vr-total").css("background-color", "#FFFF99"); + else + $("table tr #vr-total").css("background-color", "#FFE9E8"); }); /* Delete ledger row */ commit f95137368bde3219028b211f7ba6096fca6632c1 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Thu Feb 17 21:51:48 2011 +0530 Updated stock voucher total Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 34b2e2f..b3f814d 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -93,7 +93,7 @@ $(document).ready(function() { } $('table td .amount-stock-item').live('change', function() { - calculateStockTotal(); + $('.recalculate').trigger('click'); }); /* calculating stock total */ @@ -133,6 +133,7 @@ $(document).ready(function() { /******************************* LEDGER *******************************/ /* Dr - Cr dropdown changed */ $('.dc-dropdown').live('change', function() { + $('.recalculate').trigger('click'); }); /* Ledger dropdown changed */ @@ -172,9 +173,34 @@ $(document).ready(function() { } }); + $('table td .amount-item').live('change', function() { + $('.recalculate').trigger('click'); + }); + + /* calculating ledger total */ + var calculateLedgerTotal = function() { + var ledger_total = 0; + $('table td .amount-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + { + if ($(this).parent().prev().prev().prev().children().val() == 'D') { + ledger_total += item_amount; + } else if ($(this).parent().prev().prev().prev().children().val() == 'C') { + ledger_total -= item_amount; + } + } + } + }); + return ledger_total; + } + /* Recalculate Total */ $('table td .recalculate').live('click', function() { - + var voucherTotal = calculateLedgerTotal() + calculateStockTotal(); + $("table tr #vr-total").text(voucherTotal); }); /* Delete ledger row */ @@ -273,7 +299,7 @@ $(document).ready(function() { echo "<p></p>"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Discount</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Discount %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($stock_item_id as $i => $row) { @@ -366,7 +392,7 @@ $(document).ready(function() { } echo "<tr><td colspan=\"7\"></td></tr>"; - echo "<tr id=\"voucher-total\"><td colspan=3><strong>Total</strong></td><td id=\"cr-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; + echo "<tr id=\"voucher-total\"><td colspan=3><strong>Total</strong></td><td id=\"vr-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; echo "</table>"; commit fbb5116793b4718c1820b5eb7b63447459239341 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Feb 16 22:43:36 2011 +0530 Added stock item total calculation in javascript Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 527a2a1..34b2e2f 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -62,7 +62,15 @@ $(document).ready(function() { var item_quantity = itemrow.next().children().val(); var item_rate_per_unit = itemrow.next().next().children().val(); var item_discount = itemrow.next().next().next().children().val(); + var is_percent = false; + /* check whether discount is in percent or absolute value */ + if (item_discount != "") { + if (item_discount.match(/%$/)) + { + is_percent = true; + } + } item_quantity = parseFloat(item_quantity); item_rate_per_unit = parseFloat(item_rate_per_unit); item_discount = parseFloat(item_discount); @@ -70,12 +78,38 @@ $(document).ready(function() { item_discount = 0; if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) { - var item_amount = (item_quantity * item_rate_per_unit) - item_discount; + /* calculating total amount for each stock item */ + var item_amount; + if (is_percent) { + if (item_discount <= 100) + item_amount = ((item_quantity * item_rate_per_unit) * (100 - item_discount)) / 100; + } else { + item_amount = (item_quantity * item_rate_per_unit) - item_discount; + } + /* displaying total amount for each stock item */ itemrow.next().next().next().next().children().val(item_amount); itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } } + $('table td .amount-stock-item').live('change', function() { + calculateStockTotal(); + }); + + /* calculating stock total */ + var calculateStockTotal = function() { + var stock_total = 0; + $('table td .amount-stock-item').each(function(index) { + if ($(this).val() != "") + { + var item_amount = parseFloat($(this).val()); + if ( ! isNaN(item_amount)) + stock_total += item_amount; + } + }); + return stock_total; + } + /* Add stock item row */ $('table td .addstockrow').live('click', function() { var cur_obj = this; @@ -273,7 +307,7 @@ $(document).ready(function() { 'maxlength' => '15', 'size' => '15', 'value' => isset($stock_item_amount[$i]) ? $stock_item_amount[$i] : '', - 'class' => 'rate-stock-item', + 'class' => 'amount-stock-item', ); echo "<tr>"; commit 2388c6435e9f930e5e63c90cd8de748c97d839fc Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Tue Feb 15 23:25:02 2011 +0530 Added discount validation Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 1fa0ed0..a677545 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -173,7 +173,7 @@ class StockVoucher extends Controller { { $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); - $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|rate'); + $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|discount'); $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); } foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) diff --git a/system/application/libraries/MY_Form_validation.php b/system/application/libraries/MY_Form_validation.php index a795821..7379e9c 100644 --- a/system/application/libraries/MY_Form_validation.php +++ b/system/application/libraries/MY_Form_validation.php @@ -118,6 +118,24 @@ class MY_Form_validation extends CI_Form_validation { } } + function discount($str) + { + $CI =& get_instance(); + if (preg_match('/^[\-]/', $str)) + { + $CI->form_validation->set_message('discount', '%s cannot be negative.'); + return FALSE; + } + + if (preg_match('/^[0-9]*\.?[0-9]{0,2}%?$/', $str)) + { + return TRUE; + } else { + $CI->form_validation->set_message('discount', '%s must be a valid percent or amount. Maximum 2 decimal places is allowed.'); + return FALSE; + } + } + function is_date($str) { $CI =& get_instance(); diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index ef0e6ee..527a2a1 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -243,7 +243,7 @@ $(document).ready(function() { foreach ($stock_item_id as $i => $row) { - $stock_item_quantity = array( + $stock_item_quantity_item = array( 'name' => 'stock_item_quantity[' . $i . ']', 'id' => 'stock_item_quantity[' . $i . ']', 'maxlength' => '15', @@ -251,7 +251,7 @@ $(document).ready(function() { 'value' => isset($stock_item_quantity[$i]) ? $stock_item_quantity[$i] : '', 'class' => 'quantity-stock-item', ); - $stock_item_rate_per_unit = array( + $stock_item_rate_per_unit_item = array( 'name' => 'stock_item_rate_per_unit[' . $i . ']', 'id' => 'stock_item_rate_per_unit[' . $i . ']', 'maxlength' => '15', @@ -259,7 +259,7 @@ $(document).ready(function() { 'value' => isset($stock_item_rate_per_unit[$i]) ? $stock_item_rate_per_unit[$i] : '', 'class' => 'rate-stock-item', ); - $stock_item_discount = array( + $stock_item_discount_item = array( 'name' => 'stock_item_discount[' . $i . ']', 'id' => 'stock_item_discount[' . $i . ']', 'maxlength' => '15', @@ -267,7 +267,7 @@ $(document).ready(function() { 'value' => isset($stock_item_discount[$i]) ? $stock_item_discount[$i] : '', 'class' => 'discount-stock-item', ); - $stock_item_amount = array( + $stock_item_amount_item = array( 'name' => 'stock_item_amount[' . $i . ']', 'id' => 'stock_item_amount[' . $i . ']', 'maxlength' => '15', @@ -278,10 +278,10 @@ $(document).ready(function() { echo "<tr>"; echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', isset($stock_item_id[$i]) ? $stock_item_id[$i] : 0) . "</td>"; - echo "<td>" . form_input($stock_item_quantity) . "</td>"; - echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; - echo "<td>" . form_input($stock_item_discount) . "</td>"; - echo "<td>" . form_input($stock_item_amount) . "</td>"; + echo "<td>" . form_input($stock_item_quantity_item) . "</td>"; + echo "<td>" . form_input($stock_item_rate_per_unit_item) . "</td>"; + echo "<td>" . form_input($stock_item_discount_item) . "</td>"; + echo "<td>" . form_input($stock_item_amount_item) . "</td>"; echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; @@ -300,7 +300,7 @@ $(document).ready(function() { foreach ($ledger_dc as $i => $ledger) { - $rate_item = array( + $rate_item_item = array( 'name' => 'rate_item[' . $i . ']', 'id' => 'rate_item[' . $i . ']', 'maxlength' => '5', @@ -308,7 +308,7 @@ $(document).ready(function() { 'value' => isset($rate_item[$i]) ? $rate_item[$i] : '', 'class' => 'rate-item', ); - $amount_item = array( + $amount_item_item = array( 'name' => 'amount_item[' . $i . ']', 'id' => 'amount_item[' . $i . ']', 'maxlength' => '15', @@ -320,8 +320,8 @@ $(document).ready(function() { echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', isset($ledger_dc[$i]) ? $ledger_dc[$i] : "D") . "</td>"; echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', isset($ledger_id[$i]) ? $ledger_id[$i] : 0) . "</td>"; - echo "<td>" . form_input($rate_item) . "</td>"; - echo "<td>" . form_input($amount_item) . "</td>"; + echo "<td>" . form_input($rate_item_item) . "</td>"; + echo "<td>" . form_input($amount_item_item) . "</td>"; echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; commit 12f943448b2bcfd77b1b9b8c9a0c854b399c802c Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Mon Feb 14 15:54:55 2011 +0530 Added stock voucher email, download, view Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 816fa11..3d39387 100644 --- a/db-update.txt +++ b/db-update.txt @@ -9,6 +9,8 @@ ALTER TABLE voucher_types ADD stock_voucher_type INT(2) NOT NULL DEFAULT '1'; ALTER TABLE voucher_types CHANGE bank_cash_ledger_restriction bank_cash_ledger_restriction INT(2) NOT NULL DEFAULT '1'; +ALTER TABLE voucher_items ADD stock_type INT(1) NOT NULL; + CREATE TABLE IF NOT EXISTS stock_units ( id int(11) NOT NULL AUTO_INCREMENT, symbol varchar(15) NOT NULL, diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index 98a91aa..fc8de14 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -51,6 +51,7 @@ CREATE TABLE IF NOT EXISTS voucher_items ( amount decimal(15,2) NOT NULL DEFAULT '0.00', dc char(1) NOT NULL, reconciliation_date datetime NULL, + stock_type int(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 9585ca2..1fa0ed0 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -7,6 +7,7 @@ class StockVoucher extends Controller { parent::Controller(); $this->load->model('Voucher_model'); $this->load->model('Ledger_model'); + $this->load->model('Stock_Item_model'); $this->load->model('Tag_model'); return; } @@ -30,6 +31,13 @@ class StockVoucher extends Controller { $current_voucher_type = voucher_type_info($voucher_type_id); } + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + $this->template->set('page_title', 'View ' . $current_voucher_type['name'] . ' Voucher'); /* Load current voucher details */ @@ -39,18 +47,43 @@ class StockVoucher extends Controller { redirect('voucher/show/' . $current_voucher_type['label']); return; } - /* Load current voucher details */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); $cur_voucher_ledgers = $this->db->get(); if ($cur_voucher_ledgers->num_rows() < 1) { $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; - $this->template->load('template', 'voucher/view', $data); + $this->template->load('template', 'inventory/stockvoucher/view', $data); return; } @@ -337,6 +370,8 @@ class StockVoucher extends Controller { 'ledger_id' => $data_main_account, 'amount' => $data_total_amount, 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 1, ); if ($current_voucher_type['stock_voucher_type'] == '1') $insert_data['dc'] = 'D'; @@ -365,6 +400,8 @@ class StockVoucher extends Controller { 'ledger_id' => $data_main_entity, 'amount' => $data_total_amount, 'dc' => '', + 'reconciliation_date' => NULL, + 'stock_type' => 2, ); if ($current_voucher_type['stock_voucher_type'] == '1') $insert_data['dc'] = 'C'; @@ -451,6 +488,8 @@ class StockVoucher extends Controller { 'ledger_id' => $data_ledger_id, 'amount' => $data_amount, 'dc' => $data_ledger_dc, + 'reconciliation_date' => NULL, + 'stock_type' => 3, ); if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) { @@ -981,10 +1020,9 @@ class StockVoucher extends Controller { { $this->load->helper('download'); $this->load->model('Setting_model'); - $this->load->model('Ledger_model'); /* Check access */ - if ( ! check_access('download voucher')) + if ( ! check_access('download stock voucher')) { $this->messages->add('Permission denied.', 'error'); redirect('inventory/stockvoucher/show/' . $voucher_type); @@ -1002,6 +1040,13 @@ class StockVoucher extends Controller { $current_voucher_type = voucher_type_info($voucher_type_id); } + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + /* Load current voucher details */ if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) { @@ -1010,36 +1055,45 @@ class StockVoucher extends Controller { return; } - $data['voucher_type_id'] = $voucher_type_id; - $data['current_voucher_type'] = $current_voucher_type; - $data['voucher_number'] = $cur_voucher->number; - $data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); - $data['voucher_dr_total'] = $cur_voucher->dr_total; - $data['voucher_cr_total'] = $cur_voucher->cr_total; - $data['voucher_narration'] = $cur_voucher->narration; - - /* Getting Ledger details */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); - $ledger_q = $this->db->get(); - $counter = 0; - $data['ledger_data'] = array(); - if ($ledger_q->num_rows() > 0) + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) { - foreach ($ledger_q->result() as $row) - { - $data['ledger_data'][$counter] = array( - 'id' => $row->ledger_id, - 'name' => $this->Ledger_model->get_name($row->ledger_id), - 'dc' => $row->dc, - 'amount' => $row->amount, - ); - $counter++; - } + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); } + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + /* Download Voucher */ $file_name = $current_voucher_type['name'] . '_voucher_' . $cur_voucher->number . ".html"; - $download_data = $this->load->view('voucher/downloadpreview', $data, TRUE); + $download_data = $this->load->view('inventory/stockvoucher/downloadpreview', $data, TRUE); force_download($file_name, $download_data); return; } @@ -1047,10 +1101,9 @@ class StockVoucher extends Controller { function printpreview($voucher_type, $voucher_id = 0) { $this->load->model('Setting_model'); - $this->load->model('Ledger_model'); /* Check access */ - if ( ! check_access('print voucher')) + if ( ! check_access('print stock voucher')) { $this->messages->add('Permission denied.', 'error'); redirect('inventory/stockvoucher/show/' . $voucher_type); @@ -1068,6 +1121,13 @@ class StockVoucher extends Controller { $current_voucher_type = voucher_type_info($voucher_type_id); } + if ($current_voucher_type['base_type'] == '1') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + /* Load current voucher details */ if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) { @@ -1076,45 +1136,53 @@ class StockVoucher extends Controller { return; } - $data['voucher_type_id'] = $voucher_type_id; - $data['current_voucher_type'] = $current_voucher_type; - $data['voucher_number'] = $cur_voucher->number; - $data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); - $data['voucher_dr_total'] = $cur_voucher->dr_total; - $data['voucher_cr_total'] = $cur_voucher->cr_total; - $data['voucher_narration'] = $cur_voucher->narration; - - /* Getting Ledger details */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); - $ledger_q = $this->db->get(); - $counter = 0; - $data['ledger_data'] = array(); - if ($ledger_q->num_rows() > 0) + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) { - foreach ($ledger_q->result() as $row) - { - $data['ledger_data'][$counter] = array( - 'id' => $row->ledger_id, - 'name' => $this->Ledger_model->get_name($row->ledger_id), - 'dc' => $row->dc, - 'amount' => $row->amount, - ); - $counter++; - } + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); } - $this->load->view('voucher/printpreview', $data); + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + + $this->load->view('inventory/stockvoucher/printpreview', $data); return; } function email($voucher_type, $voucher_id = 0) { $this->load->model('Setting_model'); - $this->load->model('Ledger_model'); $this->load->library('email'); /* Check access */ - if ( ! check_access('email voucher')) + if ( ! check_access('email stock voucher')) { $this->messages->add('Permission denied.', 'error'); redirect('inventory/stockvoucher/show/' . $voucher_type); @@ -1142,6 +1210,34 @@ class StockVoucher extends Controller { return; } + /* Load current voucher details - account, entity, ledgers */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 1)->order_by('id', 'asc'); + $cur_voucher_main_account = $this->db->get(); + if ($cur_voucher_main_account->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Purchase or Sale Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 2)->order_by('id', 'asc'); + $cur_voucher_main_entity = $this->db->get(); + if ($cur_voucher_main_entity->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Debtor or Creditor Ledger A/C.', 'error'); + } + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->where('stock_type', 3)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + + /* Load current stock items details */ + $this->db->from('stock_voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_stock_items = $this->db->get(); + if ($cur_voucher_stock_items->num_rows() < 1) + { + $this->messages->add('Voucher has no associated stock items.', 'error'); + } + $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; $data['voucher_id'] = $voucher_id; @@ -1165,40 +1261,19 @@ class StockVoucher extends Controller { if ($this->form_validation->run() == FALSE) { $data['error'] = validation_errors(); - $this->load->view('voucher/email', $data); + $this->load->view('inventory/stockvoucher/email', $data); return; } else { - $voucher_data['voucher_type_id'] = $voucher_type_id; - $voucher_data['current_voucher_type'] = $current_voucher_type; - $voucher_data['voucher_number'] = $cur_voucher->number; - $voucher_data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); - $voucher_data['voucher_dr_total'] = $cur_voucher->dr_total; - $voucher_data['voucher_cr_total'] = $cur_voucher->cr_total; - $voucher_data['voucher_narration'] = $cur_voucher->narration; - - /* Getting Ledger details */ - $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); - $ledger_q = $this->db->get(); - $counter = 0; - $voucher_data['ledger_data'] = array(); - if ($ledger_q->num_rows() > 0) - { - foreach ($ledger_q->result() as $row) - { - $voucher_data['ledger_data'][$counter] = array( - 'id' => $row->ledger_id, - 'name' => $this->Ledger_model->get_name($row->ledger_id), - 'dc' => $row->dc, - 'amount' => $row->amount, - ); - $counter++; - } - } + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_main_account'] = $cur_voucher_main_account; + $data['cur_voucher_main_entity'] = $cur_voucher_main_entity; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['cur_voucher_stock_items'] = $cur_voucher_stock_items; /* Preparing message */ - $message = $this->load->view('voucher/emailpreview', $voucher_data, TRUE); + $message = $this->load->view('inventory/stockvoucher/emailpreview', $data, TRUE); /* Getting email configuration */ $config['smtp_timeout'] = '30'; @@ -1230,7 +1305,7 @@ class StockVoucher extends Controller { $data['error'] = "Error sending email. Check you email settings."; $this->logger->write_message("error", "Error emailing " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); } - $this->load->view('voucher/email', $data); + $this->load->view('inventory/stockvoucher/email', $data); return; } return; diff --git a/system/application/controllers/voucher.php b/system/application/controllers/voucher.php index eeb24af..312728f 100644 --- a/system/application/controllers/voucher.php +++ b/system/application/controllers/voucher.php @@ -207,6 +207,13 @@ class Voucher extends Controller { $current_voucher_type = voucher_type_info($voucher_type_id); } + if ($current_voucher_type['base_type'] == '2') + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } + $this->template->set('page_title', 'View ' . $current_voucher_type['name'] . ' Voucher'); /* Load current voucher details */ diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index e152bb0..aa6291b 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -128,7 +128,7 @@ class Ledger_model extends Model { $current_voucher_type = voucher_type_info($voucher_type_id); $ledger_type = 'C'; - if ($current_voucher_type['bank_cash_ledger_restriction'] == 3) + if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') $ledger_type = 'D'; $this->db->select('ledgers.name as name'); @@ -141,9 +141,15 @@ class Ledger_model extends Model { $ledger_multiple = ($ledger_q->num_rows() > 1) ? TRUE : FALSE; $html = ''; if ($ledger_multiple) - $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + if ($current_voucher_type['base_type'] == '1') + $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + else + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, "(" . $ledger->name . ")", array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); else - $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + if ($current_voucher_type['base_type'] == '1') + $html .= anchor('voucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); + else + $html .= anchor('inventory/stockvoucher/view/' . $current_voucher_type['label'] . "/" . $voucher_id, $ledger->name, array('title' => 'View ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'anchor-link-a')); return $html; } return; diff --git a/system/application/views/inventory/stockvoucher/downloadpreview.php b/system/application/views/inventory/stockvoucher/downloadpreview.php new file mode 100644 index 0000000..52ee803 --- /dev/null +++ b/system/application/views/inventory/stockvoucher/downloadpreview.php @@ -0,0 +1,165 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title><?php $current_voucher_type['name']; ?> Voucher Number <?php echo $voucher_number; ?></title> + +<style type="text/css"> + body { + color:#000000; + font:14px "Helvetica Neue","Lucida Grande","Helvetica Neue",Arial,sans-serif; + margin:20px; + padding:0; + } + + #print-account-name { + text-align:center; + font-size:17px; + } + + #print-account-address { + text-align:center; + font-size:14px; + } + + #print-voucher-type { + text-align:center; + font-size:15px; + } + + table.print-voucher-table { + border:1px solid #000000; + border-collapse: collapse; + } + + table.print-voucher-table tr.tr-title { + text-align:left; + border:1px solid #000000; + padding:5px 0 5px 2px; + } + + table.print-voucher-table tr.tr-title th { + padding:5px 0 5px 5px; + } + + table.print-voucher-table td { + padding:5px 0 5px 5px; + } + + table.print-voucher-table td.item { + padding-right:35px; + } + + table.print-voucher-table td.last-item { + padding-right:5px; + } + + table.print-voucher-table tr.tr-total { + border:1px solid #000000; + } +</style> + +</head> +<body> + <div id="print-account-name"><span class="value"><?php echo $this->config->item('account_name'); ?></span></div> + <div id="print-account-address"><span class="value"><?php echo $this->config->item('account_address'); ?></span></div> + <br /> + <div id="print-voucher-type"><span class="value"><?php echo $current_voucher_type['name']; ?> Voucher</span></div> + <br /> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Number : <span class="value"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span></div> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Date : <span class="value"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span></div> + <br /> + + <table class="print-voucher-table"> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Purchase Ledger A/C :"; + else + echo "Sale Ledger A/C :"; + ?> + </td> + <td class="last-item"> + <?php + $main_account = $cur_voucher_main_account->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_account->ledger_id) . "</span>"; + ?> + </td> + </tr> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Creditor (Supplier) :"; + else + echo "Debtor (Customer) :"; + ?> + </td> + <td class="last-item"> + <?php + $main_entity = $cur_voucher_main_entity->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_entity->ledger_id) . "</span>"; + ?> + </td> + </tr> + </table> + + <br /> + + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Discount</th><th>Total</th></tr> + </thead> + <tbody> + <?php + foreach ($cur_voucher_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"item\">" . $row->discount . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + } + ?> + </tbody> + </table> + + <br /> + + <table class="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + foreach ($cur_voucher_ledgers->result() as $row) + { + echo "<tr class=\"tr-ledger\">"; + if ($row->dc == "D") + { + echo "<td class=\"ledger-name item\">Dr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } else { + echo "<td class=\"ledger-name item\">Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } + if ($row->dc == "D") + { + echo "<td class=\"ledger-dr item\">" . $currency . " " . $row->amount . "</td>"; + echo "<td class=\"ledger-cr last-item\"></td>"; + } else { + echo "<td class=\"ledger-dr item\"></td>"; + echo "<td class=\"ledger-cr last-item\">" . $currency . " " . $row->amount . "</td>"; + } + echo "</tr>"; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + ?> + </tbody> + </table> + <br /> + <div id="print-voucher-narration">Narration : <span class="value"><?php echo $cur_voucher->narration; ?></span></div> + <br /> +</body> +</html> diff --git a/system/application/views/inventory/stockvoucher/email.php b/system/application/views/inventory/stockvoucher/email.php new file mode 100644 index 0000000..1cac7c1 --- /dev/null +++ b/system/application/views/inventory/stockvoucher/email.php @@ -0,0 +1,54 @@ +<style type="text/css"> +#error-box { + border:solid 1px #C34A2C; + background:#FFBABA; + color:#222222; + padding:0 10px 0 10px; + margin:0 0 10px 0; + text-align:left; +} + +#message-box { + border:solid 1px #FFEC8B; + background:#FFF8C6; + color:#222222; + padding:0 10px 0 10px; + margin:0 0 10px 0; + text-align:left; +} +</style> +<?php + if (isset($error) && $error) + { + echo "<div id=\"error-box\">"; + echo "<ul>"; + echo ($error); + echo "</ul>"; + echo "</div>"; + } + + if (isset($message) && $message) + { + echo "<div id=\"message-box\">"; + echo "<ul>"; + echo ($message); + echo "</ul>"; + echo "</div>"; + } + + echo form_open('inventory/stockvoucher/email/' . $current_voucher_type['label'] . "/" . $voucher_id); + + echo "Emailing " . $current_voucher_type['name'] . " Voucher No. " . $voucher_number . "<br />"; + + echo "<p>"; + echo form_label('Email to', 'email_to'); + echo "<br />"; + echo form_input($email_to); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Send Email'); + echo "</p>"; + + echo form_close(); + diff --git a/system/application/views/inventory/stockvoucher/emailpreview.php b/system/application/views/inventory/stockvoucher/emailpreview.php new file mode 100644 index 0000000..a1f0bcc --- /dev/null +++ b/system/application/views/inventory/stockvoucher/emailpreview.php @@ -0,0 +1,106 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title>Email - <?php echo $current_voucher_type['name']; ?> Voucher Number <?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></title> +</head> +<body> + <p><?php echo $this->config->item('account_name'); ?></p> + <p><?php echo $this->config->item('account_address'); ?></p> + <p><strong><?php echo $current_voucher_type['name']; ?> Voucher</strong></p> + <p><?php echo $current_voucher_type['name']; ?> Voucher Number : <strong><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></strong></p> + <p><?php echo $current_voucher_type['name']; ?> Voucher Date : <strong><?php echo date_mysql_to_php_display($cur_voucher->date); ?></strong></p> + + <table border=1 cellpadding=6> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Purchase Ledger A/C :"; + else + echo "Sale Ledger A/C :"; + ?> + </td> + <td> + <?php + $main_account = $cur_voucher_main_account->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_account->ledger_id) . "</span>"; + ?> + </td> + </tr> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Creditor (Supplier) :"; + else + echo "Debtor (Customer) :"; + ?> + </td> + <td> + <?php + $main_entity = $cur_voucher_main_entity->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_entity->ledger_id) . "</span>"; + ?> + </td> + </tr> + </table> + + <br /> + + <table border=1 cellpadding=6> + <thead> + <tr><th align="left">Stock Item</th><th>Quantity</th><th>Rate</th><th>Discount</th><th>Total</th></tr> + </thead> + <tbody> + <?php + foreach ($cur_voucher_stock_items->result() as $row) + { + echo "<tr>"; + echo "<td>" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td>" . $row->quantity . "</td>"; + echo "<td>" . $row->rate_per_unit . "</td>"; + echo "<td>" . $row->discount . "</td>"; + echo "<td>" . $row->total . "</td>"; + echo "</tr>"; + } + ?> + </tbody> + </table> + + <br /> + + <table border=1 cellpadding=6> + <thead> + <tr><th align="left">Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + foreach ($cur_voucher_ledgers->result() as $row) + { + echo "<tr>"; + if ($row->dc == "D") + { + echo "<td>Dr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } else { + echo "<td>Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } + if ($row->dc == "D") + { + echo "<td>" . $currency . " " . $row->amount . "</td>"; + echo "<td></td>"; + } else { + echo "<td></td>"; + echo "<td>" . $currency . " " . $row->amount . "</td>"; + } + echo "</tr>"; + } + echo "<tr><td>Total</td><td>" . $currency . " " . $cur_voucher->dr_total . "</td><td>" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + ?> + </tbody> + </table> + <br /> + <p>Narration : <span class="value"><?php echo $cur_voucher->narration; ?></p> + <br /> +</body> +</html> diff --git a/system/application/views/inventory/stockvoucher/printpreview.php b/system/application/views/inventory/stockvoucher/printpreview.php new file mode 100644 index 0000000..a7cd8e1 --- /dev/null +++ b/system/application/views/inventory/stockvoucher/printpreview.php @@ -0,0 +1,114 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"> +<html xmlns="
http://www.w3.org/1999/xhtml
" xml:lang="en" lang="en"> +<head> +<title>Print - <?php echo $current_voucher_type['name']; ?> Voucher Number <?php echo $voucher_number; ?></title> +<?php echo link_tag(asset_url() . 'images/favicon.ico', 'shortcut icon', 'image/ico'); ?> +<link type="text/css" rel="stylesheet" href="<?php echo asset_url(); ?>css/printvoucher.css"> +</head> +<body> + <div id="print-account-name"><span class="value"><?php echo $this->config->item('account_name'); ?></span></div> + <div id="print-account-address"><span class="value"><?php echo $this->config->item('account_address'); ?></span></div> + <br /> + <div id="print-voucher-type"><span class="value"><?php echo $current_voucher_type['name']; ?> Voucher</span></div> + <br /> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Number : <span class="value"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span></div> + <div id="print-voucher-number"><?php echo $current_voucher_type['name']; ?> Voucher Date : <span class="value"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span></div> + <br /> + + <table id="print-voucher-table"> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Purchase Ledger A/C"; + else + echo "Sale Ledger A/C"; + ?> + </td> + <td> + <?php + $main_account = $cur_voucher_main_account->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_account->ledger_id) . "</span>"; + ?> + </td> + </tr> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Creditor (Supplier)"; + else + echo "Debtor (Customer)"; + ?> + </td> + <td> + <?php + $main_entity = $cur_voucher_main_entity->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_entity->ledger_id) . "</span>"; + ?> + </td> + </tr> + </table> + + <br /> + + <table id="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Discount</th><th>Total</th></tr> + </thead> + <tbody> + <?php + foreach ($cur_voucher_stock_items->result() as $row) + { + echo "<tr class=\"tr-stock-item\">"; + echo "<td class=\"item\">" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td class=\"item\">" . $row->quantity . "</td>"; + echo "<td class=\"item\">" . $row->rate_per_unit . "</td>"; + echo "<td class=\"item\">" . $row->discount . "</td>"; + echo "<td class=\"last-item\">" . $row->total . "</td>"; + echo "</tr>"; + } + ?> + </tbody> + </table> + + <br /> + + <table id="print-voucher-table"> + <thead> + <tr class="tr-title"><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr> + </thead> + <tbody> + <?php + $currency = $this->config->item('account_currency_symbol'); + foreach ($cur_voucher_ledgers->result() as $row) + { + echo "<tr class=\"tr-ledger\">"; + if ($row->dc == "D") + { + echo "<td class=\"ledger-name item\">Dr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } else { + echo "<td class=\"ledger-name item\">Cr " . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + } + if ($row->dc == "D") + { + echo "<td class=\"ledger-dr item\">" . $currency . " " . $row->amount . "</td>"; + echo "<td class=\"ledger-cr last-item\"></td>"; + } else { + echo "<td class=\"ledger-dr item\"></td>"; + echo "<td class=\"ledger-cr last-item\">" . $currency . " " . $row->amount . "</td>"; + } + echo "</tr>"; + } + echo "<tr class=\"tr-total\"><td class=\"total-name\">Total</td><td class=\"total-dr\">" . $currency . " " . $cur_voucher->dr_total . "</td><td class=\"total-cr\">" . $currency . " " . $cur_voucher->cr_total . "</td></tr>"; + ?> + </tbody> + </table> + <br /> + <div id="print-voucher-narration">Narration : <span class="value"><?php echo $cur_voucher->narration; ?></span></div> + <br /> + <form> + <input class="hide-print" type="button" onClick="window.print()" value="Print voucher"> + </form> +</body> +</html> diff --git a/system/application/views/inventory/stockvoucher/view.php b/system/application/views/inventory/stockvoucher/view.php new file mode 100644 index 0000000..3bf649d --- /dev/null +++ b/system/application/views/inventory/stockvoucher/view.php @@ -0,0 +1,115 @@ +<p>Voucher Number : <span class="bold"><?php echo full_voucher_number($voucher_type_id, $cur_voucher->number); ?></span> + +Voucher Date : <span class="bold"><?php echo date_mysql_to_php_display($cur_voucher->date); ?></span> +</p> + +<table border=0 cellpadding=2> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Purchase Ledger A/C :"; + else + echo "Sale Ledger A/C :"; + ?> + </td> + <td> + <?php + $main_account = $cur_voucher_main_account->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_account->ledger_id) . "</span>"; + ?> + </td> + </tr> + <tr> + <td align=\"right\"> + <?php + if ($current_voucher_type['stock_voucher_type'] == '1') + echo "Creditor (Supplier) :"; + else + echo "Debtor (Customer) :"; + ?> + </td> + <td> + <?php + $main_entity = $cur_voucher_main_entity->row(); + echo "<span class=\"bold\">" . $this->Ledger_model->get_name($main_entity->ledger_id) . "</span>"; + ?> + </td> + </tr> +</table> + +<table border=0 cellpadding=5 class="simple-table voucher-view-table"> +<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate</th><th>Discount</th><th>Total</th></tr></thead> +<?php +foreach ($cur_voucher_stock_items->result() as $row) +{ + echo "<tr>"; + echo "<td>" . $this->Stock_Item_model->get_name($row->stock_item_id) . "</td>"; + echo "<td>" . $row->quantity . "</td>"; + echo "<td>" . $row->rate_per_unit . "</td>"; + echo "<td>" . $row->discount . "</td>"; + echo "<td>" . $row->total . "</td>"; + echo "</tr>"; +} +?> +</table> + +<br /> + +<table border=0 cellpadding=5 class="simple-table voucher-view-table"> +<thead><tr><th>Type</th><th>Ledger A/C</th><th>Dr Amount</th><th>Cr Amount</th></tr></thead> +<?php +foreach ($cur_voucher_ledgers->result() as $row) +{ + echo "<tr>"; + echo "<td>" . convert_dc($row->dc) . "</td>"; + echo "<td>" . $this->Ledger_model->get_name($row->ledger_id) . "</td>"; + if ($row->dc == "D") + { + echo "<td>Dr " . $row->amount . "</td>"; + echo "<td></td>"; + } else { + echo "<td></td>"; + echo "<td>Cr " . $row->amount . "</td>"; + } + echo "</tr>"; +} +?> +<tr class="voucher-total"><td colspan=2><strong>Total</strong></td><td id=dr-total>Dr <?php echo $cur_voucher->dr_total; ?></td><td id=cr-total">Cr <?php echo $cur_voucher->cr_total; ?></td></tr> +<?php +if ($cur_voucher->dr_total != $cur_voucher->cr_total) +{ + $difference = $cur_voucher->dr_total - $cur_voucher->cr_total; + if ($difference < 0) + echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\"></td><td id=\"cr-diff\">" . convert_amount_dc($difference) . "</td></tr>"; + else + echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\">" . convert_amount_dc($difference) . "</td><td id=\"cr-diff\"></td></tr>"; +} +?> +</table> +<p>Narration :<br /> +<span class="bold"><?php echo $cur_voucher->narration; ?></span> +</p> +<p> +Tag : +<?php +$cur_voucher_tag = $this->Tag_model->show_voucher_tag($cur_voucher->tag_id); +if ($cur_voucher_tag == "") + echo "(None)"; +else + echo $cur_voucher_tag; +?> +</p> +<?php + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo " | "; + echo anchor('inventory/stockvoucher/edit/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Edit', array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher')); + echo " | "; + echo anchor('inventory/stockvoucher/delete/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Delete', array('class' => "confirmClick", 'title' => "Delete voucher", 'title' => 'Delete this ' . $current_voucher_type['name'] . ' Voucher')); + echo " | "; + echo anchor_popup('inventory/stockvoucher/printpreview/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Print', array('title' => 'Print this ' . $current_voucher_type['name'] . ' Voucher', 'width' => '600', 'height' => '600')); + echo " | "; + echo anchor_popup('inventory/stockvoucher/email/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Email', array('title' => 'Email this ' . $current_voucher_type['name'] . ' Voucher', 'width' => '400', 'height' => '200')); + echo " | "; + echo anchor('inventory/stockvoucher/download/' . $current_voucher_type['label'] . "/" . $cur_voucher->id, 'Download', array('title' => "Download voucher", 'title' => 'Download this ' . $current_voucher_type['name'] . ' Voucher')); + diff --git a/system/application/views/voucher/view.php b/system/application/views/voucher/view.php index 39ff524..15e3f7d 100644 --- a/system/application/views/voucher/view.php +++ b/system/application/views/voucher/view.php @@ -30,9 +30,9 @@ if ($cur_voucher->dr_total != $cur_voucher->cr_total) { $difference = $cur_voucher->dr_total - $cur_voucher->cr_total; if ($difference < 0) - echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\"></td><td id=\"cr-diff\">" . $cur_voucher->cr_total . "</td></tr>"; + echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\"></td><td id=\"cr-diff\">" . convert_amount_dc($difference) . "</td></tr>"; else - echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\">" . $cur_voucher->dr_total . "</td><td id=\"cr-diff\"></td></tr>"; + echo "<tr class=\"voucher-difference\"><td colspan=2><strong>Difference</strong></td><td id=\"dr-diff\">" . convert_amount_dc($difference) . "</td><td id=\"cr-diff\"></td></tr>"; } ?> </table> commit 989df69bd800ee93804668cffbc1a9c28c6af7cf Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 13 18:59:39 2011 +0530 Updated voucher types add/edit to show relevant options Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/views/setting/vouchertypes/add.php b/system/application/views/setting/vouchertypes/add.php index d3f81aa..cb87bd6 100644 --- a/system/application/views/setting/vouchertypes/add.php +++ b/system/application/views/setting/vouchertypes/add.php @@ -1,3 +1,22 @@ +<script type="text/javascript"> +$(document).ready(function() { + $('#voucher_type_base_type').change(function() { + if ($(this).val() == "1") { + $('#bank_cash_ledger_restriction').show(); + $('#stock_voucher_type').hide(); + } else if ($(this).val() == "2") { + $('#bank_cash_ledger_restriction').hide(); + $('#stock_voucher_type').show(); + } else { + $('#bank_cash_ledger_restriction').show(); + $('#stock_voucher_type').show(); + } + }); + /* initialize */ + $('#voucher_type_base_type').trigger('change'); +}); +</script> + <?php echo form_open('setting/vouchertypes/add'); @@ -24,16 +43,16 @@ echo "<p>"; echo form_label('Base Type', 'voucher_type_base_type'); echo "<br />"; - echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active); + echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active, 'id="voucher_type_base_type"'); echo "</p>"; - echo "<p>"; + echo "<p id=\"bank_cash_ledger_restriction\">"; echo form_label('Restrictions', 'bank_cash_ledger_restriction'); echo "<br />"; echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); echo "</p>"; - echo "<p>"; + echo "<p id=\"stock_voucher_type\">"; echo form_label('Stock Voucher Type', 'stock_voucher_type'); echo "<br />"; echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); diff --git a/system/application/views/setting/vouchertypes/edit.php b/system/application/views/setting/vouchertypes/edit.php index fa16410..a2eadfd 100644 --- a/system/application/views/setting/vouchertypes/edit.php +++ b/system/application/views/setting/vouchertypes/edit.php @@ -1,3 +1,22 @@ +<script type="text/javascript"> +$(document).ready(function() { + $('#voucher_type_base_type').change(function() { + if ($(this).val() == "1") { + $('#bank_cash_ledger_restriction').show(); + $('#stock_voucher_type').hide(); + } else if ($(this).val() == "2") { + $('#bank_cash_ledger_restriction').hide(); + $('#stock_voucher_type').show(); + } else { + $('#bank_cash_ledger_restriction').show(); + $('#stock_voucher_type').show(); + } + }); + /* initialize */ + $('#voucher_type_base_type').trigger('change'); +}); +</script> + <?php echo form_open('setting/vouchertypes/edit/' . $voucher_type_id); @@ -24,16 +43,16 @@ echo "<p>"; echo form_label('Base Type', 'voucher_type_base_type'); echo "<br />"; - echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active); + echo form_dropdown('voucher_type_base_type', $voucher_type_base_types, $voucher_type_base_type_active, 'id="voucher_type_base_type"'); echo "</p>"; - echo "<p>"; + echo "<p id=\"bank_cash_ledger_restriction\">"; echo form_label('Restrictions', 'bank_cash_ledger_restriction'); echo "<br />"; echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); echo "</p>"; - echo "<p>"; + echo "<p id=\"stock_voucher_type\">"; echo form_label('Stock Voucher Type', 'stock_voucher_type'); echo "<br />"; echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); commit c400108384a95fd899ca62fd25fe861bdd29b079 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 13 15:14:18 2011 +0530 Updated Ledger A/C add/edit to show only relevant options Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/views/ledger/add.php b/system/application/views/ledger/add.php index d597041..bd1fa38 100644 --- a/system/application/views/ledger/add.php +++ b/system/application/views/ledger/add.php @@ -1,3 +1,30 @@ +<script type="text/javascript"> +$(document).ready(function() { + /* initialize */ + if ($('#affects_inventory').attr("checked") == true) + $('#ledger_type_cashbank').attr("checked", false); + else + $('#affects_inventory_option').hide(); + if ($('#ledger_type_cashbank').attr("checked") == true) + $('#affects_inventory').attr("checked", false); + + $('#ledger_type_cashbank').click(function() { + if (this.checked == true) { + $('#affects_inventory').attr("checked", false); + $('#affects_inventory_option').fadeOut(); + } + }); + $('#affects_inventory').click(function() { + if (this.checked == true) { + $('#ledger_type_cashbank').attr("checked", false); + $('#affects_inventory_option').fadeIn(); + } else { + $('#affects_inventory_option').fadeOut(); + } + }); +}); +</script> + <?php echo form_open('ledger/add'); @@ -26,14 +53,14 @@ echo "<p>"; echo "<span id=\"tooltip-target-2\">"; - echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank) . " Bank or Cash Account"; + echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank, 'id="ledger_type_cashbank"') . " Bank or Cash Account"; echo "</span>"; echo "<span id=\"tooltip-content-2\">Select if Ledger A/C is a Bank A/C or a Cash A/C.</span>"; echo "</p>"; echo "<p>"; - echo form_checkbox('affects_inventory', 1, $affects_inventory) . " Affects Inventory "; - echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active); + echo form_checkbox('affects_inventory', 1, $affects_inventory, 'id="affects_inventory"') . " Affects Inventory "; + echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active, 'id="affects_inventory_option"'); echo "</p>"; echo "<p>"; diff --git a/system/application/views/ledger/edit.php b/system/application/views/ledger/edit.php index 2801dcd..abf2e49 100644 --- a/system/application/views/ledger/edit.php +++ b/system/application/views/ledger/edit.php @@ -1,3 +1,29 @@ +<script type="text/javascript"> +$(document).ready(function() { + /* initialize */ + if ($('#affects_inventory').attr("checked") == true) + $('#ledger_type_cashbank').attr("checked", false); + else + $('#affects_inventory_option').hide(); + if ($('#ledger_type_cashbank').attr("checked") == true) + $('#affects_inventory').attr("checked", false); + + $('#ledger_type_cashbank').click(function() { + if (this.checked == true) { + $('#affects_inventory').attr("checked", false); + $('#affects_inventory_option').fadeOut(); + } + }); + $('#affects_inventory').click(function() { + if (this.checked == true) { + $('#ledger_type_cashbank').attr("checked", false); + $('#affects_inventory_option').fadeIn(); + } else { + $('#affects_inventory_option').fadeOut(); + } + }); +}); +</script> <?php echo form_open('ledger/edit/' . $ledger_id); @@ -26,14 +52,14 @@ echo "<p>"; echo "<span id=\"tooltip-target-2\">"; - echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank) . " Bank or Cash Account"; + echo form_checkbox('ledger_type_cashbank', 1, $ledger_type_cashbank, 'id="ledger_type_cashbank"') . " Bank or Cash Account"; echo "</span>"; echo "<span id=\"tooltip-content-2\">Select if Ledger A/C is a Bank A/C or a Cash A/C.</span>"; echo "</p>"; echo "<p>"; - echo form_checkbox('affects_inventory', 1, $affects_inventory) . " Affects Inventory "; - echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active); + echo form_checkbox('affects_inventory', 1, $affects_inventory, 'id="affects_inventory"') . " Affects Inventory "; + echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active, 'id="affects_inventory_option"'); echo "</p>"; echo "<p>"; commit 3b72cceeb3c587777a0ab98f87fd8c3025e7903e Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 12 15:57:42 2011 +0530 Updated stock voucher links to inventory/stockvoucher Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 02bdfe6..9585ca2 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -522,6 +522,7 @@ class StockVoucher extends Controller { $this->session->set_userdata('voucher_added_type_id', $voucher_type_id); $this->session->set_userdata('voucher_added_type_label', $current_voucher_type['label']); $this->session->set_userdata('voucher_added_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_added_type_base_type', $current_voucher_type['base_type']); $this->session->set_userdata('voucher_added_number', $data_number); /* Showing success message in show() method since message is too long for storing it in session */ diff --git a/system/application/controllers/voucher.php b/system/application/controllers/voucher.php index eda8357..eeb24af 100644 --- a/system/application/controllers/voucher.php +++ b/system/application/controllers/voucher.php @@ -128,14 +128,24 @@ class Voucher extends Controller { $voucher_added_type_id_temp = $this->session->userdata('voucher_added_type_id'); $voucher_added_type_label_temp = $this->session->userdata('voucher_added_type_label'); $voucher_added_type_name_temp = $this->session->userdata('voucher_added_type_name'); + $voucher_added_type_base_type_temp = $this->session->userdata('voucher_added_type_base_type'); $voucher_added_number_temp = $this->session->userdata('voucher_added_number'); $voucher_added_message = 'Added ' . $voucher_added_type_name_temp . ' Voucher number ' . full_voucher_number($voucher_added_type_id_temp, $voucher_added_number_temp) . "."; $voucher_added_message .= " You can [ "; - $voucher_added_message .= anchor('voucher/view/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'View', array('class' => 'anchor-link-a')) . " | "; - $voucher_added_message .= anchor('voucher/edit/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Edit', array('class' => 'anchor-link-a')) . " | "; - $voucher_added_message .= anchor_popup('voucher/printpreview/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp , 'Print', array('class' => 'anchor-link-a', 'width' => '600', 'height' => '600')) . " | "; - $voucher_added_message .= anchor_popup('voucher/email/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Email', array('class' => 'anchor-link-a', 'width' => '500', 'height' => '300')) . " | "; - $voucher_added_message .= anchor('voucher/download/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Download', array('class' => 'anchor-link-a')); + if ($voucher_added_type_base_type_temp == '1') + { + $voucher_added_message .= anchor('voucher/view/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'View', array('class' => 'anchor-link-a')) . " | "; + $voucher_added_message .= anchor('voucher/edit/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Edit', array('class' => 'anchor-link-a')) . " | "; + $voucher_added_message .= anchor_popup('voucher/printpreview/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp , 'Print', array('class' => 'anchor-link-a', 'width' => '600', 'height' => '600')) . " | "; + $voucher_added_message .= anchor_popup('voucher/email/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Email', array('class' => 'anchor-link-a', 'width' => '500', 'height' => '300')) . " | "; + $voucher_added_message .= anchor('voucher/download/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Download', array('class' => 'anchor-link-a')); + } else { + $voucher_added_message .= anchor('inventory/stockvoucher/view/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'View', array('class' => 'anchor-link-a')) . " | "; + $voucher_added_message .= anchor('inventory/stockvoucher/edit/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Edit', array('class' => 'anchor-link-a')) . " | "; + $voucher_added_message .= anchor_popup('inventory/stockvoucher/printpreview/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp , 'Print', array('class' => 'anchor-link-a', 'width' => '600', 'height' => '600')) . " | "; + $voucher_added_message .= anchor_popup('inventory/stockvoucher/email/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Email', array('class' => 'anchor-link-a', 'width' => '500', 'height' => '300')) . " | "; + $voucher_added_message .= anchor('inventory/stockvoucher/download/' . $voucher_added_type_label_temp . "/" . $voucher_added_id_temp, 'Download', array('class' => 'anchor-link-a')); + } $voucher_added_message .= " ] it."; $this->messages->add($voucher_added_message, 'success'); $this->session->unset_userdata('voucher_added_show_action'); @@ -143,6 +153,7 @@ class Voucher extends Controller { $this->session->unset_userdata('voucher_added_type_id'); $this->session->unset_userdata('voucher_added_type_label'); $this->session->unset_userdata('voucher_added_type_name'); + $this->session->unset_userdata('voucher_added_type_base_type'); $this->session->unset_userdata('voucher_added_number'); } @@ -546,6 +557,7 @@ class Voucher extends Controller { $this->session->set_userdata('voucher_added_type_id', $voucher_type_id); $this->session->set_userdata('voucher_added_type_label', $current_voucher_type['label']); $this->session->set_userdata('voucher_added_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_added_type_base_type', $current_voucher_type['base_type']); $this->session->set_userdata('voucher_added_number', $data_number); /* Showing success message in show() method since message is too long for storing it in session */ diff --git a/system/application/views/voucher/index.php b/system/application/views/voucher/index.php index fee5836..3285cf5 100644 --- a/system/application/views/voucher/index.php +++ b/system/application/views/voucher/index.php @@ -34,11 +34,20 @@ echo "<td>" . $row->dr_total . "</td>"; echo "<td>" . $row->cr_total . "</td>"; - echo "<td>" . anchor('voucher/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; - echo " " . anchor('voucher/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; - echo " " . anchor_popup('voucher/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; - echo " " . anchor_popup('voucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; - echo " " . anchor('voucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + if ($current_voucher_type['base_type'] == '1') + { + echo "<td>" . anchor('voucher/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; + echo " " . anchor('voucher/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; + echo " " . anchor_popup('voucher/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; + echo " " . anchor_popup('voucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; + echo " " . anchor('voucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + } else { + echo "<td>" . anchor('inventory/stockvoucher/edit/' . $current_voucher_type['label'] . "/" . $row->id , "Edit", array('title' => 'Edit ' . $current_voucher_type['name'] . ' Voucher', 'class' => 'red-link')) . " "; + echo " " . anchor('inventory/stockvoucher/delete/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete ' . $current_voucher_type['name'] . ' Voucher', 'class' => "confirmClick", 'title' => "Delete voucher")), array('title' => 'Delete ' . $current_voucher_type['name'] . ' Voucher')) . " "; + echo " " . anchor_popup('inventory/stockvoucher/printpreview/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/print.png", 'border' => '0', 'alt' => 'Print ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Print ' . $current_voucher_type['name']. ' Voucher', 'width' => '600', 'height' => '600')) . " "; + echo " " . anchor_popup('inventory/stockvoucher/email/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/email.png", 'border' => '0', 'alt' => 'Email ' . $current_voucher_type['name'] . ' Voucher')), array('title' => 'Email ' . $current_voucher_type['name'] . ' Voucher', 'width' => '500', 'height' => '300')) . " "; + echo " " . anchor('inventory/stockvoucher/download/' . $current_voucher_type['label'] . "/" . $row->id , img(array('src' => asset_url() . "images/icons/save.png", 'border' => '0', 'alt' => 'Download ' . $current_voucher_type['name'] . ' Voucher', 'title' => "Download voucher")), array('title' => 'Download ' . $current_voucher_type['name'] . ' Voucher')) . "</td>"; + } echo "</tr>"; } commit 441e1696a1611fbfa3b2f918d82f34642b03e5dd Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 12 15:41:51 2011 +0530 Updated add stock voucher Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 0561c99..816fa11 100644 --- a/db-update.txt +++ b/db-update.txt @@ -36,6 +36,17 @@ CREATE TABLE IF NOT EXISTS stock_items ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS stock_voucher_items ( + id int(11) NOT NULL AUTO_INCREMENT, + voucher_id int(11) NOT NULL, + stock_item_id int(11) NOT NULL, + quantity float NOT NULL, + rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', + discount varchar(15) NOT NULL, + total decimal(15,2) NOT NULL DEFAULT '0.00', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + //--------------------------------- VERSION 3 ---------------------------------- CREATE TABLE IF NOT EXISTS voucher_types ( diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index ca914a3..98a91aa 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -132,6 +132,7 @@ CREATE TABLE IF NOT EXISTS stock_items ( CREATE TABLE IF NOT EXISTS stock_voucher_items ( id int(11) NOT NULL AUTO_INCREMENT, + voucher_id int(11) NOT NULL, stock_item_id int(11) NOT NULL, quantity float NOT NULL, rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index 892c9fe..02bdfe6 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -211,6 +211,8 @@ class StockVoucher extends Controller { $data_all_rate_item = $this->input->post('rate_item', TRUE); $data_all_amount_item = $this->input->post('amount_item', TRUE); + $data_total_amount = 0; + /* Checking for Valid Stock Ledger A/C - account */ if ($current_voucher_type['stock_voucher_type'] == '1') $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); @@ -228,9 +230,9 @@ class StockVoucher extends Controller { } /* Checking for Valid Stock Ledger A/C - entity */ if ($current_voucher_type['stock_voucher_type'] == '1') - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4); + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4)->or_where('type', 1); else - $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5); + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5)->or_where('type', 1); $valid_main_account_q = $this->db->get(); if ($valid_main_account_q->num_rows() < 1) { @@ -309,6 +311,7 @@ class StockVoucher extends Controller { $data_total_amount = 0; $voucher_id = NULL; + /* Adding Voucher */ $this->db->trans_start(); $insert_data = array( 'number' => $data_number, @@ -344,20 +347,22 @@ class StockVoucher extends Controller { $this->db->trans_rollback(); if ($current_voucher_type['stock_voucher_type'] == '1') { - $this->messages->add('Error adding Purchase Ledger A/C - ' . $data_main_account . ' to Voucher.', 'error'); + $this->messages->add('Error adding Purchase Ledger A/C to Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting purchase ledger " . "[id:" . $data_main_account . "]"); } else { - $this->messages->add('Error adding Sale Ledger A/C - ' . $data_main_account . ' to Voucher.', 'error'); + $this->messages->add('Error adding Sale Ledger A/C to Voucher.', 'error'); $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting sale ledger " . "[id:" . $data_main_account . "]"); } $this->template->load('template', 'inventory/stockvoucher/add', $data); return; + } else { + $main_voucher_id = $this->db->insert_id(); } /* Adding main - entity */ $insert_data = array( 'voucher_id' => $voucher_id, - 'ledger_id' => $data_entity_account, + 'ledger_id' => $data_main_entity, 'amount' => $data_total_amount, 'dc' => '', ); @@ -370,39 +375,77 @@ class StockVoucher extends Controller { $this->db->trans_rollback(); if ($current_voucher_type['stock_voucher_type'] == '1') { - $this->messages->add('Error adding Creditor (Supplier) - ' . $data_entity_account . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting creditor ledger " . "[id:" . $data_entity_account . "]"); + $this->messages->add('Error adding Creditor (Supplier) to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting creditor ledger " . "[id:" . $data_main_entity . "]"); } else { - $this->messages->add('Error adding Debtor (Customer) - ' . $data_entity_account . ' to Voucher.', 'error'); - $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting debtor ledger " . "[id:" . $data_entity_account . "]"); + $this->messages->add('Error adding Debtor (Customer) - to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting debtor ledger " . "[id:" . $data_main_entity . "]"); } $this->template->load('template', 'inventory/stockvoucher/add', $data); return; + } else { + $entity_voucher_id = $this->db->insert_id(); + } + + /* Adding stock items */ + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + + foreach ($data_all_stock_item_id as $id => $stock_data) + { + $data_stock_item_id = $data_all_stock_item_id[$id]; + + if ($data_stock_item_id < 1) + continue; + + $data_stock_item_quantity = $data_all_stock_item_quantity[$id]; + $data_stock_item_rate_per_unit = $data_all_stock_item_rate_per_unit[$id]; + $data_stock_item_discount = $data_all_stock_item_discount[$id]; + $data_stock_item_amount = $data_all_stock_item_amount[$id]; + + $data_total_amount += $data_stock_item_amount; + + $insert_stock_data = array( + 'voucher_id' => $voucher_id, + 'stock_item_id' => $data_stock_item_id, + 'quantity' => $data_stock_item_quantity, + 'rate_per_unit' => $data_stock_item_rate_per_unit, + 'discount' => $data_stock_item_discount, + 'total' => $data_stock_item_amount, + ); + if ( ! $this->db->insert('stock_voucher_items', $insert_stock_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Stock Item - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting stock item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } } /* Adding ledger accounts */ $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); $data_all_ledger_id = $this->input->post('ledger_id', TRUE); - $data_all_dr_amount = $this->input->post('dr_amount', TRUE); - $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); - $dr_total = 0; - $cr_total = 0; foreach ($data_all_ledger_dc as $id => $ledger_data) { $data_ledger_dc = $data_all_ledger_dc[$id]; $data_ledger_id = $data_all_ledger_id[$id]; + if ($data_ledger_id < 1) continue; - $data_amount = 0; - if ($data_all_ledger_dc[$id] == "D") - { - $data_amount = $data_all_dr_amount[$id]; - $dr_total += $data_all_dr_amount[$id]; - } else { - $data_amount = $data_all_cr_amount[$id]; - $cr_total += $data_all_cr_amount[$id]; - } + + $data_amount = $data_all_amount_item[$id]; + if ($data_ledger_dc == "D") + $data_total_amount += $data_amount; + else + $data_total_amount -= $data_amount; + $insert_ledger_data = array( 'voucher_id' => $voucher_id, 'ledger_id' => $data_ledger_id, @@ -419,10 +462,10 @@ class StockVoucher extends Controller { } } - /* Updating Debit and Credit Total in vouchers table */ + /* Updating Debit and Credit Total - vouchers */ $update_data = array( - 'dr_total' => $dr_total, - 'cr_total' => $cr_total, + 'dr_total' => $data_total_amount, + 'cr_total' => $data_total_amount, ); if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) { @@ -433,6 +476,44 @@ class StockVoucher extends Controller { return; } + /* Updating Debit and Credit Total - main account */ + $update_data = array( + 'amount' => $data_total_amount, + ); + if ( ! $this->db->where('id', $main_voucher_id)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Purchase Ledger A/C total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating purchase ledger total"); + } else { + $this->messages->add('Error updating Sale Ledger A/C total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating sale ledger total"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Updating Debit and Credit Total - entity account */ + $update_data = array( + 'amount' => $data_total_amount, + ); + if ( ! $this->db->where('id', $entity_voucher_id)->update('voucher_items', $update_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error updating Creditor (Supplier) total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating creditor (supplier) total"); + } else { + $this->messages->add('Error updating Debtor (Customer) total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debtor (customer) total"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + /* Success */ $this->db->trans_complete(); @@ -829,7 +910,7 @@ class StockVoucher extends Controller { function delete($voucher_type, $voucher_id = 0) { /* Check access */ - if ( ! check_access('delete voucher')) + if ( ! check_access('delete stock voucher')) { $this->messages->add('Permission denied.', 'error'); redirect('inventory/stockvoucher/show/' . $voucher_type); @@ -864,6 +945,14 @@ class StockVoucher extends Controller { } $this->db->trans_start(); + if ( ! $this->db->delete('stock_voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Stock Items.', 'error'); + $this->logger->write_message("error", "Error deleting stock item entries for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) { $this->db->trans_rollback(); @@ -1146,6 +1235,37 @@ class StockVoucher extends Controller { return; } + function addrow() + { + $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); + $rate_item = array( + 'name' => 'rate_item[' . $i . ']', + 'id' => 'rate_item[' . $i . ']', + 'maxlength' => '5', + 'size' => '5', + 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", + 'class' => 'dr-item', + ); + $amount_item = array( + 'name' => 'amount_item[' . $i . ']', + 'id' => 'amount_item[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", + 'class' => 'cr-item', + ); + echo "<tr>"; + echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', 'D') . "</td>"; + echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', '0') . "</td>"; + echo "<td>" . form_input($rate_item) . "</td>"; + echo "<td>" . form_input($amount_item) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; + echo "<td class=\"ledger-balance\"><div></div></td>"; + echo "</tr>"; + return; + } + function addstockrow() { $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 31c19c1..ef0e6ee 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -1,7 +1,3 @@ -<?php - /* Add row ledger type */ - $add_type = "all"; -?> <script type="text/javascript"> $(document).ready(function() { @@ -47,17 +43,17 @@ $(document).ready(function() { } }); - $('table td .quantity-item').live('change', function() { + $('table td .quantity-stock-item').live('change', function() { var rowid = $(this); calculateRowTotal(rowid.parent().prev()); }); - $('table td .rate-item').live('change', function() { + $('table td .rate-stock-item').live('change', function() { var rowid = $(this); calculateRowTotal(rowid.parent().prev().prev()); }); - $('table td .discount-item').live('change', function() { + $('table td .discount-stock-item').live('change', function() { var rowid = $(this); calculateRowTotal(rowid.parent().prev().prev().prev()); }); @@ -158,10 +154,11 @@ $(document).ready(function() { var add_image_url = $(cur_obj).attr('src'); $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); $.ajax({ - url: <?php echo '\'' . site_url('voucher/addrow/' . $add_type) . '\''; ?>, + url: <?php echo '\'' . site_url('inventory/stockvoucher/addrow') . '\''; ?>, success: function(data) { $(cur_obj).parent().parent().after(data); $(cur_obj).attr('src', add_image_url); + $('.ledger-dropdown').trigger('change'); } }); }); @@ -251,36 +248,36 @@ $(document).ready(function() { 'id' => 'stock_item_quantity[' . $i . ']', 'maxlength' => '15', 'size' => '9', - 'value' => '', - 'class' => 'quantity-item', + 'value' => isset($stock_item_quantity[$i]) ? $stock_item_quantity[$i] : '', + 'class' => 'quantity-stock-item', ); $stock_item_rate_per_unit = array( 'name' => 'stock_item_rate_per_unit[' . $i . ']', 'id' => 'stock_item_rate_per_unit[' . $i . ']', 'maxlength' => '15', 'size' => '9', - 'value' => '', - 'class' => 'rate-item', + 'value' => isset($stock_item_rate_per_unit[$i]) ? $stock_item_rate_per_unit[$i] : '', + 'class' => 'rate-stock-item', ); $stock_item_discount = array( 'name' => 'stock_item_discount[' . $i . ']', 'id' => 'stock_item_discount[' . $i . ']', 'maxlength' => '15', 'size' => '9', - 'value' => '', - 'class' => 'discount-item', + 'value' => isset($stock_item_discount[$i]) ? $stock_item_discount[$i] : '', + 'class' => 'discount-stock-item', ); $stock_item_amount = array( 'name' => 'stock_item_amount[' . $i . ']', 'id' => 'stock_item_amount[' . $i . ']', 'maxlength' => '15', 'size' => '15', - 'value' => '', - 'class' => 'rate-item', + 'value' => isset($stock_item_amount[$i]) ? $stock_item_amount[$i] : '', + 'class' => 'rate-stock-item', ); echo "<tr>"; - echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; + echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', isset($stock_item_id[$i]) ? $stock_item_id[$i] : 0) . "</td>"; echo "<td>" . form_input($stock_item_quantity) . "</td>"; echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; echo "<td>" . form_input($stock_item_discount) . "</td>"; @@ -308,23 +305,21 @@ $(document).ready(function() { 'id' => 'rate_item[' . $i . ']', 'maxlength' => '5', 'size' => '5', - 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", - 'class' => 'dr-item', + 'value' => isset($rate_item[$i]) ? $rate_item[$i] : '', + 'class' => 'rate-item', ); $amount_item = array( 'name' => 'amount_item[' . $i . ']', 'id' => 'amount_item[' . $i . ']', 'maxlength' => '15', 'size' => '15', - 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", - 'class' => 'cr-item', + 'value' => isset($amount_item[$i]) ? $amount_item[$i] : '', + 'class' => 'amount-item', ); echo "<tr>"; echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', isset($ledger_dc[$i]) ? $ledger_dc[$i] : "D") . "</td>"; - echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', isset($ledger_id[$i]) ? $ledger_id[$i] : 0) . "</td>"; - echo "<td>" . form_input($rate_item) . "</td>"; echo "<td>" . form_input($amount_item) . "</td>"; commit fd1df2d3239c41cb61f41ea07ed968c7965781ed Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 12 13:16:19 2011 +0530 Udpated stock voucher - Added main ledger and entity ledger - Added seperate puchase and sale voucher type - Added stock voucher items to purchase and sale voucher types - Updated stock vocuher jQuery to updated the total amount for each stock item - Added basic stock validation to stock vouchers Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php index b97aaea..892c9fe 100644 --- a/system/application/controllers/inventory/stockvoucher.php +++ b/system/application/controllers/inventory/stockvoucher.php @@ -107,6 +107,8 @@ class StockVoucher extends Controller { 'rows' => '4', 'value' => '', ); + $data['main_account_active'] = 0; + $data['main_entity_active'] = 0; $data['voucher_type_id'] = $voucher_type_id; $data['current_voucher_type'] = $current_voucher_type; $data['voucher_tags'] = $this->Tag_model->get_all_tags(); @@ -120,16 +122,31 @@ class StockVoucher extends Controller { else $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->form_validation->set_rules('main_account', 'Purchase Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Creditors (Supplier)', 'trim|required'); + } else { + $this->form_validation->set_rules('main_account', 'Sale Ledger A/C', 'trim|required'); + $this->form_validation->set_rules('main_entity', 'Debtor (Customer)', 'trim|required'); + } $this->form_validation->set_rules('voucher_narration', 'trim'); $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); /* Debit and Credit amount validation */ if ($_POST) { + foreach ($this->input->post('stock_item_id', TRUE) as $id => $stock_data) + { + $this->form_validation->set_rules('stock_item_quantity[' . $id . ']', 'Stock Item Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_rate_per_unit[' . $id . ']', 'Stock Item Rate Per Unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_discount[' . $id . ']', 'Stock Item Discount', 'trim|rate'); + $this->form_validation->set_rules('stock_item_amount[' . $id . ']', 'Stock Item Amount', 'trim|currency'); + } foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) { - $this->form_validation->set_rules('dr_amount[' . $id . ']', 'Debit Amount', 'trim|currency'); - $this->form_validation->set_rules('cr_amount[' . $id . ']', 'Credit Amount', 'trim|currency'); + $this->form_validation->set_rules('rate_item[' . $id . ']', 'Rate %', 'trim|rate'); + $this->form_validation->set_rules('amount_item[' . $id . ']', 'Ledger Amount', 'trim|currency'); } } @@ -141,23 +158,33 @@ class StockVoucher extends Controller { $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); + $data['main_account_active'] = $this->input->post('main_account', TRUE); + $data['main_entity_active'] = $this->input->post('main_entity', TRUE); + + $data['stock_item_id'] = $this->input->post('stock_item_id', TRUE); + $data['stock_item_quantity'] = $this->input->post('stock_item_quantity', TRUE); + $data['stock_item_rate_per_unit'] = $this->input->post('stock_item_rate_per_unit', TRUE); + $data['stock_item_discount'] = $this->input->post('stock_item_discount', TRUE); + $data['stock_item_amount'] = $this->input->post('stock_item_amount', TRUE); + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); $data['ledger_id'] = $this->input->post('ledger_id', TRUE); - $data['dr_amount'] = $this->input->post('dr_amount', TRUE); - $data['cr_amount'] = $this->input->post('cr_amount', TRUE); + $data['rate_item'] = $this->input->post('rate_item', TRUE); + $data['amount_item'] = $this->input->post('amount_item', TRUE); } else { for ($count = 0; $count <= 1; $count++) { $data['ledger_dc'][$count] = "D"; $data['ledger_id'][$count] = 0; - $data['rate'][$count] = ""; - $data['amount'][$count] = ""; + $data['rate_item'][$count] = ""; + $data['amount_item'][$count] = ""; } for ($count = 0; $count <= 3; $count++) { $data['stock_item_id'][$count] = '0'; $data['stock_item_quantity'][$count] = ''; $data['stock_item_rate_per_unit'][$count] = ''; + $data['stock_item_discount'][$count] = ''; $data['stock_item_amount'][$count] = ''; } } @@ -170,109 +197,88 @@ class StockVoucher extends Controller { } else { - /* Checking for Valid Ledgers A/C and Debit and Credit Total */ + $data_main_account = $this->input->post('main_account', TRUE); + $data_main_entity = $this->input->post('main_entity', TRUE); + + $data_all_stock_item_id = $this->input->post('stock_item_id', TRUE); + $data_all_stock_item_quantity = $this->input->post('stock_item_quantity', TRUE); + $data_all_stock_item_rate_per_unit = $this->input->post('stock_item_rate_per_unit', TRUE); + $data_all_stock_item_discount = $this->input->post('stock_item_discount', TRUE); + $data_all_stock_item_amount = $this->input->post('stock_item_amount', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); - $data_all_dr_amount = $this->input->post('dr_amount', TRUE); - $data_all_cr_amount = $this->input->post('cr_amount', TRUE); - $dr_total = 0; - $cr_total = 0; - $bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is Bank or Cash A/C */ - $non_bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is NOT a Bank or Cash A/C */ - foreach ($data_all_ledger_dc as $id => $ledger_data) - { - if ($data_all_ledger_id[$id] < 1) - continue; + $data_all_rate_item = $this->input->post('rate_item', TRUE); + $data_all_amount_item = $this->input->post('amount_item', TRUE); - /* Check for valid ledger id */ - $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); - $valid_ledger_q = $this->db->get(); - if ($valid_ledger_q->num_rows() < 1) - { - $this->messages->add('Invalid Ledger A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } else { - /* Check for valid ledger type */ - $valid_ledger = $valid_ledger_q->row(); - if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') - { - if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) - { - $bank_cash_present = TRUE; - } - if ($valid_ledger->type != 1) - $non_bank_cash_present = TRUE; - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') - { - if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) - { - $bank_cash_present = TRUE; - } - if ($valid_ledger->type != 1) - $non_bank_cash_present = TRUE; - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') - { - if ($valid_ledger->type != 1) - { - $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') - { - if ($valid_ledger->type == 1) - { - $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - } - } - - if ($data_all_ledger_dc[$id] == "D") - { - $dr_total += $data_all_dr_amount[$id]; - } else { - $cr_total += $data_all_cr_amount[$id]; - } - } - if ($dr_total != $cr_total) + /* Checking for Valid Stock Ledger A/C - account */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 2); + else + $this->db->from('ledgers')->where('id', $data_main_account)->where('type', 3); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) { - $this->messages->add('Debit and Credit Total does not match!', 'error'); + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Purchase Ledger A/C.', 'error'); + else + $this->messages->add('Invalid Sale Ledger A/C.', 'error'); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; - } else if ($dr_total == 0 && $cr_total == 0) { - $this->messages->add('Cannot save empty Voucher.', 'error'); + } + /* Checking for Valid Stock Ledger A/C - entity */ + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 4); + else + $this->db->from('ledgers')->where('id', $data_main_entity)->where('type', 5); + $valid_main_account_q = $this->db->get(); + if ($valid_main_account_q->num_rows() < 1) + { + if ($current_voucher_type['stock_voucher_type'] == '1') + $this->messages->add('Invalid Creditor (Supplier).', 'error'); + else + $this->messages->add('Invalid Debtor (Customer).', 'error'); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; } - /* Check if atleast one Bank or Cash Ledger A/C is present */ - if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') + + /* Checking for Valid Stock Item A/C */ + $stock_item_present = FALSE; + foreach ($data_all_stock_item_id as $id => $stock_data) { - if ( ! $bank_cash_present) - { - $this->messages->add('Need to Debit atleast one Bank or Cash A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - if ( ! $non_bank_cash_present) + if ($data_all_stock_item_id[$id] < 1) + continue; + + /* Check for valid stock item id */ + $this->db->from('stock_items')->where('id', $data_all_stock_item_id[$id]); + $valid_stock_item_q = $this->db->get(); + if ($valid_stock_item_q->num_rows() < 1) { - $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->messages->add('Invalid Stock Item.', 'error'); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; } - } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + $stock_item_present = TRUE; + } + if ( ! $stock_item_present) { - if ( ! $bank_cash_present) - { - $this->messages->add('Need to Credit atleast one Bank or Cash A/C.', 'error'); - $this->template->load('template', 'inventory/stockvoucher/add', $data); - return; - } - if ( ! $non_bank_cash_present) + $this->messages->add('No Stock Item selected.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Checking for Valid Ledgers A/C */ + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + if ($data_all_ledger_id[$id] < 1) + continue; + + /* Check for valid ledger id */ + $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); + $valid_ledger_q = $this->db->get(); + if ($valid_ledger_q->num_rows() < 1) { - $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->messages->add('Invalid Ledger A/C.', 'error'); $this->template->load('template', 'inventory/stockvoucher/add', $data); return; } @@ -300,6 +306,7 @@ class StockVoucher extends Controller { $data_tag = NULL; $data_type = $voucher_type_id; $data_date = date_php_to_mysql($data_date); // Converting date to MySQL + $data_total_amount = 0; $voucher_id = NULL; $this->db->trans_start(); @@ -321,6 +328,58 @@ class StockVoucher extends Controller { $voucher_id = $this->db->insert_id(); } + /* Adding main - account */ + $insert_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_main_account, + 'amount' => $data_total_amount, + 'dc' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'D'; + else + $insert_data['dc'] = 'C'; + if ( ! $this->db->insert('voucher_items', $insert_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error adding Purchase Ledger A/C - ' . $data_main_account . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting purchase ledger " . "[id:" . $data_main_account . "]"); + } else { + $this->messages->add('Error adding Sale Ledger A/C - ' . $data_main_account . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting sale ledger " . "[id:" . $data_main_account . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Adding main - entity */ + $insert_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_entity_account, + 'amount' => $data_total_amount, + 'dc' => '', + ); + if ($current_voucher_type['stock_voucher_type'] == '1') + $insert_data['dc'] = 'C'; + else + $insert_data['dc'] = 'D'; + if ( ! $this->db->insert('voucher_items', $insert_data)) + { + $this->db->trans_rollback(); + if ($current_voucher_type['stock_voucher_type'] == '1') + { + $this->messages->add('Error adding Creditor (Supplier) - ' . $data_entity_account . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting creditor ledger " . "[id:" . $data_entity_account . "]"); + } else { + $this->messages->add('Error adding Debtor (Customer) - ' . $data_entity_account . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting debtor ledger " . "[id:" . $data_entity_account . "]"); + } + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + /* Adding ledger accounts */ $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); $data_all_ledger_id = $this->input->post('ledger_id', TRUE); @@ -1106,6 +1165,14 @@ class StockVoucher extends Controller { 'value' => '', 'class' => 'rate-item', ); + $stock_item_discount = array( + 'name' => 'stock_item_discount[' . $i . ']', + 'id' => 'stock_item_discount[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'discount-item', + ); $stock_item_amount = array( 'name' => 'stock_item_amount[' . $i . ']', 'id' => 'stock_item_amount[' . $i . ']', @@ -1119,6 +1186,7 @@ class StockVoucher extends Controller { echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; echo "<td>" . form_input($stock_item_quantity) . "</td>"; echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; + echo "<td>" . form_input($stock_item_discount) . "</td>"; echo "<td>" . form_input($stock_item_amount) . "</td>"; echo '<td>'; echo img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Stock Item', 'class' => 'addstockrow')); diff --git a/system/application/controllers/ledger.php b/system/application/controllers/ledger.php index bff86cf..13a5550 100644 --- a/system/application/controllers/ledger.php +++ b/system/application/controllers/ledger.php @@ -62,8 +62,8 @@ class Ledger extends Controller { $data['affects_inventory_options'] = array( '2' => 'Purchases Ledger A/C', '3' => 'Sales Ledger A/C', - '4' => 'Debtor (Customer)', - '5' => 'Creditor (Supplier)', + '4' => 'Creditor (Supplier)', + '5' => 'Debtor (Customer)', ); $data['affects_inventory_option_active'] = '2'; @@ -243,8 +243,8 @@ class Ledger extends Controller { $data['affects_inventory_options'] = array( '2' => 'Purchases Ledger A/C', '3' => 'Sales Ledger A/C', - '4' => 'Debtor (Customer)', - '5' => 'Creditor (Supplier)', + '4' => 'Creditor (Supplier)', + '5' => 'Debtor (Customer)', ); if ($ledger_data->type <= 0) { diff --git a/system/application/helpers/MY_form_helper.php b/system/application/helpers/MY_form_helper.php index cdc5825..7880e2b 100644 --- a/system/application/helpers/MY_form_helper.php +++ b/system/application/helpers/MY_form_helper.php @@ -70,6 +70,10 @@ if ( ! function_exists('form_input_ledger')) $options = $CI->Ledger_model->get_all_ledgers_purchase(); else if ($type == 'creditor') $options = $CI->Ledger_model->get_all_ledgers_creditor(); + else if ($type == 'sale') + $options = $CI->Ledger_model->get_all_ledgers_sale(); + else if ($type == 'debtor') + $options = $CI->Ledger_model->get_all_ledgers_debtor(); else $options = $CI->Ledger_model->get_all_ledgers(); diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index d50bcbe..e152bb0 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -7,6 +7,7 @@ class Ledger_model extends Model { parent::Model(); } + /**************************** GET LEDGERS METHODS *********************/ function get_all_ledgers() { $options = array(); @@ -76,7 +77,33 @@ class Ledger_model extends Model { { $options = array(); $options[0] = "(Please Select)"; - $this->db->from('ledgers')->where('type', 5)->order_by('name', 'asc'); + $this->db->from('ledgers')->where('type', 4)->or_where('type', 1)->order_by('name', 'asc'); + $ledger_q = $this->db->get(); + foreach ($ledger_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } + + function get_all_ledgers_sale() + { + $options = array(); + $options[0] = "(Please Select)"; + $this->db->from('ledgers')->where('type', 3)->order_by('name', 'asc'); + $ledger_q = $this->db->get(); + foreach ($ledger_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } + + function get_all_ledgers_debtor() + { + $options = array(); + $options[0] = "(Please Select)"; + $this->db->from('ledgers')->where('type', 5)->or_where('type', 1)->order_by('name', 'asc'); $ledger_q = $this->db->get(); foreach ($ledger_q->result() as $row) { diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php index 83a68bc..31c19c1 100644 --- a/system/application/views/inventory/stockvoucher/add.php +++ b/system/application/views/inventory/stockvoucher/add.php @@ -13,13 +13,16 @@ $(document).ready(function() { $(this).parent().next().children().attr('value', ""); $(this).parent().next().next().children().attr('value', ""); $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().next().next().next().children().attr('value', ""); $(this).parent().next().children().attr('disabled', 'disabled'); $(this).parent().next().next().children().attr('disabled', 'disabled'); $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().next().children().attr('disabled', 'disabled'); } else { $(this).parent().next().children().attr('disabled', ''); $(this).parent().next().next().children().attr('disabled', ''); $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().next().children().attr('disabled', ''); $(this).parent().prev().children().trigger('change'); } var stockid = $(this).val(); @@ -32,15 +35,15 @@ $(document).ready(function() { if (isNaN(stock_bal)) stock_bal = 0; if (stock_bal == 0) - rowid.parent().next().next().next().next().next().children().text("0"); + rowid.parent().next().next().next().next().next().next().children().text("0"); else if (stock_bal < 0) - rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); else - rowid.parent().next().next().next().next().next().next().children().text(data); + rowid.parent().next().next().next().next().next().next().next().children().text(data); } }); } else { - rowid.parent().next().next().next().next().next().next().children().text(""); + rowid.parent().next().next().next().next().next().next().next().children().text(""); } }); @@ -49,18 +52,31 @@ $(document).ready(function() { calculateRowTotal(rowid.parent().prev()); }); + $('table td .rate-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev()); + }); + + $('table td .discount-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev().prev().prev()); + }); + var calculateRowTotal = function(itemrow) { var item_quantity = itemrow.next().children().val(); var item_rate_per_unit = itemrow.next().next().children().val(); - var item_amount = itemrow.next().next().next().children().val(); + var item_discount = itemrow.next().next().next().children().val(); item_quantity = parseFloat(item_quantity); item_rate_per_unit = parseFloat(item_rate_per_unit); - if ( (!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit)) ) + item_discount = parseFloat(item_discount); + if (isNaN(item_discount)) + item_discount = 0; + if ((!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit))) { - item_amount = item_quantity * item_rate_per_unit; - itemrow.next().next().next().children().val(item_amount); - itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + var item_amount = (item_quantity * item_rate_per_unit) - item_discount; + itemrow.next().next().next().next().children().val(item_amount); + itemrow.next().next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); } } @@ -159,7 +175,7 @@ $(document).ready(function() { </script> <?php - echo form_open('voucher/add/' . $current_voucher_type['label']); + echo form_open('inventory/stockvoucher/add/' . $current_voucher_type['label']); echo "<p>"; echo "<span id=\"tooltip-target-1\">"; echo form_label('Voucher Number', 'voucher_number'); @@ -176,32 +192,57 @@ $(document).ready(function() { echo "<span id=\"tooltip-content-2\">Date format is " . $this->config->item('account_date_format') . ".</span>"; echo "</p>"; - echo "<p>"; - echo "<table border=0 cellpadding=2>"; - echo "<tr>"; - echo "<td align=\"right\">"; - echo form_label('Purchase Ledger A/C', 'purchase_ledger_id'); - echo "</td>"; - echo "<td>"; - echo form_input_ledger('purchase_ledger_id', '', '', $type = 'purchase'); - echo "</td>"; - echo "</tr>"; - - echo "<tr>"; - echo "<td align=\"right\">"; - echo form_label('Creditor (Supplier)', 'creditor_ledger_id'); - echo "</td>"; - echo "<td>"; - echo form_input_ledger('creditor_ledger_id', '', '', $type = 'creditor'); - echo "</td>"; - echo "</tr>"; - echo "</table>"; - echo "</p>"; + if ($current_voucher_type['stock_voucher_type'] == '1') + { + echo "<p>"; + echo "<table border=0 cellpadding=2>"; + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Purchase Ledger A/C', 'main_account'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_account', $main_account_active, '', $type = 'purchase'); + echo "</td>"; + echo "</tr>"; + + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Creditor (Supplier)', 'main_entity'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_entity', $main_entity_active, '', $type = 'creditor'); + echo "</td>"; + echo "</tr>"; + echo "</table>"; + echo "</p>"; + } else { + echo "<p>"; + echo "<table border=0 cellpadding=2>"; + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Sales Ledger A/C', 'main_account'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_account', $main_account_active, '', $type = 'sale'); + echo "</td>"; + echo "</tr>"; + + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Debtor (Customer)', 'main_entity'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('main_entity', $main_entity_active, '', $type = 'debtor'); + echo "</td>"; + echo "</tr>"; + echo "</table>"; + echo "</p>"; + } echo "<p></p>"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Discount</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($stock_item_id as $i => $row) { @@ -221,6 +262,14 @@ $(document).ready(function() { 'value' => '', 'class' => 'rate-item', ); + $stock_item_discount = array( + 'name' => 'stock_item_discount[' . $i . ']', + 'id' => 'stock_item_discount[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'discount-item', + ); $stock_item_amount = array( 'name' => 'stock_item_amount[' . $i . ']', 'id' => 'stock_item_amount[' . $i . ']', @@ -234,6 +283,7 @@ $(document).ready(function() { echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; echo "<td>" . form_input($stock_item_quantity) . "</td>"; echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; + echo "<td>" . form_input($stock_item_discount) . "</td>"; echo "<td>" . form_input($stock_item_amount) . "</td>"; echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; @@ -249,15 +299,15 @@ $(document).ready(function() { echo "<br />"; echo "<table class=\"voucher-table\">"; - echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate %</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; foreach ($ledger_dc as $i => $ledger) { $rate_item = array( 'name' => 'rate_item[' . $i . ']', 'id' => 'rate_item[' . $i . ']', - 'maxlength' => '15', - 'size' => '15', + 'maxlength' => '5', + 'size' => '5', 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", 'class' => 'dr-item', ); commit 38a185b7893e5ce5c67955654a59a003ee86b773 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 12 12:10:26 2011 +0530 Added development vesrion warning Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/libraries/Startup.php b/system/application/libraries/Startup.php index d658223..f0af27d 100644 --- a/system/application/libraries/Startup.php +++ b/system/application/libraries/Startup.php @@ -16,6 +16,8 @@ class Startup $CI->db->trans_strict(FALSE); $CI->load->library('general'); + $CI->messages->add('This is a development version of webzash not meant for production use. You can get the stable version from ' . anchor('
http://webzash.org/download
', '
http://webzash.org/download
'), 'error'); + /* Skip checking if accessing admin section*/ if ($CI->uri->segment(1) == "admin") return; commit f134c5d03b42ba3f05c73b6325b66b6dd3501f74 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 11 16:44:43 2011 +0530 Added stock_voucher_type to voucher types - stock_voucher_type can be Purchases or Sales Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 60f62b7..0561c99 100644 --- a/db-update.txt +++ b/db-update.txt @@ -5,6 +5,10 @@ UPDATE ledgers SET type = '0' WHERE type = 'N'; ALTER TABLE ledgers CHANGE type type INT(2) NOT NULL DEFAULT '0'; +ALTER TABLE voucher_types ADD stock_voucher_type INT(2) NOT NULL DEFAULT '1'; + +ALTER TABLE voucher_types CHANGE bank_cash_ledger_restriction bank_cash_ledger_restriction INT(2) NOT NULL DEFAULT '1'; + CREATE TABLE IF NOT EXISTS stock_units ( id int(11) NOT NULL AUTO_INCREMENT, symbol varchar(15) NOT NULL, diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index 299bd14..ca914a3 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -23,11 +23,12 @@ CREATE TABLE IF NOT EXISTS voucher_types ( name varchar(100) NOT NULL, description varchar(255) NOT NULL, base_type int(2) NOT NULL, + bank_cash_ledger_restriction int(2) NOT NULL DEFAULT '1', + stock_voucher_type int(2) NOT NULL DEFAULT '1', numbering int(2) NOT NULL, prefix varchar(10) NOT NULL, suffix varchar(10) NOT NULL, zero_padding int(2) NOT NULL, - bank_cash_ledger_restriction int(2) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; diff --git a/system/application/controllers/setting/vouchertypes.php b/system/application/controllers/setting/vouchertypes.php index a5d368e..9506bac 100644 --- a/system/application/controllers/setting/vouchertypes.php +++ b/system/application/controllers/setting/vouchertypes.php @@ -100,10 +100,15 @@ class VoucherTypes extends Controller { '4' => 'Only Bank or Cash A/C can be present on both Debit and Credit side', '5' => 'Only NON Bank or Cash A/C can be present on both Debit and Credit side', ); + $data['stock_voucher_types'] = array( + '1' => 'Purchases', + '2' => 'Sales', + ); $data['voucher_type_base_type_active'] = '1'; $data['voucher_type_numbering_active'] = '1'; $data['bank_cash_ledger_restriction_active'] = '1'; + $data['stock_voucher_type_active'] = '1'; /* Repopulating form */ if ($_POST) @@ -118,6 +123,7 @@ class VoucherTypes extends Controller { $data['voucher_type_base_type_active'] = $this->input->post('voucher_type_base_type', TRUE); $data['voucher_type_numbering_active'] = $this->input->post('voucher_type_numbering', TRUE); $data['bank_cash_ledger_restriction_active'] = $this->input->post('bank_cash_ledger_restriction', TRUE); + $data['stock_voucher_type_active'] = $this->input->post('stock_voucher_type', TRUE); } /* Form validations */ @@ -146,6 +152,7 @@ class VoucherTypes extends Controller { $data_voucher_type_base_type = $this->input->post('voucher_type_base_type', TRUE); $data_voucher_type_numbering = $this->input->post('voucher_type_numbering', TRUE); $data_bank_cash_ledger_restriction = $this->input->post('bank_cash_ledger_restriction', TRUE); + $data_stock_voucher_type = $this->input->post('stock_voucher_type', TRUE); if (($data_voucher_type_base_type < 1) or ($data_voucher_type_base_type > 2)) $data_voucher_type_base_type = 1; @@ -156,6 +163,9 @@ class VoucherTypes extends Controller { if (($data_bank_cash_ledger_restriction < 1) or ($data_bank_cash_ledger_restriction > 5)) $data_bank_cash_ledger_restriction = 1; + if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 2)) + $data_stock_voucher_type = 1; + /* Calculating Voucher Type Id */ $last_id = 1; $this->db->select_max('id', 'lastid')->from('voucher_types'); @@ -178,6 +188,7 @@ class VoucherTypes extends Controller { 'suffix' => $data_voucher_type_suffix, 'zero_padding' => $data_voucher_type_zero_padding, 'bank_cash_ledger_restriction' => $data_bank_cash_ledger_restriction, + 'stock_voucher_type' => $data_stock_voucher_type, ); if ( ! $this->db->insert('voucher_types', $insert_data)) { @@ -288,10 +299,15 @@ class VoucherTypes extends Controller { '4' => 'Only Bank or Cash A/C can be present on both Debit and Credit side', '5' => 'Only NON Bank or Cash A/C can be present on both Debit and Credit side', ); + $data['stock_voucher_types'] = array( + '1' => 'Purchases', + '2' => 'Sales', + ); $data['voucher_type_base_type_active'] = $voucher_type_data->base_type; $data['voucher_type_numbering_active'] = $voucher_type_data->numbering; $data['bank_cash_ledger_restriction_active'] = $voucher_type_data->bank_cash_ledger_restriction; + $data['stock_voucher_type_active'] = $voucher_type_data->stock_voucher_type; $data['voucher_type_id'] = $id; /* Repopulating form */ @@ -307,6 +323,7 @@ class VoucherTypes extends Controller { $data['voucher_type_base_type_active'] = $this->input->post('voucher_type_base_type', TRUE); $data['voucher_type_numbering_active'] = $this->input->post('voucher_type_numbering', TRUE); $data['bank_cash_ledger_restriction_active'] = $this->input->post('bank_cash_ledger_restriction', TRUE); + $data['stock_voucher_type_active'] = $this->input->post('stock_voucher_type', TRUE); } /* Form validations */ @@ -336,6 +353,7 @@ class VoucherTypes extends Controller { $data_voucher_type_base_type = $this->input->post('voucher_type_base_type', TRUE); $data_voucher_type_numbering = $this->input->post('voucher_type_numbering', TRUE); $data_bank_cash_ledger_restriction = $this->input->post('bank_cash_ledger_restriction', TRUE); + $data_stock_voucher_type = $this->input->post('stock_voucher_type', TRUE); if (($data_voucher_type_base_type < 1) or ($data_voucher_type_base_type > 2)) $data_voucher_type_base_type = 1; @@ -346,6 +364,9 @@ class VoucherTypes extends Controller { if (($data_bank_cash_ledger_restriction < 1) or ($data_bank_cash_ledger_restriction > 5)) $data_bank_cash_ledger_restriction = 1; + if (($data_stock_voucher_type < 1) or ($data_stock_voucher_type > 2)) + $data_stock_voucher_type = 1; + $this->db->trans_start(); $update_data = array( 'label' => $data_voucher_type_label, @@ -357,6 +378,7 @@ class VoucherTypes extends Controller { 'suffix' => $data_voucher_type_suffix, 'zero_padding' => $data_voucher_type_zero_padding, 'bank_cash_ledger_restriction' => $data_bank_cash_ledger_restriction, + 'stock_voucher_type' => $data_stock_voucher_type, ); if ( ! $this->db->where('id', $data_voucher_type_id)->update('voucher_types', $update_data)) { diff --git a/system/application/helpers/custom_helper.php b/system/application/helpers/custom_helper.php index 15b3029..f1071cb 100644 --- a/system/application/helpers/custom_helper.php +++ b/system/application/helpers/custom_helper.php @@ -117,11 +117,12 @@ if ( ! function_exists('voucher_type_info')) 'label' => $voucher_type_all[$voucher_type_id]['label'], 'name' => $voucher_type_all[$voucher_type_id]['name'], 'base_type' => $voucher_type_all[$voucher_type_id]['base_type'], + 'bank_cash_ledger_restriction' => $voucher_type_all[$voucher_type_id]['bank_cash_ledger_restriction'], + 'stock_voucher_type' => $voucher_type_all[$voucher_type_id]['stock_voucher_type'], 'numbering' => $voucher_type_all[$voucher_type_id]['numbering'], 'prefix' => $voucher_type_all[$voucher_type_id]['prefix'], 'suffix' => $voucher_type_all[$voucher_type_id]['suffix'], 'zero_padding' => $voucher_type_all[$voucher_type_id]['zero_padding'], - 'bank_cash_ledger_restriction' => $voucher_type_all[$voucher_type_id]['bank_cash_ledger_restriction'], ); } else { return array( @@ -129,11 +130,12 @@ if ( ! function_exists('voucher_type_info')) 'label' => '', 'name' => '(Unkonwn)', 'base_type' => 1, + 'bank_cash_ledger_restriction' => 1, + 'stock_voucher_type' => 1, 'numbering' => 1, 'prefix' => '', 'suffix' => '', 'zero_padding' => 0, - 'bank_cash_ledger_restriction' => 5, ); } } diff --git a/system/application/libraries/General.php b/system/application/libraries/General.php index 9f0d101..eab6e19 100644 --- a/system/application/libraries/General.php +++ b/system/application/libraries/General.php @@ -189,11 +189,12 @@ class General { 'name' => $row->name, 'description' => $row->description, 'base_type' => $row->base_type, + 'bank_cash_ledger_restriction' => $row->bank_cash_ledger_restriction, + 'stock_voucher_type' => $row->stock_voucher_type, 'numbering' => $row->numbering, 'prefix' => $row->prefix, 'suffix' => $row->suffix, 'zero_padding' => $row->zero_padding, - 'bank_cash_ledger_restriction' => $row->bank_cash_ledger_restriction, ); } $CI->config->set_item('account_voucher_types', $voucher_type_config); diff --git a/system/application/views/setting/vouchertypes/add.php b/system/application/views/setting/vouchertypes/add.php index a312630..d3f81aa 100644 --- a/system/application/views/setting/vouchertypes/add.php +++ b/system/application/views/setting/vouchertypes/add.php @@ -28,6 +28,18 @@ echo "</p>"; echo "<p>"; + echo form_label('Restrictions', 'bank_cash_ledger_restriction'); + echo "<br />"; + echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock Voucher Type', 'stock_voucher_type'); + echo "<br />"; + echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); + echo "</p>"; + + echo "<p>"; echo form_label('Voucher Numbering', 'voucher_type_numbering'); echo "<br />"; echo form_dropdown('voucher_type_numbering', $voucher_type_numberings, $voucher_type_numbering_active); @@ -52,12 +64,6 @@ echo "</p>"; echo "<p>"; - echo form_label('Restrictions', 'bank_cash_ledger_restriction'); - echo "<br />"; - echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); - echo "</p>"; - - echo "<p>"; echo form_submit('submit', 'Create'); echo " "; echo anchor('setting/vouchertypes', 'Back', 'Back to Voucher Types'); diff --git a/system/application/views/setting/vouchertypes/edit.php b/system/application/views/setting/vouchertypes/edit.php index b3a8513..fa16410 100644 --- a/system/application/views/setting/vouchertypes/edit.php +++ b/system/application/views/setting/vouchertypes/edit.php @@ -28,6 +28,18 @@ echo "</p>"; echo "<p>"; + echo form_label('Restrictions', 'bank_cash_ledger_restriction'); + echo "<br />"; + echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock Voucher Type', 'stock_voucher_type'); + echo "<br />"; + echo form_dropdown('stock_voucher_type', $stock_voucher_types, $stock_voucher_type_active); + echo "</p>"; + + echo "<p>"; echo form_label('Voucher Numbering', 'voucher_type_numbering'); echo "<br />"; echo form_dropdown('voucher_type_numbering', $voucher_type_numberings, $voucher_type_numbering_active); @@ -52,12 +64,6 @@ echo "</p>"; echo "<p>"; - echo form_label('Restrictions', 'bank_cash_ledger_restriction'); - echo "<br />"; - echo form_dropdown('bank_cash_ledger_restriction', $bank_cash_ledger_restrictions, $bank_cash_ledger_restriction_active); - echo "</p>"; - - echo "<p>"; echo form_submit('submit', 'Update'); echo " "; echo anchor('setting/vouchertypes', 'Back', 'Back to Voucher Types'); commit a0e5ef873fde1038a0a40eb1185240cf1fbad420 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Wed Feb 9 17:35:08 2011 +0530 Added basic purchase voucher structure - Updated database schema to add table for stock voucher items - Added stub stock item balance method - Added purcahse voucher add structure - Added permissions to view/add/edit/delete stock vouchers Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/assets/css/tables.css b/system/application/assets/css/tables.css index 6ebba75..567daa9 100644 --- a/system/application/assets/css/tables.css +++ b/system/application/assets/css/tables.css @@ -71,6 +71,33 @@ tr.total-area { } /******************************************************************************/ +/************************* STOCK VOUCHER TABLE ********************************/ +/******************************************************************************/ + +.stock-voucher-table { + font-family:"Lucida Sans Unicode", "Lucida Grande", Sans-Serif; + font-size:14px; + border-collapse:collapse; + text-align:left; +} + +.stock-voucher-table th { + font-weight:normal; + color:#000000; + padding:5px 8px; + background-color:#EEEEEE; +} + +.stock-voucher-table td { + color:#000000; + padding:8px 8px 8px 8px; +} + +.stock-voucher-table tr.new-row { + background-color:#FFFFE0; +} + +/******************************************************************************/ /****************************** CUSTOM TABLES *********************************/ /******************************************************************************/ diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index 6e4d706..299bd14 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -124,8 +124,17 @@ CREATE TABLE IF NOT EXISTS stock_items ( name varchar(100) NOT NULL, costing_method int(2) NOT NULL, op_balance_quantity float NOT NULL, - op_balance_rate_per_unit decimal(15,2) NOT NULL, - op_balance_total_value decimal(15,2) NOT NULL, + op_balance_rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', + op_balance_total_value decimal(15,2) NOT NULL DEFAULT '0.00', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS stock_voucher_items ( + id int(11) NOT NULL AUTO_INCREMENT, + stock_item_id int(11) NOT NULL, + quantity float NOT NULL, + rate_per_unit decimal(15,2) NOT NULL DEFAULT '0.00', + discount varchar(15) NOT NULL, + total decimal(15,2) NOT NULL DEFAULT '0.00', + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; diff --git a/system/application/controllers/inventory/stockitem.php b/system/application/controllers/inventory/stockitem.php index e8fcdd0..5193c51 100644 --- a/system/application/controllers/inventory/stockitem.php +++ b/system/application/controllers/inventory/stockitem.php @@ -386,6 +386,15 @@ class StockItem extends Controller { } return; } + + function balance($stock_ledger_id = 0) + { + if ($stock_ledger_id > 0) + echo $this->Stock_Item_model->get_stock_item_balance($stock_ledger_id); + else + echo ""; + return; + } } /* End of file stockitem.php */ diff --git a/system/application/controllers/inventory/stockvoucher.php b/system/application/controllers/inventory/stockvoucher.php new file mode 100644 index 0000000..b97aaea --- /dev/null +++ b/system/application/controllers/inventory/stockvoucher.php @@ -0,0 +1,1137 @@ +<?php + +class StockVoucher extends Controller { + + function StockVoucher() + { + parent::Controller(); + $this->load->model('Voucher_model'); + $this->load->model('Ledger_model'); + $this->load->model('Tag_model'); + return; + } + + function index() + { + redirect('voucher/show/all'); + return; + } + + function view($voucher_type, $voucher_id = 0) + { + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $this->template->set('page_title', 'View ' . $current_voucher_type['name'] . ' Voucher'); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + /* Load current voucher details */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('id', 'asc'); + $cur_voucher_ledgers = $this->db->get(); + if ($cur_voucher_ledgers->num_rows() < 1) + { + $this->messages->add('Voucher has no associated Ledger A/C\'s.', 'error'); + } + $data['cur_voucher'] = $cur_voucher; + $data['cur_voucher_ledgers'] = $cur_voucher_ledgers; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $this->template->load('template', 'voucher/view', $data); + return; + } + + function add($voucher_type) + { + /* Check access */ + if ( ! check_access('create stock voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $this->template->set('page_title', 'New ' . $current_voucher_type['name'] . ' Voucher'); + + /* Form fields */ + $data['voucher_number'] = array( + 'name' => 'voucher_number', + 'id' => 'voucher_number', + 'maxlength' => '11', + 'size' => '11', + 'value' => '', + ); + $data['voucher_date'] = array( + 'name' => 'voucher_date', + 'id' => 'voucher_date', + 'maxlength' => '11', + 'size' => '11', + 'value' => date_today_php(), + ); + $data['voucher_narration'] = array( + 'name' => 'voucher_narration', + 'id' => 'voucher_narration', + 'cols' => '50', + 'rows' => '4', + 'value' => '', + ); + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_tags'] = $this->Tag_model->get_all_tags(); + $data['voucher_tag'] = 0; + + /* Form validations */ + if ($current_voucher_type['numbering'] == '2') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + else if ($current_voucher_type['numbering'] == '3') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + else + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevoucherno[' . $voucher_type_id . ']'); + $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + $this->form_validation->set_rules('voucher_narration', 'trim'); + $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); + + /* Debit and Credit amount validation */ + if ($_POST) + { + foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + { + $this->form_validation->set_rules('dr_amount[' . $id . ']', 'Debit Amount', 'trim|currency'); + $this->form_validation->set_rules('cr_amount[' . $id . ']', 'Credit Amount', 'trim|currency'); + } + } + + /* Repopulating form */ + if ($_POST) + { + $data['voucher_number']['value'] = $this->input->post('voucher_number', TRUE); + $data['voucher_date']['value'] = $this->input->post('voucher_date', TRUE); + $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); + $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); + + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); + $data['ledger_id'] = $this->input->post('ledger_id', TRUE); + $data['dr_amount'] = $this->input->post('dr_amount', TRUE); + $data['cr_amount'] = $this->input->post('cr_amount', TRUE); + } else { + for ($count = 0; $count <= 1; $count++) + { + $data['ledger_dc'][$count] = "D"; + $data['ledger_id'][$count] = 0; + $data['rate'][$count] = ""; + $data['amount'][$count] = ""; + } + for ($count = 0; $count <= 3; $count++) + { + $data['stock_item_id'][$count] = '0'; + $data['stock_item_quantity'][$count] = ''; + $data['stock_item_rate_per_unit'][$count] = ''; + $data['stock_item_amount'][$count] = ''; + } + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + else + { + /* Checking for Valid Ledgers A/C and Debit and Credit Total */ + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_dr_amount = $this->input->post('dr_amount', TRUE); + $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + $dr_total = 0; + $cr_total = 0; + $bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is Bank or Cash A/C */ + $non_bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is NOT a Bank or Cash A/C */ + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + if ($data_all_ledger_id[$id] < 1) + continue; + + /* Check for valid ledger id */ + $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); + $valid_ledger_q = $this->db->get(); + if ($valid_ledger_q->num_rows() < 1) + { + $this->messages->add('Invalid Ledger A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else { + /* Check for valid ledger type */ + $valid_ledger = $valid_ledger_q->row(); + if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') + { + if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) + { + $bank_cash_present = TRUE; + } + if ($valid_ledger->type != 1) + $non_bank_cash_present = TRUE; + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + { + if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) + { + $bank_cash_present = TRUE; + } + if ($valid_ledger->type != 1) + $non_bank_cash_present = TRUE; + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') + { + if ($valid_ledger->type != 1) + { + $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') + { + if ($valid_ledger->type == 1) + { + $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } + } + + if ($data_all_ledger_dc[$id] == "D") + { + $dr_total += $data_all_dr_amount[$id]; + } else { + $cr_total += $data_all_cr_amount[$id]; + } + } + if ($dr_total != $cr_total) + { + $this->messages->add('Debit and Credit Total does not match!', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else if ($dr_total == 0 && $cr_total == 0) { + $this->messages->add('Cannot save empty Voucher.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + /* Check if atleast one Bank or Cash Ledger A/C is present */ + if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') + { + if ( ! $bank_cash_present) + { + $this->messages->add('Need to Debit atleast one Bank or Cash A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + if ( ! $non_bank_cash_present) + { + $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + { + if ( ! $bank_cash_present) + { + $this->messages->add('Need to Credit atleast one Bank or Cash A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + if ( ! $non_bank_cash_present) + { + $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } + + /* Adding main voucher */ + if ($current_voucher_type['numbering'] == '2') + { + $data_number = $this->input->post('voucher_number', TRUE); + } else if ($current_voucher_type['numbering'] == '3') { + $data_number = $this->input->post('voucher_number', TRUE); + if ( ! $data_number) + $data_number = NULL; + } else { + if ($this->input->post('voucher_number', TRUE)) + $data_number = $this->input->post('voucher_number', TRUE); + else + $data_number = $this->Voucher_model->next_voucher_number($voucher_type_id); + } + + $data_date = $this->input->post('voucher_date', TRUE); + $data_narration = $this->input->post('voucher_narration', TRUE); + $data_tag = $this->input->post('voucher_tag', TRUE); + if ($data_tag < 1) + $data_tag = NULL; + $data_type = $voucher_type_id; + $data_date = date_php_to_mysql($data_date); // Converting date to MySQL + $voucher_id = NULL; + + $this->db->trans_start(); + $insert_data = array( + 'number' => $data_number, + 'date' => $data_date, + 'narration' => $data_narration, + 'voucher_type' => $data_type, + 'tag_id' => $data_tag, + ); + if ( ! $this->db->insert('vouchers', $insert_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error addding Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } else { + $voucher_id = $this->db->insert_id(); + } + + /* Adding ledger accounts */ + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_dr_amount = $this->input->post('dr_amount', TRUE); + $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + + $dr_total = 0; + $cr_total = 0; + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + $data_ledger_dc = $data_all_ledger_dc[$id]; + $data_ledger_id = $data_all_ledger_id[$id]; + if ($data_ledger_id < 1) + continue; + $data_amount = 0; + if ($data_all_ledger_dc[$id] == "D") + { + $data_amount = $data_all_dr_amount[$id]; + $dr_total += $data_all_dr_amount[$id]; + } else { + $data_amount = $data_all_cr_amount[$id]; + $cr_total += $data_all_cr_amount[$id]; + } + $insert_ledger_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_ledger_id, + 'amount' => $data_amount, + 'dc' => $data_ledger_dc, + ); + if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed inserting voucher ledger item " . "[id:" . $data_ledger_id . "]"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + } + + /* Updating Debit and Credit Total in vouchers table */ + $update_data = array( + 'dr_total' => $dr_total, + 'cr_total' => $cr_total, + ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher total.', 'error'); + $this->logger->write_message("error", "Error adding " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " since failed updating debit and credit total"); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + + /* Success */ + $this->db->trans_complete(); + + $this->session->set_userdata('voucher_added_show_action', TRUE); + $this->session->set_userdata('voucher_added_id', $voucher_id); + $this->session->set_userdata('voucher_added_type_id', $voucher_type_id); + $this->session->set_userdata('voucher_added_type_label', $current_voucher_type['label']); + $this->session->set_userdata('voucher_added_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_added_number', $data_number); + + /* Showing success message in show() method since message is too long for storing it in session */ + $this->logger->write_message("success", "Added " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + redirect('voucher/show/' . $current_voucher_type['label']); + $this->template->load('template', 'inventory/stockvoucher/add', $data); + return; + } + return; + } + + function edit($voucher_type, $voucher_id = 0) + { + /* Check access */ + if ( ! check_access('edit voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $this->template->set('page_title', 'Edit ' . $current_voucher_type['name'] . ' Voucher'); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + /* Form fields - Voucher */ + $data['voucher_number'] = array( + 'name' => 'voucher_number', + 'id' => 'voucher_number', + 'maxlength' => '11', + 'size' => '11', + 'value' => $cur_voucher->number, + ); + $data['voucher_date'] = array( + 'name' => 'voucher_date', + 'id' => 'voucher_date', + 'maxlength' => '11', + 'size' => '11', + 'value' => date_mysql_to_php($cur_voucher->date), + ); + $data['voucher_narration'] = array( + 'name' => 'voucher_narration', + 'id' => 'voucher_narration', + 'cols' => '50', + 'rows' => '4', + 'value' => $cur_voucher->narration, + ); + $data['voucher_id'] = $voucher_id; + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_tag'] = $cur_voucher->tag_id; + $data['voucher_tags'] = $this->Tag_model->get_all_tags(); + $data['has_reconciliation'] = FALSE; + + /* Load current ledger details if not $_POST */ + if ( ! $_POST) + { + $this->db->from('voucher_items')->where('voucher_id', $voucher_id); + $cur_ledgers_q = $this->db->get(); + if ($cur_ledgers_q->num_rows <= 0) + { + $this->messages->add('No Ledger A/C\'s found!', 'error'); + } + $counter = 0; + foreach ($cur_ledgers_q->result() as $row) + { + $data['ledger_dc'][$counter] = $row->dc; + $data['ledger_id'][$counter] = $row->ledger_id; + if ($row->dc == "D") + { + $data['dr_amount'][$counter] = $row->amount; + $data['cr_amount'][$counter] = ""; + } else { + $data['dr_amount'][$counter] = ""; + $data['cr_amount'][$counter] = $row->amount; + } + if ($row->reconciliation_date) + $data['has_reconciliation'] = TRUE; + $counter++; + } + /* Two extra rows */ + $data['ledger_dc'][$counter] = 'D'; + $data['ledger_id'][$counter] = 0; + $data['dr_amount'][$counter] = ""; + $data['cr_amount'][$counter] = ""; + $counter++; + $data['ledger_dc'][$counter] = 'D'; + $data['ledger_id'][$counter] = 0; + $data['dr_amount'][$counter] = ""; + $data['cr_amount'][$counter] = ""; + $counter++; + } + + /* Form validations */ + if ($current_voucher_type['numbering'] == '3') + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); + else + $this->form_validation->set_rules('voucher_number', 'Voucher Number', 'trim|required|is_natural_no_zero|uniquevouchernowithid[' . $voucher_type_id . '.' . $voucher_id . ']'); + $this->form_validation->set_rules('voucher_date', 'Voucher Date', 'trim|required|is_date|is_date_within_range'); + $this->form_validation->set_rules('voucher_narration', 'trim'); + $this->form_validation->set_rules('voucher_tag', 'Tag', 'trim|is_natural'); + + /* Debit and Credit amount validation */ + if ($_POST) + { + foreach ($this->input->post('ledger_dc', TRUE) as $id => $ledger_data) + { + $this->form_validation->set_rules('dr_amount[' . $id . ']', 'Debit Amount', 'trim|currency'); + $this->form_validation->set_rules('cr_amount[' . $id . ']', 'Credit Amount', 'trim|currency'); + } + } + + /* Repopulating form */ + if ($_POST) + { + $data['voucher_number']['value'] = $this->input->post('voucher_number', TRUE); + $data['voucher_date']['value'] = $this->input->post('voucher_date', TRUE); + $data['voucher_narration']['value'] = $this->input->post('voucher_narration', TRUE); + $data['voucher_tag'] = $this->input->post('voucher_tag', TRUE); + $data['has_reconciliation'] = $this->input->post('has_reconciliation', TRUE); + + $data['ledger_dc'] = $this->input->post('ledger_dc', TRUE); + $data['ledger_id'] = $this->input->post('ledger_id', TRUE); + $data['dr_amount'] = $this->input->post('dr_amount', TRUE); + $data['cr_amount'] = $this->input->post('cr_amount', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'voucher/edit', $data); + } else { + /* Checking for Valid Ledgers A/C and Debit and Credit Total */ + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_dr_amount = $this->input->post('dr_amount', TRUE); + $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + $dr_total = 0; + $cr_total = 0; + $bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is Bank or Cash A/C */ + $non_bank_cash_present = FALSE; /* Whether atleast one Ledger A/C is NOT a Bank or Cash A/C */ + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + if ($data_all_ledger_id[$id] < 1) + continue; + + /* Check for valid ledger id */ + $this->db->from('ledgers')->where('id', $data_all_ledger_id[$id]); + $valid_ledger_q = $this->db->get(); + if ($valid_ledger_q->num_rows() < 1) + { + $this->messages->add('Invalid Ledger A/C.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } else { + /* Check for valid ledger type */ + $valid_ledger = $valid_ledger_q->row(); + if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') + { + if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) + { + $bank_cash_present = TRUE; + } + if ($valid_ledger->type != 1) + $non_bank_cash_present = TRUE; + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + { + if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) + { + $bank_cash_present = TRUE; + } + if ($valid_ledger->type != 1) + $non_bank_cash_present = TRUE; + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') + { + if ($valid_ledger->type != 1) + { + $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') + { + if ($valid_ledger->type == 1) + { + $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + } + } + if ($data_all_ledger_dc[$id] == "D") + { + $dr_total += $data_all_dr_amount[$id]; + } else { + $cr_total += $data_all_cr_amount[$id]; + } + } + if ($dr_total != $cr_total) + { + $this->messages->add('Debit and Credit Total does not match!', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } else if ($dr_total == 0 && $cr_total == 0) { + $this->messages->add('Cannot save empty Voucher.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + /* Check if atleast one Bank or Cash Ledger A/C is present */ + if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') + { + if ( ! $bank_cash_present) + { + $this->messages->add('Need to Debit atleast one Bank or Cash A/C.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + if ( ! $non_bank_cash_present) + { + $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') + { + if ( ! $bank_cash_present) + { + $this->messages->add('Need to Credit atleast one Bank or Cash A/C.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + if ( ! $non_bank_cash_present) + { + $this->messages->add('Need to Debit or Credit atleast one NON - Bank or Cash A/C.', 'error'); + $this->template->load('template', 'voucher/edit', $data); + return; + } + } + + /* Updating main voucher */ + if ($current_voucher_type['numbering'] == '3') { + $data_number = $this->input->post('voucher_number', TRUE); + if ( ! $data_number) + $data_number = NULL; + } else { + $data_number = $this->input->post('voucher_number', TRUE); + } + + $data_date = $this->input->post('voucher_date', TRUE); + $data_narration = $this->input->post('voucher_narration', TRUE); + $data_tag = $this->input->post('voucher_tag', TRUE); + if ($data_tag < 1) + $data_tag = NULL; + $data_type = $voucher_type_id; + $data_date = date_php_to_mysql($data_date); // Converting date to MySQL + $data_has_reconciliation = $this->input->post('has_reconciliation', TRUE); + + $this->db->trans_start(); + $update_data = array( + 'number' => $data_number, + 'date' => $data_date, + 'narration' => $data_narration, + 'tag_id' => $data_tag, + ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher A/C.', 'error'); + $this->logger->write_message("error", "Error updating voucher details for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'voucher/edit', $data); + return; + } + + /* TODO : Deleting all old ledger data, Bad solution */ + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting previous Ledger A/C\'s from Voucher.', 'error'); + $this->logger->write_message("error", "Error deleting previous voucher items for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'voucher/edit', $data); + return; + } + + /* Adding ledger accounts */ + $data_all_ledger_dc = $this->input->post('ledger_dc', TRUE); + $data_all_ledger_id = $this->input->post('ledger_id', TRUE); + $data_all_dr_amount = $this->input->post('dr_amount', TRUE); + $data_all_cr_amount = $this->input->post('cr_amount', TRUE); + + $dr_total = 0; + $cr_total = 0; + foreach ($data_all_ledger_dc as $id => $ledger_data) + { + $data_ledger_dc = $data_all_ledger_dc[$id]; + $data_ledger_id = $data_all_ledger_id[$id]; + if ($data_ledger_id < 1) + continue; + $data_amount = 0; + if ($data_all_ledger_dc[$id] == "D") + { + $data_amount = $data_all_dr_amount[$id]; + $dr_total += $data_all_dr_amount[$id]; + } else { + $data_amount = $data_all_cr_amount[$id]; + $cr_total += $data_all_cr_amount[$id]; + } + + $insert_ledger_data = array( + 'voucher_id' => $voucher_id, + 'ledger_id' => $data_ledger_id, + 'amount' => $data_amount, + 'dc' => $data_ledger_dc, + ); + if ( ! $this->db->insert('voucher_items', $insert_ledger_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error adding Ledger A/C - ' . $data_ledger_id . ' to Voucher.', 'error'); + $this->logger->write_message("error", "Error adding Ledger A/C item [id:" . $data_ledger_id . "] for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'voucher/edit', $data); + return; + } + } + + /* Updating Debit and Credit Total in vouchers table */ + $update_data = array( + 'dr_total' => $dr_total, + 'cr_total' => $cr_total, + ); + if ( ! $this->db->where('id', $voucher_id)->update('vouchers', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Voucher total.', 'error'); + $this->logger->write_message("error", "Error updating voucher total for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + $this->template->load('template', 'voucher/edit', $data); + return; + } + + /* Success */ + $this->db->trans_complete(); + + $this->session->set_userdata('voucher_updated_show_action', TRUE); + $this->session->set_userdata('voucher_updated_id', $voucher_id); + $this->session->set_userdata('voucher_updated_type_id', $voucher_type_id); + $this->session->set_userdata('voucher_updated_type_label', $current_voucher_type['label']); + $this->session->set_userdata('voucher_updated_type_name', $current_voucher_type['name']); + $this->session->set_userdata('voucher_updated_number', $data_number); + if ($data_has_reconciliation) + $this->session->set_userdata('voucher_updated_has_reconciliation', TRUE); + else + $this->session->set_userdata('voucher_updated_has_reconciliation', FALSE); + + /* Showing success message in show() method since message is too long for storing it in session */ + $this->logger->write_message("success", "Updated " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $data_number) . " [id:" . $voucher_id . "]"); + + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + return; + } + + function delete($voucher_type, $voucher_id = 0) + { + /* Check access */ + if ( ! check_access('delete voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('voucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + $this->db->trans_start(); + if ( ! $this->db->delete('voucher_items', array('voucher_id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Voucher - Ledger A/C\'s.', 'error'); + $this->logger->write_message("error", "Error deleting ledger entries for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } + if ( ! $this->db->delete('vouchers', array('id' => $voucher_id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Voucher entry.', 'error'); + $this->logger->write_message("error", "Error deleting Voucher entry for " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/view/' . $current_voucher_type['label'] . '/' . $voucher_id); + return; + } + $this->db->trans_complete(); + $this->messages->add('Deleted ' . $current_voucher_type['name'] . ' Voucher.', 'success'); + $this->logger->write_message("success", "Deleted " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + function download($voucher_type, $voucher_id = 0) + { + $this->load->helper('download'); + $this->load->model('Setting_model'); + $this->load->model('Ledger_model'); + + /* Check access */ + if ( ! check_access('download voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_number'] = $cur_voucher->number; + $data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); + $data['voucher_dr_total'] = $cur_voucher->dr_total; + $data['voucher_cr_total'] = $cur_voucher->cr_total; + $data['voucher_narration'] = $cur_voucher->narration; + + /* Getting Ledger details */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); + $ledger_q = $this->db->get(); + $counter = 0; + $data['ledger_data'] = array(); + if ($ledger_q->num_rows() > 0) + { + foreach ($ledger_q->result() as $row) + { + $data['ledger_data'][$counter] = array( + 'id' => $row->ledger_id, + 'name' => $this->Ledger_model->get_name($row->ledger_id), + 'dc' => $row->dc, + 'amount' => $row->amount, + ); + $counter++; + } + } + + /* Download Voucher */ + $file_name = $current_voucher_type['name'] . '_voucher_' . $cur_voucher->number . ".html"; + $download_data = $this->load->view('voucher/downloadpreview', $data, TRUE); + force_download($file_name, $download_data); + return; + } + + function printpreview($voucher_type, $voucher_id = 0) + { + $this->load->model('Setting_model'); + $this->load->model('Ledger_model'); + + /* Check access */ + if ( ! check_access('print voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_number'] = $cur_voucher->number; + $data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); + $data['voucher_dr_total'] = $cur_voucher->dr_total; + $data['voucher_cr_total'] = $cur_voucher->cr_total; + $data['voucher_narration'] = $cur_voucher->narration; + + /* Getting Ledger details */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); + $ledger_q = $this->db->get(); + $counter = 0; + $data['ledger_data'] = array(); + if ($ledger_q->num_rows() > 0) + { + foreach ($ledger_q->result() as $row) + { + $data['ledger_data'][$counter] = array( + 'id' => $row->ledger_id, + 'name' => $this->Ledger_model->get_name($row->ledger_id), + 'dc' => $row->dc, + 'amount' => $row->amount, + ); + $counter++; + } + } + + $this->load->view('voucher/printpreview', $data); + return; + } + + function email($voucher_type, $voucher_id = 0) + { + $this->load->model('Setting_model'); + $this->load->model('Ledger_model'); + $this->load->library('email'); + + /* Check access */ + if ( ! check_access('email voucher')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/stockvoucher/show/' . $voucher_type); + return; + } + + /* Voucher Type */ + $voucher_type_id = voucher_type_name_to_id($voucher_type); + if ( ! $voucher_type_id) + { + $this->messages->add('Invalid Voucher type.', 'error'); + redirect('voucher/show/all'); + return; + } else { + $current_voucher_type = voucher_type_info($voucher_type_id); + } + + $account_data = $this->Setting_model->get_current(); + + /* Load current voucher details */ + if ( ! $cur_voucher = $this->Voucher_model->get_voucher($voucher_id, $voucher_type_id)) + { + $this->messages->add('Invalid Voucher.', 'error'); + redirect('voucher/show/' . $current_voucher_type['label']); + return; + } + + $data['voucher_type_id'] = $voucher_type_id; + $data['current_voucher_type'] = $current_voucher_type; + $data['voucher_id'] = $voucher_id; + $data['voucher_number'] = $cur_voucher->number; + $data['email_to'] = array( + 'name' => 'email_to', + 'id' => 'email_to', + 'size' => '40', + 'value' => '', + ); + + /* Form validations */ + $this->form_validation->set_rules('email_to', 'Email to', 'trim|valid_emails|required'); + + /* Repopulating form */ + if ($_POST) + { + $data['email_to']['value'] = $this->input->post('email_to', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $data['error'] = validation_errors(); + $this->load->view('voucher/email', $data); + return; + } + else + { + $voucher_data['voucher_type_id'] = $voucher_type_id; + $voucher_data['current_voucher_type'] = $current_voucher_type; + $voucher_data['voucher_number'] = $cur_voucher->number; + $voucher_data['voucher_date'] = date_mysql_to_php_display($cur_voucher->date); + $voucher_data['voucher_dr_total'] = $cur_voucher->dr_total; + $voucher_data['voucher_cr_total'] = $cur_voucher->cr_total; + $voucher_data['voucher_narration'] = $cur_voucher->narration; + + /* Getting Ledger details */ + $this->db->from('voucher_items')->where('voucher_id', $voucher_id)->order_by('dc', 'desc'); + $ledger_q = $this->db->get(); + $counter = 0; + $voucher_data['ledger_data'] = array(); + if ($ledger_q->num_rows() > 0) + { + foreach ($ledger_q->result() as $row) + { + $voucher_data['ledger_data'][$counter] = array( + 'id' => $row->ledger_id, + 'name' => $this->Ledger_model->get_name($row->ledger_id), + 'dc' => $row->dc, + 'amount' => $row->amount, + ); + $counter++; + } + } + + /* Preparing message */ + $message = $this->load->view('voucher/emailpreview', $voucher_data, TRUE); + + /* Getting email configuration */ + $config['smtp_timeout'] = '30'; + $config['charset'] = 'utf-8'; + $config['newline'] = "\r\n"; + $config['mailtype'] = "html"; + if ($account_data) + { + $config['protocol'] = $account_data->email_protocol; + $config['smtp_host'] = $account_data->email_host; + $config['smtp_port'] = $account_data->email_port; + $config['smtp_user'] = $account_data->email_username; + $config['smtp_pass'] = $account_data->email_password; + } else { + $data['error'] = 'Invalid account settings.'; + } + $this->email->initialize($config); + + /* Sending email */ + $this->email->from('', 'Webzash'); + $this->email->to($this->input->post('email_to', TRUE)); + $this->email->subject($current_voucher_type['name'] . ' Voucher No. ' . full_voucher_number($voucher_type_id, $cur_voucher->number)); + $this->email->message($message); + if ($this->email->send()) + { + $data['message'] = "Email sent."; + $this->logger->write_message("success", "Emailed " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + } else { + $data['error'] = "Error sending email. Check you email settings."; + $this->logger->write_message("error", "Error emailing " . $current_voucher_type['name'] . " Voucher number " . full_voucher_number($voucher_type_id, $cur_voucher->number) . " [id:" . $voucher_id . "]"); + } + $this->load->view('voucher/email', $data); + return; + } + return; + } + + function addstockrow() + { + $i = time() + rand (0, time()) + rand (0, time()) + rand (0, time()); + $stock_item_quantity = array( + 'name' => 'stock_item_quantity[' . $i . ']', + 'id' => 'stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'quantity-item', + ); + $stock_item_rate_per_unit = array( + 'name' => 'stock_item_rate_per_unit[' . $i . ']', + 'id' => 'stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'rate-item', + ); + $stock_item_amount = array( + 'name' => 'stock_item_amount[' . $i . ']', + 'id' => 'stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => '', + 'class' => 'rate-item', + ); + + echo '<tr class="new-row">'; + echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; + echo "<td>" . form_input($stock_item_quantity) . "</td>"; + echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; + echo "<td>" . form_input($stock_item_amount) . "</td>"; + echo '<td>'; + echo img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Stock Item', 'class' => 'addstockrow')); + echo '</td>'; + echo '<td>'; + echo img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Stock Item', 'class' => 'deletestockrow')); + echo '</td>'; + echo '<td class="stock-item-balance"><div></div>'; + echo '</td>'; + echo '</tr>'; + return; + } +} + +/* End of file voucher.php */ +/* Location: ./system/application/controllers/voucher.php */ diff --git a/system/application/controllers/voucher.php b/system/application/controllers/voucher.php index 7db9777..eda8357 100644 --- a/system/application/controllers/voucher.php +++ b/system/application/controllers/voucher.php @@ -49,7 +49,10 @@ class Voucher extends Controller { } else { $current_voucher_type = voucher_type_info($voucher_type_id); $this->template->set('page_title', $current_voucher_type['name'] . ' Vouchers'); - $this->template->set('nav_links', array('voucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); + if ($current_voucher_type['base_type'] == '1') + $this->template->set('nav_links', array('voucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); + else + $this->template->set('nav_links', array('inventory/stockvoucher/add/' . $current_voucher_type['label'] => 'New ' . $current_voucher_type['name'] . ' Voucher')); } } diff --git a/system/application/helpers/MY_form_helper.php b/system/application/helpers/MY_form_helper.php index 786a38c..cdc5825 100644 --- a/system/application/helpers/MY_form_helper.php +++ b/system/application/helpers/MY_form_helper.php @@ -66,6 +66,10 @@ if ( ! function_exists('form_input_ledger')) $options = $CI->Ledger_model->get_all_ledgers_nobankcash(); else if ($type == 'reconciliation') $options = $CI->Ledger_model->get_all_ledgers_reconciliation(); + else if ($type == 'purchase') + $options = $CI->Ledger_model->get_all_ledgers_purchase(); + else if ($type == 'creditor') + $options = $CI->Ledger_model->get_all_ledgers_creditor(); else $options = $CI->Ledger_model->get_all_ledgers(); @@ -96,5 +100,41 @@ if ( ! function_exists('form_input_ledger')) } } +if ( ! function_exists('form_input_stock_item')) +{ + function form_input_stock_item($name, $selected = NULL, $extra = '') + { + $CI =& get_instance(); + $CI->load->model('Stock_Item_model'); + + $options = $CI->Stock_Item_model->get_all_item(); + + // If no selected state was submitted we will attempt to set it automatically + if ( ! ($selected)) + { + // If the form name appears in the $_POST array we have a winner! + if (isset($_POST[$name])) + { + $selected = $_POST[$name]; + } + } + + if ($extra != '') $extra = ' '.$extra; + + $form = '<select name="'.$name.'"'.$extra.' class="stock-item-dropdown">'; + + foreach ($options as $key => $val) + { + $key = (string) $key; + $sel = ($key == $selected) ? ' selected="selected"' : ''; + $form .= '<option value="'.$key.'"'.$sel.'>'.(string) $val."</option>\n"; + } + + $form .= '</select>'; + + return $form; + } +} + /* End of file MY_form_helper.php */ /* Location: ./system/application/helpers/MY_form_helper.php */ diff --git a/system/application/helpers/access_helper.php b/system/application/helpers/access_helper.php index 35e7067..9498dee 100644 --- a/system/application/helpers/access_helper.php +++ b/system/application/helpers/access_helper.php @@ -13,6 +13,13 @@ * 'print voucher' * 'email voucher' * 'download voucher' + * 'view stock voucher' + * 'create stock voucher' + * 'edit stock voucher' + * 'delete stock voucher' + * 'print stock voucher' + * 'email stock voucher' + * 'download stock voucher' * 'create ledger' * 'edit ledger' * 'delete ledger' @@ -25,6 +32,9 @@ * 'create stock group' * 'edit stock group' * 'delete stock group' + * 'create stock item', + * 'edit stock item', + * 'delete stock item', * 'create tag' * 'edit tag' * 'delete tag' @@ -51,6 +61,13 @@ if ( ! function_exists('check_access')) 'print voucher', 'email voucher', 'download voucher', + 'view stock voucher', + 'create stock voucher', + 'edit stock voucher', + 'delete stock voucher', + 'print stock voucher', + 'email stock voucher', + 'download stock voucher', 'create ledger', 'edit ledger', 'delete ledger', @@ -63,6 +80,9 @@ if ( ! function_exists('check_access')) 'create stock group', 'edit stock group', 'delete stock group', + 'create stock item', + 'edit stock item', + 'delete stock item', 'create tag', 'edit tag', 'delete tag', @@ -81,6 +101,13 @@ if ( ! function_exists('check_access')) 'print voucher', 'email voucher', 'download voucher', + 'view stock voucher', + 'create stock voucher', + 'edit stock voucher', + 'delete stock voucher', + 'print stock voucher', + 'email stock voucher', + 'download stock voucher', 'create ledger', 'edit ledger', 'delete ledger', @@ -93,6 +120,9 @@ if ( ! function_exists('check_access')) 'create stock group', 'edit stock group', 'delete stock group', + 'create stock item', + 'edit stock item', + 'delete stock item', 'create tag', 'edit tag', 'delete tag', @@ -108,8 +138,17 @@ if ( ! function_exists('check_access')) 'print voucher', 'email voucher', 'download voucher', + 'view stock voucher', + 'create stock voucher', + 'edit stock voucher', + 'delete stock voucher', + 'print stock voucher', + 'email stock voucher', + 'download stock voucher', 'create ledger', 'edit ledger', + 'create stock item', + 'edit stock item', ); $permissions['guest'] = array( 'view voucher', diff --git a/system/application/helpers/custom_helper.php b/system/application/helpers/custom_helper.php index de31de7..15b3029 100644 --- a/system/application/helpers/custom_helper.php +++ b/system/application/helpers/custom_helper.php @@ -116,6 +116,7 @@ if ( ! function_exists('voucher_type_info')) 'id' => $voucher_type_all[$voucher_type_id], 'label' => $voucher_type_all[$voucher_type_id]['label'], 'name' => $voucher_type_all[$voucher_type_id]['name'], + 'base_type' => $voucher_type_all[$voucher_type_id]['base_type'], 'numbering' => $voucher_type_all[$voucher_type_id]['numbering'], 'prefix' => $voucher_type_all[$voucher_type_id]['prefix'], 'suffix' => $voucher_type_all[$voucher_type_id]['suffix'], @@ -127,6 +128,7 @@ if ( ! function_exists('voucher_type_info')) 'id' => $voucher_type_all[$voucher_type_id], 'label' => '', 'name' => '(Unkonwn)', + 'base_type' => 1, 'numbering' => 1, 'prefix' => '', 'suffix' => '', diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index 71f36f5..d50bcbe 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -59,6 +59,32 @@ class Ledger_model extends Model { return $options; } + function get_all_ledgers_purchase() + { + $options = array(); + $options[0] = "(Please Select)"; + $this->db->from('ledgers')->where('type', 2)->order_by('name', 'asc'); + $ledger_q = $this->db->get(); + foreach ($ledger_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } + + function get_all_ledgers_creditor() + { + $options = array(); + $options[0] = "(Please Select)"; + $this->db->from('ledgers')->where('type', 5)->order_by('name', 'asc'); + $ledger_q = $this->db->get(); + foreach ($ledger_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } + function get_name($ledger_id) { $this->db->from('ledgers')->where('id', $ledger_id)->limit(1); diff --git a/system/application/models/stock_item_model.php b/system/application/models/stock_item_model.php index da33e9f..1b4ae88 100644 --- a/system/application/models/stock_item_model.php +++ b/system/application/models/stock_item_model.php @@ -29,4 +29,9 @@ class Stock_Item_model extends Model { else return "(Error)"; } + + function get_stock_item_balance($stock_item_id) + { + return '100'; + } } diff --git a/system/application/views/inventory/stockvoucher/add.php b/system/application/views/inventory/stockvoucher/add.php new file mode 100644 index 0000000..83a68bc --- /dev/null +++ b/system/application/views/inventory/stockvoucher/add.php @@ -0,0 +1,313 @@ +<?php + /* Add row ledger type */ + $add_type = "all"; +?> +<script type="text/javascript"> + +$(document).ready(function() { + + /***************************** STOCK ITEM *****************************/ + /* Stock Item dropdown changed */ + $('.stock-item-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().next().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + var stockid = $(this).val(); + var rowid = $(this); + if (stockid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockitem/balance') . '/\''; ?> + stockid, + success: function(data) { + var stock_bal = parseFloat(data); + if (isNaN(stock_bal)) + stock_bal = 0; + if (stock_bal == 0) + rowid.parent().next().next().next().next().next().children().text("0"); + else if (stock_bal < 0) + rowid.parent().next().next().next().next().next().next().children().text(data); + else + rowid.parent().next().next().next().next().next().next().children().text(data); + } + }); + } else { + rowid.parent().next().next().next().next().next().next().children().text(""); + } + }); + + $('table td .quantity-item').live('change', function() { + var rowid = $(this); + calculateRowTotal(rowid.parent().prev()); + }); + + var calculateRowTotal = function(itemrow) { + var item_quantity = itemrow.next().children().val(); + var item_rate_per_unit = itemrow.next().next().children().val(); + var item_amount = itemrow.next().next().next().children().val(); + + item_quantity = parseFloat(item_quantity); + item_rate_per_unit = parseFloat(item_rate_per_unit); + if ( (!isNaN(item_quantity)) && (!isNaN(item_rate_per_unit)) ) + { + item_amount = item_quantity * item_rate_per_unit; + itemrow.next().next().next().children().val(item_amount); + itemrow.next().next().next().fadeTo('slow', 0.1).fadeTo('slow', 1); + } + } + + /* Add stock item row */ + $('table td .addstockrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('inventory/stockvoucher/addstockrow') . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + $('.stock-item-dropdown').trigger('change'); + } + }); + }); + + /* Delete stock item row */ + $('table td .deletestockrow').live('click', function() { + $(this).parent().parent().remove(); + }); + + /******************************* LEDGER *******************************/ + /* Dr - Cr dropdown changed */ + $('.dc-dropdown').live('change', function() { + }); + + /* Ledger dropdown changed */ + $('.ledger-dropdown').live('change', function() { + if ($(this).val() == "0") { + $(this).parent().next().children().attr('value', ""); + $(this).parent().next().next().children().attr('value', ""); + $(this).parent().next().children().attr('disabled', 'disabled'); + $(this).parent().next().next().children().attr('disabled', 'disabled'); + } else { + $(this).parent().next().children().attr('disabled', ''); + $(this).parent().next().next().children().attr('disabled', ''); + $(this).parent().prev().children().trigger('change'); + } + $(this).parent().next().children().trigger('change'); + $(this).parent().next().next().children().trigger('change'); + + var ledgerid = $(this).val(); + var rowid = $(this); + if (ledgerid > 0) { + $.ajax({ + url: <?php echo '\'' . site_url('ledger/balance') . '/\''; ?> + ledgerid, + success: function(data) { + var ledger_bal = parseFloat(data); + if (isNaN(ledger_bal)) + ledger_bal = 0; + if (ledger_bal == 0) + rowid.parent().next().next().next().next().next().children().text("0"); + else if (ledger_bal < 0) + rowid.parent().next().next().next().next().next().children().text("Cr " + -data); + else + rowid.parent().next().next().next().next().next().children().text("Dr " + data); + } + }); + } else { + rowid.parent().next().next().next().next().next().children().text(""); + } + }); + + /* Recalculate Total */ + $('table td .recalculate').live('click', function() { + + }); + + /* Delete ledger row */ + $('table td .deleterow').live('click', function() { + $(this).parent().parent().remove(); + }); + + /* Add ledger row */ + $('table td .addrow').live('click', function() { + var cur_obj = this; + var add_image_url = $(cur_obj).attr('src'); + $(cur_obj).attr('src', <?php echo '\'' . asset_url() . 'images/icons/ajax.gif' . '\''; ?>); + $.ajax({ + url: <?php echo '\'' . site_url('voucher/addrow/' . $add_type) . '\''; ?>, + success: function(data) { + $(cur_obj).parent().parent().after(data); + $(cur_obj).attr('src', add_image_url); + } + }); + }); + + /* On page load initiate all triggers */ + $('.dc-dropdown').trigger('change'); + $('.ledger-dropdown').trigger('change'); + $('.stock-item-dropdown').trigger('change'); +}); + +</script> + +<?php + echo form_open('voucher/add/' . $current_voucher_type['label']); + echo "<p>"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Voucher Number', 'voucher_number'); + echo " "; + echo $current_voucher_type['prefix'] . form_input($voucher_number) . $current_voucher_type['suffix']; + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Leave Voucher Number empty for auto numbering</span>"; + echo " "; + echo "<span id=\"tooltip-target-2\">"; + echo form_label('Voucher Date', 'voucher_date'); + echo " "; + echo form_input_date_restrict($voucher_date); + echo "</span>"; + echo "<span id=\"tooltip-content-2\">Date format is " . $this->config->item('account_date_format') . ".</span>"; + echo "</p>"; + + echo "<p>"; + echo "<table border=0 cellpadding=2>"; + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Purchase Ledger A/C', 'purchase_ledger_id'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('purchase_ledger_id', '', '', $type = 'purchase'); + echo "</td>"; + echo "</tr>"; + + echo "<tr>"; + echo "<td align=\"right\">"; + echo form_label('Creditor (Supplier)', 'creditor_ledger_id'); + echo "</td>"; + echo "<td>"; + echo form_input_ledger('creditor_ledger_id', '', '', $type = 'creditor'); + echo "</td>"; + echo "</tr>"; + echo "</table>"; + echo "</p>"; + + echo "<p></p>"; + + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Stock Item</th><th>Quantity</th><th>Rate Per Unit</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($stock_item_id as $i => $row) + { + $stock_item_quantity = array( + 'name' => 'stock_item_quantity[' . $i . ']', + 'id' => 'stock_item_quantity[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'quantity-item', + ); + $stock_item_rate_per_unit = array( + 'name' => 'stock_item_rate_per_unit[' . $i . ']', + 'id' => 'stock_item_rate_per_unit[' . $i . ']', + 'maxlength' => '15', + 'size' => '9', + 'value' => '', + 'class' => 'rate-item', + ); + $stock_item_amount = array( + 'name' => 'stock_item_amount[' . $i . ']', + 'id' => 'stock_item_amount[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => '', + 'class' => 'rate-item', + ); + echo "<tr>"; + + echo "<td>" . form_input_stock_item('stock_item_id[' . $i . ']', 0) . "</td>"; + echo "<td>" . form_input($stock_item_quantity) . "</td>"; + echo "<td>" . form_input($stock_item_rate_per_unit) . "</td>"; + echo "<td>" . form_input($stock_item_amount) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addstockrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deletestockrow')) . "</td>"; + + echo "<td class=\"stock-item-balance\"><div></div></td>"; + + echo "</tr>"; + } + echo "</table>"; + + echo "<br />"; + echo "<br />"; + + echo "<table class=\"voucher-table\">"; + echo "<thead><tr><th>Type</th><th>Ledger A/C</th><th>Rate</th><th>Amount</th><th colspan=2></th><th colspan=2>Cur Balance</th></tr></thead>"; + + foreach ($ledger_dc as $i => $ledger) + { + $rate_item = array( + 'name' => 'rate_item[' . $i . ']', + 'id' => 'rate_item[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($dr_amount[$i]) ? $dr_amount[$i] : "", + 'class' => 'dr-item', + ); + $amount_item = array( + 'name' => 'amount_item[' . $i . ']', + 'id' => 'amount_item[' . $i . ']', + 'maxlength' => '15', + 'size' => '15', + 'value' => isset($cr_amount[$i]) ? $cr_amount[$i] : "", + 'class' => 'cr-item', + ); + echo "<tr>"; + + echo "<td>" . form_dropdown_dc('ledger_dc[' . $i . ']', isset($ledger_dc[$i]) ? $ledger_dc[$i] : "D") . "</td>"; + + echo "<td>" . form_input_ledger('ledger_id[' . $i . ']', isset($ledger_id[$i]) ? $ledger_id[$i] : 0) . "</td>"; + + echo "<td>" . form_input($rate_item) . "</td>"; + echo "<td>" . form_input($amount_item) . "</td>"; + + echo "<td>" . img(array('src' => asset_url() . "images/icons/add.png", 'border' => '0', 'alt' => 'Add Ledger', 'class' => 'addrow')) . "</td>"; + echo "<td>" . img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Remove Ledger', 'class' => 'deleterow')) . "</td>"; + + echo "<td class=\"ledger-balance\"><div></div></td>"; + + echo "</tr>"; + } + + echo "<tr><td colspan=\"7\"></td></tr>"; + echo "<tr id=\"voucher-total\"><td colspan=3><strong>Total</strong></td><td id=\"cr-total\">0</td><td>" . img(array('src' => asset_url() . "images/icons/gear.png", 'border' => '0', 'alt' => 'Recalculate Total', 'class' => 'recalculate', 'title' => 'Recalculate Total')) . "</td><td></td><td></td></tr>"; + + echo "</table>"; + + echo "<p>"; + echo form_label('Narration', 'voucher_narration'); + echo "<br />"; + echo form_textarea($voucher_narration); + echo "</p>"; + + echo "<p>"; + echo form_label('Tag', 'voucher_tag'); + echo " "; + echo form_dropdown('voucher_tag', $voucher_tags, $voucher_tag); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('voucher/show/' . $current_voucher_type['label'], 'Back', array('title' => 'Back to ' . $current_voucher_type['name'] . ' Vouchers')); + echo "</p>"; + + echo form_close(); + commit 2e042a681f030e4ac46d8082be5aacdb764febc0 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sun Feb 6 16:07:44 2011 +0530 Added inventory options to Ledger A/C - Updated Ledger A/C type from CHAR(1) to INT(2) - Added inventory options to Ledger A/C add/edit actions Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 83856c3..60f62b7 100644 --- a/db-update.txt +++ b/db-update.txt @@ -1,5 +1,10 @@ //--------------------------------- VERSION 4 ---------------------------------- +UPDATE ledgers SET type = '1' WHERE type = 'B'; +UPDATE ledgers SET type = '0' WHERE type = 'N'; + +ALTER TABLE ledgers CHANGE type type INT(2) NOT NULL DEFAULT '0'; + CREATE TABLE IF NOT EXISTS stock_units ( id int(11) NOT NULL AUTO_INCREMENT, symbol varchar(15) NOT NULL, diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index c2f3461..6e4d706 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS ledgers ( name varchar(100) NOT NULL, op_balance decimal(15,2) NOT NULL DEFAULT '0.00', op_balance_dc char(1) NOT NULL, - type char(1) NOT NULL, + type int(2) NOT NULL DEFAULT '0', reconciliation int(1) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=1; diff --git a/system/application/controllers/ledger.php b/system/application/controllers/ledger.php index 7403867..bff86cf 100644 --- a/system/application/controllers/ledger.php +++ b/system/application/controllers/ledger.php @@ -57,6 +57,16 @@ class Ledger extends Controller { $data['ledger_type_cashbank'] = FALSE; $data['reconciliation'] = FALSE; + /**** Inventory ***/ + $data['affects_inventory'] = 0; + $data['affects_inventory_options'] = array( + '2' => 'Purchases Ledger A/C', + '3' => 'Sales Ledger A/C', + '4' => 'Debtor (Customer)', + '5' => 'Creditor (Supplier)', + ); + $data['affects_inventory_option_active'] = '2'; + /* Form validations */ $this->form_validation->set_rules('ledger_name', 'Ledger name', 'trim|required|min_length[2]|max_length[100]|unique[ledgers.name]'); $this->form_validation->set_rules('ledger_group_id', 'Parent group', 'trim|required|is_natural_no_zero'); @@ -72,6 +82,10 @@ class Ledger extends Controller { $data['op_balance_dc'] = $this->input->post('op_balance_dc', TRUE); $data['ledger_type_cashbank'] = $this->input->post('ledger_type_cashbank', TRUE); $data['reconciliation'] = $this->input->post('reconciliation', TRUE); + + /**** Inventory ***/ + $data['affects_inventory'] = $this->input->post('affects_inventory', TRUE); + $data['affects_inventory_option_active'] = $this->input->post('affects_inventory_option', TRUE); } if ($this->form_validation->run() == FALSE) @@ -86,9 +100,14 @@ class Ledger extends Controller { $data_group_id = $this->input->post('ledger_group_id', TRUE); $data_op_balance = $this->input->post('op_balance', TRUE); $data_op_balance_dc = $this->input->post('op_balance_dc', TRUE); + $data_ledger_type = 0; $data_ledger_type_cashbank_value = $this->input->post('ledger_type_cashbank', TRUE); $data_reconciliation = $this->input->post('reconciliation', TRUE); + /**** Inventory ***/ + $data_affects_inventory = $this->input->post('affects_inventory', TRUE); + $data_affects_inventory_option_active = $this->input->post('affects_inventory_option', TRUE); + if ($data_group_id < 5) { $this->messages->add('Invalid Parent group.', 'error'); @@ -107,9 +126,9 @@ class Ledger extends Controller { if ($data_ledger_type_cashbank_value == "1") { - $data_ledger_type_cashbank = "B"; + $data_ledger_type = 1; } else { - $data_ledger_type_cashbank = "N"; + $data_ledger_type = 0; } if ($data_reconciliation == "1") @@ -119,13 +138,25 @@ class Ledger extends Controller { $data_reconciliation = 0; } + /**** Inventory ***/ + if ($data_affects_inventory == "1") + { + if (($data_affects_inventory_option_active < 2) or ($data_affects_inventory_option_active > 5)) + { + $this->messages->add('Invalid inventory option selected.', 'error'); + $this->template->load('template', 'ledger/add', $data); + return; + } + $data_ledger_type = $data_affects_inventory_option_active; + } + $this->db->trans_start(); $insert_data = array( 'name' => $data_name, 'group_id' => $data_group_id, 'op_balance' => $data_op_balance, 'op_balance_dc' => $data_op_balance_dc, - 'type' => $data_ledger_type_cashbank, + 'type' => $data_ledger_type, 'reconciliation' => $data_reconciliation, ); if ( ! $this->db->insert('ledgers', $insert_data)) @@ -206,12 +237,34 @@ class Ledger extends Controller { $data['ledger_group_active'] = $ledger_data->group_id; $data['op_balance_dc'] = $ledger_data->op_balance_dc; $data['ledger_id'] = $id; - if ($ledger_data->type == "B") - $data['ledger_type_cashbank'] = TRUE; - else - $data['ledger_type_cashbank'] = FALSE; $data['reconciliation'] = $ledger_data->reconciliation; + /**** Inventory ***/ + $data['affects_inventory_options'] = array( + '2' => 'Purchases Ledger A/C', + '3' => 'Sales Ledger A/C', + '4' => 'Debtor (Customer)', + '5' => 'Creditor (Supplier)', + ); + if ($ledger_data->type <= 0) + { + $data['ledger_type_cashbank'] = 0; + $data['affects_inventory'] = 0; + $data['affects_inventory_option_active'] = 2; + } else if ($ledger_data->type == 1) { + $data['ledger_type_cashbank'] = 1; + $data['affects_inventory'] = 0; + $data['affects_inventory_option_active'] = 2; + } else if (($ledger_data->type > 1) and ($ledger_data->type < 6)) { + $data['ledger_type_cashbank'] = 0; + $data['affects_inventory'] = 1; + $data['affects_inventory_option_active'] = $ledger_data->type; + } else { + $data['ledger_type_cashbank'] = 0; + $data['affects_inventory'] = 0; + $data['affects_inventory_option_active'] = 2; + } + /* Form validations */ $this->form_validation->set_rules('ledger_name', 'Ledger name', 'trim|required|min_length[2]|max_length[100]|uniquewithid[ledgers.name.' . $id . ']'); $this->form_validation->set_rules('ledger_group_id', 'Parent group', 'trim|required|is_natural_no_zero'); @@ -227,6 +280,10 @@ class Ledger extends Controller { $data['op_balance_dc'] = $this->input->post('op_balance_dc', TRUE); $data['ledger_type_cashbank'] = $this->input->post('ledger_type_cashbank', TRUE); $data['reconciliation'] = $this->input->post('reconciliation', TRUE); + + /**** Inventory ***/ + $data['affects_inventory'] = $this->input->post('affects_inventory', TRUE); + $data['affects_inventory_option_active'] = $this->input->post('affects_inventory_option', TRUE); } if ($this->form_validation->run() == FALSE) @@ -241,9 +298,14 @@ class Ledger extends Controller { $data_group_id = $this->input->post('ledger_group_id', TRUE); $data_op_balance = $this->input->post('op_balance', TRUE); $data_op_balance_dc = $this->input->post('op_balance_dc', TRUE); - $data_id = $id; + $data_ledger_type = 0; $data_ledger_type_cashbank_value = $this->input->post('ledger_type_cashbank', TRUE); $data_reconciliation = $this->input->post('reconciliation', TRUE); + $data_id = $id; + + /**** Inventory ***/ + $data_affects_inventory = $this->input->post('affects_inventory', TRUE); + $data_affects_inventory_option_active = $this->input->post('affects_inventory_option', TRUE); if ($data_group_id < 5) { @@ -284,9 +346,9 @@ class Ledger extends Controller { if ($data_ledger_type_cashbank_value == "1") { - $data_ledger_type_cashbank = "B"; + $data_ledger_type = 1; } else { - $data_ledger_type_cashbank = "N"; + $data_ledger_type = 0; } if ($data_reconciliation == "1") @@ -296,13 +358,25 @@ class Ledger extends Controller { $data_reconciliation = 0; } + /**** Inventory ***/ + if ($data_affects_inventory == "1") + { + if (($data_affects_inventory_option_active < 2) or ($data_affects_inventory_option_active > 5)) + { + $this->messages->add('Invalid inventory option selected.', 'error'); + $this->template->load('template', 'ledger/edit', $data); + return; + } + $data_ledger_type = $data_affects_inventory_option_active; + } + $this->db->trans_start(); $update_data = array( 'name' => $data_name, 'group_id' => $data_group_id, 'op_balance' => $data_op_balance, 'op_balance_dc' => $data_op_balance_dc, - 'type' => $data_ledger_type_cashbank, + 'type' => $data_ledger_type, 'reconciliation' => $data_reconciliation, ); if ( ! $this->db->where('id', $data_id)->update('ledgers', $update_data)) diff --git a/system/application/controllers/voucher.php b/system/application/controllers/voucher.php index cd71753..7db9777 100644 --- a/system/application/controllers/voucher.php +++ b/system/application/controllers/voucher.php @@ -358,23 +358,23 @@ class Voucher extends Controller { $valid_ledger = $valid_ledger_q->row(); if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') { - if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 'B') + if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) { $bank_cash_present = TRUE; } - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) $non_bank_cash_present = TRUE; } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') { - if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 'B') + if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) { $bank_cash_present = TRUE; } - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) $non_bank_cash_present = TRUE; } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') { - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) { $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); $this->template->load('template', 'voucher/add', $data); @@ -382,7 +382,7 @@ class Voucher extends Controller { } } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') { - if ($valid_ledger->type == 'B') + if ($valid_ledger->type == 1) { $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); $this->template->load('template', 'voucher/add', $data); @@ -727,23 +727,23 @@ class Voucher extends Controller { $valid_ledger = $valid_ledger_q->row(); if ($current_voucher_type['bank_cash_ledger_restriction'] == '2') { - if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 'B') + if ($data_all_ledger_dc[$id] == 'D' && $valid_ledger->type == 1) { $bank_cash_present = TRUE; } - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) $non_bank_cash_present = TRUE; } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '3') { - if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 'B') + if ($data_all_ledger_dc[$id] == 'C' && $valid_ledger->type == 1) { $bank_cash_present = TRUE; } - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) $non_bank_cash_present = TRUE; } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '4') { - if ($valid_ledger->type != 'B') + if ($valid_ledger->type != 1) { $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers can have only Bank and Cash Ledgers A/C\'s.', 'error'); $this->template->load('template', 'voucher/edit', $data); @@ -751,7 +751,7 @@ class Voucher extends Controller { } } else if ($current_voucher_type['bank_cash_ledger_restriction'] == '5') { - if ($valid_ledger->type == 'B') + if ($valid_ledger->type == 1) { $this->messages->add('Invalid Ledger A/C. ' . $current_voucher_type['name'] . ' Vouchers cannot have Bank and Cash Ledgers A/C\'s.', 'error'); $this->template->load('template', 'voucher/edit', $data); diff --git a/system/application/controllers/welcome.php b/system/application/controllers/welcome.php index df0c301..8e3be2f 100644 --- a/system/application/controllers/welcome.php +++ b/system/application/controllers/welcome.php @@ -17,7 +17,7 @@ class Welcome extends Controller { $this->template->set('add_javascript', array("js/raphael.js", "js/jquery.enumerable.js", "js/jquery.tufte-graph.js")); /* Bank and Cash Ledger accounts */ - $this->db->from('ledgers')->where('type', 'B'); + $this->db->from('ledgers')->where('type', 1); $bank_q = $this->db->get(); if ($bank_q->num_rows() > 0) { diff --git a/system/application/models/ledger_model.php b/system/application/models/ledger_model.php index fe7fd04..71f36f5 100644 --- a/system/application/models/ledger_model.php +++ b/system/application/models/ledger_model.php @@ -24,7 +24,7 @@ class Ledger_model extends Model { { $options = array(); $options[0] = "(Please Select)"; - $this->db->from('ledgers')->where('type', 'B')->order_by('name', 'asc'); + $this->db->from('ledgers')->where('type', 1)->order_by('name', 'asc'); $ledger_q = $this->db->get(); foreach ($ledger_q->result() as $row) { @@ -37,7 +37,7 @@ class Ledger_model extends Model { { $options = array(); $options[0] = "(Please Select)"; - $this->db->from('ledgers')->where('type !=', 'B')->order_by('name', 'asc'); + $this->db->from('ledgers')->where('type !=', 1)->order_by('name', 'asc'); $ledger_q = $this->db->get(); foreach ($ledger_q->result() as $row) { diff --git a/system/application/views/ledger/add.php b/system/application/views/ledger/add.php index b5c2ba6..d597041 100644 --- a/system/application/views/ledger/add.php +++ b/system/application/views/ledger/add.php @@ -32,6 +32,11 @@ echo "</p>"; echo "<p>"; + echo form_checkbox('affects_inventory', 1, $affects_inventory) . " Affects Inventory "; + echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active); + echo "</p>"; + + echo "<p>"; echo "<span id=\"tooltip-target-3\">"; echo form_checkbox('reconciliation', 1, $reconciliation) . " Reconciliation"; echo "</span>"; diff --git a/system/application/views/ledger/edit.php b/system/application/views/ledger/edit.php index a9057c1..2801dcd 100644 --- a/system/application/views/ledger/edit.php +++ b/system/application/views/ledger/edit.php @@ -32,6 +32,11 @@ echo "</p>"; echo "<p>"; + echo form_checkbox('affects_inventory', 1, $affects_inventory) . " Affects Inventory "; + echo form_dropdown('affects_inventory_option', $affects_inventory_options, $affects_inventory_option_active); + echo "</p>"; + + echo "<p>"; echo "<span id=\"tooltip-target-3\">"; echo form_checkbox('reconciliation', 1, $reconciliation) . " Reconciliation"; echo "</span>"; commit b71155dc177b8c74982469562a51846e0f415c15 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 5 16:13:32 2011 +0530 Added the stock tree view Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/account.php b/system/application/controllers/inventory/account.php index 3201ef0..9043d30 100644 --- a/system/application/controllers/inventory/account.php +++ b/system/application/controllers/inventory/account.php @@ -10,6 +10,11 @@ class Account extends Controller { $this->db->from('stock_units')->order_by('name', 'desc'); $data['stock_units'] = $this->db->get(); + /* Stocks Tree */ + $this->load->library('stockstree'); + $stocks_tree_o = new Stockstree(); + $data['stocks_tree'] = $stocks_tree_o->init(0); + $this->template->load('template', 'inventory/account/index', $data); return; } diff --git a/system/application/helpers/custom_helper.php b/system/application/helpers/custom_helper.php index 21f23a4..de31de7 100644 --- a/system/application/helpers/custom_helper.php +++ b/system/application/helpers/custom_helper.php @@ -36,7 +36,7 @@ if ( ! function_exists('convert_amount_dc')) { function convert_amount_dc($amount) { - if ($amount == "D") + if ($amount == "0") return "0"; else if ($amount < 0) return "Cr " . convert_cur(-$amount); diff --git a/system/application/libraries/Stockstree.php b/system/application/libraries/Stockstree.php new file mode 100644 index 0000000..f907989 --- /dev/null +++ b/system/application/libraries/Stockstree.php @@ -0,0 +1,139 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); + +class Stockstree +{ + public static $counter = 0; + + function Stockstree() + { + return; + } + + function init($start_id = 0) + { + $CI =& get_instance(); + $stock_tree = $this->add_sub_groups($start_id); + return $stock_tree; + } + + function add_sub_groups($id) + { + $CI =& get_instance(); + /* Adding current group */ + if ($id == 0) + { + $stock_group[$id] = array( + 'id' => $id, + 'name' => '', + 'type' => 'R', + 'sub_stock_groups' => array(), + 'sub_stock_items' => array(), + ); + } else { + $CI->db->from('stock_groups')->where('id', $id)->limit(1); + $current_stock_group_q = $CI->db->get(); + if ($current_stock_group = $current_stock_group_q->row()) + { + $stock_group[$id] = array( + 'id' => $id, + 'name' => $current_stock_group->name, + 'type' => 'G', + 'sub_stock_groups' => array(), + 'sub_stock_items' => array(), + ); + } + } + + /* Adding sub groups */ + $CI->db->from('stock_groups')->where('parent_id', $id)->order_by('name', 'asc'); + $stock_group_q = $CI->db->get(); + foreach ($stock_group_q->result() as $row) + { + $stock_group[$id]['sub_stock_groups'][$row->id] = $this->add_sub_groups($row->id); + } + + /* Adding sub item */ + $stock_group[$id]['sub_stock_items'] = $this->add_sub_item($id); + + return $stock_group; + } + + function add_sub_item($id) + { + $CI =& get_instance(); + $stock_items = array(); + $CI->db->from('stock_items')->where('stock_group_id', $id)->order_by('name', 'asc'); + $stock_item_q = $CI->db->get(); + foreach ($stock_item_q->result() as $row) + { + $stock_items[$row->id] = array( + 'id' => $row->id, + 'name' => $row->name, + 'type' => 'I', + 'costing_method' => $row->costing_method, + 'op_balance_quantity' => $row->op_balance_quantity, + 'op_balance_rate_per_unit' => $row->op_balance_rate_per_unit, + 'op_balance_total_value' => $row->op_balance_total_value, + ); + } + return $stock_items; + } + + /* + * Prints the entire stock tree as required in stock account list + */ + function print_tree($stock_tree) + { + self::$counter++; + foreach ($stock_tree as $row) + { + if ($row['id'] != 0) + { + echo "<tr class=\"tr-group\">"; + echo "<td>" . self::print_spaces(self::$counter) . $row['name'] . "</td>"; + echo "<td>Stock Group</td>"; + echo "<td>-</td>"; + echo "<td>-</td>"; + echo "<td class=\"td-actions\">" . anchor('inventory/stockgroup/edit/' . $row['id'] , "Edit", array('title' => 'Edit Stock Group', 'class' => 'red-link')); + echo " " . anchor('inventory/stockgroup/delete/' . $row['id'], img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete Stock Group')), array('class' => "confirmClick", 'title' => "Delete Stock Group")) . "</td>"; + echo "</tr>"; + } + if ($row['sub_stock_items']) + { + self::$counter++; + foreach ($row['sub_stock_items'] as $row_item) + { + echo "<tr>"; + echo "<td>" . self::print_spaces(self::$counter) . $row_item['name'] . "</td>"; + echo "<td>Stock Item</td>"; + echo "<td>" . convert_amount_dc($row_item['op_balance_total_value']) . "</td>"; + echo "<td></td>"; + echo "<td class=\"td-actions\">" . anchor('inventory/stockitem/edit/' . $row_item['id'] , "Edit", array('title' => 'Edit Stock Item', 'class' => 'red-link')); + echo " " . anchor('inventory/stockitem/delete/' . $row_item['id'], img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete Stock Item')), array('class' => "confirmClick", 'title' => "Delete Stock Item")) . "</td>"; + echo "</tr>"; + } + self::$counter--; + } + if ($row['sub_stock_groups']) + { + foreach ($row['sub_stock_groups'] as $row_item) + { + self::print_tree($row_item); + } + } + } + self::$counter--; + } + + /* + * Prints empty spaces + */ + function print_spaces($counter) + { + $return_html = ''; + for ($c = 2; $c < $counter; $c++) + $return_html .= " "; + return $return_html; + } +} + diff --git a/system/application/views/inventory/account/index.php b/system/application/views/inventory/account/index.php index 107a44c..a961821 100644 --- a/system/application/views/inventory/account/index.php +++ b/system/application/views/inventory/account/index.php @@ -1,14 +1,5 @@ <?php - echo "<table>"; - echo "<tr valign=\"top\">"; - echo "<td>"; - echo "<table border=0 cellpadding=5 class=\"simple-table account-table\">"; - echo "<thead><tr><th>Account Name</th><th>Type</th><th>O/P Balance</th><th>C/L Balance</th><th></th></tr></thead>"; - echo "</table>"; - echo "</td>"; - echo "</tr>"; - echo "</table>"; - + /**************************** Stock Units *****************************/ echo "<table border=0 cellpadding=5 class=\"simple-table float-right\">"; echo "<thead><tr><th>Stock Unit</th><th>Symbol</th><th></th></tr></thead>"; foreach ($stock_units->result() as $row) @@ -24,3 +15,14 @@ } echo "</table>"; + /******************************* Stock Tree ***************************/ + echo "<table>"; + echo "<tr valign=\"top\">"; + echo "<td>"; + echo "<table border=0 cellpadding=5 class=\"simple-table account-table\">"; + echo "<thead><tr><th>Name</th><th>Type</th><th>O/P Balance</th><th>C/L Balance</th><th></th></tr></thead>"; + Stockstree::print_tree($stocks_tree); + echo "</table>"; + echo "</td>"; + echo "</tr>"; + echo "</table>"; commit ca54b66065450516410d69ab959589046c7c2235 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Sat Feb 5 13:45:48 2011 +0530 Added Stock Item actions - Updated database schema for stock items - Added add/edit/delete actions - Added validation for quantity Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index c358019..83856c3 100644 --- a/db-update.txt +++ b/db-update.txt @@ -8,6 +8,25 @@ CREATE TABLE IF NOT EXISTS stock_units ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS stock_groups ( + id int(11) NOT NULL AUTO_INCREMENT, + parent_id varchar(11) NOT NULL, + name varchar(100) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS stock_items ( + id int(11) NOT NULL AUTO_INCREMENT, + stock_group_id int(11) NOT NULL, + stock_unit_id int(11) NOT NULL, + name varchar(100) NOT NULL, + costing_method int(2) NOT NULL, + op_balance_quantity float NOT NULL, + op_balance_rate_per_unit decimal(15,2) NOT NULL, + op_balance_total_value decimal(15,2) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + //--------------------------------- VERSION 3 ---------------------------------- CREATE TABLE IF NOT EXISTS voucher_types ( diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index 5abac50..c2f3461 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -116,3 +116,16 @@ CREATE TABLE IF NOT EXISTS stock_groups ( name varchar(100) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + +CREATE TABLE IF NOT EXISTS stock_items ( + id int(11) NOT NULL AUTO_INCREMENT, + stock_group_id int(11) NOT NULL, + stock_unit_id int(11) NOT NULL, + name varchar(100) NOT NULL, + costing_method int(2) NOT NULL, + op_balance_quantity float NOT NULL, + op_balance_rate_per_unit decimal(15,2) NOT NULL, + op_balance_total_value decimal(15,2) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + diff --git a/system/application/controllers/inventory/stockitem.php b/system/application/controllers/inventory/stockitem.php new file mode 100644 index 0000000..e8fcdd0 --- /dev/null +++ b/system/application/controllers/inventory/stockitem.php @@ -0,0 +1,392 @@ +<?php + +class StockItem extends Controller { + + function StockItem() + { + parent::Controller(); + $this->load->model('Stock_Unit_model'); + $this->load->model('Stock_Group_model'); + $this->load->model('Stock_Item_model'); + return; + } + + function index() + { + redirect('inventory/stockitem/add'); + return; + } + + function add() + { + $this->template->set('page_title', 'New Stock Item'); + + /* Check access */ + if ( ! check_access('create stock item')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('account'); + return; + } + + /* Form fields */ + $data['stock_item_name'] = array( + 'name' => 'stock_item_name', + 'id' => 'stock_item_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_item_op_quantity'] = array( + 'name' => 'stock_item_op_quantity', + 'id' => 'stock_item_op_quantity', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_item_op_rate_per_unit'] = array( + 'name' => 'stock_item_op_rate_per_unit', + 'id' => 'stock_item_op_rate_per_unit', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_item_op_total'] = array( + 'name' => 'stock_item_op_total', + 'id' => 'stock_item_op_total', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_item_costing_methods'] = array( + '1' => 'Last In First Out (LIFO)', + '2' => 'First In First Out (FIFO)', + ); + $data['stock_item_costing_method_active'] = 1; + $data['stock_item_units'] = $this->Stock_Unit_model->get_all_units(); + $data['stock_item_unit_active'] = 0; + $data['stock_item_groups'] = $this->Stock_Group_model->get_stock_item_groups(); + $data['stock_item_group_active'] = 0; + + /* Form validations */ + $this->form_validation->set_rules('stock_item_name', 'Stock item name', 'trim|required|min_length[2]|max_length[100]|unique[stock_items.name]'); + $this->form_validation->set_rules('stock_item_group', 'Stock group', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_unit', 'Stock unit', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_costing_method', 'Costing method', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_op_quantity', 'Opening Balance Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_op_rate_per_unit', 'Opening Balance Rate per unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_op_total', 'Opening Balance Total value', 'trim|currency'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_item_name']['value'] = $this->input->post('stock_item_name', TRUE); + $data['stock_item_group_active'] = $this->input->post('stock_item_group', TRUE); + $data['stock_item_unit_active'] = $this->input->post('stock_item_unit', TRUE); + $data['stock_item_costing_method_active'] = $this->input->post('stock_item_costing_method', TRUE); + $data['stock_item_op_quantity']['value'] = $this->input->post('stock_item_op_quantity', TRUE); + $data['stock_item_op_rate_per_unit']['value'] = $this->input->post('stock_item_op_rate_per_unit', TRUE); + $data['stock_item_op_total']['value'] = $this->input->post('stock_item_op_total', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } + else + { + $data_stock_item_name = $this->input->post('stock_item_name', TRUE); + $data_stock_item_group_id = $this->input->post('stock_item_group', TRUE); + $data_stock_item_unit_id = $this->input->post('stock_item_unit', TRUE); + $data_stock_item_costing_method = $this->input->post('stock_item_costing_method', TRUE); + $data_stock_item_op_quantity = $this->input->post('stock_item_op_quantity', TRUE); + $data_stock_item_op_rate_per_unit = $this->input->post('stock_item_op_rate_per_unit', TRUE); + $data_stock_item_op_total = $this->input->post('stock_item_op_total', TRUE); + + /* Check if stock group present */ + $this->db->select('id')->from('stock_groups')->where('id', $data_stock_item_group_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid stock group.', 'error'); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } + + /* Check if stock unit present */ + $this->db->select('id')->from('stock_units')->where('id', $data_stock_item_unit_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid stock unit.', 'error'); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } + + if (($data_stock_item_costing_method < 1) or ($data_stock_item_costing_method > 2)) + $data_stock_item_costing_method = 1; + + $this->db->trans_start(); + $insert_data = array( + 'name' => $data_stock_item_name, + 'stock_group_id' => $data_stock_item_group_id, + 'stock_unit_id' => $data_stock_item_unit_id, + 'costing_method' => $data_stock_item_costing_method, + 'op_balance_quantity' => $data_stock_item_op_quantity, + 'op_balance_rate_per_unit' => $data_stock_item_op_rate_per_unit, + 'op_balance_total_value' => $data_stock_item_op_total, + ); + if ( ! $this->db->insert('stock_items', $insert_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error addding Stock Item - ' . $data_stock_item_name . '.', 'error'); + $this->logger->write_message("error", "Error adding Stock Item named " . $data_stock_item_name); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Added Stock Item - ' . $data_stock_item_name . '.', 'success'); + $this->logger->write_message("success", "Added Stock Item named " . $data_stock_item_name); + redirect('inventory/account'); + return; + } + } + return; + } + + function edit($id) + { + $this->template->set('page_title', 'Edit Stock Item'); + + /* Check access */ + if ( ! check_access('edit stock item')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Item.', 'error'); + redirect('inventory/account'); + return; + } + + /* Loading current stock item */ + $this->db->from('stock_items')->where('id', $id); + $stock_item_data_q = $this->db->get(); + if ($stock_item_data_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Item.', 'error'); + redirect('inventory/account'); + return; + } + $stock_item_data = $stock_item_data_q->row(); + + /* Form fields */ + $data['stock_item_name'] = array( + 'name' => 'stock_item_name', + 'id' => 'stock_item_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_item_data->name, + ); + $data['stock_item_op_quantity'] = array( + 'name' => 'stock_item_op_quantity', + 'id' => 'stock_item_op_quantity', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_item_data->op_balance_quantity, + ); + $data['stock_item_op_rate_per_unit'] = array( + 'name' => 'stock_item_op_rate_per_unit', + 'id' => 'stock_item_op_rate_per_unit', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_item_data->op_balance_rate_per_unit, + ); + $data['stock_item_op_total'] = array( + 'name' => 'stock_item_op_total', + 'id' => 'stock_item_op_total', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_item_data->op_balance_total_value, + ); + $data['stock_item_costing_methods'] = array( + '1' => 'Last In First Out (LIFO)', + '2' => 'First In First Out (FIFO)', + ); + $data['stock_item_costing_method_active'] = $stock_item_data->costing_method; + $data['stock_item_units'] = $this->Stock_Unit_model->get_all_units(); + $data['stock_item_unit_active'] = $stock_item_data->stock_unit_id; + $data['stock_item_groups'] = $this->Stock_Group_model->get_stock_item_groups(); + $data['stock_item_group_active'] = $stock_item_data->stock_group_id; + $data['stock_item_id'] = $id; + + /* Form validations */ + $this->form_validation->set_rules('stock_item_name', 'Stock item name', 'trim|required|min_length[2]|max_length[100]|uniquewithid[stock_items.name.' . $id . ']'); + $this->form_validation->set_rules('stock_item_group', 'Stock group', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_unit', 'Stock unit', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_costing_method', 'Costing method', 'trim|required|is_natural'); + $this->form_validation->set_rules('stock_item_op_quantity', 'Opening Balance Quantity', 'trim|quantity'); + $this->form_validation->set_rules('stock_item_op_rate_per_unit', 'Opening Balance Rate per unit', 'trim|currency'); + $this->form_validation->set_rules('stock_item_op_total', 'Opening Balance Total value', 'trim|currency'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_item_name']['value'] = $this->input->post('stock_item_name', TRUE); + $data['stock_item_group_active'] = $this->input->post('stock_item_group', TRUE); + $data['stock_item_unit_active'] = $this->input->post('stock_item_unit', TRUE); + $data['stock_item_costing_method_active'] = $this->input->post('stock_item_costing_method', TRUE); + $data['stock_item_op_quantity']['value'] = $this->input->post('stock_item_op_quantity', TRUE); + $data['stock_item_op_rate_per_unit']['value'] = $this->input->post('stock_item_op_rate_per_unit', TRUE); + $data['stock_item_op_total']['value'] = $this->input->post('stock_item_op_total', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockitem/edit', $data); + return; + } + else + { + $data_stock_item_name = $this->input->post('stock_item_name', TRUE); + $data_stock_item_group_id = $this->input->post('stock_item_group', TRUE); + $data_stock_item_unit_id = $this->input->post('stock_item_unit', TRUE); + $data_stock_item_costing_method = $this->input->post('stock_item_costing_method', TRUE); + $data_stock_item_op_quantity = $this->input->post('stock_item_op_quantity', TRUE); + $data_stock_item_op_rate_per_unit = $this->input->post('stock_item_op_rate_per_unit', TRUE); + $data_stock_item_op_total = $this->input->post('stock_item_op_total', TRUE); + $data_id = $id; + + /* Check if stock group present */ + $this->db->select('id')->from('stock_groups')->where('id', $data_stock_item_group_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid stock group.', 'error'); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } + + /* Check if stock unit present */ + $this->db->select('id')->from('stock_units')->where('id', $data_stock_item_unit_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid stock unit.', 'error'); + $this->template->load('template', 'inventory/stockitem/add', $data); + return; + } + + if (($data_stock_item_costing_method < 1) or ($data_stock_item_costing_method > 2)) + $data_stock_item_costing_method = 1; + + $this->db->trans_start(); + $update_data = array( + 'name' => $data_stock_item_name, + 'stock_group_id' => $data_stock_item_group_id, + 'stock_unit_id' => $data_stock_item_unit_id, + 'costing_method' => $data_stock_item_costing_method, + 'op_balance_quantity' => $data_stock_item_op_quantity, + 'op_balance_rate_per_unit' => $data_stock_item_op_rate_per_unit, + 'op_balance_total_value' => $data_stock_item_op_total, + ); + if ( ! $this->db->where('id', $data_id)->update('stock_items', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Stock Item - ' . $data_stock_item_name . '.', 'error'); + $this->logger->write_message("error", "Error updating Stock Item named " . $data_stock_item_name . " [id:" . $data_id . "]"); + $this->template->load('template', 'inventory/stockgroup/edit', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Updated Stock Item - ' . $data_stock_item_name . '.', 'success'); + $this->logger->write_message("success", "Updated Stock Item named " . $data_stock_item_name . " [id:" . $data_id . "]"); + redirect('inventory/account'); + return; + } + } + return; + } + + function delete($id) + { + /* Check access */ + if ( ! check_access('delete stock item')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Item.', 'error'); + redirect('inventory/account'); + return; + } + + /* Get the stock item details */ + $this->db->from('stock_items')->where('id', $id); + $stock_item_q = $this->db->get(); + if ($stock_item_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Item.', 'error'); + redirect('inventory/account'); + return; + } else { + $stock_item_data = $stock_item_q->row(); + } + + /* Deleting item */ + $this->db->trans_start(); + if ( ! $this->db->delete('stock_items', array('id' => $id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Stock Item - ' . $stock_item_data->name . '.', 'error'); + $this->logger->write_message("error", "Error deleting Stock Item named " . $stock_item_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Deleted Stock Item - ' . $stock_item_data->name . '.', 'success'); + $this->logger->write_message("success", "Deleted Stock Item named " . $stock_item_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } + return; + } +} + +/* End of file stockitem.php */ +/* Location: ./system/application/controllers/inventory/stockitem.php */ diff --git a/system/application/controllers/inventory/stockunit.php b/system/application/controllers/inventory/stockunit.php index 29922db..0e1a503 100644 --- a/system/application/controllers/inventory/stockunit.php +++ b/system/application/controllers/inventory/stockunit.php @@ -247,6 +247,15 @@ class StockUnit extends Controller { return; } + /* Checking if linked to any stock item */ + $this->db->from('stock_items')->where('stock_unit_id', $id); + if ($this->db->get()->num_rows() > 0) + { + $this->messages->add('Cannot delete Stock Unit. Stock Unit is still in use.', 'error'); + redirect('inventory/account'); + return; + } + /* Get the stock unit details */ $this->db->from('stock_units')->where('id', $id); $stock_unit_q = $this->db->get(); diff --git a/system/application/libraries/MY_Form_validation.php b/system/application/libraries/MY_Form_validation.php index 06624e3..a795821 100644 --- a/system/application/libraries/MY_Form_validation.php +++ b/system/application/libraries/MY_Form_validation.php @@ -100,6 +100,24 @@ class MY_Form_validation extends CI_Form_validation { } } + function quantity($str) + { + $CI =& get_instance(); + if (preg_match('/^[\-]/', $str)) + { + $CI->form_validation->set_message('quantity', '%s cannot be negative.'); + return FALSE; + } + + if (preg_match('/^[0-9]*\.?[0-9]{0,4}$/', $str)) + { + return TRUE; + } else { + $CI->form_validation->set_message('quantity', '%s must be a valid quantity. Maximum 4 decimal places are allowed.'); + return FALSE; + } + } + function is_date($str) { $CI =& get_instance(); diff --git a/system/application/models/stock_group_model.php b/system/application/models/stock_group_model.php index 0388121..47b6bff 100644 --- a/system/application/models/stock_group_model.php +++ b/system/application/models/stock_group_model.php @@ -22,4 +22,16 @@ class Stock_Group_model extends Model { } return $options; } + + function get_stock_item_groups() + { + $options = array(); + $this->db->from('stock_groups')->where('id >', 0)->order_by('name', 'asc'); + $stock_item_parent_q = $this->db->get(); + foreach ($stock_item_parent_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } } diff --git a/system/application/models/stock_item_model.php b/system/application/models/stock_item_model.php new file mode 100644 index 0000000..da33e9f --- /dev/null +++ b/system/application/models/stock_item_model.php @@ -0,0 +1,32 @@ +<?php + +class Stock_Item_model extends Model { + + function Stock_Item_model() + { + parent::Model(); + } + + function get_all_item() + { + $options = array(); + $options[0] = "(Please Select)"; + $this->db->from('stock_items')->order_by('name', 'asc'); + $ledger_q = $this->db->get(); + foreach ($ledger_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } + + function get_name($stock_item_id) + { + $this->db->from('stock_items')->where('id', $stock_item_id)->limit(1); + $stock_item_q = $this->db->get(); + if ($stock_item = $stock_item_q->row()) + return $stock_item->name; + else + return "(Error)"; + } +} diff --git a/system/application/models/stock_unit_model.php b/system/application/models/stock_unit_model.php new file mode 100644 index 0000000..2521b95 --- /dev/null +++ b/system/application/models/stock_unit_model.php @@ -0,0 +1,21 @@ +<?php + +class Stock_Unit_model extends Model { + + function Stock_Unit_model() + { + parent::Model(); + } + + function get_all_units() + { + $options = array(); + $this->db->from('stock_units')->where('id >', 0)->order_by('symbol', 'asc'); + $stock_unit_q = $this->db->get(); + foreach ($stock_unit_q->result() as $row) + { + $options[$row->id] = $row->symbol; + } + return $options; + } +} diff --git a/system/application/views/inventory/stockgroup/add.php b/system/application/views/inventory/stockgroup/add.php index 623f4b4..9d40a9e 100644 --- a/system/application/views/inventory/stockgroup/add.php +++ b/system/application/views/inventory/stockgroup/add.php @@ -16,7 +16,7 @@ echo "<p>"; echo form_submit('submit', 'Create'); echo " "; - echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); echo "</p>"; echo form_close(); diff --git a/system/application/views/inventory/stockgroup/edit.php b/system/application/views/inventory/stockgroup/edit.php index b41b7f0..636df09 100644 --- a/system/application/views/inventory/stockgroup/edit.php +++ b/system/application/views/inventory/stockgroup/edit.php @@ -16,7 +16,7 @@ echo "<p>"; echo form_submit('submit', 'Update'); echo " "; - echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); echo "</p>"; echo form_close(); diff --git a/system/application/views/inventory/stockitem/add.php b/system/application/views/inventory/stockitem/add.php new file mode 100644 index 0000000..e9e8652 --- /dev/null +++ b/system/application/views/inventory/stockitem/add.php @@ -0,0 +1,58 @@ +<?php + echo form_open('inventory/stockitem/add'); + + echo "<p>"; + echo form_label('Stock item name', 'stock_item_name'); + echo "<br />"; + echo form_input($stock_item_name); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock group', 'stock_item_group'); + echo "<br />"; + echo form_dropdown('stock_item_group', $stock_item_groups, $stock_item_group_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock unit', 'stock_item_unit'); + echo "<br />"; + echo form_dropdown('stock_item_unit', $stock_item_units, $stock_item_unit_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Costing method', 'stock_item_costing_method'); + echo "<br />"; + echo form_dropdown('stock_item_costing_method', $stock_item_costing_methods, $stock_item_costing_method_active); + echo "</p>"; + + echo "<p>"; + echo form_fieldset('Opening Balance', array('class' => "fieldset-auto-width")); + + echo "<p>"; + echo form_label('Quantity', 'stock_item_op_quantity'); + echo "<br />"; + echo form_input($stock_item_op_quantity); + echo "</p>"; + + echo "<p>"; + echo form_label('Rate per unit', 'stock_item_op_rate_per_unit'); + echo "<br />"; + echo form_input($stock_item_op_rate_per_unit); + echo "</p>"; + + echo "<p>"; + echo form_label('Total value', 'stock_item_op_total'); + echo "<br />"; + echo form_input($stock_item_op_total); + echo "</p>"; + + echo form_fieldset_close(); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); + echo "</p>"; + + echo form_close(); diff --git a/system/application/views/inventory/stockitem/edit.php b/system/application/views/inventory/stockitem/edit.php new file mode 100644 index 0000000..f5fd1be --- /dev/null +++ b/system/application/views/inventory/stockitem/edit.php @@ -0,0 +1,58 @@ +<?php + echo form_open('inventory/stockitem/edit/' . $stock_item_id); + + echo "<p>"; + echo form_label('Stock item name', 'stock_item_name'); + echo "<br />"; + echo form_input($stock_item_name); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock group', 'stock_item_group'); + echo "<br />"; + echo form_dropdown('stock_item_group', $stock_item_groups, $stock_item_group_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock unit', 'stock_item_unit'); + echo "<br />"; + echo form_dropdown('stock_item_unit', $stock_item_units, $stock_item_unit_active); + echo "</p>"; + + echo "<p>"; + echo form_label('Costing method', 'stock_item_costing_method'); + echo "<br />"; + echo form_dropdown('stock_item_costing_method', $stock_item_costing_methods, $stock_item_costing_method_active); + echo "</p>"; + + echo "<p>"; + echo form_fieldset('Opening Balance', array('class' => "fieldset-auto-width")); + + echo "<p>"; + echo form_label('Quantity', 'stock_item_op_quantity'); + echo "<br />"; + echo form_input($stock_item_op_quantity); + echo "</p>"; + + echo "<p>"; + echo form_label('Rate per unit', 'stock_item_op_rate_per_unit'); + echo "<br />"; + echo form_input($stock_item_op_rate_per_unit); + echo "</p>"; + + echo "<p>"; + echo form_label('Total value', 'stock_item_op_total'); + echo "<br />"; + echo form_input($stock_item_op_total); + echo "</p>"; + + echo form_fieldset_close(); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Update'); + echo " "; + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); + echo "</p>"; + + echo form_close(); diff --git a/system/application/views/inventory/stockunit/add.php b/system/application/views/inventory/stockunit/add.php index 4ecd28c..9a4ac65 100644 --- a/system/application/views/inventory/stockunit/add.php +++ b/system/application/views/inventory/stockunit/add.php @@ -25,7 +25,7 @@ echo "<p>"; echo form_submit('submit', 'Create'); echo " "; - echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); echo "</p>"; echo form_close(); diff --git a/system/application/views/inventory/stockunit/edit.php b/system/application/views/inventory/stockunit/edit.php index 12930e5..131b851 100644 --- a/system/application/views/inventory/stockunit/edit.php +++ b/system/application/views/inventory/stockunit/edit.php @@ -25,7 +25,7 @@ echo "<p>"; echo form_submit('submit', 'Udpate'); echo " "; - echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo anchor('inventory/account', 'Back', array('title' => 'Back to Inventory')); echo "</p>"; echo form_close(); commit 66e1a211bafd064d71efb7de06087c45b8254e66 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 4 21:52:58 2011 +0530 Added Stock Group to database schema Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index b54c129..5abac50 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -110,3 +110,9 @@ CREATE TABLE IF NOT EXISTS stock_units ( PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; +CREATE TABLE IF NOT EXISTS stock_groups ( + id int(11) NOT NULL AUTO_INCREMENT, + parent_id varchar(11) NOT NULL, + name varchar(100) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; commit 984d827e3ca23c732d319d2d4587a3702efcabc0 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 4 21:30:54 2011 +0530 Added Stock Group actions - Added permissions - Added add/edit/delete stock group actions Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/inventory/stockgroup.php b/system/application/controllers/inventory/stockgroup.php new file mode 100644 index 0000000..0ec19c9 --- /dev/null +++ b/system/application/controllers/inventory/stockgroup.php @@ -0,0 +1,302 @@ +<?php + +class StockGroup extends Controller { + + function StockGroup() + { + parent::Controller(); + $this->load->model('Stock_Group_model'); + return; + } + + function index() + { + redirect('inventory/stockgroup/add'); + return; + } + + function add() + { + $this->template->set('page_title', 'New Stock Group'); + + /* Check access */ + if ( ! check_access('create stock group')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('account'); + return; + } + + /* Form fields */ + $data['stock_group_name'] = array( + 'name' => 'stock_group_name', + 'id' => 'stock_group_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_group_parents'] = $this->Stock_Group_model->get_all_stock_groups(); + $data['stock_group_parent_active'] = 0; + + /* Form validations */ + $this->form_validation->set_rules('stock_group_name', 'Stock group name', 'trim|required|min_length[2]|max_length[100]|unique[stock_groups.name]'); + $this->form_validation->set_rules('stock_group_parent', 'Parent stock group', 'trim|required|is_natural'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_group_name']['value'] = $this->input->post('stock_group_name', TRUE); + $data['stock_group_parent_active'] = $this->input->post('stock_group_parent', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockgroup/add', $data); + return; + } + else + { + $data_stock_group_name = $this->input->post('stock_group_name', TRUE); + $data_stock_group_parent_id = $this->input->post('stock_group_parent', TRUE); + + /* Check if parent group id present */ + if ($data_stock_group_parent_id > 0) + { + $this->db->select('id')->from('stock_groups')->where('id', $data_stock_group_parent_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid parent stock group.', 'error'); + $this->template->load('template', 'inventory/stockgroup/add', $data); + return; + } + } + + $this->db->trans_start(); + $insert_data = array( + 'name' => $data_stock_group_name, + 'parent_id' => $data_stock_group_parent_id, + ); + if ( ! $this->db->insert('stock_groups', $insert_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error addding Stock Group - ' . $data_stock_group_name . '.', 'error'); + $this->logger->write_message("error", "Error adding Stock Group named " . $data_stock_group_name); + $this->template->load('template', 'inventory/stockgroup/add', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Added Stock Group - ' . $data_stock_group_name . '.', 'success'); + $this->logger->write_message("success", "Added Stock Group named " . $data_stock_group_name); + redirect('inventory/account'); + return; + } + } + return; + } + + function edit($id) + { + $this->template->set('page_title', 'Edit Stock Group'); + + /* Check access */ + if ( ! check_access('edit stock group')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Group.', 'error'); + redirect('inventory/account'); + return; + } + + /* Loading current group */ + $this->db->from('stock_groups')->where('id', $id); + $stock_group_data_q = $this->db->get(); + if ($stock_group_data_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Group.', 'error'); + redirect('inventory/account'); + return; + } + $stock_group_data = $stock_group_data_q->row(); + + /* Form fields */ + $data['stock_group_name'] = array( + 'name' => 'stock_group_name', + 'id' => 'stock_group_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_group_data->name, + ); + $data['stock_group_parents'] = $this->Stock_Group_model->get_all_stock_groups($stock_group_data->id); + $data['stock_group_parent_active'] = $stock_group_data->parent_id; + $data['stock_group_id'] = $id; + + /* Form validations */ + $this->form_validation->set_rules('stock_group_name', 'Stock group name', 'trim|required|min_length[2]|max_length[100]|uniquewithid[stock_groups.name.' . $id . ']'); + $this->form_validation->set_rules('stock_group_parent', 'Parent stock group', 'trim|required|is_natural'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_group_name']['value'] = $this->input->post('stock_group_name', TRUE); + $data['stock_group_parent_active'] = $this->input->post('stock_group_parent', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockgroup/edit', $data); + return; + } + else + { + $data_stock_group_name = $this->input->post('stock_group_name', TRUE); + $data_stock_group_parent_id = $this->input->post('stock_group_parent', TRUE); + $data_id = $id; + + /* Check if parent group id present */ + if ($data_stock_group_parent_id > 0) + { + $this->db->select('id')->from('stock_groups')->where('id', $data_stock_group_parent_id); + if ($this->db->get()->num_rows() < 1) + { + $this->messages->add('Invalid parent stock group.', 'error'); + $this->template->load('template', 'inventory/stockgroup/edit', $data); + return; + } + } + + /* Check if parent group same as current group id */ + if ($data_stock_group_parent_id > 0) + { + if ($data_stock_group_parent_id == $id) + { + $this->messages->add('Invalid Parent stock group', 'error'); + $this->template->load('template', 'inventory/stockgroup/edit', $data); + return; + } + } + + $this->db->trans_start(); + $update_data = array( + 'name' => $data_stock_group_name, + 'parent_id' => $data_stock_group_parent_id, + ); + if ( ! $this->db->where('id', $data_id)->update('stock_groups', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Stock Group - ' . $data_stock_group_name . '.', 'error'); + $this->logger->write_message("error", "Error updating Stock Group named " . $data_stock_group_name . " [id:" . $data_id . "]"); + $this->template->load('template', 'inventory/stockgroup/edit', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Updated Stock Group - ' . $data_stock_group_name . '.', 'success'); + $this->logger->write_message("success", "Updated Stock Group named " . $data_stock_group_name . " [id:" . $data_id . "]"); + redirect('inventory/account'); + return; + } + } + return; + } + + function delete($id) + { + /* Check access */ + if ( ! check_access('delete stock group')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Group.', 'error'); + redirect('inventory/account'); + return; + } + + $this->db->from('stock_groups')->where('parent_id', $id); + if ($this->db->get()->num_rows() > 0) + { + $this->messages->add('Cannot delete non-empty Stock Group.', 'error'); + redirect('inventory/account'); + return; + } + $this->db->from('stock_items')->where('group_id', $id); + if ($this->db->get()->num_rows() > 0) + { + $this->messages->add('Cannot delete non-empty Stock Group.', 'error'); + redirect('inventory/account'); + return; + } + + /* Get the group details */ + $this->db->from('stock_groups')->where('id', $id); + $stock_group_q = $this->db->get(); + if ($stock_group_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Group.', 'error'); + redirect('inventory/account'); + return; + } else { + $stock_group_data = $stock_group_q->row(); + } + + /* Deleting group */ + $this->db->trans_start(); + if ( ! $this->db->delete('stock_groups', array('id' => $id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Stock Group - ' . $stock_group_data->name . '.', 'error'); + $this->logger->write_message("error", "Error deleting Stock Group named " . $stock_group_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Deleted Stock Group - ' . $stock_group_data->name . '.', 'success'); + $this->logger->write_message("success", "Deleted Stock Group named " . $stock_group_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } + return; + } +} + +/* End of file stockgroup.php */ +/* Location: ./system/application/controllers/inventory/stockgroup.php */ diff --git a/system/application/helpers/access_helper.php b/system/application/helpers/access_helper.php index 86c939d..35e7067 100644 --- a/system/application/helpers/access_helper.php +++ b/system/application/helpers/access_helper.php @@ -22,6 +22,9 @@ * 'create stock unit' * 'edit stock unit' * 'delete stock unit' + * 'create stock group' + * 'edit stock group' + * 'delete stock group' * 'create tag' * 'edit tag' * 'delete tag' @@ -57,6 +60,9 @@ if ( ! function_exists('check_access')) 'create stock unit', 'edit stock unit', 'delete stock unit', + 'create stock group', + 'edit stock group', + 'delete stock group', 'create tag', 'edit tag', 'delete tag', @@ -84,6 +90,9 @@ if ( ! function_exists('check_access')) 'create stock unit', 'edit stock unit', 'delete stock unit', + 'create stock group', + 'edit stock group', + 'delete stock group', 'create tag', 'edit tag', 'delete tag', diff --git a/system/application/models/stock_group_model.php b/system/application/models/stock_group_model.php new file mode 100644 index 0000000..0388121 --- /dev/null +++ b/system/application/models/stock_group_model.php @@ -0,0 +1,25 @@ +<?php + +class Stock_Group_model extends Model { + + function Stock_Group_model() + { + parent::Model(); + } + + function get_all_stock_groups($id = NULL) + { + $options = array(); + $options[0] = '(None)'; + if ($id == NULL) + $this->db->from('stock_groups')->where('id >', 0)->order_by('name', 'asc'); + else + $this->db->from('stock_groups')->where('id >', 0)->where('id !=', $id)->order_by('name', 'asc'); + $stock_group_parent_q = $this->db->get(); + foreach ($stock_group_parent_q->result() as $row) + { + $options[$row->id] = $row->name; + } + return $options; + } +} diff --git a/system/application/views/inventory/stockgroup/add.php b/system/application/views/inventory/stockgroup/add.php new file mode 100644 index 0000000..623f4b4 --- /dev/null +++ b/system/application/views/inventory/stockgroup/add.php @@ -0,0 +1,22 @@ +<?php + echo form_open('inventory/stockgroup/add'); + + echo "<p>"; + echo form_label('Stock group name', 'stock_group_name'); + echo "<br />"; + echo form_input($stock_group_name); + echo "</p>"; + + echo "<p>"; + echo form_label('Parent stock group', 'stock_group_parent'); + echo "<br />"; + echo form_dropdown('stock_group_parent', $stock_group_parents, $stock_group_parent_active); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo "</p>"; + + echo form_close(); diff --git a/system/application/views/inventory/stockgroup/edit.php b/system/application/views/inventory/stockgroup/edit.php new file mode 100644 index 0000000..b41b7f0 --- /dev/null +++ b/system/application/views/inventory/stockgroup/edit.php @@ -0,0 +1,22 @@ +<?php + echo form_open('inventory/stockgroup/edit/' . $stock_group_id); + + echo "<p>"; + echo form_label('Stock group name', 'stock_group_name'); + echo "<br />"; + echo form_input($stock_group_name); + echo "</p>"; + + echo "<p>"; + echo form_label('Parent stock group', 'stock_group_parent'); + echo "<br />"; + echo form_dropdown('stock_group_parent', $stock_group_parents, $stock_group_parent_active); + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Update'); + echo " "; + echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo "</p>"; + + echo form_close(); commit c9f9fb8420f95529fba87a1b190916044919866f Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 4 16:56:03 2011 +0530 Updated database schema to version 4 Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/db-update.txt b/db-update.txt index 6ab82ca..c358019 100644 --- a/db-update.txt +++ b/db-update.txt @@ -1,3 +1,13 @@ +//--------------------------------- VERSION 4 ---------------------------------- + +CREATE TABLE IF NOT EXISTS stock_units ( + id int(11) NOT NULL AUTO_INCREMENT, + symbol varchar(15) NOT NULL, + name varchar(100) NOT NULL, + decimal_places int(2) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + //--------------------------------- VERSION 3 ---------------------------------- CREATE TABLE IF NOT EXISTS voucher_types ( diff --git a/system/application/controllers/admin/create.php b/system/application/controllers/admin/create.php index 28c8837..dba6d82 100644 --- a/system/application/controllers/admin/create.php +++ b/system/application/controllers/admin/create.php @@ -322,7 +322,7 @@ class Create extends Controller { /* Adding account settings */ $newacc->trans_start(); - if ( ! $newacc->query("INSERT INTO settings (id, name, address, email, fy_start, fy_end, currency_symbol, date_format, timezone, account_locked, database_version) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", array(1, $data_account_name, $data_account_address, $data_account_email, $data_fy_start, $data_fy_end, $data_account_currency, $data_account_date, $data_account_timezone, 0, 3))) + if ( ! $newacc->query("INSERT INTO settings (id, name, address, email, fy_start, fy_end, currency_symbol, date_format, timezone, account_locked, database_version) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", array(1, $data_account_name, $data_account_address, $data_account_email, $data_fy_start, $data_fy_end, $data_account_currency, $data_account_date, $data_account_timezone, 0, 4))) { $newacc->trans_rollback(); $this->messages->add('Error adding account settings.', 'error'); diff --git a/system/application/controllers/setting/cf.php b/system/application/controllers/setting/cf.php index ce9c1f2..f821602 100644 --- a/system/application/controllers/setting/cf.php +++ b/system/application/controllers/setting/cf.php @@ -269,7 +269,7 @@ class Cf extends Controller { /* Adding account settings */ $newacc->trans_start(); - if ( ! $newacc->query("INSERT INTO settings (id, name, address, email, fy_start, fy_end, currency_symbol, date_format, timezone, account_locked, email_protocol, email_host, email_port, email_username, email_password, database_version) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", array(1, $data_account_name, $data_account_address, $data_account_email, $data_fy_start, $data_fy_end, $data_account_currency, $data_account_date, $data_account_timezone, 0, $data_account_email_protocol, $data_account_email_host, $data_account_email_port, $data_account_email_username, $data_account_email_password, 3))) + if ( ! $newacc->query("INSERT INTO settings (id, name, address, email, fy_start, fy_end, currency_symbol, date_format, timezone, account_locked, email_protocol, email_host, email_port, email_username, email_password, database_version) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", array(1, $data_account_name, $data_account_address, $data_account_email, $data_fy_start, $data_fy_end, $data_account_currency, $data_account_date, $data_account_timezone, 0, $data_account_email_protocol, $data_account_email_host, $data_account_email_port, $data_account_email_username, $data_account_email_password, 4))) { $newacc->trans_rollback(); $this->messages->add('Error adding account settings.', 'error'); commit 8fc65110bc66fa39fe6ac9e295321a18892f0cc4 Author: Prashant P Shah <pshah.mumbai(a)gmail.com> Date: Fri Feb 4 16:52:21 2011 +0530 Added Stock Unit actions - Updated database schema - Added add/edit/delete actions for Stock Units - Added menu item for Inventory Signed-off-by: Prashant P Shah <pshah.mumbai(a)gmail.com> diff --git a/system/application/controllers/admin/schema.sql b/system/application/controllers/admin/schema.sql index 2f8f010..b54c129 100644 --- a/system/application/controllers/admin/schema.sql +++ b/system/application/controllers/admin/schema.sql @@ -101,3 +101,12 @@ CREATE TABLE IF NOT EXISTS settings ( print_page_format varchar(1) NOT NULL, database_version int(10) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +CREATE TABLE IF NOT EXISTS stock_units ( + id int(11) NOT NULL AUTO_INCREMENT, + symbol varchar(15) NOT NULL, + name varchar(100) NOT NULL, + decimal_places int(2) NOT NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; + diff --git a/system/application/controllers/inventory/account.php b/system/application/controllers/inventory/account.php new file mode 100644 index 0000000..3201ef0 --- /dev/null +++ b/system/application/controllers/inventory/account.php @@ -0,0 +1,19 @@ +<?php + +class Account extends Controller { + function index() + { + $this->template->set('page_title', 'Inventory'); + $this->template->set('nav_links', array('inventory/stockgroup/add' => 'New Stock Group', 'inventory/stockitem/add' => 'New Stock Item', 'inventory/stockunit/add' => 'New Stock Unit')); + + /* Stock Units */ + $this->db->from('stock_units')->order_by('name', 'desc'); + $data['stock_units'] = $this->db->get(); + + $this->template->load('template', 'inventory/account/index', $data); + return; + } +} + +/* End of file account.php */ +/* Location: ./system/application/controllers/inventory/account.php */ diff --git a/system/application/controllers/inventory/stockunit.php b/system/application/controllers/inventory/stockunit.php new file mode 100644 index 0000000..29922db --- /dev/null +++ b/system/application/controllers/inventory/stockunit.php @@ -0,0 +1,283 @@ +<?php + +class StockUnit extends Controller { + + function StockUnit() + { + parent::Controller(); + return; + } + + function index() + { + redirect('inventory/stockunit/add'); + return; + } + + function add() + { + $this->template->set('page_title', 'New Stock Unit'); + + /* Check access */ + if ( ! check_access('create stock unit')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Form fields */ + $data['stock_unit_symbol'] = array( + 'name' => 'stock_unit_symbol', + 'id' => 'stock_unit_symbol', + 'maxlength' => '15', + 'size' => '15', + 'value' => '', + ); + $data['stock_unit_name'] = array( + 'name' => 'stock_unit_name', + 'id' => 'stock_unit_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => '', + ); + $data['stock_unit_decimal'] = array( + 'name' => 'stock_unit_decimal', + 'id' => 'stock_unit_decimal', + 'maxlength' => '1', + 'size' => '1', + 'value' => '0', + ); + + /* Form validations */ + $this->form_validation->set_rules('stock_unit_symbol', 'Stock Unit Symbol', 'trim|required|min_length[2]|max_length[15]|unique[stock_units.symbol]'); + $this->form_validation->set_rules('stock_unit_name', 'Stock Unit Name', 'trim|required|min_length[2]|max_length[100]|unique[stock_units.name]'); + $this->form_validation->set_rules('stock_unit_decimal', 'Decimal Places', 'trim|required|max_length[1]|is_natural'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_unit_symbol']['value'] = $this->input->post('stock_unit_symbol', TRUE); + $data['stock_unit_name']['value'] = $this->input->post('stock_unit_name', TRUE); + $data['stock_unit_decimal']['value'] = $this->input->post('stock_unit_decimal', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockunit/add', $data); + return; + } + else + { + $data_stock_unit_symbol = $this->input->post('stock_unit_symbol', TRUE); + $data_stock_unit_name = $this->input->post('stock_unit_name', TRUE); + $data_stock_unit_decimal = $this->input->post('stock_unit_decimal', TRUE); + + $this->db->trans_start(); + $insert_data = array( + 'symbol' => $data_stock_unit_symbol, + 'name' => $data_stock_unit_name, + 'decimal_places' => $data_stock_unit_decimal, + ); + if ( ! $this->db->insert('stock_units', $insert_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error addding Stock Unit - ' . $data_stock_unit_name . '.', 'error'); + $this->logger->write_message("error", "Error adding Stock Unit named " . $data_stock_unit_name); + $this->template->load('template', 'inventory/stockunit/add', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Added Stock Unit - ' . $data_stock_unit_name . '.', 'success'); + $this->logger->write_message("success", "Added Stock Unit named " . $data_stock_unit_name); + redirect('inventory/account'); + return; + } + } + return; + } + + function edit($id) + { + $this->template->set('page_title', 'Edit Stock Unit'); + + /* Check access */ + if ( ! check_access('edit stock unit')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Unit.', 'error'); + redirect('inventory/account'); + return; + } + + /* Loading current stock unit */ + $this->db->from('stock_units')->where('id', $id); + $stock_unit_data_q = $this->db->get(); + if ($stock_unit_data_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Unit.', 'error'); + redirect('inventory/account'); + return; + } + $stock_unit_data = $stock_unit_data_q->row(); + + /* Form fields */ + $data['stock_unit_symbol'] = array( + 'name' => 'stock_unit_symbol', + 'id' => 'stock_unit_symbol', + 'maxlength' => '15', + 'size' => '15', + 'value' => $stock_unit_data->symbol, + ); + $data['stock_unit_name'] = array( + 'name' => 'stock_unit_name', + 'id' => 'stock_unit_name', + 'maxlength' => '100', + 'size' => '40', + 'value' => $stock_unit_data->name, + ); + $data['stock_unit_decimal'] = array( + 'name' => 'stock_unit_decimal', + 'id' => 'stock_unit_decimal', + 'maxlength' => '1', + 'size' => '1', + 'value' => $stock_unit_data->decimal_places, + ); + $data['stock_unit_id'] = $id; + + /* Form validations */ + $this->form_validation->set_rules('stock_unit_symbol', 'Stock Unit Symbol', 'trim|required|min_length[2]|max_length[15]|uniquewithid[stock_units.symbol.' . $id . ']'); + $this->form_validation->set_rules('stock_unit_name', 'Stock Unit Name', 'trim|required|min_length[2]|max_length[100]|uniquewithid[stock_units.name.' . $id . ']'); + $this->form_validation->set_rules('stock_unit_decimal', 'Decimal Places', 'trim|required|max_length[1]|is_natural'); + + /* Re-populating form */ + if ($_POST) + { + $data['stock_unit_symbol']['value'] = $this->input->post('stock_unit_symbol', TRUE); + $data['stock_unit_name']['value'] = $this->input->post('stock_unit_name', TRUE); + $data['stock_unit_decimal']['value'] = $this->input->post('stock_unit_decimal', TRUE); + } + + if ($this->form_validation->run() == FALSE) + { + $this->messages->add(validation_errors(), 'error'); + $this->template->load('template', 'inventory/stockunit/edit', $data); + return; + } + else + { + $data_id = $id; + $data_stock_unit_symbol = $this->input->post('stock_unit_symbol', TRUE); + $data_stock_unit_name = $this->input->post('stock_unit_name', TRUE); + $data_stock_unit_decimal = $this->input->post('stock_unit_decimal', TRUE); + + $this->db->trans_start(); + $update_data = array( + 'symbol' => $data_stock_unit_symbol, + 'name' => $data_stock_unit_name, + 'decimal_places' => $data_stock_unit_decimal, + ); + if ( ! $this->db->where('id', $data_id)->update('stock_units', $update_data)) + { + $this->db->trans_rollback(); + $this->messages->add('Error updating Stock Unit - ' . $data_stock_unit_name . '.', 'error'); + $this->logger->write_message("error", "Error updating Stock Unit named " . $data_stock_unit_name . " [id:" . $data_id . "]"); + $this->template->load('template', 'inventory/stockunit/edit', $data); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Updated Stock Unit - ' . $data_stock_unit_name . '.', 'success'); + $this->logger->write_message("success", "Udpated Stock Unit named " . $data_stock_unit_name . " [id:" . $data_id . "]"); + redirect('inventory/account'); + return; + } + } + return; + } + + function delete($id) + { + /* Check access */ + if ( ! check_access('delete stock unit')) + { + $this->messages->add('Permission denied.', 'error'); + redirect('inventory/account'); + return; + } + + /* Check for account lock */ + if ($this->config->item('account_locked') == 1) + { + $this->messages->add('Account is locked.', 'error'); + redirect('inventory/account'); + return; + } + + /* Checking for valid data */ + $id = $this->input->xss_clean($id); + $id = (int)$id; + if ($id < 1) { + $this->messages->add('Invalid Stock Unit.', 'error'); + redirect('inventory/account'); + return; + } + + /* Get the stock unit details */ + $this->db->from('stock_units')->where('id', $id); + $stock_unit_q = $this->db->get(); + if ($stock_unit_q->num_rows() < 1) + { + $this->messages->add('Invalid Stock Unit.', 'error'); + redirect('inventory/account'); + return; + } else { + $stock_unit_data = $stock_unit_q->row(); + } + + /* Deleting group */ + $this->db->trans_start(); + if ( ! $this->db->delete('stock_units', array('id' => $id))) + { + $this->db->trans_rollback(); + $this->messages->add('Error deleting Stock Unit - ' . $stock_unit_data->name . '.', 'error'); + $this->logger->write_message("error", "Error deleting Stock Unit named " . $stock_unit_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } else { + $this->db->trans_complete(); + $this->messages->add('Deleted Stock Unit - ' . $stock_unit_data->name . '.', 'success'); + $this->logger->write_message("success", "Deleted Stock Unit named " . $stock_unit_data->name . " [id:" . $id . "]"); + redirect('inventory/account'); + return; + } + return; + } +} + +/* End of file stockunit.php */ +/* Location: ./system/application/controllers/inventory/stockunit.php */ diff --git a/system/application/controllers/inventory/welcome.php b/system/application/controllers/inventory/welcome.php new file mode 100644 index 0000000..3a2513b --- /dev/null +++ b/system/application/controllers/inventory/welcome.php @@ -0,0 +1,18 @@ +<?php + +class Welcome extends Controller { + + function Welcome() + { + parent::Controller(); + return; + } + + function index() + { + redirect('inventory/account'); + } +} + +/* End of file welcome.php */ +/* Location: ./system/application/controllers/inventory/welcome.php */ diff --git a/system/application/helpers/access_helper.php b/system/application/helpers/access_helper.php index 09ba678..86c939d 100644 --- a/system/application/helpers/access_helper.php +++ b/system/application/helpers/access_helper.php @@ -19,6 +19,9 @@ * 'create group' * 'edit group' * 'delete group' + * 'create stock unit' + * 'edit stock unit' + * 'delete stock unit' * 'create tag' * 'edit tag' * 'delete tag' @@ -51,6 +54,9 @@ if ( ! function_exists('check_access')) 'create group', 'edit group', 'delete group', + 'create stock unit', + 'edit stock unit', + 'delete stock unit', 'create tag', 'edit tag', 'delete tag', @@ -75,6 +81,9 @@ if ( ! function_exists('check_access')) 'create group', 'edit group', 'delete group', + 'create stock unit', + 'edit stock unit', + 'delete stock unit', 'create tag', 'edit tag', 'delete tag', diff --git a/system/application/views/inventory/account/index.php b/system/application/views/inventory/account/index.php new file mode 100644 index 0000000..107a44c --- /dev/null +++ b/system/application/views/inventory/account/index.php @@ -0,0 +1,26 @@ +<?php + echo "<table>"; + echo "<tr valign=\"top\">"; + echo "<td>"; + echo "<table border=0 cellpadding=5 class=\"simple-table account-table\">"; + echo "<thead><tr><th>Account Name</th><th>Type</th><th>O/P Balance</th><th>C/L Balance</th><th></th></tr></thead>"; + echo "</table>"; + echo "</td>"; + echo "</tr>"; + echo "</table>"; + + echo "<table border=0 cellpadding=5 class=\"simple-table float-right\">"; + echo "<thead><tr><th>Stock Unit</th><th>Symbol</th><th></th></tr></thead>"; + foreach ($stock_units->result() as $row) + { + echo "<tr>"; + echo "<td>" . $row->name . "</td>"; + echo "<td>" . $row->symbol . "</td>"; + echo "<td>" . anchor('inventory/stockunit/edit/' . $row->id , "Edit", array('title' => 'Edit Stock Unit', 'class' => 'red-link')); + echo " "; + echo anchor('inventory/stockunit/delete/' . $row->id , img(array('src' => asset_url() . "images/icons/delete.png", 'border' => '0', 'alt' => 'Delete Stock Unit', 'class' => "confirmClick", 'title' => "Delete Stock Unit")), array('title' => 'Delete Stock Unit')) . "</td>"; + echo "</tr>"; + + } + echo "</table>"; + diff --git a/system/application/views/inventory/stockunit/add.php b/system/application/views/inventory/stockunit/add.php new file mode 100644 index 0000000..4ecd28c --- /dev/null +++ b/system/application/views/inventory/stockunit/add.php @@ -0,0 +1,31 @@ +<?php + echo form_open('inventory/stockunit/add'); + + echo "<p>"; + echo form_label('Stock unit symbol', 'stock_unit_symbol'); + echo "<br />"; + echo form_input($stock_unit_symbol); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock unit name', 'stock_unit_name'); + echo "<br />"; + echo form_input($stock_unit_name); + echo "</p>"; + + echo "<p class=\"affects-gross\">"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Decimal Places', 'stock_unit_decimal'); + echo "<br />"; + echo form_input($stock_unit_decimal); + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Maximum number of decimal places supported is 4.</span>"; + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Create'); + echo " "; + echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo "</p>"; + + echo form_close(); diff --git a/system/application/views/inventory/stockunit/edit.php b/system/application/views/inventory/stockunit/edit.php new file mode 100644 index 0000000..12930e5 --- /dev/null +++ b/system/application/views/inventory/stockunit/edit.php @@ -0,0 +1,31 @@ +<?php + echo form_open('inventory/stockunit/edit/' . $stock_unit_id); + + echo "<p>"; + echo form_label('Stock unit symbol', 'stock_unit_symbol'); + echo "<br />"; + echo form_input($stock_unit_symbol); + echo "</p>"; + + echo "<p>"; + echo form_label('Stock unit name', 'stock_unit_name'); + echo "<br />"; + echo form_input($stock_unit_name); + echo "</p>"; + + echo "<p class=\"affects-gross\">"; + echo "<span id=\"tooltip-target-1\">"; + echo form_label('Decimal Places', 'stock_unit_decimal'); + echo "<br />"; + echo form_input($stock_unit_decimal); + echo "</span>"; + echo "<span id=\"tooltip-content-1\">Maximum number of decimal places supported is 4.</span>"; + echo "</p>"; + + echo "<p>"; + echo form_submit('submit', 'Udpate'); + echo " "; + echo anchor('inventory/account', 'Back', 'Back to Inventory'); + echo "</p>"; + + echo form_close(); diff --git a/system/application/views/template.php b/system/application/views/template.php index cc7e883..adba3cb 100644 --- a/system/application/views/template.php +++ b/system/application/views/template.php @@ -113,6 +113,9 @@ $(document).ready(function() { <?php echo anchor('account', 'Accounts', array('title' => 'Chart of accounts')); ?> </li> <li> + <?php echo anchor('inventory', 'Inventory', array('title' => 'Inventory')); ?> + </li> + <li> <?php /* Showing Voucher Type sub-menu */ $voucher_type_all = $this->config->item('account_voucher_types');
1
0
0
0
Results per page:
10
25
50
100
200