jc file sales module inv-no : GWM

This commit is contained in:
Smart 2024-10-05 08:56:52 +05:30
parent 8f43e39420
commit 405799a296
10 changed files with 409 additions and 421 deletions

View File

@ -26,7 +26,7 @@ use App\Models\JobcardFileModel;
use Mpdf\Mpdf;
use DateTime;
use CodeIgniter\API\ResponseTrait;
use App\Helpers\InvNoHelper;
class Jobcard extends BaseController
{
@ -67,28 +67,10 @@ class Jobcard extends BaseController
return view('jobs_list',$data);
}
public function getCurrentFinancialYear() {
// Get the current month and year
$currentMonth = date('n');
$currentYear = date('Y');
// Determine the start date of the financial year
if ($currentMonth >= 4) {
$startYear = $currentYear;
} else {
$startYear = $currentYear - 1;
}
// Determine the end date of the financial year
$endYear = $startYear + 1;
// Format the financial year string
$financialYear = $startYear . '/' . substr($endYear, -2);
return $financialYear;
}
public function preview_jobcard_invoice($job_card_id) {
public function preview_jobcard_invoice($job_card_id)
{
$logged_user = $this->session->get('logged_user');
try {
@ -101,16 +83,7 @@ class Jobcard extends BaseController
$productdata = $this->JobcardModel->get_jobcard_products_details($job_card_id);
// echo json_encode($productdata);die;
if($data['job_card'][0]['inv_no'] == '')
{
/** GENERATE INV NO */
$count = $this->JobcardModel->where('status', 'Paid')->countAllResults();
$formattedCount = str_pad($count+1, 5, '0', STR_PAD_LEFT);
$currentFinancialYear = $this->getCurrentFinancialYear();
$invoiceNumber = 'MECH-' . $currentFinancialYear. '/' . $formattedCount;
$this->JobcardModel->update($job_card_id,['inv_no' => $invoiceNumber]);
$data['job_card'][0]['inv_no'] = $invoiceNumber;
}
$servicedata = $this->JobcardModel->get_jobcard_service($job_card_id);
$complaintdata = $this->JobcardModel->get_jobcard_complaint($job_card_id);
@ -135,6 +108,7 @@ class Jobcard extends BaseController
// Create single output array
$labour_data[0] = [
"name" => "Labour Cost",
"product_name" => "Labour Cost",
"qty" => "-",
"per" => "-",
"tax" => number_format($totalTax, 2),
@ -165,50 +139,42 @@ class Jobcard extends BaseController
$productdata = $this->JobcardModel->get_jobcard_products_details($job_card_id);
// echo json_encode($productdata);die;
if($data['job_card'][0]['inv_no'] == '')
{
/** GENERATE INV NO */
$count = $this->JobcardModel->where('status', 'Paid')->countAllResults();
$formattedCount = str_pad($count+1, 5, '0', STR_PAD_LEFT);
$currentFinancialYear = $this->getCurrentFinancialYear();
$invoiceNumber = 'MECH-' . $currentFinancialYear. '/' . $formattedCount;
$this->JobcardModel->update($job_card_id,['inv_no' => $invoiceNumber]);
$data['job_card'][0]['inv_no'] = $invoiceNumber;
}
$servicedata = $this->JobcardModel->get_jobcard_service($job_card_id);
$complaintdata = $this->JobcardModel->get_jobcard_complaint($job_card_id);
$osdata = $this->JobcardModel->get_jobcard_os($job_card_id);
$customcomplaintdata = $this->JobcardModel->get_jobcard_custom_complaint($job_card_id);
$labourcost = array_merge($servicedata, $complaintdata,$customcomplaintdata,$osdata);
/** CALCULATE LABOURCOST WITH TAX */
$totalAmount = 0;
$totalTax = 0;
// Calculate total amount and total tax
foreach ($labourcost as $product) {
$totalAmount += $product["labour_amount"];
$totalTax = $product["tax"];
}
// Calculate total
$total = $totalAmount + $totalTax;
$discount = ($data['job_card'][0]['is_rework'] == 1) ? 0 : $data['job_card'][0]['discount'] ;
$amt_with_tax = $totalAmount + ($totalAmount * $totalTax / 100);
$totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100));
// Create single output array
$labour_data[0] = [
"name" => "Labour Cost",
"qty" => '-',
"per" => '-',
"tax" => number_format($totalTax, 2),
"amount" => number_format($totalAmount, 2),
"custom_tax" => number_format($totalTax, 2),
"custom_total" => number_format($total, 2)
];
$data['job_card_products'] = array_merge($productdata, $labour_data);
// echo json_encode($complaintdata);die;
/** CALCULATE LABOURCOST WITH TAX */
$totalAmount = 0;
$totalTax = 0;
// Calculate total amount and total tax
foreach ($labourcost as $product) {
$totalAmount += $product["labour_amount"];
$totalTax = $product["tax"];
}
// Calculate total
$total = $totalAmount + $totalTax;
$discount = ($data['job_card'][0]['is_rework'] == 1) ? 0 : $data['job_card'][0]['discount'] ;
$amt_with_tax = $totalAmount + ($totalAmount * $totalTax / 100);
$totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100));
// Create single output array
$labour_data[0] = [
"name" => "Labour Cost",
"product_name" => "Labour Cost",
"qty" => '-',
"per" => '-',
"tax" => number_format($totalTax, 2),
"amount" => number_format($totalAmount, 2),
"custom_tax" => number_format($totalTax, 2),
"custom_total" => number_format($total, 2)
];
$data['job_card_products'] = array_merge($productdata, $labour_data);
// Create an mPDF object
$mpdf = new Mpdf([
'mode' => '',
@ -252,11 +218,41 @@ class Jobcard extends BaseController
$bus_id = $this->session->get('logged_user_business_id');
$data['job_card'] = $this->JobcardModel->where('job_card_id',$job_card_id)->findAll();
$data['company_address'] = $this->BranchModel->where('branch_id', $this->session->get('logged_user_branch_id'))->where('business_id', $bus_id)->where('isactive', 1)->findAll();
$data['job_card_products'] = $this->JobcardModel->get_jobcard_products_details($job_card_id);
$productdata = $this->JobcardModel->get_jobcard_products_details($job_card_id);
$data['service'] = $this->JobcardModel->get_jobcard_service($job_card_id);
$complaint = $this->JobcardModel->get_jobcard_complaint($job_card_id);
$customcomplaint = $this->JobcardModel->get_jobcard_custom_complaint($job_card_id);
$data['complaint'] = array_merge($complaint,$customcomplaint);
$data['complaint'] = $this->JobcardModel->get_jobcard_complaint($job_card_id);
$data['customcomplaint'] = $this->JobcardModel->get_jobcard_custom_complaint($job_card_id);
$data['osdata'] = $this->JobcardModel->get_jobcard_os($job_card_id);
$labourcost = array_merge($data['service'], $data['complaint'],$data['customcomplaint'],$data['osdata']);
/** CALCULATE LABOURCOST WITH TAX */
$totalAmount = 0;
$totalTax = 0;
// Calculate total amount and total tax
foreach ($labourcost as $product) {
$totalAmount += $product["labour_amount"];
$totalTax = $product["tax"];
}
// Calculate total
$total = $totalAmount + $totalTax;
$discount = ($data['job_card'][0]['is_rework'] == 1) ? 0 : $data['job_card'][0]['discount'] ;
$amt_with_tax = $totalAmount + ($totalAmount * $totalTax / 100);
$totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100));
// Create single output array
$labour_data[0] = [
"name" => "Labour Cost",
"product_name" => "Labour Cost",
"qty" => 0,
"per" => '-',
"tax" => number_format($totalTax, 2),
"amount" => number_format($totalAmount, 2),
"custom_tax" => number_format($totalTax, 2),
"custom_total" => number_format($total, 2)
];
$data['job_card_products'] = array_merge($productdata, $labour_data);
$html = view('jobcard_pdf_template', $data);
return $this->respond(['status' => 'success','code' => 200,'data' => $html],200);
@ -271,17 +267,46 @@ class Jobcard extends BaseController
$bus_id = $this->session->get('logged_user_business_id');
$data['job_card'] = $this->JobcardModel->where('job_card_id',$job_card_id)->findAll();
$data['company_address'] = $this->BranchModel->where('branch_id', $this->session->get('logged_user_branch_id'))->where('business_id', $bus_id)->where('isactive', 1)->findAll();
$data['job_card_products'] = $this->JobcardModel->get_jobcard_products_details($job_card_id);
$productdata = $this->JobcardModel->get_jobcard_products_details($job_card_id);
$data['service'] = $this->JobcardModel->get_jobcard_service($job_card_id);
$complaint = $this->JobcardModel->get_jobcard_complaint($job_card_id);
$customcomplaint = $this->JobcardModel->get_jobcard_custom_complaint($job_card_id);
$data['complaint'] = array_merge($complaint,$customcomplaint);
$data['complaint'] = $this->JobcardModel->get_jobcard_complaint($job_card_id);
$data['customcomplaint'] = $this->JobcardModel->get_jobcard_custom_complaint($job_card_id);
$data['osdata'] = $this->JobcardModel->get_jobcard_os($job_card_id);
$labourcost = array_merge($data['service'], $data['complaint'],$data['customcomplaint'],$data['osdata']);
/** CALCULATE LABOURCOST WITH TAX */
$totalAmount = 0;
$totalTax = 0;
// Calculate total amount and total tax
foreach ($labourcost as $product) {
$totalAmount += $product["labour_amount"];
$totalTax = $product["tax"];
}
// Calculate total
$total = $totalAmount + $totalTax;
$discount = ($data['job_card'][0]['is_rework'] == 1) ? 0 : $data['job_card'][0]['discount'] ;
$amt_with_tax = $totalAmount + ($totalAmount * $totalTax / 100);
$totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100));
// Create single output array
$labour_data[0] = [
"name" => "Labour Cost",
"product_name" => "Labour Cost",
"qty" => 0,
"per" => '-',
"tax" => number_format($totalTax, 2),
"amount" => number_format($totalAmount, 2),
"custom_tax" => number_format($totalTax, 2),
"custom_total" => number_format($total, 2)
];
$data['job_card_products'] = array_merge($productdata, $labour_data);
// Create an mPDF object
$mpdf = new Mpdf([
'mode' => '',
'format' => 'A5',
'format' => 'A4',
'default_font_size' => 0,
'default_font' => '',
@ -710,7 +735,6 @@ class Jobcard extends BaseController
public function add_jobs()
{
// dd($this->request->getPost());
$JobcardModel = new JobcardModel();
if($this->session->get('logged_user_role') == "Store Manager") {
$data['status'] = $this->request->getPost('status');
@ -730,7 +754,7 @@ class Jobcard extends BaseController
$this->delete_items($this->request->getPost('delete_items'));
$rework = $this->request->getPost('rework');
// Job card INSERT
$deliveryDate = $this->request->getPost('delivery_date');
// Retrieve and validate the delivery date
$deliveryDate = $this->request->getPost('delivery_date');
@ -775,6 +799,8 @@ class Jobcard extends BaseController
}
$JobcardModel->update($job_card_id, $job_card_data);
} else {
$job_card_data['inv_no'] = InvNoHelper::generateInvoiceNumber();
$JobcardModel->insert($job_card_data);
$job_card_id = $JobcardModel->getInsertID(); // Get the last inserted ID
@ -798,8 +824,8 @@ class Jobcard extends BaseController
$service['service_id'] = $item->service_id;
$service['qty'] = $item->quality;
$service['tax'] = (int)$item->tax;
$service['labour_cost'] = $item->labour_cost; //(isset($rework) ? 0 : $item->labour_cost );
$service['amount'] = $item->amount; //(isset($rework) ? 0 : $item->amount );
$service['labour_cost'] = $item->labour_cost;
$service['amount'] = $item->amount;
if(empty($item->id)) {
$JobcardServiceModel->insert($service);

View File

@ -13,6 +13,7 @@ use App\Models\BusinessModel;
use App\Models\BranchModel;
use Mpdf\Mpdf;
use CodeIgniter\API\ResponseTrait;
use App\Helpers\InvNoHelper;
class Sales extends BaseController
{
public $session;
@ -45,17 +46,16 @@ class Sales extends BaseController
{
if(!$this->session->has('logged_user')) { return redirect()->to(base_url()); }
if ($sales_order_id === '0') {
$data['page_name']="Create Sales Order";
$data['page_name']="Create Sales Order";
$data['sales'] = [];
$ClientModel = new ClientModel();
$client=$ClientModel
->where('isactive',1)
->where('branch_id',$this->session->get('logged_user_branch_id'))->findAll();
$client = $ClientModel->where('isactive',1)
->where('branch_id',$this->session->get('logged_user_branch_id'))->findAll();
$VehicleModel = new VehicleModel();
$vehicle = $VehicleModel->getCustomerandVehicle($this->session->get('logged_user_branch_id'));
// ->where('isactive',1)
// ->where('branch_id',$this->session->get('logged_user_branch_id'))->findAll();
$ProductModel = new ProductModel();
$product=$ProductModel->select('products.*, manufacturer.manufacturer_name')
@ -64,8 +64,7 @@ class Sales extends BaseController
->where('products.branch_id', $this->session->get('logged_user_branch_id'))
->where('products.isactive', 1)
->findAll();
// echo "<pre>";
// print_r($product);die;
$data['product']=$product;
$data['client']=$client;
$data['vehicle']=$vehicle;
@ -178,8 +177,11 @@ class Sales extends BaseController
}
$SalesOrderModel->update($sales_order_id, $data);
} else {
$data['inv_no'] = InvNoHelper::generateInvoiceNumber();
// dd($data);
$SalesOrderModel->insert($data);
$sales_order_id = $SalesOrderModel->getInsertID(); // Get the last inserted ID
$sales_order_id = $SalesOrderModel->getInsertID();
// Update sales order with generated order number
$orderNumber = 'SO-' . date('md') . '-' . str_pad($sales_order_id, 5, '0', STR_PAD_LEFT);

View File

@ -0,0 +1,61 @@
<?php
namespace App\Helpers;
use App\Models\SalesOrderModel;
use App\Models\JobcardModel;
class InvNoHelper
{
public static function generateInvoiceNumber()
{
$SalesOrderModel = new SalesOrderModel();
$JobcardModel = new JobcardModel();
$Sales = $SalesOrderModel->orderBy('sales_order_id', 'DESC')->first();
$SaleslastFiveDigits = $Sales && isset($Sales['inv_no']) ? substr($Sales['inv_no'], -5) : 0;
$Jobs = $JobcardModel->orderBy('job_card_id', 'DESC')->first();
$JobslastFiveDigits = $Jobs && isset($Jobs['inv_no']) ? substr($Jobs['inv_no'], -5) : 0;
$largerNumber = max((int)$SaleslastFiveDigits, (int)$JobslastFiveDigits);
$formattedCount = str_pad($largerNumber+1, 5, '0', STR_PAD_LEFT);
$currentFinancialYear = SELF::getCurrentFinancialYear();
$invoiceNumber = 'MECH-' . $currentFinancialYear. '/' . $formattedCount;
return $invoiceNumber;
}
public static function getCurrentFinancialYear() {
// Get the current month and year
$currentMonth = date('n');
$currentYear = date('Y');
// Determine the start date of the financial year
if ($currentMonth >= 4) {
$startYear = $currentYear;
} else {
$startYear = $currentYear - 1;
}
// Determine the end date of the financial year
$endYear = $startYear + 1;
// Format the financial year string
$financialYear = $startYear . '-' . substr($endYear, -2);
return $financialYear;
}
}
?>

View File

@ -5,8 +5,8 @@ class SalesOrderModel extends Model
{
protected $table = 'sales_order';
protected $primaryKey = 'sales_order_id';
protected $allowedFields = ['sales_order_id','client_name','vehicle_id','order_number','branch_id','status','mode_of_payment','mobile_no','billing_address','billing_city','billing_state','billing_country','billing_postal_code','total','tax','subtotal','discount','terms_condition','isactive'];
//
protected $allowedFields = ['sales_order_id','inv_no','client_name','vehicle_id','order_number','branch_id','status','mode_of_payment','mobile_no','billing_address','billing_city','billing_state','billing_country','billing_postal_code','total','tax','subtotal','discount','terms_condition','isactive'];
public function getSalesPdf($sales_order_id){
return $this->db->table('sales_order')
->where('sales_order_id', $sales_order_id)

View File

@ -10,7 +10,7 @@
<table style="border-collapse: collapse; width: 100%;" border="0">
<tbody>
<tr>
<td style="width: 33.3333%;"></td>
<td style="width: 33.3333%;"><?= $sales[0]->inv_no; ?></td>
<td style="width: 33.3333%;">&nbsp;</td>
<td style="width: 33.3333%;">&nbsp;</td>
</tr>

View File

@ -112,7 +112,7 @@
<tr >
<td style="width: 10%; height: 5px;text-align: center; font-size: small;"> <?= $key+1; ?> </td>
<td style="width: 10%; height: 5px; font-size: small;"> <?= $value['name']; ?> </td>
<td style="width: 10%; height: 5px; font-size: small;"> <?= $value['product_name']; ?> </td>
<td style="width: 10%; height: 5px;text-align: center; font-size: small;"><?php echo $value['amount']; ?></td>
<td style="width: 10%; height: 5px;text-align: center; font-size: small;"><?= $value['qty']; ?></td>
<td style="width: 10%; height: 5px;text-align: center; font-size: small;"><?= $value['per']; ?></td>
@ -158,7 +158,7 @@
<tr style="height: 36px;">
<td style="width: 33.3333%; height: 36px;">&nbsp;</td>
<td style="width: 33.3333%; height: 36px; text-align: right; font-size: small"><strong>Grand Total</strong></td>
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><strong>&#8377;&nbsp;<?php $grandTotal = $subTotal+$subTax; round($grandTotal, 2); ?></strong></td>
<td style="width: 25.7946%; height: 36px; text-align: right; font-size: small"><strong>&#8377;&nbsp;<?php echo number_format($subTotal+$subTax, 2, '.', ''); ?></strong></td>
</tr>
</tbody>
</table>

File diff suppressed because one or more lines are too long

View File

@ -139,7 +139,7 @@
<div class="modal-header">
<h5 class="modal-title" id="PreviewJobcardModalLabel"></h5>
<a href="#" class="ri-download-2-fill ml-3 text-muted font-18" id="downloadJobcardButton" title="Download Jobcard"></a>
<a href="#" class="ri-printer-fill ml-3 text-muted font-18" id="printJobcardButton" title="Print Jobcard"></a>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" style="font-size: 27px; margin-bottom: 2px;">
<span aria-hidden="true">&times;</span>
</button>
@ -257,6 +257,9 @@
}
});
});
$(document).on('click', '.preview-jobcard', function() {
var jobCardId = $(this).data('job-card-id');
$.ajax({
@ -269,6 +272,7 @@
$('#PreviewJobcardModalLabel').text('Preview Jobcard Modal');
$('#PreviewJobcardModal .modal-body').html(response.data);
$('#downloadJobcardButton').attr('href', '<?= base_url("download_jobcard/") ?>' + jobCardId);
$('#printJobcardButton').attr('data-id', jobCardId);
}else{
$('#PreviewJobcardModal').modal('hide');
$('#PreviewJobcardModalLabel').text('');
@ -330,23 +334,35 @@
}
});
});
$(document).on('click', '.print-jobcard', function() {
var jobCardId = $(this).data('job-card-id');
$(document).on('click', '#printJobcardButton', function() {
var jobCardId = $(this).data('id');
$.ajax({
type: 'GET',
url: 'preview_jobcard/'+jobCardId,
dataType: 'json',
success: function(response) {
if (response.status == "success") {
$('#PreviewJobcardModal').modal('show');
$('#PreviewJobcardModalLabel').text('Preview Jobcard Modal');
$('#PreviewJobcardModal .modal-body').html(response.data);
$('#downloadJobcardButton').attr('href', '<?= base_url("download_jobcard/") ?>' + jobCardId);
}else{
$('#PreviewJobcardModal').modal('hide');
$('#PreviewJobcardModalLabel').text('');
}
var newWin = window.open("", "_blank", "width=600,height=400");
newWin.document.write("<html><head><title>Print</title>");
newWin.document.write(`
<style>
@media print {
@page {
size: A4; /* Set default print size to A4 */
margin: 1cm; /* Set margin as per requirement */
}
body {
font-family: Arial, sans-serif;
}
}
</style>
`);
newWin.document.write("</head><body>");
newWin.document.write(response.data);
newWin.document.write("</body></html>");
newWin.document.close();
newWin.print();
newWin.close();
},
error: function(xhr, status, error) {
// Handle error response here

View File

@ -408,6 +408,9 @@
<li>
<a href="<?php echo base_url('product_index') ?>">Products</a>
</li>
<li>
<a href="<?php echo base_url('product_category_index') ?>">Product Category</a>
</li>
</ul>
</div>
</li>
@ -451,12 +454,7 @@
<span> Make & Models</span>
</a>
</li>
<li>
<a href="<?php echo base_url('product_category_index') ?>">
<i class="fas fa-luggage-cart"></i>
<span>Product Category</span>
</a>
</li>
<?php } ?>

View File

@ -7,6 +7,9 @@
/* left: 50px; Adjust as needed */
width: 300px; /* Adjust as needed */
}
.form-control{
padding: 5px !important;
}
</style>
<div class="row">
@ -73,11 +76,12 @@
minlength="6" onkeypress="return onlyNumbers(event)" readonly>
</div>
<div class="form-group col-md-4">
<label for="inputPassword4" class="col-form-label">Status<span class="text-danger">*</span>
<label for="inputPassword4" class="col-form-label">Status
<?php if (isset($sales['status']) && $sales['status'] !== ''): ?>
(<?= $sales['status'] ?>)
<?php echo "( ". $sales['status']." )"; ?>
<?php endif; ?></label>
<select class="form-control status-select status_class_for_change" name="status" required data-toggle="select2">
<select class="form-control status-select status_class_for_change" name="status" data-toggle="select2" style="background-color: aquamarine;color: darkblue;">
<?php if (isset($sales['status'])): ?>
<?php if ($sales['status'] === 'Cancelled'): ?>