diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 3069412dd692..e1c3acbbe038 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -11,28 +11,147 @@ namespace App\Export\CSV; +use App\Libraries\MultiDB; +use App\Models\Client; use App\Models\Company; -use Excel; +use App\Models\Invoice; +use App\Transformers\CreditTransformer; +use App\Utils\Ninja; +use Illuminate\Support\Facades\App; +use League\Csv\Writer; class InvoiceExport { private $company; - public function __construct(Company $company) + private $report_keys; + + private $invoice_transformer; + + private array $entity_keys = [ + 'amount' => 'amount', + 'balance' => 'balance', + 'client' => 'client_id', + 'custom_surcharge1' => 'custom_surcharge1', + 'custom_surcharge2' => 'custom_surcharge2', + 'custom_surcharge3' => 'custom_surcharge3', + 'custom_surcharge4' => 'custom_surcharge4', + 'country' => 'country_id', + 'custom_value1' => 'custom_value1', + 'custom_value2' => 'custom_value2', + 'custom_value3' => 'custom_value3', + 'custom_value4' => 'custom_value4', + 'date' => 'date', + 'discount' => 'discount', + 'due_date' => 'due_date', + 'exchange_rate' => 'exchange_rate', + 'footer' => 'footer', + 'invoice' => 'invoice_id', + 'number' => 'number', + 'paid_to_date' => 'paid_to_date', + 'partial' => 'partial', + 'partial_due_date' => 'partial_due_date', + 'po_number' => 'po_number', + 'private_notes' => 'private_notes', + 'public_notes' => 'public_notes', + 'status' => 'status_id', + 'tax_name1' => 'tax_name1', + 'tax_name2' => 'tax_name2', + 'tax_name3' => 'tax_name3', + 'tax_rate1' => 'tax_rate1', + 'tax_rate2' => 'tax_rate2', + 'tax_rate3' => 'tax_rate3', + 'terms' => 'terms', + 'total_taxes' => 'total_taxes', + 'currency' => 'currency' + ]; + + private array $decorate_keys = [ + 'country', + 'client', + 'invoice', + 'currency', + ]; + + public function __construct(Company $company, array $report_keys) { $this->company = $company; + $this->report_keys = $report_keys; + $this->invoice_transformer = new CreditTransformer(); } - public function export() + public function run() { - // $fileName = 'test.csv'; - - // $data = $this->company->invoices->get(); - // return Excel::create($fileName, function ($excel) use ($data) { - // $excel->sheet('', function ($sheet) use ($data) { - // $sheet->loadView('export', $data); - // }); - // })->download('csv'); + MultiDB::setDb($this->company->db); + App::forgetInstance('translator'); + App::setLocale($this->company->locale()); + $t = app('translator'); + $t->replace(Ninja::transformTranslations($this->company->settings)); + + //load the CSV document from a string + $this->csv = Writer::createFromString(); + + //insert the header + $this->csv->insertOne($this->buildHeader()); + + Invoice::with('client')->where('company_id', $this->company->id) + ->where('is_deleted',0) + ->cursor() + ->each(function ($invoice){ + + $this->csv->insertOne($this->buildRow($invoice)); + + }); + + + return $this->csv->toString(); + } + + private function buildHeader() :array + { + + $header = []; + + foreach(array_keys($this->report_keys) as $key) + $header[] = ctrans("texts.{$key}"); + + return $header; + } + + private function buildRow(Credit $invoice) :array + { + + $transformed_invoice = $this->invoice_transformer->transform($invoice); + + $entity = []; + + foreach(array_values($this->report_keys) as $key){ + + $entity[$key] = $transformed_invoice[$key]; + } + + return $this->decorateAdvancedFields($invoice, $entity); + + } + + private function decorateAdvancedFields(Credit $invoice, array $entity) :array + { + + if(array_key_exists('country_id', $entity)) + $entity['country_id'] = $invoice->client->country ? ctrans("texts.country_{$invoice->client->country->name}") : ""; + + if(array_key_exists('currency', $entity)) + $entity['currency'] = $invoice->client->currency()->code; + + if(array_key_exists('invoice_id', $entity)) + $entity['invoice_id'] = $invoice->invoice ? $invoice->invoice->number : ""; + + if(array_key_exists('client_id', $entity)) + $entity['client_id'] = $invoice->client->present()->name(); + + return $entity; + } + } diff --git a/app/Http/ValidationRules/Payment/ValidInvoicesRules.php b/app/Http/ValidationRules/Payment/ValidInvoicesRules.php index f3a333a091c7..1de6cc6bc877 100644 --- a/app/Http/ValidationRules/Payment/ValidInvoicesRules.php +++ b/app/Http/ValidationRules/Payment/ValidInvoicesRules.php @@ -81,13 +81,13 @@ class ValidInvoicesRules implements Rule if($inv->status_id == Invoice::STATUS_DRAFT && $invoice['amount'] <= $inv->amount){ //catch here nothing to do - we need this to prevent the last elseif triggering } - else if($inv->status_id == Invoice::STATUS_DRAFT && $invoice['amount'] > $inv->amount){ + else if($inv->status_id == Invoice::STATUS_DRAFT && floatval($invoice['amount']) > floatval($inv->amount)){ $this->error_msg = 'Amount cannot be greater than invoice balance'; return false; } - else if($invoice['amount'] > $inv->balance) { + else if(floatval($invoice['amount']) > floatval($inv->balance)) { $this->error_msg = ctrans('texts.amount_greater_than_balance_v5');