From 9f32a4933a103089b1aa90d18c10a875b3070c93 Mon Sep 17 00:00:00 2001 From: Smart Date: Tue, 1 Oct 2024 18:22:07 +0530 Subject: [PATCH] CHANGE_ invoice preview , download , print (sales and jobcard) --- app/Config/Routes.php | 1 + app/Controllers/Jobcard.php | 24 +- app/Controllers/Sales.php | 61 ++- app/Models/SalesOrderModel.php | 2 +- app/Views/invoice_pdf_template.php | 481 +++++++----------- app/Views/invoice_pdf_template_jobcard.php | 553 +++++++-------------- app/Views/invoice_pdf_template_old.php | 307 ++++++++++++ app/Views/job_card_form.php | 3 +- app/Views/jobs_list.php | 86 +++- app/Views/sales_list.php | 92 ++++ public/assets/css/bootstrap-corporate.css | 4 +- public/assets/images/Group.png | Bin 0 -> 5489 bytes 12 files changed, 891 insertions(+), 723 deletions(-) mode change 100755 => 100644 app/Views/invoice_pdf_template.php create mode 100755 app/Views/invoice_pdf_template_old.php create mode 100644 public/assets/images/Group.png diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 15e5236..bd83905 100755 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -81,6 +81,7 @@ $routes->get("new_sale/(:any)", "Sales::new_sale/$1"); $routes->get("delete_sale/(:any)", "Sales::delete_sale/$1"); $routes->post("delete_sales_product", "Sales::delete_sales_product"); $routes->get("download_invoice/(:any)", "Sales::download_invoice/$1"); +$routes->get("preview_invoice/(:any)", "Sales::preview_invoice/$1"); $routes->post("save_vehicle", "Sales::save_vehicle"); $routes->post("getProducts", "Sales::getProducts"); //end salle order// diff --git a/app/Controllers/Jobcard.php b/app/Controllers/Jobcard.php index d359936..1bc2a2e 100755 --- a/app/Controllers/Jobcard.php +++ b/app/Controllers/Jobcard.php @@ -134,17 +134,20 @@ class Jobcard extends BaseController $totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100)); // Create single output array $labour_data[0] = [ - "product_name" => "Labour Cost", - "qty" => 1, + "name" => "Labour Cost", + "qty" => "-", + "per" => "-", "tax" => number_format($totalTax, 2), - "custom_amount" => number_format($totalAmount, 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; - $html = view('invoice_pdf_template_jobcard', $data); - return $this->respond(['status' => 'success','code' => 200,'data' => $html],200); + + + + $html = view('invoice_pdf_template_jobcard', $data); + return $this->respond(['status' => 'success','code' => 200,'data' => $html],200); } catch (\Exception $e) { return $this->respond(['status' => 'failed','code' => 500,'data' => $e],500); @@ -195,10 +198,11 @@ class Jobcard extends BaseController $totalAmount = ($amt_with_tax - (float)$discount) / (1 + ($totalTax/100)); // Create single output array $labour_data[0] = [ - "product_name" => "Labour Cost", - "qty" => 1, + "name" => "Labour Cost", + "qty" => '-', + "per" => '-', "tax" => number_format($totalTax, 2), - "custom_amount" => number_format($totalAmount, 2), + "amount" => number_format($totalAmount, 2), "custom_tax" => number_format($totalTax, 2), "custom_total" => number_format($total, 2) ]; @@ -208,7 +212,7 @@ class Jobcard extends BaseController // Create an mPDF object $mpdf = new Mpdf([ 'mode' => '', - 'format' => 'A5', + 'format' => 'A4', 'default_font_size' => 0, 'default_font' => '', diff --git a/app/Controllers/Sales.php b/app/Controllers/Sales.php index 8b3f285..598da70 100755 --- a/app/Controllers/Sales.php +++ b/app/Controllers/Sales.php @@ -12,9 +12,11 @@ use App\Models\VehicleModel; use App\Models\BusinessModel; use App\Models\BranchModel; use Mpdf\Mpdf; +use CodeIgniter\API\ResponseTrait; class Sales extends BaseController { public $session; + use ResponseTrait; protected $BikemodelsModel; protected $BikemakeModel; public function __construct() @@ -336,18 +338,18 @@ class Sales extends BaseController $BusinessModel = new BusinessModel(); $BikemodelsModel = new BikemodelsModel(); $BikemakeModel = new BikemakeModel(); - $data = $model->getSalesPdf($sales_order_id); - $bus_id = $this->session->get('logged_user_business_id'); - $branch = $BranchModel->where('branch_id', $data[0]->branch_id)->first(); - $business = $BusinessModel->where('business_id', $branch['business_id'])->first(); - $vehicle = $VehicleModel->where('vehicle_id',$data[0]->vehicle_id)->first(); - $bike_model = $BikemodelsModel->where('model_id',$vehicle['model'])->first(); - $bike_make = $BikemakeModel->where('make_id', $vehicle['make'])->first(); - $items = $model->getSalesOrderProductsForPdf($sales_order_id); + $data['sales'] = $model->getSalesPdf($sales_order_id); + $data['branch'] = $BranchModel->where('branch_id', $data['sales'][0]->branch_id)->first(); + $data['vehicle'] = $VehicleModel->select('vehicle.reg_no,vehicle.colour,vehicle.email,vehicle.mobile_no,vehicle.year_of_manufacturing, make.make as make_name, model.model_name') + ->join('model', 'model.model_id = vehicle.model', 'left') + ->join('make', 'make.make_id = vehicle.make', 'left') + ->where('vehicle.vehicle_id', $data['sales'][0]->vehicle_id) + ->first(); + $data['items'] = $model->getSalesOrderProductsForPdf($sales_order_id); $mpdf = new Mpdf([ 'mode' => '', - 'format' => 'A5', + 'format' => 'A4', 'default_font_size' => 0, 'default_font' => '', // 'margin_right' => 1, @@ -361,35 +363,62 @@ class Sales extends BaseController $mpdf->autoLangToFont = true; $mpdf->autoScriptToLang = true; // Set PDF properties $mpdf->SetTitle('Invoice'); - $mpdf->SetAuthor($data[0]->branch_name); + $mpdf->SetAuthor($data['sales'][0]->branch_name); $mpdf->SetCreator(''); // Generate the PDF content (HTML) - if ($data[0]->status === 'Draft') { + if ($data['sales'][0]->status === 'Draft') { // Set the watermark text and options $mpdf->SetWatermarkText('Draft'); $mpdf->showWatermarkText = true; } - if ($data[0]->status === 'Cancelled') { + if ($data['sales'][0]->status === 'Cancelled') { // Set the watermark text and options $mpdf->SetWatermarkText('Cancelled'); $mpdf->showWatermarkText = true; } - if ($data[0]->status === 'Void') { + if ($data['sales'][0]->status === 'Void') { // Set the watermark text and options $mpdf->SetWatermarkText('Void'); $mpdf->showWatermarkText = true; } - // return view('invoice_pdf_template', ['sales' => $data,'items'=>$items, 'business' => $business , 'vehicle' => $vehicle,'bike_model'=>$bike_model,'bike_make'=>$bike_make]); + // Generate the PDF content (HTML) with data - $html = view('invoice_pdf_template', ['sales' => $data,'saleOrderCount' => $saleOrderCount,'items'=>$items,'branch'=>$branch, 'business' => $business , 'vehicle' => $vehicle,'bike_model'=>$bike_model,'bike_make'=>$bike_make]); + $html = view('invoice_pdf_template', $data); // echo $html;die; // Load HTML into the mPDF instance $mpdf->WriteHTML($html); date_default_timezone_set('Asia/Kolkata'); // Output the PDF to the browser for download - $mpdf->Output($data[0]->order_number .'_' . date('Y-m-d H-i-s') . '.pdf', 'D'); + $mpdf->Output($data['sales'][0]->order_number .'_' . date('Y-m-d H-i-s') . '.pdf', 'D'); + } + + + public function preview_invoice($sales_order_id) + { + + + // Fetch the invoice data based on $invoice_id + $model = new SalesOrderModel(); + $saleOrderCount = count($model->where('status','Paid')->findAll()); + $VehicleModel = new VehicleModel(); + $BranchModel = new BranchModel(); + $BusinessModel = new BusinessModel(); + $BikemodelsModel = new BikemodelsModel(); + $BikemakeModel = new BikemakeModel(); + $data['sales'] = $model->getSalesPdf($sales_order_id); + $data['branch'] = $BranchModel->where('branch_id', $data['sales'][0]->branch_id)->first(); + $data['vehicle'] = $VehicleModel->select('vehicle.reg_no,vehicle.colour,vehicle.email,vehicle.mobile_no,vehicle.year_of_manufacturing, make.make as make_name, model.model_name') + ->join('model', 'model.model_id = vehicle.model', 'left') + ->join('make', 'make.make_id = vehicle.make', 'left') + ->where('vehicle.vehicle_id', $data['sales'][0]->vehicle_id) + ->first(); + $data['items'] = $model->getSalesOrderProductsForPdf($sales_order_id); + + + $html = view('invoice_pdf_template', $data); + return $this->respond(['status' => 'success','code' => 200,'data' => $html],200); } diff --git a/app/Models/SalesOrderModel.php b/app/Models/SalesOrderModel.php index 69da91f..8c898a8 100755 --- a/app/Models/SalesOrderModel.php +++ b/app/Models/SalesOrderModel.php @@ -13,7 +13,7 @@ class SalesOrderModel extends Model ->join('branches as B','B.branch_id = sales_order.branch_id','left') ->select('sales_order.*') - ->select('B.branch_name ,B.address as company_address,B.city as company_city,B.state as company_state,B.postal_code as company_postal_code,B.contact_1 as company_mobile_no_1,B.contact_2 as company_mobile_no_2') + ->select('B.branch_name ,B.address as company_address,B.city as company_city,B.state as company_state,B.postal_code as company_postal_code,B.contact_1 as company_mobile_no_1,B.contact_2 as company_mobile_no_2,B.gstno as company_gstno') ->get() ->getResult(); diff --git a/app/Views/invoice_pdf_template.php b/app/Views/invoice_pdf_template.php old mode 100755 new mode 100644 index 62130d3..af1a156 --- a/app/Views/invoice_pdf_template.php +++ b/app/Views/invoice_pdf_template.php @@ -1,307 +1,182 @@ - - - - - - - - - -

