mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-07 19:04:41 -04:00
Revert "Revert "Re-revert "Improve Import Support""""
This commit is contained in:
parent
810d18981b
commit
e5ca3973d8
@ -64,10 +64,22 @@ class BaseTransformer extends TransformerAbstract
|
|||||||
return str_pad($number, 4, '0', STR_PAD_LEFT);
|
return str_pad($number, 4, '0', STR_PAD_LEFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getInvoiceId($invoiceNumber)
|
||||||
|
{
|
||||||
|
$invoiceNumber = $this->getInvoiceNumber($invoiceNumber);
|
||||||
|
return isset($this->maps[ENTITY_INVOICE][$invoiceNumber]) ? $this->maps[ENTITY_INVOICE][$invoiceNumber] : null;
|
||||||
|
}
|
||||||
|
|
||||||
protected function hasInvoice($invoiceNumber)
|
protected function hasInvoice($invoiceNumber)
|
||||||
{
|
{
|
||||||
$invoiceNumber = $this->getInvoiceNumber($invoiceNumber);
|
$invoiceNumber = $this->getInvoiceNumber($invoiceNumber);
|
||||||
return isset($this->maps[ENTITY_INVOICE][$invoiceNumber]);
|
return isset($this->maps[ENTITY_INVOICE][$invoiceNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getInvoiceClientId($invoiceNumber)
|
||||||
|
{
|
||||||
|
$invoiceNumber = $this->getInvoiceNumber($invoiceNumber);
|
||||||
|
return isset($this->maps[ENTITY_INVOICE.'_'.ENTITY_CLIENT][$invoiceNumber])? $this->maps[ENTITY_INVOICE.'_'.ENTITY_CLIENT][$invoiceNumber] : null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => $data->paid,
|
'amount' => $data->paid,
|
||||||
'payment_date_sql' => isset($data->invoice_date) ? $data->invoice_date : null,
|
'payment_date_sql' => isset($data->invoice_date) ? $data->invoice_date : null,
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => $data->paid,
|
'amount' => $data->paid,
|
||||||
'payment_date_sql' => $data->create_date,
|
'payment_date_sql' => $data->create_date,
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => $data->paid_amount,
|
'amount' => $data->paid_amount,
|
||||||
'payment_date_sql' => $this->getDate($data->last_payment_date, 'm/d/Y'),
|
'payment_date_sql' => $this->getDate($data->last_payment_date, 'm/d/Y'),
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => $data->paid_total,
|
'amount' => $data->paid_total,
|
||||||
'payment_date_sql' => $this->getDate($data->last_paid_on),
|
'payment_date_sql' => $this->getDate($data->last_paid_on),
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => $data->paid,
|
'amount' => $data->paid,
|
||||||
'payment_date_sql' => $data->date_paid,
|
'payment_date_sql' => $data->date_paid,
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => (float) $data->paid_to_date,
|
'amount' => (float) $data->paid_to_date,
|
||||||
'payment_date_sql' => $this->getDate($data->date),
|
'payment_date_sql' => $this->getDate($data->date),
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ class PaymentTransformer extends BaseTransformer
|
|||||||
'amount' => (float) $data->total - (float) $data->balance,
|
'amount' => (float) $data->total - (float) $data->balance,
|
||||||
'payment_date_sql' => $data->date_paid,
|
'payment_date_sql' => $data->date_paid,
|
||||||
'client_id' => $data->client_id,
|
'client_id' => $data->client_id,
|
||||||
'invoice_id' => $data->invoice_id,
|
'invoice_id' => $this->getInvoiceId($data->invoice_id),
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
37
app/Ninja/Import/Wave/InvoiceTransformer.php
Normal file
37
app/Ninja/Import/Wave/InvoiceTransformer.php
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?php namespace App\Ninja\Import\Wave;
|
||||||
|
|
||||||
|
use App\Ninja\Import\BaseTransformer;
|
||||||
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
class InvoiceTransformer extends BaseTransformer
|
||||||
|
{
|
||||||
|
public function transform($data)
|
||||||
|
{
|
||||||
|
if ( ! $this->getClientId($data->customer)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->hasInvoice($data->invoice_num)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Item($data, function ($data) {
|
||||||
|
return [
|
||||||
|
'client_id' => $this->getClientId($data->customer),
|
||||||
|
'invoice_number' => $this->getInvoiceNumber($data->invoice_num),
|
||||||
|
'po_number' => $data->po_so,
|
||||||
|
'invoice_date_sql' => $this->getDate($data->invoice_date),
|
||||||
|
'due_date_sql' => $this->getDate($data->due_date),
|
||||||
|
'paid' => 0,
|
||||||
|
'invoice_items' => [
|
||||||
|
[
|
||||||
|
'product_key' => $data->product,
|
||||||
|
'notes' => $data->description,
|
||||||
|
'cost' => (float) $data->amount,
|
||||||
|
'qty' => (float) $data->quantity,
|
||||||
|
]
|
||||||
|
],
|
||||||
|
];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
23
app/Ninja/Import/Wave/PaymentTransformer.php
Normal file
23
app/Ninja/Import/Wave/PaymentTransformer.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php namespace App\Ninja\Import\Wave;
|
||||||
|
|
||||||
|
use App\Ninja\Import\BaseTransformer;
|
||||||
|
use League\Fractal\Resource\Item;
|
||||||
|
|
||||||
|
class PaymentTransformer extends BaseTransformer
|
||||||
|
{
|
||||||
|
public function transform($data, $maps)
|
||||||
|
{
|
||||||
|
if ( ! $this->getInvoiceClientId($data->invoice_num)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Item($data, function ($data) use ($maps) {
|
||||||
|
return [
|
||||||
|
'amount' => (float) $data->amount,
|
||||||
|
'payment_date_sql' => $this->getDate($data->payment_date),
|
||||||
|
'client_id' => $this->getInvoiceClientId($data->invoice_num),
|
||||||
|
'invoice_id' => $this->getInvoiceId($data->invoice_num),
|
||||||
|
];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -23,11 +23,13 @@ class ImportService
|
|||||||
protected $invoiceRepo;
|
protected $invoiceRepo;
|
||||||
protected $clientRepo;
|
protected $clientRepo;
|
||||||
protected $contactRepo;
|
protected $contactRepo;
|
||||||
|
protected $processedRows = array();
|
||||||
|
|
||||||
public static $entityTypes = [
|
public static $entityTypes = [
|
||||||
ENTITY_CLIENT,
|
ENTITY_CLIENT,
|
||||||
ENTITY_CONTACT,
|
ENTITY_CONTACT,
|
||||||
ENTITY_INVOICE,
|
ENTITY_INVOICE,
|
||||||
|
ENTITY_PAYMENT,
|
||||||
ENTITY_TASK,
|
ENTITY_TASK,
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -73,31 +75,45 @@ class ImportService
|
|||||||
RESULT_FAILURE => [],
|
RESULT_FAILURE => [],
|
||||||
];
|
];
|
||||||
|
|
||||||
Excel::load($file, function ($reader) use ($source, $entityType, &$results) {
|
// Convert the data
|
||||||
|
$row_list = array();
|
||||||
|
$maps = $this->createMaps();
|
||||||
|
Excel::load($file, function ($reader) use ($source, $entityType, $maps, &$row_list, &$results) {
|
||||||
$this->checkData($entityType, count($reader->all()));
|
$this->checkData($entityType, count($reader->all()));
|
||||||
$maps = $this->createMaps();
|
|
||||||
|
|
||||||
$reader->each(function ($row) use ($source, $entityType, $maps, &$results) {
|
$reader->each(function ($row) use ($source, $entityType, $maps, &$row_list, &$results) {
|
||||||
$result = $this->saveData($source, $entityType, $row, $maps);
|
$data_index = $this->transformRow($source, $entityType, $row, $maps);
|
||||||
|
|
||||||
if ($result) {
|
if ($data_index !== false){
|
||||||
$results[RESULT_SUCCESS][] = $result;
|
if($data_index !== true){// Wasn't merged with another row
|
||||||
|
$row_list[] = array('row'=>$row, 'data_index'=>$data_index);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$results[RESULT_FAILURE][] = $row;
|
$results[RESULT_FAILURE][] = $row;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Save the data
|
||||||
|
foreach($row_list as $row_data){
|
||||||
|
$result = $this->saveData($source, $entityType, $row_data['row'], $row_data['data_index'], $maps);
|
||||||
|
if ($result) {
|
||||||
|
$results[RESULT_SUCCESS][] = $result;
|
||||||
|
} else {
|
||||||
|
$results[RESULT_FAILURE][] = $row_data['row'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function saveData($source, $entityType, $row, $maps)
|
private function transformRow($source, $entityType, $row, $maps)
|
||||||
{
|
{
|
||||||
$transformer = $this->getTransformer($source, $entityType, $maps);
|
$transformer = $this->getTransformer($source, $entityType, $maps);
|
||||||
$resource = $transformer->transform($row, $maps);
|
$resource = $transformer->transform($row, $maps);
|
||||||
|
|
||||||
if (!$resource) {
|
if (!$resource) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = $this->fractal->createData($resource)->toArray();
|
$data = $this->fractal->createData($resource)->toArray();
|
||||||
@ -108,11 +124,32 @@ class ImportService
|
|||||||
$invoice = Invoice::createNew();
|
$invoice = Invoice::createNew();
|
||||||
$data['invoice_number'] = $account->getNextInvoiceNumber($invoice);
|
$data['invoice_number'] = $account->getNextInvoiceNumber($invoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->validate($source, $data, $entityType) !== true) {
|
if ($this->validate($source, $data, $entityType) !== true) {
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($entityType == ENTITY_INVOICE){
|
||||||
|
if(empty($this->processedRows[$data['invoice_number']])){
|
||||||
|
$this->processedRows[$data['invoice_number']] = $data;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
// Merge invoice items
|
||||||
|
$this->processedRows[$data['invoice_number']]['invoice_items'] = array_merge($this->processedRows[$data['invoice_number']]['invoice_items'], $data['invoice_items']);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$this->processedRows[] = $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
end($this->processedRows);
|
||||||
|
return key($this->processedRows);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function saveData($source, $entityType, $row, $data_index, $maps)
|
||||||
|
{
|
||||||
|
$data = $this->processedRows[$data_index];
|
||||||
$entity = $this->{"{$entityType}Repo"}->save($data);
|
$entity = $this->{"{$entityType}Repo"}->save($data);
|
||||||
|
|
||||||
// if the invoice is paid we'll also create a payment record
|
// if the invoice is paid we'll also create a payment record
|
||||||
@ -204,10 +241,12 @@ class ImportService
|
|||||||
}
|
}
|
||||||
|
|
||||||
$invoiceMap = [];
|
$invoiceMap = [];
|
||||||
|
$invoiceClientMap = [];
|
||||||
$invoices = $this->invoiceRepo->all();
|
$invoices = $this->invoiceRepo->all();
|
||||||
foreach ($invoices as $invoice) {
|
foreach ($invoices as $invoice) {
|
||||||
if ($number = strtolower(trim($invoice->invoice_number))) {
|
if ($number = strtolower(trim($invoice->invoice_number))) {
|
||||||
$invoiceMap[$number] = $invoice->id;
|
$invoiceMap[$number] = $invoice->id;
|
||||||
|
$invoiceClientMap[$number] = $invoice->client_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,6 +267,7 @@ class ImportService
|
|||||||
return [
|
return [
|
||||||
ENTITY_CLIENT => $clientMap,
|
ENTITY_CLIENT => $clientMap,
|
||||||
ENTITY_INVOICE => $invoiceMap,
|
ENTITY_INVOICE => $invoiceMap,
|
||||||
|
ENTITY_INVOICE.'_'.ENTITY_CLIENT => $invoiceClientMap,
|
||||||
'countries' => $countryMap,
|
'countries' => $countryMap,
|
||||||
'countries2' => $countryMap2,
|
'countries2' => $countryMap2,
|
||||||
'currencies' => $currencyMap,
|
'currencies' => $currencyMap,
|
||||||
@ -371,6 +411,8 @@ class ImportService
|
|||||||
$this->checkData($entityType, count($data));
|
$this->checkData($entityType, count($data));
|
||||||
$maps = $this->createMaps();
|
$maps = $this->createMaps();
|
||||||
|
|
||||||
|
// Convert the data
|
||||||
|
$row_list = array();
|
||||||
foreach ($data as $row) {
|
foreach ($data as $row) {
|
||||||
if ($hasHeaders) {
|
if ($hasHeaders) {
|
||||||
$hasHeaders = false;
|
$hasHeaders = false;
|
||||||
@ -378,8 +420,21 @@ class ImportService
|
|||||||
}
|
}
|
||||||
|
|
||||||
$row = $this->convertToObject($entityType, $row, $map);
|
$row = $this->convertToObject($entityType, $row, $map);
|
||||||
$result = $this->saveData($source, $entityType, $row, $maps);
|
$data_index = $this->transformRow($source, $entityType, $row, $maps);
|
||||||
|
|
||||||
|
if ($data_index !== false) {
|
||||||
|
if($data_index !== true){// Wasn't merged with another row
|
||||||
|
$row_list[] = array('row'=>$row, 'data_index'=>$data_index);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$results[RESULT_FAILURE][] = $row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save the data
|
||||||
|
foreach($row_list as $row_data){
|
||||||
|
$result = $this->saveData($source, $entityType, $row_data['row'], $row_data['data_index'], $maps);
|
||||||
|
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$results[RESULT_SUCCESS][] = $result;
|
$results[RESULT_SUCCESS][] = $result;
|
||||||
} else {
|
} else {
|
||||||
|
@ -240,6 +240,7 @@ return array(
|
|||||||
'deleted_invoices' => 'Successfully deleted :count invoices',
|
'deleted_invoices' => 'Successfully deleted :count invoices',
|
||||||
|
|
||||||
'created_payment' => 'Successfully created payment',
|
'created_payment' => 'Successfully created payment',
|
||||||
|
'created_payments' => 'Successfully created :count payment(s)',
|
||||||
'archived_payment' => 'Successfully archived payment',
|
'archived_payment' => 'Successfully archived payment',
|
||||||
'archived_payments' => 'Successfully archived :count payments',
|
'archived_payments' => 'Successfully archived :count payments',
|
||||||
'deleted_payment' => 'Successfully deleted payment',
|
'deleted_payment' => 'Successfully deleted payment',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user