mirror of
https://github.com/crater-invoice/crater.git
synced 2025-10-27 19:51:09 -04:00
Merge branch 'master' into master
This commit is contained in:
@ -49,15 +49,20 @@ class Estimate extends Model
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'total' => 'float',
|
||||
'tax' => 'float',
|
||||
'sub_total' => 'float'
|
||||
'total' => 'integer',
|
||||
'tax' => 'integer',
|
||||
'sub_total' => 'integer',
|
||||
'discount' => 'float',
|
||||
'discount_val' => 'integer',
|
||||
];
|
||||
|
||||
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 +104,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') {
|
||||
|
||||
@ -146,7 +146,8 @@ class CompanyController extends Controller
|
||||
$languages = [
|
||||
["code"=>"en", "name" => "English"],
|
||||
["code"=>"fr", "name" => "French"],
|
||||
["code"=>"es", "name" => "Spanish"]
|
||||
["code"=>"es", "name" => "Spanish"],
|
||||
["code"=>"ar", "name" => "العربية"],
|
||||
];
|
||||
|
||||
return response()->json([
|
||||
@ -190,6 +191,58 @@ class CompanyController extends Controller
|
||||
'success' => true
|
||||
]);
|
||||
}
|
||||
|
||||
public function getCustomizeSetting (Request $request)
|
||||
{
|
||||
$invoice_prefix = CompanySetting::getSetting('invoice_prefix', $request->header('company'));
|
||||
$invoice_auto_generate = CompanySetting::getSetting('invoice_auto_generate', $request->header('company'));
|
||||
|
||||
$estimate_prefix = CompanySetting::getSetting('estimate_prefix', $request->header('company'));
|
||||
$estimate_auto_generate = CompanySetting::getSetting('estimate_auto_generate', $request->header('company'));
|
||||
|
||||
$payment_prefix = CompanySetting::getSetting('payment_prefix', $request->header('company'));
|
||||
$payment_auto_generate = CompanySetting::getSetting('payment_auto_generate', $request->header('company'));
|
||||
|
||||
return response()->json([
|
||||
'invoice_prefix' => $invoice_prefix,
|
||||
'invoice_auto_generate' => $invoice_auto_generate,
|
||||
'estimate_prefix' => $estimate_prefix,
|
||||
'estimate_auto_generate' => $estimate_auto_generate,
|
||||
'payment_prefix' => $payment_prefix,
|
||||
'payment_auto_generate' => $payment_auto_generate,
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateCustomizeSetting (Request $request)
|
||||
{
|
||||
$sets = [];
|
||||
|
||||
if ($request->type == "PAYMENTS") {
|
||||
$sets = [
|
||||
'payment_prefix'
|
||||
];
|
||||
}
|
||||
|
||||
if ($request->type == "INVOICES") {
|
||||
$sets = [
|
||||
'invoice_prefix',
|
||||
];
|
||||
}
|
||||
|
||||
if ($request->type == "ESTIMATES") {
|
||||
$sets = [
|
||||
'estimate_prefix',
|
||||
];
|
||||
}
|
||||
|
||||
foreach ($sets as $key) {
|
||||
CompanySetting::setSetting($key, $request->$key, $request->header('company'));
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a specific Company Setting
|
||||
|
||||
@ -177,6 +177,7 @@ class CustomersController extends Controller
|
||||
$customer->enable_portal = $request->enable_portal;
|
||||
$customer->save();
|
||||
|
||||
$customer->addresses()->delete();
|
||||
if ($request->addresses) {
|
||||
foreach ($request->addresses as $address) {
|
||||
$newAddress = $customer->addresses()->firstOrNew(['type' => $address["type"]]);
|
||||
|
||||
@ -56,25 +56,43 @@ 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;
|
||||
$nextEstimateNumber = Estimate::getNextEstimateNumber($estimate_prefix);
|
||||
|
||||
if ($estimate_num_auto_generate == "YES") {
|
||||
$nextEstimateNumberAttribute = $nextEstimateNumber;
|
||||
}
|
||||
|
||||
$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,
|
||||
'nextEstimateNumberAttribute' => $nextEstimateNumberAttribute,
|
||||
'nextEstimateNumber' => $estimate_prefix.'-'.$nextEstimateNumber,
|
||||
'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 +119,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'),
|
||||
@ -127,7 +145,7 @@ class EstimatesController extends Controller
|
||||
|
||||
if (array_key_exists('taxes', $estimateItem) && $estimateItem['taxes']) {
|
||||
foreach ($estimateItem['taxes'] as $tax) {
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
$item->taxes()->create($tax);
|
||||
}
|
||||
@ -137,7 +155,7 @@ class EstimatesController extends Controller
|
||||
|
||||
if ($request->has('taxes')) {
|
||||
foreach ($request->taxes as $tax) {
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
$estimate->taxes()->create($tax);
|
||||
}
|
||||
@ -216,26 +234,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;
|
||||
@ -266,7 +291,7 @@ class EstimatesController extends Controller
|
||||
|
||||
if (array_key_exists('taxes', $estimateItem) && $estimateItem['taxes']) {
|
||||
foreach ($estimateItem['taxes'] as $tax) {
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
$item->taxes()->create($tax);
|
||||
}
|
||||
@ -276,7 +301,7 @@ class EstimatesController extends Controller
|
||||
|
||||
if ($request->has('taxes')) {
|
||||
foreach ($request->taxes as $tax) {
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
$estimate->taxes()->create($tax);
|
||||
}
|
||||
|
||||
@ -66,14 +66,24 @@ 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;
|
||||
$nextInvoiceNumber = Invoice::getNextInvoiceNumber($invoice_prefix);
|
||||
|
||||
if ($invoice_num_auto_generate == "YES") {
|
||||
$nextInvoiceNumberAttribute = $nextInvoiceNumber;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'nextInvoiceNumber' => $nextInvoiceNumber,
|
||||
'nextInvoiceNumberAttribute' => $nextInvoiceNumberAttribute,
|
||||
'nextInvoiceNumber' => $invoice_prefix.'-'.$nextInvoiceNumber,
|
||||
'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 +95,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 +116,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'),
|
||||
@ -128,8 +145,7 @@ class InvoicesController extends Controller
|
||||
if (array_key_exists('taxes', $invoiceItem) && $invoiceItem['taxes']) {
|
||||
foreach ($invoiceItem['taxes'] as $tax) {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$item->taxes()->create($tax);
|
||||
}
|
||||
}
|
||||
@ -140,7 +156,7 @@ class InvoicesController extends Controller
|
||||
foreach ($request->taxes as $tax) {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$invoice->taxes()->create($tax);
|
||||
}
|
||||
}
|
||||
@ -222,12 +238,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 +257,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 +292,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;
|
||||
@ -292,7 +316,6 @@ class InvoicesController extends Controller
|
||||
foreach ($oldTaxes as $oldTax) {
|
||||
Tax::destroy($oldTax['id']);
|
||||
}
|
||||
|
||||
foreach ($invoiceItems as $invoiceItem) {
|
||||
$invoiceItem['company_id'] = $request->header('company');
|
||||
$item = $invoice->items()->create($invoiceItem);
|
||||
@ -300,8 +323,7 @@ class InvoicesController extends Controller
|
||||
if (array_key_exists('taxes', $invoiceItem) && $invoiceItem['taxes']) {
|
||||
foreach ($invoiceItem['taxes'] as $tax) {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$item->taxes()->create($tax);
|
||||
}
|
||||
}
|
||||
@ -312,7 +334,7 @@ class InvoicesController extends Controller
|
||||
foreach ($request->taxes as $tax) {
|
||||
$tax['company_id'] = $request->header('company');
|
||||
|
||||
if ($tax['amount']) {
|
||||
if (gettype($tax['amount']) !== "NULL") {
|
||||
$invoice->taxes()->create($tax);
|
||||
}
|
||||
}
|
||||
|
||||
@ -235,6 +235,45 @@ class OnboardingController extends Controller
|
||||
);
|
||||
}
|
||||
|
||||
$invoices = [
|
||||
'invoice_auto_generate' => 'YES',
|
||||
'invoice_prefix' => 'INV'
|
||||
];
|
||||
|
||||
foreach ($invoices as $key => $value) {
|
||||
CompanySetting::setSetting(
|
||||
$key,
|
||||
$value,
|
||||
$user->company_id
|
||||
);
|
||||
}
|
||||
|
||||
$estimates = [
|
||||
'estimate_prefix' => 'EST',
|
||||
'estimate_auto_generate' => 'YES'
|
||||
];
|
||||
|
||||
foreach ($estimates as $key => $value) {
|
||||
CompanySetting::setSetting(
|
||||
$key,
|
||||
$value,
|
||||
$user->company_id
|
||||
);
|
||||
}
|
||||
|
||||
$payments = [
|
||||
'payment_prefix' => 'PAY',
|
||||
'payment_auto_generate' => 'YES'
|
||||
];
|
||||
|
||||
foreach ($payments as $key => $value) {
|
||||
CompanySetting::setSetting(
|
||||
$key,
|
||||
$value,
|
||||
$user->company_id
|
||||
);
|
||||
}
|
||||
|
||||
$colors = [
|
||||
'primary_text_color' => '#5851D8',
|
||||
'heading_text_color' => '#595959',
|
||||
@ -271,7 +310,14 @@ class OnboardingController extends Controller
|
||||
|
||||
if (file_exists($path)) {
|
||||
file_put_contents($path, str_replace(
|
||||
'PROXY_OAUTH_CLIENT_SECRET='.config('auth.proxy.client_secret'), 'PROXY_OAUTH_CLIENT_SECRET='.$client->secret, file_get_contents($path)
|
||||
'PROXY_OAUTH_CLIENT_SECRET='.config('auth.proxy.client_secret'),
|
||||
'PROXY_OAUTH_CLIENT_SECRET='.$client->secret,
|
||||
file_get_contents($path)
|
||||
));
|
||||
file_put_contents($path, str_replace(
|
||||
'APP_DEBUG=true',
|
||||
'APP_DEBUG=false',
|
||||
file_get_contents($path)
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@ -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,24 @@ 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;
|
||||
$nextPaymentNumber = Payment::getNextPaymentNumber($payment_prefix);
|
||||
|
||||
if ($payment_num_auto_generate == "YES") {
|
||||
$nextPaymentNumberAttribute = $nextPaymentNumber;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'customers' => User::where('role', 'customer')
|
||||
->whereCompany($request->header('company'))
|
||||
->get(),
|
||||
'nextPaymentNumber' => $nextPaymentNumber
|
||||
'nextPaymentNumberAttribute' => $nextPaymentNumberAttribute,
|
||||
'nextPaymentNumber' => $payment_prefix.'-'.$nextPaymentNumber,
|
||||
'payment_prefix' => $payment_prefix
|
||||
]);
|
||||
}
|
||||
|
||||
@ -68,6 +80,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 +109,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 +154,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 +170,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 +205,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;
|
||||
|
||||
@ -25,7 +25,6 @@ class EstimatesRequest extends FormRequest
|
||||
$rules = [
|
||||
'estimate_date' => 'required',
|
||||
'expiry_date' => 'required',
|
||||
'estimate_number' => 'required|unique:estimates,estimate_number',
|
||||
'user_id' => 'required',
|
||||
'discount' => 'required',
|
||||
'discount_val' => 'required',
|
||||
@ -41,10 +40,6 @@ class EstimatesRequest extends FormRequest
|
||||
'items.*.price' => 'required'
|
||||
];
|
||||
|
||||
if ($this->getMethod() == 'PUT') {
|
||||
$rules['estimate_number'] = $rules['estimate_number'].','.$this->get('id');
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,7 +25,6 @@ class InvoicesRequest extends FormRequest
|
||||
$rules = [
|
||||
'invoice_date' => 'required',
|
||||
'due_date' => 'required',
|
||||
'invoice_number' => 'required|unique:invoices,invoice_number',
|
||||
'user_id' => 'required',
|
||||
'discount' => 'required',
|
||||
'discount_val' => 'required',
|
||||
@ -41,10 +40,6 @@ class InvoicesRequest extends FormRequest
|
||||
'items.*.price' => 'required'
|
||||
];
|
||||
|
||||
if ($this->getMethod() == 'PUT') {
|
||||
$rules['invoice_number'] = $rules['invoice_number'].','.$this->get('id');
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,15 +24,10 @@ class PaymentRequest extends FormRequest
|
||||
{
|
||||
$rules = [
|
||||
'payment_date' => 'required',
|
||||
'payment_number' => 'required|unique:payments,payment_number',
|
||||
'user_id' => 'required',
|
||||
'amount' => 'required',
|
||||
];
|
||||
|
||||
if ($this->getMethod() == 'PUT') {
|
||||
$rules['payment_number'] = $rules['payment_number'].','.$this->route('payment');
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ class ProfileRequest extends FormRequest
|
||||
case 'POST':
|
||||
return [
|
||||
'name' => 'required',
|
||||
'password' => 'required',
|
||||
'password' => 'required|min:8',
|
||||
'address_street_1' => 'max:255',
|
||||
'address_street_2' => 'max:255',
|
||||
'email' => [
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -6,7 +6,6 @@ use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Crater\Listeners\Updates\Listener;
|
||||
use Crater\Listeners\Updates\v2\Version200;
|
||||
use Crater\Events\UpdateFinished;
|
||||
use Crater\Setting;
|
||||
use Crater\Address;
|
||||
|
||||
64
app/Listeners/Updates/v2/Version210.php
Normal file
64
app/Listeners/Updates/v2/Version210.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Crater\Listeners\Updates\v2;
|
||||
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Crater\Events\UpdateFinished;
|
||||
use Crater\Listeners\Updates\Listener;
|
||||
use Crater\Setting;
|
||||
use Crater\CompanySetting;
|
||||
|
||||
class Version210 extends Listener
|
||||
{
|
||||
const VERSION = '2.1.0';
|
||||
|
||||
/**
|
||||
* Create the event listener.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the event.
|
||||
*
|
||||
* @param object $event
|
||||
* @return void
|
||||
*/
|
||||
public function handle(UpdateFinished $event)
|
||||
{
|
||||
if ($this->isListenerFired($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Add initial auto generate value
|
||||
$this->addAutoGenerateSettings();
|
||||
|
||||
// Update Crater app version
|
||||
Setting::setSetting('version', static::VERSION);
|
||||
}
|
||||
|
||||
private function addAutoGenerateSettings()
|
||||
{
|
||||
$settings = [
|
||||
'invoice_auto_generate' => 'YES',
|
||||
'invoice_prefix' => 'INV',
|
||||
'estimate_prefix' => 'EST',
|
||||
'estimate_auto_generate' => 'YES',
|
||||
'payment_prefix' => 'PAY',
|
||||
'payment_auto_generate' => 'YES'
|
||||
];
|
||||
|
||||
foreach ($settings as $key => $value) {
|
||||
CompanySetting::setSetting(
|
||||
$key,
|
||||
$value,
|
||||
auth()->user()->company->id
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -9,6 +9,7 @@ use Crater\Listeners\Updates\v1\Version110;
|
||||
use Crater\Listeners\Updates\v2\Version200;
|
||||
use Crater\Listeners\Updates\v2\Version201;
|
||||
use Crater\Listeners\Updates\v2\Version202;
|
||||
use Crater\Listeners\Updates\v2\Version210;
|
||||
|
||||
class EventServiceProvider extends ServiceProvider
|
||||
{
|
||||
@ -23,6 +24,7 @@ class EventServiceProvider extends ServiceProvider
|
||||
Version200::class,
|
||||
Version201::class,
|
||||
Version202::class,
|
||||
Version210::class,
|
||||
],
|
||||
Registered::class => [
|
||||
SendEmailVerificationNotification::class,
|
||||
|
||||
@ -61,7 +61,7 @@ class EnvironmentManager
|
||||
} catch (Exception $e) {
|
||||
|
||||
return [
|
||||
'error' => $e->getMessage()
|
||||
'error_message' => $e->getMessage()
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@ -41,10 +41,14 @@ function clean_slug($string)
|
||||
* @param $money
|
||||
* @return formated_money
|
||||
*/
|
||||
function format_money_pdf($money)
|
||||
function format_money_pdf($money, $currency = null)
|
||||
{
|
||||
$money = $money / 100;
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', 1));
|
||||
|
||||
if (!$currency) {
|
||||
$currency = Currency::findOrFail(CompanySetting::getSetting('currency', 1));
|
||||
}
|
||||
|
||||
$format_money = number_format(
|
||||
$money,
|
||||
$currency->precision,
|
||||
|
||||
Reference in New Issue
Block a user