Tax Invoice

- - - - - +
- - - - - - - - - - - - - - - - - -
- - - -
-

company_address ?>,
- company_city ?>, - company_state ?> - company_postal_code ?>.
- - -

-
-
GSTIN:
- State Name: , Code:
- Contact : ,
- Email :

- Buyer (Bill To) -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Invoice No.
Datecreated_at)) ?>
Bike Make & Model
Colour
Register Number
Contact Number
Sale Order No order_number ?>
Payment Modemode_of_payment) && strlen($sales[0]->mode_of_payment) > 0) ? $sales[0]->mode_of_payment : "Not Done" ?>
-
+ + + + + + + +
INVOICE 
+ + + + + + + + +
  
+ + + + + + + + + + + + + + + + + + + + + + +
  company_address; ?>,
  company_city; ?>,company_state; ?>-company_postal_code; ?>
  Mobile: company_mobile_no_1; ?>
 GSTIN: company_gstno; ?>
- - - +
- - - client_name ?>
- billing_address != '' ? $value->billing_address." ,
" : ''; ?> - billing_city ?> billing_state." "?> - billing_postal_code!=0): ?> - billing_postal_code ?>
- - mobile_no." ." ?> - + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bill To,   
client_name; ?>   Invoice Date:created_at)); ?>
billing_address; ?>,billing_city; ?>,billing_state; ?>-billing_postal_code; ?>, Payment Mode:mode_of_payment; ?>
Mobile: mobile_no; ?>   
+

 

