diff --git a/app/Estimate.php b/app/Estimate.php
index 08fd7aaf..4caf953b 100644
--- a/app/Estimate.php
+++ b/app/Estimate.php
@@ -54,10 +54,13 @@ class Estimate extends Model
'sub_total' => 'float'
];
- public static function getNextEstimateNumber()
+ public static function getNextEstimateNumber($value)
{
- // Get the last created order
- $lastOrder = Estimate::orderBy('created_at', 'desc')->first();
+ // Get the last created order
+ $lastOrder = Estimate::where('estimate_number', 'LIKE', $value . '-%')
+ ->orderBy('created_at', 'desc')
+ ->first();
+
if (!$lastOrder) {
// We get here if there is no order at all
// If there is no number set it to 0, which will be 1 at the end.
@@ -99,10 +102,16 @@ class Estimate extends Model
public function getEstimateNumAttribute()
{
- $position = $this->strposX($this->estimate_number, "-", 2) + 1;
+ $position = $this->strposX($this->estimate_number, "-", 1) + 1;
return substr($this->estimate_number, $position);
}
+ public function getEstimatePrefixAttribute()
+ {
+ $prefix = explode("-",$this->estimate_number)[0];
+ return $prefix;
+ }
+
private function strposX($haystack, $needle, $number)
{
if ($number == '1') {
diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php
index ffefaf6e..845e8cad 100644
--- a/app/Http/Controllers/CompanyController.php
+++ b/app/Http/Controllers/CompanyController.php
@@ -157,12 +157,8 @@ class CompanyController extends Controller
{
$invoice_prefix = CompanySetting::getSetting('invoice_prefix', $request->header('company'));
$invoice_auto_generate = CompanySetting::getSetting('invoice_auto_generate', $request->header('company'));
- $invoice_notes = CompanySetting::getSetting('invoice_notes', $request->header('company'), true);
- $invoice_terms_and_conditions = CompanySetting::getSetting('invoice_terms_and_conditions', $request->header('company'), true);
$estimate_prefix = CompanySetting::getSetting('estimate_prefix', $request->header('company'));
- $estimate_notes = CompanySetting::getSetting('estimate_notes', $request->header('company'), true);
- $estimate_terms_and_conditions = CompanySetting::getSetting('estimate_terms_and_conditions', $request->header('company'), true);
$estimate_auto_generate = CompanySetting::getSetting('estimate_auto_generate', $request->header('company'));
$payment_prefix = CompanySetting::getSetting('payment_prefix', $request->header('company'));
@@ -175,12 +171,8 @@ class CompanyController extends Controller
return response()->json([
'invoice_prefix' => $invoice_prefix,
'invoice_auto_generate' => $invoice_auto_generate,
- 'invoice_notes' => $invoice_notes,
- 'invoice_terms_and_conditions' => $invoice_terms_and_conditions,
'estimate_prefix' => $estimate_prefix,
'estimate_auto_generate' => $estimate_auto_generate,
- 'estimate_notes' => $estimate_notes,
- 'estimate_terms_and_conditions' => $estimate_terms_and_conditions,
'payment_prefix' => $payment_prefix,
'payment_auto_generate' => $payment_auto_generate,
'billing_address_format' => $billing_address_format,
@@ -200,14 +192,10 @@ class CompanyController extends Controller
} elseif ($request->type == "INVOICES") {
$sets = [
'invoice_prefix',
- 'invoice_notes',
- 'invoice_terms_and_conditions'
];
} elseif ($request->type == "ESTIMATES") {
$sets = [
'estimate_prefix',
- 'estimate_notes',
- 'estimate_terms_and_conditions'
];
} else {
$sets = [
diff --git a/app/Http/Controllers/EstimatesController.php b/app/Http/Controllers/EstimatesController.php
index 3312842d..1dec2420 100644
--- a/app/Http/Controllers/EstimatesController.php
+++ b/app/Http/Controllers/EstimatesController.php
@@ -56,25 +56,41 @@ class EstimatesController extends Controller
public function create(Request $request)
{
- $nextEstimateNumber = 'EST-'.Estimate::getNextEstimateNumber();
+ $estimate_prefix = CompanySetting::getSetting('estimate_prefix', $request->header('company'));
+ $estimate_num_auto_generate = CompanySetting::getSetting('estimate_auto_generate', $request->header('company'));
+
+ $nextEstimateNumberAttribute = null;
+
+ if ($estimate_num_auto_generate == "YES") {
+ $nextEstimateNumberAttribute = Estimate::getNextEstimateNumber($estimate_prefix);
+ }
+
$tax_per_item = CompanySetting::getSetting('tax_per_item', $request->header('company'));
$discount_per_item = CompanySetting::getSetting('discount_per_item', $request->header('company'));
$customers = User::where('role', 'customer')->get();
return response()->json([
'customers' => $customers,
- 'nextEstimateNumber' => $nextEstimateNumber,
+ 'nextEstimateNumber' => $nextEstimateNumberAttribute,
'taxes' => Tax::whereCompany($request->header('company'))->latest()->get(),
'items' => Item::whereCompany($request->header('company'))->get(),
'tax_per_item' => $tax_per_item,
'discount_per_item' => $discount_per_item,
'estimateTemplates' => EstimateTemplate::all(),
- 'shareable_link' => ''
+ 'shareable_link' => '',
+ 'estimate_prefix' => $estimate_prefix
]);
}
public function store(EstimatesRequest $request)
{
+ $estimate_number = explode("-",$request->estimate_number);
+ $number_attributes['estimate_number'] = $estimate_number[0].'-'.sprintf('%06d', intval($estimate_number[1]));
+
+ Validator::make($number_attributes, [
+ 'estimate_number' => 'required|unique:estimates,estimate_number'
+ ])->validate();
+
$estimate_date = Carbon::createFromFormat('d/m/Y', $request->estimate_date);
$expiry_date = Carbon::createFromFormat('d/m/Y', $request->expiry_date);
$status = Estimate::STATUS_DRAFT;
@@ -101,7 +117,7 @@ class EstimatesController extends Controller
$estimate = Estimate::create([
'estimate_date' => $estimate_date,
'expiry_date' => $expiry_date,
- 'estimate_number' => $request->estimate_number,
+ 'estimate_number' => $number_attributes['estimate_number'],
'reference_number' => $request->reference_number,
'user_id' => $request->user_id,
'company_id' => $request->header('company'),
@@ -216,26 +232,33 @@ class EstimatesController extends Controller
return response()->json( [
'customers' => $customers,
- 'nextEstimateNumber' => $estimate->estimate_number,
+ 'nextEstimateNumber' => $estimate->getEstimateNumAttribute(),
'taxes' => Tax::latest()->whereCompany($request->header('company'))->get(),
'estimate' => $estimate,
'items' => Item::whereCompany($request->header('company'))->latest()->get(),
'estimateTemplates' => EstimateTemplate::all(),
'tax_per_item' => $estimate->tax_per_item,
'discount_per_item' => $estimate->discount_per_item,
- 'shareable_link' => url('/estimates/pdf/'.$estimate->unique_hash)
+ 'shareable_link' => url('/estimates/pdf/'.$estimate->unique_hash),
+ 'estimate_prefix' => $estimate->getEstimatePrefixAttribute()
]);
}
public function update(EstimatesRequest $request, $id)
{
+ $estimate_number = explode("-",$request->estimate_number);
+ $number_attributes['estimate_number'] = $estimate_number[0].'-'.sprintf('%06d', intval($estimate_number[1]));
+ Validator::make($number_attributes, [
+ 'estimate_number' => 'required|unique:estimates,estimate_number'.','.$id
+ ])->validate();
+
$estimate_date = Carbon::createFromFormat('d/m/Y', $request->estimate_date);
$expiry_date = Carbon::createFromFormat('d/m/Y', $request->expiry_date);
$estimate = Estimate::find($id);
$estimate->estimate_date = $estimate_date;
$estimate->expiry_date = $expiry_date;
- $estimate->estimate_number = $request->estimate_number;
+ $estimate->estimate_number = $number_attributes['estimate_number'];
$estimate->reference_number = $request->reference_number;
$estimate->user_id = $request->user_id;
$estimate->estimate_template_id = $request->estimate_template_id;
diff --git a/app/Http/Controllers/InvoicesController.php b/app/Http/Controllers/InvoicesController.php
index da97751f..b22eb111 100644
--- a/app/Http/Controllers/InvoicesController.php
+++ b/app/Http/Controllers/InvoicesController.php
@@ -66,14 +66,22 @@ class InvoicesController extends Controller
{
$tax_per_item = CompanySetting::getSetting('tax_per_item', $request->header('company'));
$discount_per_item = CompanySetting::getSetting('discount_per_item', $request->header('company'));
- $nextInvoiceNumber = "INV-".Invoice::getNextInvoiceNumber();
+ $invoice_prefix = CompanySetting::getSetting('invoice_prefix', $request->header('company'));
+ $invoice_num_auto_generate = CompanySetting::getSetting('invoice_auto_generate', $request->header('company'));
+
+ $nextInvoiceNumberAttribute = null;
+
+ if ($invoice_num_auto_generate == "YES") {
+ $nextInvoiceNumberAttribute = Invoice::getNextInvoiceNumber($invoice_prefix);
+ }
return response()->json([
- 'nextInvoiceNumber' => $nextInvoiceNumber,
+ 'nextInvoiceNumber' => $nextInvoiceNumberAttribute,
'items' => Item::with('taxes')->whereCompany($request->header('company'))->get(),
'invoiceTemplates' => InvoiceTemplate::all(),
'tax_per_item' => $tax_per_item,
- 'discount_per_item' => $discount_per_item
+ 'discount_per_item' => $discount_per_item,
+ 'invoice_prefix' => $invoice_prefix
]);
}
@@ -85,6 +93,13 @@ class InvoicesController extends Controller
*/
public function store(Requests\InvoicesRequest $request)
{
+ $invoice_number = explode("-",$request->invoice_number);
+ $number_attributes['invoice_number'] = $invoice_number[0].'-'.sprintf('%06d', intval($invoice_number[1]));
+
+ Validator::make($number_attributes, [
+ 'invoice_number' => 'required|unique:invoices,invoice_number'
+ ])->validate();
+
$invoice_date = Carbon::createFromFormat('d/m/Y', $request->invoice_date);
$due_date = Carbon::createFromFormat('d/m/Y', $request->due_date);
$status = Invoice::STATUS_DRAFT;
@@ -99,7 +114,7 @@ class InvoicesController extends Controller
$invoice = Invoice::create([
'invoice_date' => $invoice_date,
'due_date' => $due_date,
- 'invoice_number' => $request->invoice_number,
+ 'invoice_number' => $number_attributes['invoice_number'],
'reference_number' => $request->reference_number,
'user_id' => $request->user_id,
'company_id' => $request->header('company'),
@@ -222,12 +237,13 @@ class InvoicesController extends Controller
])->find($id);
return response()->json([
- 'nextInvoiceNumber' => $invoice->invoice_number,
+ 'nextInvoiceNumber' => $invoice->getInvoiceNumAttribute(),
'invoice' => $invoice,
'invoiceTemplates' => InvoiceTemplate::all(),
'tax_per_item' => $invoice->tax_per_item,
'discount_per_item' => $invoice->discount_per_item,
- 'shareable_link' => url('/invoices/pdf/'.$invoice->unique_hash)
+ 'shareable_link' => url('/invoices/pdf/'.$invoice->unique_hash),
+ 'invoice_prefix' => $invoice->getInvoicePrefixAttribute()
]);
}
@@ -240,6 +256,13 @@ class InvoicesController extends Controller
*/
public function update(Requests\InvoicesRequest $request, $id)
{
+ $invoice_number = explode("-",$request->invoice_number);
+ $number_attributes['invoice_number'] = $invoice_number[0].'-'.sprintf('%06d', intval($invoice_number[1]));
+
+ Validator::make($number_attributes, [
+ 'invoice_number' => 'required|unique:invoices,invoice_number'.','.$id
+ ])->validate();
+
$invoice_date = Carbon::createFromFormat('d/m/Y', $request->invoice_date);
$due_date = Carbon::createFromFormat('d/m/Y', $request->due_date);
@@ -268,7 +291,7 @@ class InvoicesController extends Controller
$invoice->invoice_date = $invoice_date;
$invoice->due_date = $due_date;
- $invoice->invoice_number = $request->invoice_number;
+ $invoice->invoice_number = $number_attributes['invoice_number'];
$invoice->reference_number = $request->reference_number;
$invoice->user_id = $request->user_id;
$invoice->invoice_template_id = $request->invoice_template_id;
diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php
index cf7f1377..ffe3582c 100644
--- a/app/Http/Controllers/PaymentController.php
+++ b/app/Http/Controllers/PaymentController.php
@@ -10,6 +10,7 @@ use Carbon\Carbon;
use function MongoDB\BSON\toJSON;
use Crater\User;
use Crater\Http\Requests\PaymentRequest;
+use Validator;
class PaymentController extends Controller
{
@@ -50,13 +51,22 @@ class PaymentController extends Controller
*/
public function create(Request $request)
{
- $nextPaymentNumber = 'PAY-'.Payment::getNextPaymentNumber();
+ $payment_prefix = CompanySetting::getSetting('payment_prefix', $request->header('company'));
+ $payment_num_auto_generate = CompanySetting::getSetting('payment_auto_generate', $request->header('company'));
+
+
+ $nextPaymentNumberAttribute = null;
+
+ if ($payment_num_auto_generate == "YES") {
+ $nextPaymentNumberAttribute = Payment::getNextPaymentNumber($payment_prefix);
+ }
return response()->json([
'customers' => User::where('role', 'customer')
->whereCompany($request->header('company'))
->get(),
- 'nextPaymentNumber' => $nextPaymentNumber
+ 'nextPaymentNumber' => $nextPaymentNumberAttribute,
+ 'payment_prefix' => $payment_prefix
]);
}
@@ -68,6 +78,13 @@ class PaymentController extends Controller
*/
public function store(PaymentRequest $request)
{
+ $payment_number = explode("-",$request->payment_number);
+ $number_attributes['payment_number'] = $payment_number[0].'-'.sprintf('%06d', intval($payment_number[1]));
+
+ Validator::make($number_attributes, [
+ 'payment_number' => 'required|unique:payments,payment_number'
+ ])->validate();
+
$payment_date = Carbon::createFromFormat('d/m/Y', $request->payment_date);
if ($request->has('invoice_id') && $request->invoice_id != null) {
@@ -90,7 +107,7 @@ class PaymentController extends Controller
$payment = Payment::create([
'payment_date' => $payment_date,
- 'payment_number' => $request->payment_number,
+ 'payment_number' => $number_attributes['payment_number'],
'user_id' => $request->user_id,
'company_id' => $request->header('company'),
'invoice_id' => $request->invoice_id,
@@ -135,7 +152,8 @@ class PaymentController extends Controller
'customers' => User::where('role', 'customer')
->whereCompany($request->header('company'))
->get(),
- 'nextPaymentNumber' => $payment->payment_number,
+ 'nextPaymentNumber' => $payment->getPaymentNumAttribute(),
+ 'payment_prefix' => $payment->getPaymentPrefixAttribute(),
'payment' => $payment,
'invoices' => $invoices
]);
@@ -150,6 +168,13 @@ class PaymentController extends Controller
*/
public function update(PaymentRequest $request, $id)
{
+ $payment_number = explode("-",$request->payment_number);
+ $number_attributes['payment_number'] = $payment_number[0].'-'.sprintf('%06d', intval($payment_number[1]));
+
+ Validator::make($number_attributes, [
+ 'payment_number' => 'required|unique:payments,payment_number'.','.$id
+ ])->validate();
+
$payment_date = Carbon::createFromFormat('d/m/Y', $request->payment_date);
$payment = Payment::find($id);
@@ -178,7 +203,7 @@ class PaymentController extends Controller
}
$payment->payment_date = $payment_date;
- $payment->payment_number = $request->payment_number;
+ $payment->payment_number = $number_attributes['payment_number'];
$payment->user_id = $request->user_id;
$payment->invoice_id = $request->invoice_id;
$payment->payment_mode = $request->payment_mode;
diff --git a/app/Invoice.php b/app/Invoice.php
index ac578015..3c01cea3 100644
--- a/app/Invoice.php
+++ b/app/Invoice.php
@@ -66,10 +66,14 @@ class Invoice extends Model
'formattedDueDate'
];
- public static function getNextInvoiceNumber()
+ public static function getNextInvoiceNumber($value)
{
// Get the last created order
- $lastOrder = Invoice::orderBy('created_at', 'desc')->first();
+ $lastOrder = Invoice::where('invoice_number', 'LIKE', $value . '-%')
+ ->orderBy('created_at', 'desc')
+ ->first();
+
+
if (!$lastOrder) {
// We get here if there is no order at all
// If there is no number set it to 0, which will be 1 at the end.
@@ -143,10 +147,15 @@ class Invoice extends Model
public function getInvoiceNumAttribute()
{
- $position = $this->strposX($this->invoice_number, "-", 2) + 1;
+ $position = $this->strposX($this->invoice_number, "-", 1) + 1;
return substr($this->invoice_number, $position);
}
+ public function getInvoicePrefixAttribute () {
+ $prefix = explode("-", $this->invoice_number)[0];
+ return $prefix;
+ }
+
public function getFormattedCreatedAtAttribute($value)
{
$dateFormat = CompanySetting::getSetting('carbon_date_format', $this->company_id);
diff --git a/app/Payment.php b/app/Payment.php
index 18acae84..64cd7799 100644
--- a/app/Payment.php
+++ b/app/Payment.php
@@ -32,10 +32,34 @@ class Payment extends Model
'formattedPaymentDate'
];
- public static function getNextPaymentNumber()
+
+ private function strposX($haystack, $needle, $number)
+ {
+ if ($number == '1') {
+ return strpos($haystack, $needle);
+ } elseif ($number > '1') {
+ return strpos(
+ $haystack,
+ $needle,
+ $this->strposX($haystack, $needle, $number - 1) + strlen($needle)
+ );
+ } else {
+ return error_log('Error: Value for parameter $number is out of range');
+ }
+ }
+
+ public function getPaymentNumAttribute()
+ {
+ $position = $this->strposX($this->payment_number, "-", 1) + 1;
+ return substr($this->payment_number, $position);
+ }
+
+ public static function getNextPaymentNumber($value)
{
// Get the last created order
- $payment = Payment::orderBy('created_at', 'desc')->first();
+ $payment = Payment::where('payment_number', 'LIKE', $value . '-%')
+ ->orderBy('created_at', 'desc')
+ ->first();
if (!$payment) {
// We get here if there is no order at all
// If there is no number set it to 0, which will be 1 at the end.
@@ -54,6 +78,13 @@ class Payment extends Model
return sprintf('%06d', intval($number) + 1);
}
+ public function getPaymentPrefixAttribute ()
+ {
+ $prefix= explode("-",$this->payment_number)[0];
+ return $prefix;
+ }
+
+
public function invoice()
{
return $this->belongsTo(Invoice::class);
diff --git a/resources/assets/js/components/base/BasePrefixInput.vue b/resources/assets/js/components/base/BasePrefixInput.vue
new file mode 100644
index 00000000..bb323e52
--- /dev/null
+++ b/resources/assets/js/components/base/BasePrefixInput.vue
@@ -0,0 +1,71 @@
+
+ {{ prefix }}-