diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index a5bfd2580af8..fdf671cc304c 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -101,6 +101,9 @@ class CompanySettings extends BaseSettings public $recurring_expense_number_pattern = ''; public $recurring_expense_number_counter = 1; + public $recurring_quote_number_pattern = ''; + public $recurring_quote_number_counter = 1; + public $vendor_number_pattern = ''; //@implemented public $vendor_number_counter = 1; //@implemented diff --git a/app/Factory/QuoteToRecurringQuoteFactory.php b/app/Factory/QuoteToRecurringQuoteFactory.php new file mode 100644 index 000000000000..1931a852ddb5 --- /dev/null +++ b/app/Factory/QuoteToRecurringQuoteFactory.php @@ -0,0 +1,57 @@ +status_id = RecurringQuote::STATUS_DRAFT; + $recurring_quote->discount = $quote->discount; + $recurring_quote->number = ''; + $recurring_quote->is_amount_discount = $quote->is_amount_discount; + $recurring_quote->po_number = $quote->po_number; + $recurring_quote->footer = $quote->footer; + $recurring_quote->terms = $quote->terms; + $recurring_quote->public_notes = $quote->public_notes; + $recurring_quote->private_notes = $quote->private_notes; + $recurring_quote->date = date_create()->format($quote->client->date_format()); + $recurring_quote->due_date = $quote->due_date; //todo calculate based on terms + $recurring_quote->is_deleted = $quote->is_deleted; + $recurring_quote->line_items = $quote->line_items; + $recurring_quote->tax_name1 = $quote->tax_name1; + $recurring_quote->tax_rate1 = $quote->tax_rate1; + $recurring_quote->tax_name2 = $quote->tax_name2; + $recurring_quote->tax_rate2 = $quote->tax_rate2; + $recurring_quote->custom_value1 = $quote->custom_value1; + $recurring_quote->custom_value2 = $quote->custom_value2; + $recurring_quote->custom_value3 = $quote->custom_value3; + $recurring_quote->custom_value4 = $quote->custom_value4; + $recurring_quote->amount = $quote->amount; + // $recurring_quote->balance = $quote->balance; + $recurring_quote->user_id = $quote->user_id; + $recurring_quote->client_id = $quote->client_id; + $recurring_quote->company_id = $quote->company_id; + $recurring_quote->frequency_id = RecurringQuote::FREQUENCY_MONTHLY; + $recurring_quote->last_sent_date = null; + $recurring_quote->next_send_date = null; + $recurring_quote->remaining_cycles = 0; + $recurring_quote->paid_to_date = 0; + + return $recurring_quote; + } +} diff --git a/app/Factory/RecurringQuoteToQuoteFactory.php b/app/Factory/RecurringQuoteToQuoteFactory.php new file mode 100644 index 000000000000..9a615b05e66a --- /dev/null +++ b/app/Factory/RecurringQuoteToQuoteFactory.php @@ -0,0 +1,60 @@ +status_id = Quote::STATUS_DRAFT; + $quote->discount = $recurring_quote->discount; + $quote->is_amount_discount = $recurring_quote->is_amount_discount; + $quote->po_number = $recurring_quote->po_number; + $quote->footer = $recurring_quote->footer; + $quote->terms = $recurring_quote->terms; + $quote->public_notes = $recurring_quote->public_notes; + $quote->private_notes = $recurring_quote->private_notes; + //$quote->date = now()->format($client->date_format()); + //$quote->due_date = $recurring_quote->calculateDueDate(now()); + $quote->is_deleted = $recurring_quote->is_deleted; + $quote->line_items = $recurring_quote->line_items; + $quote->tax_name1 = $recurring_quote->tax_name1; + $quote->tax_rate1 = $recurring_quote->tax_rate1; + $quote->tax_name2 = $recurring_quote->tax_name2; + $quote->tax_rate2 = $recurring_quote->tax_rate2; + $quote->tax_name3 = $recurring_quote->tax_name3; + $quote->tax_rate3 = $recurring_quote->tax_rate3; + $quote->total_taxes = $recurring_quote->total_taxes; + $quote->subscription_id = $recurring_quote->subscription_id; + $quote->custom_value1 = $recurring_quote->custom_value1; + $quote->custom_value2 = $recurring_quote->custom_value2; + $quote->custom_value3 = $recurring_quote->custom_value3; + $quote->custom_value4 = $recurring_quote->custom_value4; + $quote->amount = $recurring_quote->amount; + // $quote->balance = $recurring_quote->balance; + $quote->user_id = $recurring_quote->user_id; + $quote->assigned_user_id = $recurring_quote->assigned_user_id; + $quote->company_id = $recurring_quote->company_id; + $quote->recurring_id = $recurring_quote->id; + $quote->client_id = $client->id; + $quote->auto_bill_enabled = $recurring_quote->auto_bill_enabled; + $quote->paid_to_date = 0; + $quote->design_id = $recurring_quote->design_id; + + return $quote; + } +} diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index c92d7675f139..8983461289ba 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -21,6 +21,7 @@ use App\Models\Project; use App\Models\Quote; use App\Models\RecurringExpense; use App\Models\RecurringInvoice; +use App\Models\RecurringQuote; use App\Models\Task; use App\Models\Timezone; use App\Models\Vendor; @@ -136,6 +137,12 @@ trait GeneratesCounter case RecurringInvoice::class: return 'recurring_invoice_number_counter'; break; + case RecurringQuote::class: + return 'recurring_quote_number_counter'; + break; + case RecurringExpense::class: + return 'recurring_expense_number_counter'; + break; case Payment::class: return 'payment_number_counter'; break; @@ -197,6 +204,11 @@ trait GeneratesCounter return $this->getNextEntityNumber(RecurringInvoice::class, $client); } + public function getNextRecurringQuoteNumber(Client $client) + { + return $this->getNextEntityNumber(RecurringQuote::class, $client); + } + /** * Gets the next Payment number. * diff --git a/database/factories/RecurringQuoteFactory.php b/database/factories/RecurringQuoteFactory.php index 17563725b88b..b40e43d416a0 100644 --- a/database/factories/RecurringQuoteFactory.php +++ b/database/factories/RecurringQuoteFactory.php @@ -50,7 +50,6 @@ class RecurringQuoteFactory extends Factory 'due_date' => $this->faker->date(), 'line_items' => false, 'frequency_id' => RecurringQuote::FREQUENCY_MONTHLY, - 'start_date' => $this->faker->date(), 'last_sent_date' => $this->faker->date(), 'next_send_date' => $this->faker->date(), 'remaining_cycles' => $this->faker->numberBetween(1, 10), diff --git a/database/migrations/2021_08_23_101529_recurring_expenses_schema.php b/database/migrations/2021_08_23_101529_recurring_expenses_schema.php index 93adb406f418..19d43dd3b43f 100644 --- a/database/migrations/2021_08_23_101529_recurring_expenses_schema.php +++ b/database/migrations/2021_08_23_101529_recurring_expenses_schema.php @@ -78,6 +78,27 @@ class RecurringExpensesSchema extends Migration }); + Schema::table('recurring_quotes', function ($table){ + $table->string('auto_bill')->default('off'); + $table->boolean('auto_bill_enabled')->default(0); + $table->decimal('paid_to_date', 20, 6)->default(0); + $table->decimal('custom_surcharge1', 20,6)->nullable(); + $table->decimal('custom_surcharge2', 20,6)->nullable(); + $table->decimal('custom_surcharge3', 20,6)->nullable(); + $table->decimal('custom_surcharge4', 20,6)->nullable(); + $table->boolean('custom_surcharge_tax1')->default(false); + $table->boolean('custom_surcharge_tax2')->default(false); + $table->boolean('custom_surcharge_tax3')->default(false); + $table->boolean('custom_surcharge_tax4')->default(false); + $table->string('due_date_days')->nullable(); + $table->decimal('exchange_rate', 13, 6)->default(1); + $table->decimal('partial', 16, 4)->nullable(); + $table->date('partial_due_date')->nullable(); + $table->unsignedInteger('remaining_cycles')->nullable()->change(); + $table->unsignedInteger('subscription_id')->nullable(); + $table->dropColumn('start_date'); + $table->boolean('uses_inclusive_taxes')->default(true); + }); Schema::create('recurring_quote_invitations', function ($t) { $t->increments('id'); diff --git a/tests/Feature/RecurringQuotesTest.php b/tests/Feature/RecurringQuotesTest.php index ee66395827f3..78da5112771c 100644 --- a/tests/Feature/RecurringQuotesTest.php +++ b/tests/Feature/RecurringQuotesTest.php @@ -140,7 +140,7 @@ class RecurringQuotesTest extends TestCase public function testSubscriptionIdPassesToQuote() { - $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->invoice); + $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->quote); $recurring_invoice->user_id = $this->user->id; $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->status_id = RecurringQuote::STATUS_ACTIVE; @@ -148,7 +148,7 @@ class RecurringQuotesTest extends TestCase $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->save(); - $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->invoice->client, $this->invoice); + $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->quote->client, $this->quote); $recurring_invoice->subscription_id = 10; $recurring_invoice->save(); @@ -159,7 +159,7 @@ class RecurringQuotesTest extends TestCase public function testSubscriptionIdPassesToQuoteIfNull() { - $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->invoice); + $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->quote); $recurring_invoice->user_id = $this->user->id; $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->status_id = RecurringQuote::STATUS_ACTIVE; @@ -167,7 +167,7 @@ class RecurringQuotesTest extends TestCase $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->save(); - $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->invoice->client, $this->invoice); + $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->quote->client, $this->quote); $recurring_invoice->save(); $invoice = RecurringQuoteToQuoteFactory::create($recurring_invoice, $this->client); @@ -177,7 +177,7 @@ class RecurringQuotesTest extends TestCase public function testSubscriptionIdPassesToQuoteIfNothingSet() { - $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->invoice); + $recurring_invoice = QuoteToRecurringQuoteFactory::create($this->quote); $recurring_invoice->user_id = $this->user->id; $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->status_id = RecurringQuote::STATUS_ACTIVE; @@ -185,7 +185,7 @@ class RecurringQuotesTest extends TestCase $recurring_invoice->next_send_date = \Carbon\Carbon::now()->addDays(10); $recurring_invoice->save(); - $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->invoice->client, $this->invoice); + $recurring_invoice->number = $this->getNextRecurringQuoteNumber($this->quote->client, $this->quote); $recurring_invoice->save(); $invoice = RecurringQuoteToQuoteFactory::create($recurring_invoice, $this->client);