+ + + + + + + + + + + + + +
 Vehicle No: Model:  Sales No:order_number; ?>
+

 

+ + + + + + + + + + + + + + + + + + + $value) + { + $subTotal = $subTotal + ($value->net_price * $value->qty); + $tax = (($value->net_price * $value->qty) * $value->tax / 100); + $subTax = $subTax + $tax; + $grandTotal += $value->amount; + ?> + + + + + + + + + + + + + + + + +
NoDescriptionRate(₹)QtyPerGST(%)Total Tax(₹)Total(₹)
product_name; ?> net_price; ?>qty; ?>per; ?>tax; ?> amount, 2, '.', ''); ?>
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Sub Total
 CGST
 SGST
 Total
 Discount0.00
 Grand Total₹ 
+

 

+

 

+ + + + + + -
+

  S.A Signature:

+

 

+
  +

  Customer Signature:

+

 



- - - - - - - - - - - - - - - - - - - - - net_price * $item->qty; - $total_taxable_amount += $taxable_amount; - $cgst = ($taxable_amount * $item->tax / 100 ) /2; - $sgst = ($taxable_amount * $item->tax / 100 ) /2; - - $total_CGST += $cgst; - $total_SGST += $sgst; - ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +
\ No newline at end of file diff --git a/app/Views/invoice_pdf_template_jobcard.php b/app/Views/invoice_pdf_template_jobcard.php index 51b601f..ea0e2d1 100755 --- a/app/Views/invoice_pdf_template_jobcard.php +++ b/app/Views/invoice_pdf_template_jobcard.php @@ -1,396 +1,181 @@ - - - - - - - -

