diff --git a/app/Abstracts/Export.php b/app/Abstracts/Export.php index 3e4eb5adb..068d3c2f3 100644 --- a/app/Abstracts/Export.php +++ b/app/Abstracts/Export.php @@ -48,13 +48,18 @@ abstract class Export implements FromCollection, HasLocalePreference, ShouldAuto { $map = []; - $date_fields = ['paid_at', 'invoiced_at', 'billed_at', 'due_at', 'issued_at', 'created_at', 'transferred_at']; + $date_fields = ['paid_at', 'invoiced_at', 'billed_at', 'due_at', 'issued_at', 'transferred_at']; $evil_chars = ['=', '+', '-', '@']; foreach ($this->fields as $field) { $value = $model->$field; + // created_by is equal to the owner id. Therefore, the value in export is owner email. + if ($field == 'created_by') { + $value = $model->owner->email ?? null; + } + if (in_array($field, $date_fields)) { $value = ExcelDate::PHPToExcel(Date::parse($value)->format('Y-m-d')); } diff --git a/app/Abstracts/Import.php b/app/Abstracts/Import.php index c02e7ed84..eb05b9ab0 100644 --- a/app/Abstracts/Import.php +++ b/app/Abstracts/Import.php @@ -39,7 +39,12 @@ abstract class Import implements HasLocalePreference, ShouldQueue, SkipsEmptyRow public function map($row): array { $row['company_id'] = company_id(); - $row['created_by'] = $this->user->id; + + // created_by is equal to the owner id. Therefore, the value in export is owner email. + if (isset($row['created_by'])) { + $row['created_by'] = $this->getCreatedById($row); + } + $row['created_from'] = $this->getSourcePrefix() . 'import'; // Make enabled field integer diff --git a/app/Exports/Sales/Customers.php b/app/Exports/Sales/Customers.php index d464df2dd..08e3a758b 100644 --- a/app/Exports/Sales/Customers.php +++ b/app/Exports/Sales/Customers.php @@ -22,6 +22,8 @@ class Customers extends Export $model->country = $country; + $model->can_login = $model->user_id ? true : false; + return parent::map($model); } @@ -41,6 +43,7 @@ class Customers extends Export 'currency_code', 'reference', 'enabled', + 'can_login', ]; } } diff --git a/app/Imports/Banking/Transfers.php b/app/Imports/Banking/Transfers.php index 9c0023df8..6943eff92 100644 --- a/app/Imports/Banking/Transfers.php +++ b/app/Imports/Banking/Transfers.php @@ -41,10 +41,10 @@ class Transfers extends Import return [ 'from_account_id' => 'required|integer', 'from_currency_code' => 'required|string|currency', - 'from_currency_rate' => 'required', + 'from_currency_rate' => 'required|gt:0', 'to_account_id' => 'required|integer', 'to_currency_code' => 'required|string|currency', - 'to_currency_rate' => 'required', + 'to_currency_rate' => 'required|gt:0', 'amount' => 'required|amount', 'transferred_at' => 'required|date_format:Y-m-d', 'payment_method' => 'required|string', diff --git a/app/Imports/Purchases/Sheets/Bills.php b/app/Imports/Purchases/Sheets/Bills.php index a1b3cac99..8a6c7206b 100644 --- a/app/Imports/Purchases/Sheets/Bills.php +++ b/app/Imports/Purchases/Sheets/Bills.php @@ -43,7 +43,7 @@ class Bills extends Import { $rules['bill_number'] = Str::replaceFirst('unique:documents,NULL', 'unique:documents,document_number', $rules['document_number']); $rules['billed_at'] = $rules['issued_at']; - $rules['currency_rate'] = 'required'; + $rules['currency_rate'] = 'required|gt:0'; unset($rules['document_number'], $rules['issued_at'], $rules['type']); diff --git a/app/Imports/Sales/Customers.php b/app/Imports/Sales/Customers.php index 414a982a2..03c02b9c6 100644 --- a/app/Imports/Sales/Customers.php +++ b/app/Imports/Sales/Customers.php @@ -3,6 +3,7 @@ namespace App\Imports\Sales; use App\Abstracts\Import; +use App\Models\Auth\User; use App\Http\Requests\Common\Contact as Request; use App\Models\Common\Contact as Model; @@ -26,6 +27,10 @@ class Customers extends Import $row['currency_code'] = $this->getCurrencyCode($row); $row['user_id'] = null; + if (isset($row['can_login']) && isset($row['email'])) { + $row['user_id'] = User::where('email', $row['email'])->first()?->id ?? null; + } + return $row; } } diff --git a/app/Imports/Sales/Sheets/Invoices.php b/app/Imports/Sales/Sheets/Invoices.php index 440d84d48..aeb831de8 100644 --- a/app/Imports/Sales/Sheets/Invoices.php +++ b/app/Imports/Sales/Sheets/Invoices.php @@ -43,7 +43,7 @@ class Invoices extends Import { $rules['invoice_number'] = Str::replaceFirst('unique:documents,NULL', 'unique:documents,document_number', $rules['document_number']); $rules['invoiced_at'] = $rules['issued_at']; - $rules['currency_rate'] = 'required'; + $rules['currency_rate'] = 'required|gt:0'; unset($rules['document_number'], $rules['issued_at'], $rules['type']); diff --git a/app/Models/Document/Document.php b/app/Models/Document/Document.php index 323956a38..edf79ae79 100644 --- a/app/Models/Document/Document.php +++ b/app/Models/Document/Document.php @@ -538,17 +538,29 @@ class Document extends Model if ($this->status != 'paid' && (empty($this->transactions->count()) || (! empty($this->transactions->count()) && $this->paid != $this->amount))) { try { - $actions[] = [ - 'type' => 'button', - 'title' => trans('invoices.add_payment'), - 'icon' => 'paid', - 'url' => route('modals.documents.document.transactions.create', $this->id), - 'permission' => 'read-' . $group . '-' . $permission_prefix, - 'attributes' => [ - 'id' => 'index-line-actions-payment-' . $this->type . '-' . $this->id, - '@click' => 'onAddPayment("' . route('modals.documents.document.transactions.create', $this->id) . '")', - ], - ]; + if ($this->totals->count()) { + $actions[] = [ + 'type' => 'button', + 'title' => trans('invoices.add_payment'), + 'icon' => 'paid', + 'url' => route('modals.documents.document.transactions.create', $this->id), + 'permission' => 'read-' . $group . '-' . $permission_prefix, + 'attributes' => [ + 'id' => 'index-line-actions-payment-' . $this->type . '-' . $this->id, + '@click' => 'onAddPayment("' . route('modals.documents.document.transactions.create', $this->id) . '")', + ], + ]; + } else { + $actions[] = [ + 'type' => 'button', + 'title' => trans('invoices.messages.totals_required', ['type' => $this->type]), + 'icon' => 'paid', + 'permission' => 'read-' . $group . '-' . $permission_prefix, + 'attributes' => [ + "disabled" => "disabled", + ], + ]; + } } catch (\Exception $e) {} } diff --git a/app/Traits/Import.php b/app/Traits/Import.php index e04b113ec..8681e785c 100644 --- a/app/Traits/Import.php +++ b/app/Traits/Import.php @@ -14,6 +14,7 @@ use App\Jobs\Common\CreateItem; use App\Jobs\Setting\CreateCategory; use App\Jobs\Setting\CreateCurrency; use App\Jobs\Setting\CreateTax; +use App\Models\Auth\User; use App\Models\Banking\Account; use App\Models\Common\Contact; use App\Models\Common\Item; @@ -110,6 +111,17 @@ trait Import return $currency->code; } + public function getCreatedById($row) + { + $user = User::where('email', $row['created_by'])->first(); + + if (! empty($user)) { + return $user->id; + } + + return $this->user->id; + } + public function getDocumentId($row) { $id = isset($row['document_id']) ? $row['document_id'] : null; diff --git a/resources/lang/en-GB/invoices.php b/resources/lang/en-GB/invoices.php index 5186448b9..99040dc6a 100644 --- a/resources/lang/en-GB/invoices.php +++ b/resources/lang/en-GB/invoices.php @@ -50,6 +50,8 @@ return [ 'messages' => [ 'email_required' => 'No email address for this customer!', + 'totals_required' => 'Invoice totals are required Please edit the :type and save it again.', + 'draft' => 'This is a DRAFT invoice and will be reflected to charts after it gets sent.', 'status' => [ diff --git a/resources/views/components/documents/show/content.blade.php b/resources/views/components/documents/show/content.blade.php index 34ec22538..174cf979d 100644 --- a/resources/views/components/documents/show/content.blade.php +++ b/resources/views/components/documents/show/content.blade.php @@ -34,6 +34,10 @@ @if ($document->status == 'draft') @endif + + @if (! $document->totals->count()) + + @endif @endif @stack('status_message_end') diff --git a/resources/views/components/documents/show/get-paid.blade.php b/resources/views/components/documents/show/get-paid.blade.php index 73822a701..01a720103 100644 --- a/resources/views/components/documents/show/get-paid.blade.php +++ b/resources/views/components/documents/show/get-paid.blade.php @@ -11,15 +11,23 @@ @stack('timeline_get_paid_body_button_payment_start') @if (! $hideAddPayment) - @if ($document->status != 'paid' && (empty($document->transactions->count()) || (! empty($document->transactions->count()) && $document->paid != $document->amount))) - - {{ trans('invoices.add_payment') }} - + @if ($document->totals->count()) + @if ($document->status != 'paid' && (empty($document->transactions->count()) || (! empty($document->transactions->count()) && $document->paid != $document->amount))) + + {{ trans('invoices.add_payment') }} + + @endif + @else + + + {{ trans('invoices.add_payment') }} + + @endif @endif diff --git a/resources/views/components/documents/show/make-payment.blade.php b/resources/views/components/documents/show/make-payment.blade.php index c382bae9a..5b4dd39d5 100644 --- a/resources/views/components/documents/show/make-payment.blade.php +++ b/resources/views/components/documents/show/make-payment.blade.php @@ -11,15 +11,23 @@ @stack('timeline_get_paid_body_button_payment_start') @if (! $hideAddPayment) - @if ($document->status != 'paid' && (empty($document->transactions->count()) || (! empty($document->transactions->count()) && $document->paid != $document->amount)) ) - - {{ trans('invoices.add_payment') }} - + @if ($document->totals->count()) + @if ($document->status != 'paid' && (empty($document->transactions->count()) || (! empty($document->transactions->count()) && $document->paid != $document->amount)) ) + + {{ trans('invoices.add_payment') }} + + @endif + @else + + + {{ trans('invoices.add_payment') }} + + @endif @endif