From a3372aeb6344e48d74d77e1cd39a07f3e8da9508 Mon Sep 17 00:00:00 2001 From: denisdulici Date: Mon, 20 Jan 2020 23:50:19 +0300 Subject: [PATCH] revenues import/export --- app/Abstracts/Import.php | 105 ++++++++++++++++++ app/Exports/Sales/Revenues.php | 20 +++- app/Imports/Common/Items.php | 20 +--- app/Imports/Sales/Revenues.php | 31 +++++- app/Imports/Sales/Sheets/InvoiceItemTaxes.php | 9 +- app/Imports/Sales/Sheets/InvoiceItems.php | 10 +- .../Sales/Sheets/InvoiceTransactions.php | 61 +--------- app/Imports/Sales/Sheets/Invoices.php | 30 +---- public/files/import/items.xlsx | Bin 9022 -> 8978 bytes public/files/import/revenues.xlsx | Bin 6670 -> 9189 bytes 10 files changed, 163 insertions(+), 123 deletions(-) diff --git a/app/Abstracts/Import.php b/app/Abstracts/Import.php index ebd1fe995..2165336f6 100644 --- a/app/Abstracts/Import.php +++ b/app/Abstracts/Import.php @@ -2,6 +2,11 @@ namespace App\Abstracts; +use App\Models\Banking\Account; +use App\Models\Common\Contact; +use App\Models\Common\Item; +use App\Models\Setting\Category; +use App\Models\Setting\Tax; use Illuminate\Support\Str; use Jenssegers\Date\Date; use Maatwebsite\Excel\Concerns\Importable; @@ -86,4 +91,104 @@ abstract class Import implements ToModel, SkipsOnError, SkipsOnFailure, WithBatc { flash($e->getMessage())->error()->important(); } + + public function getAccountIdFromCurrency($row) + { + return Account::firstOrCreate([ + 'currency_code' => $row['currency_code'], + ], [ + 'company_id' => session('company_id'), + 'name' => $row['currency_code'], + 'number' => Account::max('number') + 1, + 'opening_balance' => 0, + 'enabled' => 1, + ])->id; + } + + public function getAccountIdFromName($row) + { + return Account::firstOrCreate([ + 'name' => $row['account_name'], + ], [ + 'company_id' => session('company_id'), + 'number' => Account::max('number') + 1, + 'currency_code' => setting('default.currency'), + 'opening_balance' => 0, + 'enabled' => 1, + ])->id; + } + + public function getAccountIdFromNumber($row) + { + return Account::firstOrCreate([ + 'number' => $row['account_number'], + ], [ + 'company_id' => session('company_id'), + 'name' => $row['account_number'], + 'currency_code' => setting('default.currency'), + 'opening_balance' => 0, + 'enabled' => 1, + ])->id; + } + + public function getCategoryIdFromName($row, $type) + { + return Category::firstOrCreate([ + 'name' => $row['category_name'], + ], [ + 'company_id' => session('company_id'), + 'type' => $type, + 'color' => '#' . dechex(rand(0x000000, 0xFFFFFF)), + 'enabled' => 1, + ])->id; + } + + public function getContactIdFromEmail($row, $type) + { + return Contact::firstOrCreate([ + 'email' => $row['contact_email'], + ], [ + 'company_id' => session('company_id'), + 'type' => $type, + 'name' => $row['contact_email'], + 'currency_code' => setting('default.currency'), + 'enabled' => 1, + ])->id; + } + + public function getContactIdFromName($row, $type) + { + return Contact::firstOrCreate([ + 'name' => $row['contact_name'], + ], [ + 'company_id' => session('company_id'), + 'type' => $type, + 'currency_code' => setting('default.currency'), + 'enabled' => 1, + ])->id; + } + + public function getItemIdFromName($row) + { + return Item::firstOrCreate([ + 'name' => $row['item_name'], + ], [ + 'company_id' => session('company_id'), + 'sale_price' => $row['price'], + 'purchase_price' => $row['price'], + 'enabled' => 1, + ])->id; + } + + public function getTaxIdFromRate($row, $type = 'normal') + { + return Tax::firstOrCreate([ + 'rate' => $row['tax_rate'], + ], [ + 'company_id' => session('company_id'), + 'type' => $type, + 'name' => $row['tax_rate'], + 'enabled' => 1, + ])->id; + } } diff --git a/app/Exports/Sales/Revenues.php b/app/Exports/Sales/Revenues.php index dd592bcbf..34e803906 100644 --- a/app/Exports/Sales/Revenues.php +++ b/app/Exports/Sales/Revenues.php @@ -9,7 +9,7 @@ class Revenues extends Export { public function collection() { - $model = Model::type('income')->usingSearchString(request('search')); + $model = Model::with(['account', 'category', 'contact', 'invoice'])->type('income')->usingSearchString(request('search')); if (!empty($this->ids)) { $model->whereIn('id', (array) $this->ids); @@ -18,6 +18,16 @@ class Revenues extends Export return $model->get(); } + public function map($model): array + { + $model->account_name = $model->account->name; + $model->invoice_number = $model->invoice ? $model->invoice->invoice_number : 0; + $model->contact_email = $model->contact->email; + $model->category_name = $model->category->name; + + return parent::map($model); + } + public function fields(): array { return [ @@ -25,10 +35,10 @@ class Revenues extends Export 'amount', 'currency_code', 'currency_rate', - 'account_id', - 'document_id', - 'contact_id', - 'category_id', + 'account_name', + 'invoice_number', + 'contact_email', + 'category_name', 'description', 'payment_method', 'reference', diff --git a/app/Imports/Common/Items.php b/app/Imports/Common/Items.php index 31fa1dfb7..6560b1ab9 100644 --- a/app/Imports/Common/Items.php +++ b/app/Imports/Common/Items.php @@ -5,8 +5,6 @@ namespace App\Imports\Common; use App\Abstracts\Import; use App\Http\Requests\Common\Item as Request; use App\Models\Common\Item as Model; -use App\Models\Setting\Category; -use App\Models\Setting\Tax; class Items extends Import { @@ -20,25 +18,11 @@ class Items extends Import $row = parent::map($row); if (empty($row['category_id']) && !empty($row['category_name'])) { - $row['category_id'] = Category::firstOrCreate([ - 'name' => $row['category_name'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'income', - 'color' => '#' . dechex(rand(0x000000, 0xFFFFFF)), - 'enabled' => 1, - ])->id; + $row['category_id'] = $this->getCategoryIdFromName($row, 'item'); } if (empty($row['tax_id']) && !empty($row['tax_rate'])) { - $row['tax_id'] = Tax::firstOrCreate([ - 'rate' => $row['tax_rate'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'normal', - 'name' => $row['tax_rate'], - 'enabled' => 1, - ])->id; + $row['tax_id'] = $this->getTaxIdFromRate($row); } return $row; diff --git a/app/Imports/Sales/Revenues.php b/app/Imports/Sales/Revenues.php index 5fe04dbf7..57e4da863 100644 --- a/app/Imports/Sales/Revenues.php +++ b/app/Imports/Sales/Revenues.php @@ -3,8 +3,9 @@ namespace App\Imports\Sales; use App\Abstracts\Import; -use App\Models\Banking\Transaction as Model; use App\Http\Requests\Banking\Transaction as Request; +use App\Models\Banking\Transaction as Model; +use App\Models\Sale\Invoice; class Revenues extends Import { @@ -19,6 +20,34 @@ class Revenues extends Import $row['type'] = 'income'; + if (empty($row['account_id']) && !empty($row['account_name'])) { + $row['account_id'] = $this->getAccountIdFromName($row); + } + + if (empty($row['account_id']) && !empty($row['account_number'])) { + $row['account_id'] = $this->getAccountIdFromNumber($row); + } + + if (empty($row['account_id']) && !empty($row['currency_code'])) { + $row['account_id'] = $this->getAccountIdFromCurrency($row); + } + + if (empty($row['contact_id']) && !empty($row['contact_name'])) { + $row['contact_id'] = $this->getContactIdFromName($row, 'customer'); + } + + if (empty($row['contact_id']) && !empty($row['contact_email'])) { + $row['contact_id'] = $this->getContactIdFromEmail($row, 'customer'); + } + + if (empty($row['category_id']) && !empty($row['category_name'])) { + $row['category_id'] = $this->getCategoryIdFromName($row, 'income'); + } + + if (!empty($row['invoice_number'])) { + $row['document_id'] = Invoice::number($row['invoice_number'])->pluck('id')->first(); + } + return $row; } diff --git a/app/Imports/Sales/Sheets/InvoiceItemTaxes.php b/app/Imports/Sales/Sheets/InvoiceItemTaxes.php index 0dbf13c2c..54a770c95 100644 --- a/app/Imports/Sales/Sheets/InvoiceItemTaxes.php +++ b/app/Imports/Sales/Sheets/InvoiceItemTaxes.php @@ -40,14 +40,7 @@ class InvoiceItemTaxes extends Import } if (empty($row['tax_id']) && !empty($row['tax_rate'])) { - $row['tax_id'] = Tax::firstOrCreate([ - 'rate' => $row['tax_rate'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'normal', - 'name' => $row['tax_rate'], - 'enabled' => 1, - ])->id; + $row['tax_id'] = $this->getTaxIdFromRate($row); } if (empty($row['name']) && !empty($row['item_name'])) { diff --git a/app/Imports/Sales/Sheets/InvoiceItems.php b/app/Imports/Sales/Sheets/InvoiceItems.php index 8872923b9..0222bf547 100644 --- a/app/Imports/Sales/Sheets/InvoiceItems.php +++ b/app/Imports/Sales/Sheets/InvoiceItems.php @@ -4,7 +4,6 @@ namespace App\Imports\Sales\Sheets; use App\Abstracts\Import; use App\Http\Requests\Sale\InvoiceItem as Request; -use App\Models\Common\Item; use App\Models\Sale\Invoice; use App\Models\Sale\InvoiceItem as Model; @@ -22,14 +21,7 @@ class InvoiceItems extends Import $row['invoice_id'] = Invoice::number($row['invoice_number'])->pluck('id')->first(); if (empty($row['item_id']) && !empty($row['item_name'])) { - $row['item_id'] = Item::firstOrCreate([ - 'name' => $row['item_name'], - ], [ - 'company_id' => session('company_id'), - 'sale_price' => $row['price'], - 'purchase_price' => $row['price'], - 'enabled' => 1, - ])->id; + $row['item_id'] = $this->getItemIdFromName($row); $row['name'] = $row['item_name']; } diff --git a/app/Imports/Sales/Sheets/InvoiceTransactions.php b/app/Imports/Sales/Sheets/InvoiceTransactions.php index fd9fb41e9..429177e9d 100644 --- a/app/Imports/Sales/Sheets/InvoiceTransactions.php +++ b/app/Imports/Sales/Sheets/InvoiceTransactions.php @@ -4,11 +4,8 @@ namespace App\Imports\Sales\Sheets; use App\Abstracts\Import; use App\Http\Requests\Banking\Transaction as Request; -use App\Models\Banking\Account; use App\Models\Banking\Transaction as Model; -use App\Models\Common\Contact; use App\Models\Sale\Invoice; -use App\Models\Setting\Category; class InvoiceTransactions extends Import { @@ -24,73 +21,27 @@ class InvoiceTransactions extends Import $row['type'] = 'income'; if (empty($row['account_id']) && !empty($row['account_name'])) { - $row['account_id'] = Account::firstOrCreate([ - 'name' => $row['account_name'], - ], [ - 'company_id' => session('company_id'), - 'number' => Account::max('number') + 1, - 'currency_code' => setting('default.currency'), - 'opening_balance' => 0, - 'enabled' => 1, - ])->id; + $row['account_id'] = $this->getAccountIdFromName($row); } if (empty($row['account_id']) && !empty($row['account_number'])) { - $row['account_id'] = Account::firstOrCreate([ - 'number' => $row['account_number'], - ], [ - 'company_id' => session('company_id'), - 'name' => $row['account_number'], - 'currency_code' => setting('default.currency'), - 'opening_balance' => 0, - 'enabled' => 1, - ])->id; + $row['account_id'] = $this->getAccountIdFromNumber($row); } if (empty($row['account_id']) && !empty($row['currency_code'])) { - $row['account_id'] = Account::firstOrCreate([ - 'currency_code' => $row['currency_code'], - ], [ - 'company_id' => session('company_id'), - 'name' => $row['currency_code'], - 'number' => Account::max('number') + 1, - 'opening_balance' => 0, - 'enabled' => 1, - ])->id; + $row['account_id'] = $this->getAccountIdFromCurrency($row); } if (empty($row['contact_id']) && !empty($row['contact_name'])) { - $row['contact_id'] = Contact::firstOrCreate([ - 'name' => $row['contact_name'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'customer', - 'currency_code' => setting('default.currency'), - 'enabled' => 1, - ])->id; + $row['contact_id'] = $this->getContactIdFromName($row, 'customer'); } if (empty($row['contact_id']) && !empty($row['contact_email'])) { - $row['contact_id'] = Contact::firstOrCreate([ - 'email' => $row['contact_email'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'customer', - 'name' => $row['contact_email'], - 'currency_code' => setting('default.currency'), - 'enabled' => 1, - ])->id; + $row['contact_id'] = $this->getContactIdFromEmail($row, 'customer'); } if (empty($row['category_id']) && !empty($row['category_name'])) { - $row['category_id'] = Category::firstOrCreate([ - 'name' => $row['category_name'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'income', - 'color' => '#' . dechex(rand(0x000000, 0xFFFFFF)), - 'enabled' => 1, - ])->id; + $row['category_id'] = $this->getCategoryIdFromName($row, 'income'); } $row['document_id'] = Invoice::number($row['invoice_number'])->pluck('id')->first(); diff --git a/app/Imports/Sales/Sheets/Invoices.php b/app/Imports/Sales/Sheets/Invoices.php index 58bbc812b..5d1afb140 100644 --- a/app/Imports/Sales/Sheets/Invoices.php +++ b/app/Imports/Sales/Sheets/Invoices.php @@ -4,9 +4,7 @@ namespace App\Imports\Sales\Sheets; use App\Abstracts\Import; use App\Http\Requests\Sale\Invoice as Request; -use App\Models\Common\Contact; use App\Models\Sale\Invoice as Model; -use App\Models\Setting\Category; class Invoices extends Import { @@ -20,37 +18,15 @@ class Invoices extends Import $row = parent::map($row); if (empty($row['contact_id']) && !empty($row['contact_name'])) { - $row['contact_id'] = Contact::firstOrCreate([ - 'name' => $row['contact_name'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'customer', - 'currency_code' => setting('default.currency'), - 'enabled' => 1, - ])->id; + $row['contact_id'] = $this->getContactIdFromName($row, 'customer'); } if (empty($row['contact_id']) && !empty($row['contact_email'])) { - $row['contact_id'] = Contact::firstOrCreate([ - 'email' => $row['contact_email'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'customer', - 'name' => $row['contact_email'], - 'currency_code' => setting('default.currency'), - 'enabled' => 1, - ])->id; + $row['contact_id'] = $this->getContactIdFromEmail($row, 'customer'); } if (empty($row['category_id']) && !empty($row['category_name'])) { - $row['category_id'] = Category::firstOrCreate([ - 'name' => $row['category_name'], - ], [ - 'company_id' => session('company_id'), - 'type' => 'income', - 'color' => '#' . dechex(rand(0x000000, 0xFFFFFF)), - 'enabled' => 1, - ])->id; + $row['category_id'] = $this->getCategoryIdFromName($row, 'income'); } return $row; diff --git a/public/files/import/items.xlsx b/public/files/import/items.xlsx index a40ac42572fd17ccc85d065041597a444be12f6c..bdc881fd8b9d65a409124086c38db3b63e571909 100644 GIT binary patch delta 3808 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 Aa{vGU