Tax Invoice

- - - - - - +
- - - - - - - - -
-

THE MECHANIC
- ,
- GST: '.$value['gstno'] ?>
- State: '.$value['state'].', code'.$value['state_code'] ?>
- Contact: '.$value['contact_1'] ?>
- Email: '.$value['email'] ?>

-
- Buyer (Bill To) -
-

,
- GST: ' ?>
- State: '.$job_card[0]['billing_state'] ?>
- Place of Supply: '.$value['state'] ?>

-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - format('Y-m-d'));die; - - if ($dateTime && $dateTime->format('Y-m-d') == $deliveryDate) { - echo ''; - } else { - echo ''; - } - } else { - echo ''; - } - ?> - - - - - - -
Invoice No.
Vehicle No
Model
Color
Contact No
Job Card No
Date of Receiptformat('d/m/Y') ?>
Delivery Date' . $dateTime->format('d/m/Y') . ' No Date ProvidedNo Date Provided
Mode of Payment - -
-
-
+ + + + + + + +
INVOICE 
+ + + + + + + + +
  
+ + + + + + + + + + + + + + + + + + + + + + +
  ,
  ,-
  Mobile:
 GSTIN:
- - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + +
Bill To,   
   Invoice Date:
,,-, Payment Mode:
Mobile:    
+

 

+ + + + + + + + + + + + + +
 Vehicle No: Model:  Job Card No:
+

 

+ + - - - + + + + + + + + + - $cgst = ($taxable_amount * $custum_tax / 100 ) /2; - $sgst = ($taxable_amount * $custum_tax / 100 ) /2; - - - }else{ - $taxable_amount = $item['amount'] * $item['qty']; - $custum_tax = (int)$item['tax']; + - $cgst = ($taxable_amount * $custum_tax / 100 ) /2; - $sgst = ($taxable_amount * $custum_tax / 100 ) /2; - } - $total_CGST += $cgst; - $total_SGST += $sgst; - ?> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
NoDescriptionRate(₹)QtyPerGST(%)Total Tax(₹)Total(₹)
- - + + $value) + { + $subTotal = $subTotal + $value['amount']; + $tax = ($value['amount'] * $value['tax'] / 100); + $subTax = $subTax + $tax; + ?> - $custom_amount = floatval($custom_amount); - - echo $custom_amount * $item['qty']; - - $sub_tot += $custom_amount * $item['qty']; - } - else - { - echo ($item['amount']) * $item['qty']; - $sub_tot += ($item['amount']) * $item['qty']; - } ?>% - - -
Sub Total
 
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Sub Total
 CGST
 SGST
 Total
 Discount0.00
 Grand Total₹ 
