diff --git a/app/Http/Middleware/Cors.php b/app/Http/Middleware/Cors.php index 93a97c80d6ce..cb26ca07df38 100644 --- a/app/Http/Middleware/Cors.php +++ b/app/Http/Middleware/Cors.php @@ -16,7 +16,7 @@ class Cors // ALLOW OPTIONS METHOD $headers = [ 'Access-Control-Allow-Methods'=> 'POST, GET, OPTIONS, PUT, DELETE', - 'Access-Control-Allow-Headers'=> 'X-API-SECRET,X-API-TOKEN,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' + 'Access-Control-Allow-Headers'=> 'X-API-SECRET,X-API-TOKEN,X-API-PASSWORD,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' ]; return Response::make('OK', 200, $headers); diff --git a/app/Http/Requests/Credit/StoreCreditRequest.php b/app/Http/Requests/Credit/StoreCreditRequest.php index 48e982ae9ae8..9c954e1f772d 100644 --- a/app/Http/Requests/Credit/StoreCreditRequest.php +++ b/app/Http/Requests/Credit/StoreCreditRequest.php @@ -41,8 +41,39 @@ class StoreCreditRequest extends FormRequest $input = $this->all(); if($input['client_id']) - $input['client_id'] = $this->decodePrimaryKey($input['client_id']); - + $input['client_id'] = $this->decodePrimaryKey($input['client_id']); + + if(isset($input['client_contacts'])) + { + foreach($input['client_contacts'] as $key => $contact) + { + if(!array_key_exists('send_email', $contact) || !array_key_exists('id', $contact)) + { + unset($input['client_contacts'][$key]); + } + } + + } + + if(isset($input['invitations'])) + { + + foreach($input['invitations'] as $key => $value) + { + + if(isset($input['invitations'][$key]['id']) && is_numeric($input['invitations'][$key]['id'])) + unset($input['invitations'][$key]['id']); + + if(isset($input['invitations'][$key]['id']) && is_string($input['invitations'][$key]['id'])) + $input['invitations'][$key]['id'] = $this->decodePrimaryKey($input['invitations'][$key]['id']); + + if(is_string($input['invitations'][$key]['client_contact_id'])) + $input['invitations'][$key]['client_contact_id'] = $this->decodePrimaryKey($input['invitations'][$key]['client_contact_id']); + + } + + } + $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; //$input['line_items'] = json_encode($input['line_items']); $this->replace($input); diff --git a/app/Http/Requests/Credit/UpdateCreditRequest.php b/app/Http/Requests/Credit/UpdateCreditRequest.php index 9e1d82dc052c..c3a5418f07aa 100644 --- a/app/Http/Requests/Credit/UpdateCreditRequest.php +++ b/app/Http/Requests/Credit/UpdateCreditRequest.php @@ -37,6 +37,7 @@ class UpdateCreditRequest extends FormRequest ]; } + protected function prepareForValidation() { $input = $this->all(); @@ -45,6 +46,25 @@ class UpdateCreditRequest extends FormRequest $input['client_id'] = $this->decodePrimaryKey($input['client_id']); } + if(isset($input['invitations'])) + { + + foreach($input['invitations'] as $key => $value) + { + + if(is_numeric($input['invitations'][$key]['id'])) + unset($input['invitations'][$key]['id']); + + if(is_string($input['invitations'][$key]['id'])) + $input['invitations'][$key]['id'] = $this->decodePrimaryKey($input['invitations'][$key]['id']); + + if(is_string($input['invitations'][$key]['client_contact_id'])) + $input['invitations'][$key]['client_contact_id'] = $this->decodePrimaryKey($input['invitations'][$key]['client_contact_id']); + + } + + } + $input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : []; $this->replace($input); diff --git a/app/Models/Company.php b/app/Models/Company.php index 2da03450380f..e2863c21a153 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -73,6 +73,8 @@ class Company extends BaseModel 'custom_surcharge_taxes3', 'custom_surcharge_taxes4', 'show_product_details', + 'first_day_of_week', + 'first_month_of_year', ]; diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 854eb8acd822..a4c7e180d634 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -14,6 +14,7 @@ namespace App\Models; use App\Helpers\Invoice\InvoiceSum; use App\Helpers\Invoice\InvoiceSumInclusive; use App\Models\Filterable; +use App\Services\Credit\CreditService; use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; @@ -137,7 +138,10 @@ class Credit extends BaseModel } - + public function service() + { + return new CreditService($this); + } /** * @param float $balance_adjustment diff --git a/app/Repositories/CreditRepository.php b/app/Repositories/CreditRepository.php index 76439af9059e..8de3f79452be 100644 --- a/app/Repositories/CreditRepository.php +++ b/app/Repositories/CreditRepository.php @@ -11,6 +11,8 @@ namespace App\Repositories; +use App\Factory\CreditInvitationFactory; +use App\Models\ClientContact; use App\Models\Credit; use App\Models\CreditInvitation; use App\Utils\Traits\MakesHash; @@ -45,43 +47,69 @@ class CreditRepository extends BaseRepository * * @return Credit|\App\Models\Credit|null Credit Object */ - public function save(array $data, Credit $credit, $invoice = null) : ?Credit + public function save(array $data, Credit $credit) : ?Credit { - +\Log::error($data); $credit->fill($data); + $credit->save(); if(!$credit->number) $credit->number = $credit->client->getNextCreditNumber($credit->client); - if (isset($data['invitations'])) { - $invitations = collect($data['invitations']); - - /* Get array of Keyss which have been removed from the invitations array and soft delete each invitation */ - collect($credit->invitations->pluck('key'))->diff($invitations->pluck('key'))->each(function ($invitation) { - CreditInvitation::destroy($invitation); - }); - - - foreach ($data['invitations'] as $invitation) { - $cred = false; - - if (array_key_exists('key', $invitation)) { - $cred = CreditInvitation::whereKey($invitation['key'])->first(); - } - - if (!$cred) { - //$invitation['client_contact_id'] = $this->decodePrimaryKey($invitation['client_contact_id']); - - $new_invitation = CreditInvitationFactory::create($invoice->company_id, $invoice->user_id); - $new_invitation->fill($invitation); - $new_invitation->credit_id = $credit->id; - $new_invitation->client_contact_id = $this->decodePrimaryKey($invitation['client_contact_id']); - $new_invitation->save(); + if (isset($data['client_contacts'])) { + foreach ($data['client_contacts'] as $contact) { + if ($contact['send_email'] == 1 && is_string($contact['id'])) { + $client_contact = ClientContact::find($this->decodePrimaryKey($contact['id'])); + $client_contact->send_email = true; + $client_contact->save(); } } } + + if (isset($data['invitations'])) { + $invitations = collect($data['invitations']); + + /* Get array of Keys which have been removed from the invitations array and soft delete each invitation */ + $credit->invitations->pluck('key')->diff($invitations->pluck('key'))->each(function ($invitation) { + + $invite = $this->getInvitationByKey($invitation); + + if($invite) + $invite->forceDelete(); + + }); + + foreach ($data['invitations'] as $invitation) { + $inv = false; + + if (array_key_exists('key', $invitation)) { + $inv = $this->getInvitationByKey($invitation['key']); + } + + if (!$inv) { + + if (isset($invitation['id'])) { + unset($invitation['id']); + } + + $new_invitation = CreditInvitationFactory::create($credit->company_id, $credit->user_id); + $new_invitation->fill($invitation); + $new_invitation->credit_id = $credit->id; + $new_invitation->client_contact_id = $invitation['client_contact_id']; + $new_invitation->save(); + + } + } + } + + $credit->load('invitations'); + + /* If no invitations have been created, this is our fail safe to maintain state*/ + if ($credit->invitations->count() == 0) { + $credit->service()->createInvitations(); + } /** * Perform calculations on the * credit note @@ -91,8 +119,13 @@ class CreditRepository extends BaseRepository $credit->save(); - return $credit; + return $credit->fresh(); } + public function getInvitationByKey($key) :?CreditInvitation + { + return CreditInvitation::whereRaw("BINARY `key`= ?", [$key])->first(); + } + } \ No newline at end of file diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php index 11d85ddb16fb..8f4259164b6a 100644 --- a/app/Repositories/InvoiceRepository.php +++ b/app/Repositories/InvoiceRepository.php @@ -100,10 +100,9 @@ class InvoiceRepository extends BaseRepository { $invoice->load('invitations'); - + /* If no invitations have been created, this is our fail safe to maintain state*/ if ($invoice->invitations->count() == 0) { - \Log::error('making invitations'); $invoice->service()->createInvitations(); } diff --git a/app/Repositories/QuoteRepository.php b/app/Repositories/QuoteRepository.php index e395e3cf9911..eba429354c61 100644 --- a/app/Repositories/QuoteRepository.php +++ b/app/Repositories/QuoteRepository.php @@ -60,15 +60,19 @@ class QuoteRepository extends BaseRepository $invitations = collect($data['invitations']); /* Get array of Keys which have been removed from the invitations array and soft delete each invitation */ - collect($quote->invitations->pluck('key'))->diff($invitations->pluck('key'))->each(function ($invitation) { - $this->getInvitationByKey($invitation)->delete(); - }); + $quote->invitations->pluck('key')->diff($invitations->pluck('key'))->each(function ($invitation) { + $this->getInvitationByKey($invitation)->delete(); + }); foreach ($data['invitations'] as $invitation) { $inv = false; if (array_key_exists('key', $invitation)) { - $inv = $this->getInvitationByKey([$invitation['key']])->first(); + $inv = $this->getInvitationByKey([$invitation['key']]); + + if($inv) + $inv->forceDelete(); + } if (!$inv) { @@ -86,6 +90,8 @@ class QuoteRepository extends BaseRepository } } + $quote->load('invitations'); + /* If no invitations have been created, this is our fail safe to maintain state*/ if ($quote->invitations->count() == 0) { $quote->service()->createInvitations(); diff --git a/app/Services/Credit/CreateInvitations.php b/app/Services/Credit/CreateInvitations.php index 1504a4b765ce..9f0f09154960 100644 --- a/app/Services/Credit/CreateInvitations.php +++ b/app/Services/Credit/CreateInvitations.php @@ -37,6 +37,6 @@ class CreateInvitations extends AbstractService } }); - return $credit; + return $this->credit; } } diff --git a/app/Transformers/CreditInvitationTransformer.php b/app/Transformers/CreditInvitationTransformer.php new file mode 100644 index 000000000000..b9b0ee0d56e2 --- /dev/null +++ b/app/Transformers/CreditInvitationTransformer.php @@ -0,0 +1,34 @@ + $this->encodePrimaryKey($invitation->id), + 'client_contact_id' => $this->encodePrimaryKey($invitation->client_contact_id), + 'key' => $invitation->key, + 'link' => $invitation->getLink() ?:'', + 'sent_date' => $invitation->sent_date ?:'', + 'viewed_date' => $invitation->viewed_date ?:'', + 'opened_date' => $invitation->opened_date ?:'', + 'updated_at' => (int) $invitation->updated_at, + 'archived_at' => (int) $invitation->deleted_at, + ]; + } +}