+

 

+

 

+ + - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - -
CGST
SGST
Estimate
Discount
Amount Chargeable (in words): - format(round($sub_tot + $tax)); - echo ucfirst($words); - ?> + +

  S.A Signature:

+

 

+
  +

  Customer Signature:

+

 

Declaration:
We Declare that this invoice shows the actual price of the goods described and that all particulars are true and correct.

**This is computer generated bill and doesn’t require signature

for THE MECHANIC




Authorised Signatory
- - - - - - + \ No newline at end of file diff --git a/app/Views/invoice_pdf_template_old.php b/app/Views/invoice_pdf_template_old.php new file mode 100755 index 0000000..62130d3 --- /dev/null +++ b/app/Views/invoice_pdf_template_old.php @@ -0,0 +1,307 @@ + + + + + + + + + +

Tax Invoice

+ + + + + +
+ + + + + + + + + + + + + + + + + +
+ + + +
+

company_address ?>,
+ company_city ?>, + company_state ?> + company_postal_code ?>.
+ + +

+
+
GSTIN:
+ State Name: , Code:
+ Contact : ,
+ Email :

+ Buyer (Bill To) +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invoice No.
Datecreated_at)) ?>
Bike Make & Model
Colour
Register Number
Contact Number
Sale Order No order_number ?>
Payment Modemode_of_payment) && strlen($sales[0]->mode_of_payment) > 0) ? $sales[0]->mode_of_payment : "Not Done" ?>
+
+ + + + +
+ + + client_name ?>
+ billing_address != '' ? $value->billing_address." ,
" : ''; ?> + billing_city ?> billing_state." "?> + billing_postal_code!=0): ?> + billing_postal_code ?>
+ + mobile_no." ." ?> + + +


+ + + + + + + + + + + + + + + + + + + + + net_price * $item->qty; + $total_taxable_amount += $taxable_amount; + $cgst = ($taxable_amount * $item->tax / 100 ) /2; + $sgst = ($taxable_amount * $item->tax / 100 ) /2; + + $total_CGST += $cgst; + $total_SGST += $sgst; + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/Views/job_card_form.php b/app/Views/job_card_form.php index c2ebe21..40212d0 100755 --- a/app/Views/job_card_form.php +++ b/app/Views/job_card_form.php @@ -635,7 +635,6 @@ $(document).ready(async function() { ''; $('#productItemTable tbody').append(newRow); - // $(newRow).insertAfter(tr); initializeSelect2(); } @@ -2112,7 +2111,7 @@ $closestTR.remove(); }); function initializeSelect2() { $('.SelExample').select2({ - width: '249px' // Adjust width as needed + width: '249px' }); } diff --git a/app/Views/jobs_list.php b/app/Views/jobs_list.php index 1e4e5b0..513150a 100755 --- a/app/Views/jobs_list.php +++ b/app/Views/jobs_list.php @@ -88,10 +88,10 @@ Preview Invoice - " class="dropdown-item edit-button">Download Invoice + Preview Jobcard - " class="dropdown-item download-button">Download Jobcard + " class="dropdown-item edit-button">Rework @@ -121,7 +121,8 @@ + \ No newline at end of file diff --git a/public/assets/css/bootstrap-corporate.css b/public/assets/css/bootstrap-corporate.css index c25f21b..07079f3 100755 --- a/public/assets/css/bootstrap-corporate.css +++ b/public/assets/css/bootstrap-corporate.css @@ -4367,9 +4367,9 @@ a.close.disabled { .modal-header { display: flex; - align-items: flex-start; + align-items: center; justify-content: space-between; - padding: 1rem 1rem; + padding: 5px 5px; border-bottom: 1px solid #e5e8eb; border-top-left-radius: 0.2rem; border-top-right-radius: 0.2rem; } diff --git a/public/assets/images/Group.png b/public/assets/images/Group.png new file mode 100644 index 0000000000000000000000000000000000000000..700e0696b5e2c27cb1d402aab28c984cf2c979fd GIT binary patch literal 5489 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 literal 0 HcmV?d00001