Browse Source

- Make sure new config variables are stored in configuration object.

- Make sure that roles can be selected by the user for each camt field.
- store subsequent configuration in configuration object
pull/373/head
James Cole 2 years ago
parent
commit
7999f95359
  1. 338
      app/Http/Controllers/Import/File/RoleController.php
  2. 10
      app/Http/Request/ConfigurationPostRequest.php
  3. 36
      app/Services/Shared/Configuration/Configuration.php
  4. 17
      app/Services/Shared/File/FileContentSherlock.php
  5. 205
      composer.lock
  6. 348
      config/camt.php
  7. 78
      resources/lang/en/camt.php
  8. 2
      resources/lang/en/import.php
  9. 14
      resources/views/import/004-configure/index.twig
  10. 661
      resources/views/import/005-roles/index-camt.twig

338
app/Http/Controllers/Import/File/RoleController.php

@ -28,8 +28,8 @@ use App\Exceptions\ImporterErrorException;
use App\Http\Controllers\Controller;
use App\Http\Middleware\RoleControllerMiddleware;
use App\Http\Request\RolesPostRequest;
use App\Services\CSV\Roles\RoleService;
use App\Services\Camt053\Converter;
use App\Services\CSV\Roles\RoleService;
use App\Services\Session\Constants;
use App\Services\Shared\Configuration\Configuration;
use App\Services\Storage\StorageService;
@ -116,8 +116,8 @@ class RoleController extends Controller
case 'csv':
return $this->csvPostIndex($request, $configuration);
case 'camt':
return $this->csvPostIndex($request, $configuration);
//return $this->camtPostIndex($request, $configuration);
return $this->camtPostIndex($request, $configuration);
//return $this->camtPostIndex($request, $configuration);
}
}
@ -234,12 +234,302 @@ class RoleController extends Controller
{
$mainTitle = 'Role definition';
$subTitle = 'Configure the role of each field in your camt.053 file';
// TODO read some example data from the camt.053 file
$roles = config('camt.import_roles'); // TODO maybe split up to different DataType -> Columns for Dates, Numbers, Strings -> AND OR create other roles for camt // list is imfported from csv.import_roles, without modification
// four levels in a CAMT file, level A B C D. Each level has a pre-defined set of
// available fields and information.
// TODO restore mappable checkbox from configuration
$levels = [
'A' => [
'title' => trans('camt.level_A'),
'explanation' => trans('camt.explain_A'),
'fields' => [
[
'section' => false,
'title' => 'messageId',
'roles' => config('camt.roles.level_a'),
'mappable' => false,
'selected_role' => 'note', // todo from config
'example_data' => [], // TODO make example data.
],
],
],
'B' => [
'title' => trans('camt.level_B'),
'explanation' => trans('camt.explain_B'),
'fields' => [
[
'section' => false,
'title' => 'statementCreationDate',
'roles' => config('camt.roles.dates'),
'mappable' => false,
'selected_role' => 'date_process',
'example_data' => [],
],
[
'section' => false,
'title' => 'statementAccountIban',
'selected_role' => 'account-iban',
'roles' => config('camt.roles.iban'),
'mappable' => true,
'example_data' => [],
],
[
'section' => false,
'title' => 'statementAccountNumber',
'selected_role' => 'account-number',
'roles' => config('camt.roles.account_number'),
'mappable' => true,
'example_data' => [],
],
],
],
'C' => [
'title' => trans('camt.level_C'),
'explanation' => trans('camt.explain_C'),
'fields' => [
[
'section' => false,
'title' => 'entryDate',
'selected_role' => 'date_transaction',
'roles' => config('camt.roles.dates'),
'mappable' => false,
],
[
'section' => false,
'title' => 'entryAccountServicerReference',
'selected_role' => 'external-id',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
[
'section' => false,
'title' => 'entryReference',
'selected_role' => 'internal_reference',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
[
'section' => false,
'title' => 'entryAdditionalInfo',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
//
[
'section' => true,
'title' => 'transaction',
],
// entryAmount
[
'section' => false,
'title' => 'entryAmount',
'selected_role' => 'amount',
'roles' => config('camt.roles.amount'),
'mappable' => false,
],
// entryAmountCurrency
[
'section' => false,
'title' => 'entryAmountCurrency',
'selected_role' => 'currency-code',
'roles' => config('camt.roles.currency'),
'mappable' => true,
],
// entryValueDate
[
'section' => false,
'title' => 'entryValueDate',
'selected_role' => 'date_payment',
'roles' => config('camt.roles.dates'),
'mappable' => false,
],
// entryBookingDate
[
'section' => false,
'title' => 'entryBookingDate',
'selected_role' => 'date_book',
'roles' => config('camt.roles.dates'),
'mappable' => false,
],
[
'section' => true,
'title' => 'Btc',
],
// entryBtcDomainCode
[
'section' => false,
'title' => 'entryBtcDomainCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryBtcFamilyCode
[
'section' => false,
'title' => 'entryBtcFamilyCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryBtcSubFamilyCode
[
'section' => false,
'title' => 'entryBtcSubFamilyCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
[
'section' => true,
'title' => 'opposingPart',
],
// entryDetailOpposingAccountIban
[
'section' => false,
'title' => 'entryDetailOpposingAccountIban',
'selected_role' => 'opposing-iban',
'roles' => config('camt.roles.iban'),
'mappable' => true,
],
// entryDetailOpposingAccountNumber
[
'section' => false,
'title' => 'entryDetailOpposingAccountNumber',
'selected_role' => 'opposing-number',
'roles' => config('camt.roles.account_number'),
'mappable' => true,
],
// entryDetailOpposingName
[
'section' => false,
'title' => 'entryDetailOpposingName',
'selected_role' => 'opposing-name',
'roles' => config('camt.roles.account_name'),
'mappable' => true,
],
],
],
'D' => [
'title' => trans('camt.level_D'),
'explanation' => trans('camt.explain_D'),
'fields' => [
// entryDetailAccountServicerReference
[
'section' => false,
'title' => 'entryDetailAccountServicerReference',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryDetailRemittanceInformationUnstructuredBlockMessage
[
'section' => false,
'title' => 'entryDetailRemittanceInformationUnstructuredBlockMessage',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation
[
'section' => false,
'title' => 'entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// section_transaction
[
'section' => true,
'title' => 'transaction',
],
// entryDetailAmount
[
'section' => false,
'title' => 'entryDetailAmount',
'selected_role' => 'amount',
'roles' => config('camt.roles.amount'),
'mappable' => false,
],
// entryDetailAmountCurrency
[
'section' => false,
'title' => 'entryDetailAmountCurrency',
'selected_role' => 'currency-code',
'roles' => config('camt.roles.currency'),
'mappable' => true,
],
// section_Btc
[
'section' => true,
'title' => 'Btc',
],
// entryBtcDomainCode
[
'section' => false,
'title' => 'entryBtcDomainCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryBtcFamilyCode
[
'section' => false,
'title' => 'entryBtcFamilyCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// entryBtcSubFamilyCode
[
'section' => false,
'title' => 'entryBtcSubFamilyCode',
'selected_role' => 'note',
'roles' => config('camt.roles.meta'),
'mappable' => false,
],
// section_opposingPart
[
'section' => true,
'title' => 'opposingPart',
],
// entryDetailOpposingAccountIban
[
'section' => false,
'title' => 'entryDetailOpposingAccountIban',
'selected_role' => 'opposing-iban',
'roles' => config('camt.roles.iban'),
'mappable' => true,
],
// entryDetailOpposingAccountNumber
[
'section' => false,
'title' => 'entryDetailOpposingAccountNumber',
'selected_role' => 'opposing-number',
'roles' => config('camt.roles.account_number'),
'mappable' => true,
],
// entryDetailOpposingName
[
'section' => false,
'title' => 'entryDetailOpposingName',
'selected_role' => 'opposing-name',
'roles' => config('camt.roles.account_name'),
'mappable' => true,
],
],
],
];
return view(
'import.005-roles.index-camt',
compact('mainTitle','configuration','subTitle','roles')
compact('mainTitle', 'configuration', 'subTitle', 'levels')
);
}
@ -247,10 +537,40 @@ class RoleController extends Controller
* @param RolesPostRequest $request
* @param Configuration $configuration
*
* @return void
* @return RedirectResponse
*/
private function camtPostIndex(RolesPostRequest $request, Configuration $configuration)
private function camtPostIndex(RolesPostRequest $request, Configuration $configuration): RedirectResponse
{
die('not yet implemented.'); // csvPostIndex is used
$data = $request->getAllForFile();
$needsMapping = $this->needMapping($data['do_mapping']);
$configuration->setRoles($data['roles']);
$configuration->setDoMapping($data['do_mapping']);
session()->put(Constants::CONFIGURATION, $configuration->toSessionArray());
// then this is the new, full array:
$fullArray = $configuration->toArray();
// and it can be saved on disk:
$configFileName = StorageService::storeArray($fullArray);
app('log')->debug(sprintf('Old configuration was stored under key "%s".', session()->get(Constants::UPLOAD_CONFIG_FILE)));
// this is a new config file name.
session()->put(Constants::UPLOAD_CONFIG_FILE, $configFileName);
app('log')->debug(sprintf('New configuration is stored under key "%s".', session()->get(Constants::UPLOAD_CONFIG_FILE)));
// set role config as complete.
session()->put(Constants::ROLES_COMPLETE_INDICATOR, true);
// redirect to mapping thing.
if (true === $needsMapping) {
return redirect()->route('006-mapping.index');
}
// otherwise, store empty mapping, and continue:
// set map config as complete.
session()->put(Constants::READY_FOR_CONVERSION, true);
return redirect()->route('007-convert.index');
}
}

10
app/Http/Request/ConfigurationPostRequest.php

@ -62,7 +62,11 @@ class ConfigurationPostRequest extends Request
'mapping' => [],
'do_mapping' => [],
'flow' => $this->convertToString('flow'),
'content_type' => $this->convertToString('content_type'),
'content_type' => $this->convertToString('content_type'),
// camt options
'grouped_transaction_handling' => $this->convertToString('grouped_transaction_handling'),
'use_entire_opposing_address' => $this->convertBoolean('use_entire_opposing_address'),
// duplicate detection:
'duplicate_detection_method' => $this->convertToString('duplicate_detection_method'),
@ -115,6 +119,10 @@ class ConfigurationPostRequest extends Request
'add_import_tag' => 'numeric|between:0,1',
'ignore_spectre_categories' => 'numeric|between:0,1',
// camt options, if present:
'use_entire_opposing_address' => 'numeric|between:0,1',
'grouped_transaction_handling' => 'in:single,split,group',
// duplicate detection:
'duplicate_detection_method' => 'in:cell,none,classic',
'unique_column_index' => 'numeric',

36
app/Services/Shared/Configuration/Configuration.php

@ -67,6 +67,10 @@ class Configuration
private bool $ignoreDuplicateTransactions;
private bool $ignoreSpectreCategories;
// camt configuration
private string $groupedTransactionHandling;
private bool $useEntireOpposingAddress;
// date range settings
private bool $mapAllData;
private array $mapping;
@ -118,6 +122,10 @@ class Configuration
$this->dateNotBefore = '';
$this->dateNotAfter = '';
// camt settings
$this->groupedTransactionHandling = 'single';
$this->useEntireOpposingAddress = false;
// nordigen configuration
$this->nordigenCountry = '';
$this->nordigenBank = '';
@ -198,6 +206,10 @@ class Configuration
$object->flow = $data['flow'] ?? 'file';
$object->contentType = $data['content_type'] ?? 'unknown';
// camt settings
$object->groupedTransactionHandling = $data['grouped_transaction_handling'] ?? 'single';
$object->useEntireOpposingAddress = $data['use_entire_opposing_address'] ?? false;
// other settings (are not in v1 anyway)
$object->dateRange = $data['date_range'] ?? 'all';
$object->dateRangeNumber = $data['date_range_number'] ?? 30;
@ -346,6 +358,9 @@ class Configuration
$object->dateNotBefore = $array['date_not_before'] ?? '';
$object->dateNotAfter = $array['date_not_after'] ?? '';
$object->groupedTransactionHandling = $array['grouped_transaction_handling'] ?? 'single';
$object->useEntireOpposingAddress = $array['use_entire_opposing_address'] ?? false;
// nordigen information:
$object->nordigenCountry = $array['nordigen_country'] ?? '';
$object->nordigenBank = $array['nordigen_bank'] ?? '';
@ -435,6 +450,9 @@ class Configuration
$object->nordigenRequisitions = $array['nordigen_requisitions'] ?? [];
$object->nordigenMaxDays = $array['nordigen_max_days'] ?? '90';
$object->groupedTransactionHandling = $array['grouped_transaction_handling'] ?? 'single';
$object->useEntireOpposingAddress = $array['use_entire_opposing_address'] ?? false;
// spectre + nordigen
$object->accounts = $array['accounts'] ?? [];
@ -1025,4 +1043,22 @@ class Configuration
$this->contentType = $contentType;
}
/**
* @return string
*/
public function getGroupedTransactionHandling(): string
{
return $this->groupedTransactionHandling;
}
/**
* @return bool
*/
public function isUseEntireOpposingAddress(): bool
{
return $this->useEntireOpposingAddress;
}
}

17
app/Services/Shared/File/FileContentSherlock.php

@ -30,11 +30,11 @@ use Genkgo\Camt\Reader;
*/
class FileContentSherlock
{
public $camtReader;
public Reader $camtReader;
public function __construct()
{
$this->camtReader = new \Genkgo\Camt\Reader(\Genkgo\Camt\Config::getDefault());
$this->camtReader = new Reader(Config::getDefault());
}
public function detectContentType(?string $file): string
@ -51,13 +51,6 @@ class FileContentSherlock
app('log')->debug('CAMT.053 Check on file: negative');
//app('log')->debug($e->getMessage());
}
// some pseudo code below:
/*
* $content= file_get_contents($file);
* if($this->isCamtFile($content)) {
* return 'camt';
* }
*/
return 'csv';
}
@ -75,12 +68,6 @@ class FileContentSherlock
app('log')->debug('CAMT.053 Check of content: negative');
//app('log')->debug($e->getMessage());
}
// some pseudo code below:
/*
* if($this->isCamtFile($content)) {
* return 'camt';
* }
*/
return 'csv';
}

205
composer.lock

@ -1057,22 +1057,22 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "7.5.0",
"version": "7.5.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba"
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/b50a2a1251152e43f6a37f0fa053e730a67d25ba",
"reference": "b50a2a1251152e43f6a37f0fa053e730a67d25ba",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/b964ca597e86b752cd994f27293e9fa6b6a95ed9",
"reference": "b964ca597e86b752cd994f27293e9fa6b6a95ed9",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.5",
"guzzlehttp/psr7": "^1.9 || ^2.4",
"guzzlehttp/psr7": "^1.9.1 || ^2.4.5",
"php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0",
"symfony/deprecation-contracts": "^2.2 || ^3.0"
@ -1165,7 +1165,7 @@
],
"support": {
"issues": "https://github.com/guzzle/guzzle/issues",
"source": "https://github.com/guzzle/guzzle/tree/7.5.0"
"source": "https://github.com/guzzle/guzzle/tree/7.5.1"
},
"funding": [
{
@ -1181,7 +1181,7 @@
"type": "tidelift"
}
],
"time": "2022-08-28T15:39:27+00:00"
"time": "2023-04-17T16:30:08+00:00"
},
{
"name": "guzzlehttp/promises",
@ -1269,22 +1269,22 @@
},
{
"name": "guzzlehttp/psr7",
"version": "2.4.4",
"version": "2.5.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf"
"reference": "b635f279edd83fc275f822a1188157ffea568ff6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
"reference": "3cf1b6d4f0c820a2cf8bcaec39fc698f3443b5cf",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/b635f279edd83fc275f822a1188157ffea568ff6",
"reference": "b635f279edd83fc275f822a1188157ffea568ff6",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-factory": "^1.0",
"psr/http-message": "^1.0",
"psr/http-message": "^1.1 || ^2.0",
"ralouphie/getallheaders": "^3.0"
},
"provide": {
@ -1304,9 +1304,6 @@
"bamarni-bin": {
"bin-links": true,
"forward-command": false
},
"branch-alias": {
"dev-master": "2.4-dev"
}
},
"autoload": {
@ -1368,7 +1365,7 @@
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/2.4.4"
"source": "https://github.com/guzzle/psr7/tree/2.5.0"
},
"funding": [
{
@ -1384,7 +1381,7 @@
"type": "tidelift"
}
],
"time": "2023-03-09T13:19:02+00:00"
"time": "2023-04-17T16:11:26+00:00"
},
{
"name": "guzzlehttp/uri-template",
@ -1531,16 +1528,16 @@
},
{
"name": "laravel/framework",
"version": "v10.7.1",
"version": "v10.9.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
"reference": "ddbbb2b50388721fe63312bb4469cae13163fd36"
"reference": "35078125f61ef0b125edf524de934f108d4b47fd"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/ddbbb2b50388721fe63312bb4469cae13163fd36",
"reference": "ddbbb2b50388721fe63312bb4469cae13163fd36",
"url": "https://api.github.com/repos/laravel/framework/zipball/35078125f61ef0b125edf524de934f108d4b47fd",
"reference": "35078125f61ef0b125edf524de934f108d4b47fd",
"shasum": ""
},
"require": {
@ -1727,7 +1724,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2023-04-11T14:11:49+00:00"
"time": "2023-04-25T13:47:18+00:00"
},
{
"name": "laravel/serializable-closure",
@ -3194,16 +3191,16 @@
},
{
"name": "psr/http-message",
"version": "1.1",
"version": "2.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
"shasum": ""
},
"require": {
@ -3212,7 +3209,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
"dev-master": "2.0.x-dev"
}
},
"autoload": {
@ -3227,7 +3224,7 @@
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
@ -3241,9 +3238,9 @@
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/1.1"
"source": "https://github.com/php-fig/http-message/tree/2.0"
},
"time": "2023-04-04T09:50:52+00:00"
"time": "2023-04-04T09:54:51+00:00"
},
{
"name": "psr/log",
@ -3557,16 +3554,16 @@
},
{
"name": "ramsey/uuid",
"version": "4.x-dev",
"version": "4.7.4",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
"reference": "8e955307d32dc9b6992440ff81321d3cb09db75a"
"reference": "60a4c63ab724854332900504274f6150ff26d286"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/8e955307d32dc9b6992440ff81321d3cb09db75a",
"reference": "8e955307d32dc9b6992440ff81321d3cb09db75a",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286",
"reference": "60a4c63ab724854332900504274f6150ff26d286",
"shasum": ""
},
"require": {
@ -3607,7 +3604,6 @@
"paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
"ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
},
"default-branch": true,
"type": "library",
"extra": {
"captainhook": {
@ -3634,7 +3630,7 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
"source": "https://github.com/ramsey/uuid/tree/4.x"
"source": "https://github.com/ramsey/uuid/tree/4.7.4"
},
"funding": [
{
@ -3646,7 +3642,7 @@
"type": "tidelift"
}
],
"time": "2023-03-27T22:05:11+00:00"
"time": "2023-04-15T23:01:58+00:00"
},
{
"name": "rcrowe/twigbridge",
@ -7620,40 +7616,40 @@
},
{
"name": "nunomaduro/collision",
"version": "v7.4.0",
"version": "v7.5.2",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
"reference": "42bab217d4913d6610f341d0468cec860aae165e"
"reference": "76b3cabda0aabda455fc3b9db6c3615f5a87c7ff"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/42bab217d4913d6610f341d0468cec860aae165e",
"reference": "42bab217d4913d6610f341d0468cec860aae165e",
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/76b3cabda0aabda455fc3b9db6c3615f5a87c7ff",
"reference": "76b3cabda0aabda455fc3b9db6c3615f5a87c7ff",
"shasum": ""
},
"require": {
"filp/whoops": "^2.15.1",
"filp/whoops": "^2.15.2",
"nunomaduro/termwind": "^1.15.1",
"php": "^8.1.0",
"symfony/console": "^6.2.7"
"symfony/console": "^6.2.8"
},
"conflict": {
"phpunit/phpunit": "<10.0.17"
"phpunit/phpunit": "<10.1.2"
},
"require-dev": {
"brianium/paratest": "^7.1.2",
"laravel/framework": "^10.5.1",
"laravel/pint": "^1.7.0",
"laravel/sail": "^1.21.3",
"brianium/paratest": "^7.1.3",
"laravel/framework": "^10.8.0",
"laravel/pint": "^1.9.0",
"laravel/sail": "^1.21.4",
"laravel/sanctum": "^3.2.1",
"laravel/tinker": "^2.8.1",
"nunomaduro/larastan": "^2.5.1",
"orchestra/testbench-core": "^8.2.0",
"pestphp/pest": "^2.3.0",
"phpunit/phpunit": "^10.0.19",
"sebastian/environment": "^6.0.0",
"spatie/laravel-ignition": "^2.0.0"
"nunomaduro/larastan": "^2.6.0",
"orchestra/testbench-core": "^8.5.0",
"pestphp/pest": "^2.5.2",
"phpunit/phpunit": "^10.1.1",
"sebastian/environment": "^6.0.1",
"spatie/laravel-ignition": "^2.1.0"
},
"type": "library",
"extra": {
@ -7712,20 +7708,20 @@
"type": "patreon"
}
],
"time": "2023-03-31T08:17:12+00:00"
"time": "2023-04-22T22:12:40+00:00"
},
{
"name": "nunomaduro/larastan",
"version": "2.5.1",
"version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/larastan.git",
"reference": "072e2c9566ae000bf66c92384fc933b81885244b"
"reference": "ccac5b25949576807862cf32ba1fce1769c06c42"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nunomaduro/larastan/zipball/072e2c9566ae000bf66c92384fc933b81885244b",
"reference": "072e2c9566ae000bf66c92384fc933b81885244b",
"url": "https://api.github.com/repos/nunomaduro/larastan/zipball/ccac5b25949576807862cf32ba1fce1769c06c42",
"reference": "ccac5b25949576807862cf32ba1fce1769c06c42",
"shasum": ""
},
"require": {
@ -7739,7 +7735,7 @@
"illuminate/support": "^9.47.0 || ^10.0.0",
"php": "^8.0.2",
"phpmyadmin/sql-parser": "^5.6.0",
"phpstan/phpstan": "~1.10.3"
"phpstan/phpstan": "~1.10.6"
},
"require-dev": {
"nikic/php-parser": "^4.15.2",
@ -7788,7 +7784,7 @@
],
"support": {
"issues": "https://github.com/nunomaduro/larastan/issues",
"source": "https://github.com/nunomaduro/larastan/tree/2.5.1"
"source": "https://github.com/nunomaduro/larastan/tree/v2.6.0"
},
"funding": [
{
@ -7808,7 +7804,7 @@
"type": "patreon"
}
],
"time": "2023-03-04T23:46:40+00:00"
"time": "2023-04-20T12:40:01+00:00"
},
{
"name": "phar-io/manifest",
@ -8121,16 +8117,16 @@
},
{
"name": "phpstan/phpdoc-parser",
"version": "1.18.1",
"version": "1.20.3",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "22dcdfd725ddf99583bfe398fc624ad6c5004a0f"
"reference": "6c04009f6cae6eda2f040745b6b846080ef069c2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/22dcdfd725ddf99583bfe398fc624ad6c5004a0f",
"reference": "22dcdfd725ddf99583bfe398fc624ad6c5004a0f",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/6c04009f6cae6eda2f040745b6b846080ef069c2",
"reference": "6c04009f6cae6eda2f040745b6b846080ef069c2",
"shasum": ""
},
"require": {
@ -8160,22 +8156,22 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.18.1"
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.20.3"
},
"time": "2023-04-07T11:51:11+00:00"
"time": "2023-04-25T09:01:03+00:00"
},
{
"name": "phpstan/phpstan",
"version": "1.10.13",
"version": "1.10.14",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70"
"reference": "d232901b09e67538e5c86a724be841bea5768a7c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/f07bf8c6980b81bf9e49d44bd0caf2e737614a70",
"reference": "f07bf8c6980b81bf9e49d44bd0caf2e737614a70",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/d232901b09e67538e5c86a724be841bea5768a7c",
"reference": "d232901b09e67538e5c86a724be841bea5768a7c",
"shasum": ""
},
"require": {
@ -8224,7 +8220,7 @@
"type": "tidelift"
}
],
"time": "2023-04-12T19:29:52+00:00"
"time": "2023-04-19T13:47:27+00:00"
},
{
"name": "phpstan/phpstan-deprecation-rules",
@ -8325,16 +8321,16 @@
},
{
"name": "phpunit/php-code-coverage",
"version": "10.1.0",
"version": "10.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "fc4f5ee614fa82d50ecf9014b51af0a9561f3df8"
"reference": "884a0da7f9f46f28b2cb69134217fd810b793974"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fc4f5ee614fa82d50ecf9014b51af0a9561f3df8",
"reference": "fc4f5ee614fa82d50ecf9014b51af0a9561f3df8",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/884a0da7f9f46f28b2cb69134217fd810b793974",
"reference": "884a0da7f9f46f28b2cb69134217fd810b793974",
"shasum": ""
},
"require": {
@ -8353,7 +8349,7 @@
"theseer/tokenizer": "^1.2.0"
},
"require-dev": {
"phpunit/phpunit": "^10.0"
"phpunit/phpunit": "^10.1"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@ -8391,7 +8387,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.0"
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.1"
},
"funding": [
{
@ -8399,7 +8395,7 @@
"type": "github"
}
],
"time": "2023-04-13T07:08:27+00:00"
"time": "2023-04-17T12:15:40+00:00"
},
{
"name": "phpunit/php-file-iterator",
@ -8644,16 +8640,16 @@
},
{
"name": "phpunit/phpunit",
"version": "10.1.0",
"version": "10.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5a477aea03e61329132935689ae2d73f418f5e25"
"reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5a477aea03e61329132935689ae2d73f418f5e25",
"reference": "5a477aea03e61329132935689ae2d73f418f5e25",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6f0cd95be71add539f8fd2be25b2a4a29789000b",
"reference": "6f0cd95be71add539f8fd2be25b2a4a29789000b",
"shasum": ""
},
"require": {
@ -8667,7 +8663,7 @@
"phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2",
"php": ">=8.1",
"phpunit/php-code-coverage": "^10.1",
"phpunit/php-code-coverage": "^10.1.1",
"phpunit/php-file-iterator": "^4.0",
"phpunit/php-invoker": "^4.0",
"phpunit/php-text-template": "^3.0",
@ -8725,7 +8721,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.0"
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.1.2"
},
"funding": [
{
@ -8741,7 +8737,7 @@
"type": "tidelift"
}
],
"time": "2023-04-14T05:15:09+00:00"
"time": "2023-04-22T07:38:19+00:00"
},
{
"name": "roave/security-advisories",
@ -8749,12 +8745,12 @@
"source": {
"type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git",
"reference": "9edb62ebe942c2b9bb8416a19fc8655cb78a7a91"
"reference": "5eb9b0587e4625150e4892e569bb223714c86256"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/9edb62ebe942c2b9bb8416a19fc8655cb78a7a91",
"reference": "9edb62ebe942c2b9bb8416a19fc8655cb78a7a91",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/5eb9b0587e4625150e4892e569bb223714c86256",
"reference": "5eb9b0587e4625150e4892e569bb223714c86256",
"shasum": ""
},
"conflict": {
@ -8782,7 +8778,8 @@
"automad/automad": "<1.8",
"awesome-support/awesome-support": "<=6.0.7",
"aws/aws-sdk-php": ">=3,<3.2.1",
"backdrop/backdrop": "<=1.23",
"azuracast/azuracast": "<0.18",
"backdrop/backdrop": "<1.24.2",
"badaso/core": "<2.7",
"bagisto/bagisto": "<0.1.5",
"barrelstrength/sprout-base-email": "<1.2.7",
@ -8824,9 +8821,9 @@
"concrete5/concrete5": "<=9.1.3|>= 9.0.0RC1, < 9.1.3",
"concrete5/core": "<8.5.8|>=9,<9.1",
"contao-components/mediaelement": ">=2.14.2,<2.21.1",
"contao/contao": ">=4,<4.4.56|>=4.5,<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3",
"contao/contao": ">=4,<4.4.56|>=4.5,<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4",
"contao/core": ">=2,<3.5.39",
"contao/core-bundle": "<4.9.18|>=4.10,<4.11.7|>=4.13,<4.13.3|= 4.10.0",
"contao/core-bundle": "<4.9.40|>=4.10,<4.11.7|>=4.13,<4.13.21|>=5.1,<5.1.4|= 4.10.0",
"contao/listing-bundle": ">=4,<4.4.8",
"contao/managed-edition": "<=1.5",
"craftcms/cms": "<3.7.64|>= 4.0.0-RC1, < 4.3.7|>= 4.0.0-RC1, < 4.2.1",
@ -8901,14 +8898,14 @@
"fooman/tcpdf": "<6.2.22",
"forkcms/forkcms": "<5.11.1",
"fossar/tcpdf-parser": "<6.2.22",
"francoisjacquet/rosariosis": "<10.8.2",
"francoisjacquet/rosariosis": "<10.9.3",
"frappant/frp-form-answers": "<3.1.2|>=4,<4.0.2",
"friendsofsymfony/oauth2-php": "<1.3",
"friendsofsymfony/rest-bundle": ">=1.2,<1.2.2",
"friendsofsymfony/user-bundle": ">=1.2,<1.3.5",
"friendsoftypo3/mediace": ">=7.6.2,<7.6.5",
"froala/wysiwyg-editor": "<3.2.7",
"froxlor/froxlor": "<2.0.13",
"froxlor/froxlor": "<2.0.14",
"fuel/core": "<1.8.1",
"funadmin/funadmin": "<=3.2",
"gaoming13/wechat-php-sdk": "<=1.10.2",
@ -8925,13 +8922,14 @@
"gregwar/rst": "<1.0.3",
"grumpydictator/firefly-iii": "<6",
"guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5",
"guzzlehttp/psr7": "<1.8.4|>=2,<2.1.1",
"guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5",
"harvesthq/chosen": "<1.8.7",
"helloxz/imgurl": "= 2.31|<=2.31",
"hillelcoren/invoice-ninja": "<5.3.35",
"himiklab/yii2-jqgrid-widget": "<1.0.8",
"hjue/justwriting": "<=1",
"hov/jobfair": "<1.0.13|>=2,<2.0.2",
"httpsoft/http-message": "<1.0.12",
"hyn/multi-tenant": ">=5.6,<5.7.2",
"ibexa/admin-ui": ">=4.2,<4.2.3",
"ibexa/core": ">=4,<4.0.7|>=4.1,<4.1.4|>=4.2,<4.2.3",
@ -8972,7 +8970,7 @@
"krayin/laravel-crm": "<1.2.2",
"kreait/firebase-php": ">=3.2,<3.8.1",
"la-haute-societe/tcpdf": "<6.2.22",
"laminas/laminas-diactoros": "<2.11.1",
"laminas/laminas-diactoros": "<2.18.1|>=2.24,<2.24.2|>=2.25,<2.25.2|= 2.23.0|= 2.22.0|= 2.21.0|= 2.20.0|= 2.19.0",
"laminas/laminas-form": "<2.17.1|>=3,<3.0.2|>=3.1,<3.1.1",
"laminas/laminas-http": "<2.14.2",
"laravel/fortify": "<1.11.1",
@ -9008,7 +9006,7 @@
"melisplatform/melis-front": "<5.0.1",
"mezzio/mezzio-swoole": "<3.7|>=4,<4.3",
"mgallegos/laravel-jqgrid": "<=1.3",
"microweber/microweber": "<1.3.3",
"microweber/microweber": "<1.3.4",
"miniorange/miniorange-saml": "<1.4.3",
"mittwald/typo3_forum": "<1.2.1",
"mobiledetect/mobiledetectlib": "<2.8.32",
@ -9031,6 +9029,7 @@
"notrinos/notrinos-erp": "<=0.7",
"noumo/easyii": "<=0.9",
"nukeviet/nukeviet": "<4.5.2",
"nyholm/psr7": "<1.6.1",
"nystudio107/craft-seomatic": "<3.4.12",
"nzo/url-encryptor-bundle": ">=4,<4.3.2|>=5,<5.0.1",
"october/backend": "<1.1.2",
@ -9061,6 +9060,7 @@
"personnummer/personnummer": "<3.0.2",
"phanan/koel": "<5.1.4",
"php-mod/curl": "<2.3.2",
"phpbb/phpbb": ">=3.2,<3.2.10|>=3.3,<3.3.1",
"phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7",
"phpmailer/phpmailer": "<6.5",
"phpmussel/phpmussel": ">=1,<1.6",
@ -9086,7 +9086,7 @@
"prestashop/blockwishlist": ">=2,<2.1.1",
"prestashop/contactform": ">=1.0.1,<4.3",
"prestashop/gamification": "<2.3.2",
"prestashop/prestashop": "<8.0.1",
"prestashop/prestashop": "<8.0.4",
"prestashop/productcomments": "<5.0.2",
"prestashop/ps_emailsubscription": "<2.6.1",
"prestashop/ps_facetedsearch": "<3.4.1",
@ -9116,8 +9116,8 @@
"scheb/two-factor-bundle": ">=0,<3.26|>=4,<4.11",
"sensiolabs/connect": "<4.2.3",
"serluck/phpwhois": "<=4.2.6",
"shopware/core": "<=6.4.18",
"shopware/platform": "<=6.4.18",
"shopware/core": "<=6.4.20",
"shopware/platform": "<=6.4.20",
"shopware/production": "<=6.3.5.2",
"shopware/shopware": "<=5.7.14",
"shopware/storefront": "<=6.4.8.1",
@ -9146,6 +9146,7 @@
"simplesamlphp/simplesamlphp-module-openidprovider": "<0.9",
"simplito/elliptic-php": "<1.0.6",
"sitegeist/fluid-components": "<3.5",
"slim/psr7": "<1.6.1",
"slim/slim": "<2.6",
"smarty/smarty": "<3.1.48|>=4,<4.3.1",
"snipe/snipe-it": "<=6.0.14|>= 6.0.0-RC-1, <= 6.0.0-RC-5",
@ -9340,7 +9341,7 @@
"type": "tidelift"
}
],
"time": "2023-04-13T17:04:11+00:00"
"time": "2023-04-25T20:04:17+00:00"
},
{
"name": "sebastian/cli-parser",

348
config/camt.php

@ -22,83 +22,285 @@
declare(strict_types=1);
use App\Services\CSV\Conversion\Task\Accounts;
use App\Services\CSV\Conversion\Task\Amount;
use App\Services\CSV\Conversion\Task\Currency;
use App\Services\CSV\Conversion\Task\EmptyAccounts;
use App\Services\CSV\Conversion\Task\EmptyDescription;
use App\Services\CSV\Conversion\Task\PositiveAmount;
use App\Services\CSV\Conversion\Task\Tags;
// TODO -> clean up, remove CSV parts... add missing parts
// to prevent duplicates first define some roles?
$availableRoles = [
'_ignore' => [
'mappable' => false,
'pre-process-map' => false,
'field' => 'ignored',
'converter' => 'Ignore',
'mapper' => null,
'append_value' => false,
],
'note' => [
'mappable' => false,
'pre-process-map' => false,
'field' => 'note',
'converter' => 'CleanNlString',
'append_value' => true,
],
'date_transaction' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date',
'append_value' => false,
],
'date_interest' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-interest',
'append_value' => false,
],
'date_book' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-book',
'append_value' => false,
],
'date_process' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-process',
'append_value' => false,
],
'date_due' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-due',
'append_value' => false,
],
'date_payment' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-payment',
'append_value' => false,
],
'date_invoice' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Date',
'field' => 'date-invoice',
'append_value' => false,
],
'account-iban' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'asset-account-iban',
'converter' => 'Iban',
'mapper' => 'AssetAccounts',
'append_value' => false,
],
'opposing-iban' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'opposing-account-iban',
'converter' => 'Iban',
'mapper' => 'OpposingAccounts',
'append_value' => false,
],
'account-number' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'asset-account-number',
'converter' => 'CleanString',
'mapper' => 'AssetAccounts',
'append_value' => false,
],
'opposing-number' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'opposing-account-number',
'converter' => 'CleanString',
'mapper' => 'OpposingAccounts',
'append_value' => false,
],
'external-id' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'CleanString',
'field' => 'external-id',
'append_value' => false,
],
'external-url' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'CleanUrl',
'field' => 'external-url',
'append_value' => false,
],
'internal_reference' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Description',
'field' => 'internal_reference',
'append_value' => true,
],
'amount' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Amount',
'field' => 'amount',
'append_value' => false,
],
'amount_debit' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'AmountDebit',
'field' => 'amount_debit',
'append_value' => false,
],
'amount_credit' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'AmountCredit',
'field' => 'amount_credit',
'append_value' => false,
],
'amount_negated' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'AmountNegated',
'field' => 'amount_negated',
'append_value' => false,
],
'amount_foreign' => [
'mappable' => false,
'pre-process-map' => false,
'converter' => 'Amount',
'field' => 'amount_foreign',
'append_value' => false,
],
'currency-id' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'currency',
'converter' => 'CleanId',
'mapper' => 'TransactionCurrencies',
'append_value' => false,
],
'currency-name' => [
'mappable' => true,
'pre-process-map' => false,
'converter' => 'CleanString',
'field' => 'currency',
'mapper' => 'TransactionCurrencies',
'append_value' => false,
],
'currency-code' => [
'mappable' => true,
'pre-process-map' => false,
'converter' => 'CleanString',
'field' => 'currency',
'mapper' => 'TransactionCurrencies',
'append_value' => false,
],
'foreign-currency-code' => [
'mappable' => true,
'pre-process-map' => false,
'converter' => 'CleanString',
'field' => 'foreign_currency',
'mapper' => 'TransactionCurrencies',
'append_value' => false,
],
'currency-symbol' => [
'mappable' => true,
'pre-process-map' => false,
'converter' => 'CleanString',
'field' => 'currency',
'mapper' => 'TransactionCurrencies',
'append_value' => false,
],
'account-name' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'asset-account-name',
'converter' => 'CleanString',
'mapper' => 'AssetAccounts',
'append_value' => false,
],
'opposing-name' => [
'mappable' => true,
'pre-process-map' => false,
'field' => 'opposing-account-name',
'converter' => 'CleanString',
'mapper' => 'OpposingAccounts',
'append_value' => false,
],
];
return [
// csv config
'classic_roles' => [
'original-source' => 'original_source',
'sepa-cc' => 'sepa_cc',
'sepa-ct-op' => 'sepa_ct_op',
'sepa-ct-id' => 'sepa_ct_id',
'sepa-db' => 'sepa_db',
'sepa-country' => 'sepa_country',
'sepa-ep' => 'sepa_ep',
'sepa-ci' => 'sepa_ci',
'sepa-batch-id' => 'sepa_batch_id',
'internal-reference' => 'internal_reference',
'date-interest' => 'date_interest',
'date-invoice' => 'date_invoice',
'date-book' => 'date_book',
'date-payment' => 'date_payment',
'date-process' => 'date_process',
'date-due' => 'date_due',
'date-transaction' => 'date_transaction',
],
'transaction_tasks' => [
Amount::class,
Tags::class,
Currency::class,
Accounts::class,
PositiveAmount::class,
EmptyDescription::class,
EmptyAccounts::class,
// roles for the header:
'roles' => [
'level_a' => [
'_ignore' => $availableRoles['_ignore'],
'note' => $availableRoles['note'],
],
// roles for any date field
'dates' => [
'_ignore' => $availableRoles['_ignore'],
'date_transaction' => $availableRoles['date_transaction'],
'date_interest' => $availableRoles['date_interest'],
'date_book' => $availableRoles['date_book'],
'date_process' => $availableRoles['date_process'],
'date_due' => $availableRoles['date_due'],
'date_payment' => $availableRoles['date_payment'],
'date_invoice' => $availableRoles['date_invoice'],
],
// roles for IBAN fields
'iban' => [
'_ignore' => $availableRoles['_ignore'],
'account-iban' => $availableRoles['account-iban'],
'opposing-iban' => $availableRoles['opposing-iban'],
],
// account number field roles
'account_number' => [
'_ignore' => $availableRoles['_ignore'],
'account-number' => $availableRoles['account-number'],
'opposing-number' => $availableRoles['opposing-number'],
],
'account_name' => [
'_ignore' => $availableRoles['_ignore'],
'account-name' => $availableRoles['account-name'],
'opposing-name' => $availableRoles['opposing-name'],
],
// roles for meta data
'meta' => [
'_ignore' => $availableRoles['_ignore'],
'note' => $availableRoles['note'],
'external-id' => $availableRoles['external-id'],
'external-url' => $availableRoles['external-url'],
'internal_reference' => $availableRoles['internal_reference'],
],
'amount' => [
'_ignore' => $availableRoles['_ignore'],
'amount' => $availableRoles['amount'],
'amount_debit' => $availableRoles['amount_debit'],
'amount_credit' => $availableRoles['amount_credit'],
'amount_negated' => $availableRoles['amount_negated'],
'amount_foreign' => $availableRoles['amount_foreign'],
],
'currency' => [
'_ignore' => $availableRoles['_ignore'],
'currency-id' => $availableRoles['currency-id'],
'currency-name' => $availableRoles['currency-name'],
'currency-symbol' => $availableRoles['currency-symbol'],
'currency-code' => $availableRoles['currency-code'],
'foreign-currency-code' => $availableRoles['foreign-currency-code'],
],
],
/*
* Configuration for possible column roles.
*
* The key is the short name for the column role. There are five values, which mean this:
*
* 'mappable'
* Whether or not the value in the CSV column can be linked to an existing value in your
* Firefly database. For example: account names can be linked to existing account names you have already
* so double entries cannot occur. This process is called "mapping". You have to make each unique value in your
* CSV file to an existing entry in your database. For example, map all account names in your CSV file to existing
* accounts. If you have an entry that does not exist in your database, you can set Firefly to ignore it, and it will
* create it.
*
* 'pre-process-map'
* In the case of tags, there are multiple values in one csv column (for example: "expense groceries snack" in one column).
* This means the content of the column must be "pre processed" aka split in parts so the importer can work with the data.
*
* 'pre-process-mapper'
* This is the class that will actually do the pre-processing.
*
* 'field'
* I don't believe this value is used any more, but I am not sure.
*
* 'converter'
* The converter is a class in app/Service/Camt/Converter that converts the given value into an object Firefly understands.
* The CategoryName converter can convert a category name into an actual category. This converter will take a mapping
* into account: if you mapped "Groceries" to category "Groceries" the converter will simply return "Groceries" instead of
* trying to make a new category also named Groceries.
*
* 'mapper'
* When you map data (see "mappable") you need a list of stuff you can map to. If you say a certain column is mappable
* and the column contains "category names", the mapper will be "Category" and it will give you a list of possible categories.
* This way the importer always presents you with a valid list of things to map to.
*
*
*
*/
'import_roles' => [ // TODO add group of roles here
// TODO remove me
'import_roles' => [
'_ignore' => [
'mappable' => false,
'pre-process-map' => false,

78
resources/lang/en/camt.php

@ -24,37 +24,53 @@
declare(strict_types=1);
return [
// level info
'level_A' => 'Group header',
'level_B' => 'Statement',
'level_C' => 'Booking',
'level_D' => 'Booking details',
// level explanation
'explain_A' => 'Global information for all transactions in this camt.053 file.',
'explain_B' => 'Information about the account. The amount of possible "Statements" in a file depends on the implementation-standard used. Some banks only allow one statement per file.',
'explain_C' => 'Information about each booking. A booking might consist of several transactions. If you have chosen not to split grouped bookings the next level\'s can\'t be assigned a role.',
'explain_D' => 'Information about each transaction inside a booking. Consists of one or multiple entries per booking.',
// field description for camt.053 import:
'field_messageId' => 'Message ID',
'field_messageCreationDate' => 'Creation Date',
'field_messagePageNr' => 'Page Number',
'field_statementId' => 'Statement ID',
'field_statementAccountIban' => 'Statement Account IBAN',
'field_statementAccountIban_description' => 'If no match, the fallback will be used',
'field_statementAccountNumber' => 'Statement Account Number',
'field_statementCreationDate' => 'Creation Date',
'field_entryDate' => 'Entry Date',
'field_entryAccountServicerReference' => 'Accounter Service Reference',
'field_entryAccountServicerReference_description' => 'Mostly the public "reference" number',
'field_entryReference' => 'Reference',
'field_entryAdditionalInfo' => 'Additional Info',
'field_entryAmount' => 'Amount',
'field_entryAmountCurrency' => 'Currency Code',
'field_entryValueDate' => 'Value Date (Interest Calculation date)',
'field_entryBookingDate' => 'Booking Date',
'section_Btc' => 'Bank Transaction Code',
'section_opposingPart' => 'Opposing Part',
'field_entryBtcDomainCode' => 'Domain Code',
'field_entryBtcFamilyCode' => 'Family Code',
'field_entryBtcSubFamilyCode' => 'SubFamily Code',
'field_entryDetailOpposingAccountIban' => 'Opposing Account IBAN',
'field_entryDetailOpposingAccountNumber' => 'Opposing Account Number',
'field_entryDetailOpposingName' => 'Opposing Name',
'field_entryDetailAmount' => 'Amount',
'field_entryDetailAmountCurrency' => 'Currency Code',
'section_transaction' => 'Transaction',
'field_entryDetailAccountServicerReference' => 'Accounter Service Reference',
'field_entryDetailRemittanceInformationUnstructuredBlockMessage' => 'Unstructured Message',
'field_entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation' => 'Structured Message',
'field_messageId' => 'Message ID',
'field_messageCreationDate' => 'Creation Date',
'field_messagePageNr' => 'Page Number',
'field_statementId' => 'Statement ID',
'field_statementAccountIban' => 'Statement Account IBAN',
'field_statementAccountNumber' => 'Statement Account Number',
'field_statementCreationDate' => 'Statement creation date',
'field_entryDate' => 'Entry Date',
'field_entryAccountServicerReference' => 'Accounter Service Reference',
'field_entryAccountServicerReference_description' => 'Mostly the public "reference" number',
'field_entryReference' => 'Reference',
'field_entryAdditionalInfo' => 'Additional Info',
'field_entryAmount' => 'Amount',
'field_entryAmountCurrency' => 'Currency Code',
'field_entryValueDate' => 'Value Date (Interest Calculation date)',
'field_entryBookingDate' => 'Booking Date',
'section_Btc' => 'Bank Transaction Code',
'section_opposingPart' => 'Opposing Part',
'field_entryBtcDomainCode' => 'Domain Code',
'field_entryBtcFamilyCode' => 'Family Code',
'field_entryBtcSubFamilyCode' => 'SubFamily Code',
'field_entryDetailOpposingAccountIban' => 'Opposing Account IBAN',
'field_entryDetailOpposingAccountNumber' => 'Opposing Account Number',
'field_entryDetailOpposingName' => 'Opposing Name',
'field_entryDetailAmount' => 'Amount',
'field_entryDetailAmountCurrency' => 'Currency Code',
'section_transaction' => 'Transaction',
'field_entryDetailAccountServicerReference' => 'Accounter Service Reference',
'field_entryDetailRemittanceInformationUnstructuredBlockMessage' => 'Unstructured Message',
'field_entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation' => 'Structured Message',
// explanations
'field_statementCreationDate_description' => 'This date may refer to the creation date of the file, not of any transactions.',
'field_statementAccountIban_description' => 'If no match is found, the fallback account will be used.',
];

2
resources/lang/en/import.php

@ -51,7 +51,7 @@ return [
'column_date_interest' => 'Interest calculation date',
'column_date_book' => 'Transaction booking date',
'column_date_process' => 'Transaction process date',
'column_date_transaction' => 'Date',
'column_date_transaction' => 'Transaction date',
'column_date_due' => 'Transaction due date',
'column_date_payment' => 'Transaction payment date',
'column_date_invoice' => 'Transaction invoice date',

14
resources/views/import/004-configure/index.twig

@ -55,7 +55,7 @@
{% if 'file' == flow %}
<p>
{% if 'camt' == configuration.getContentType %}
Even if camt.053 is a defined standard, you might want to customize. Some of the most important settings are below.
Even though camt.053 is a defined standard, you might want to customize. Some of the most important settings are below.
They apply to all records in the uploaded files. If you would like some support, you won't find anything at <a
href="https://docs.firefly-iii.org/data-importer/usage/configure/" target="_blank">
this page.</a> right now.
@ -201,18 +201,6 @@
value="group">Drop the Level-D Data and take the sum of all amounts (loss of details, not recommended)
</option>
</select>
<!--<div class="form-check">
<input class="form-check-input"
{% if configuration.useSplit or null == configuration %}checked{% endif %}
type="checkbox" id="usesplit" name="usesplit" value="1"
aria-describedby="usesplitHelp">
<label class="form-check-label" for="usesplit">
Yes
</label>
<small id="usesplitHelp" class="form-text text-muted">
<br>Choose how you want Firefly III to create handle grouped bookings (e.g. if a Level-C Entry contains multiple Level-D Entries)
</small>
</div>-->
</div>
</div>
<div class="form-group row mb-3">

661
resources/views/import/005-roles/index-camt.twig

@ -15,16 +15,11 @@
</div>
<div class="card-body">
<p>
As there are different implementation-standards, some fields used may vary.
CAMT files come in a few "layers" each with their own content.
Your options per field may be limited. Firefly III will not be able to
store all content of a CAMT file. If you feel your choices are limited, please
open an issue.
</p>
<!--<p>
Each field in your importable file has a role, it contains a specific type of content.
By configuring these roles here, you tell the importer how to approach and treat
the data in each field. <a target="_blank"
href="https://docs.firefly-iii.org/data-importer/usage/roles/">Read
the documentation</a> to learn more
about this process.
</p>-->
</div>
</div>
</div>
@ -57,34 +52,106 @@
<div class="card-body">
<form method="post" action="{{ route('005-roles.post') }}" accept-charset="UTF-8">
<input type="hidden" name="_token" value="{{ csrf_token() }}"/>
<h4>Level A (Group Header)</h4>
<p>
<b>Message-Layer</b>: Global information for all transactions in this camt.053 file.
<br><span class="text-muted small">Those data aren't used by an average user.</span>
</p>
<table class="table">
<tr>
<th width="400">Field Name<br><!--<span class="text-muted small">XML path</span>--></th>
<th width="200">Example Data</th>
<th width="300">Role</th>
<th>Map data?</th>
</tr>
<tr>
<td>
{{ helper.field("messageId") }}
{{ helper.description("messageId") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, messageId) }}
</td>
<td>
{{ helper.domapping("messageId") }}
</td>
</tr>
<!--<tr>
{% for key, level in levels %}
<h4>Level {{ key }}: {{ level.title }}</h4>
<p>
{{ level.title }}: {{ level.explanation }}
</p>
<table class="table">
<thead>
<tr>
<th style="width:30%;">Field<br><!--<span class="text-muted small">XML path</span>--></th>
<th style="width:30%;">Example data</th>
<th>Firefly III role</th>
<th style="width:10%">Map data?</th>
</tr>
</thead>
<tbody>
{% for field in level.fields %}
{% if true == field.section %}
<tr>
<th colspan="4">{{ trans('camt.section_' ~ field.title) }}</th>
</tr>
{% endif %}
{% if false == field.section %}
<tr>
<td>
{{ trans('camt.field_'~field.title) }}
{% if trans('camt.field_'~field.title~'_description') != 'camt.field_'~field.title~'_description' %}
<br><span class="text-muted small">{{ trans('camt.field_'~field.title~'_description') }}</span>
{% endif %}
</td>
<td>
{% if 0 == field.examples|length %}
<small class="text-muted"><em>(no example data)</em></small>
{% endif %}
{% if 0 != field.examples|length %}
TODO examples
{% endif %}
</td>
<td>
{% if 0 == field.roles|length %}
<small class="text-muted"><em>(no roles available)</em></small>
{% endif %}
{% if 0 != field.roles|length %}
<select name="roles[{{ field.title }}]" id="roles_{{ field.title }}" class="form-control">
{% for roleKey, role in field.roles %}
<option value="{{ roleKey }}" label="{{ trans('import.column_'~roleKey) }}"
{% if field.selected_role == roleKey %}selected="selected"{% endif %}>
{{ trans('import.column_'~roleKey) }}
</option>
{% endfor %}
</select>
{% endif %}
</td>
<td>
{% if true == field.mappable %}
<label for="do_mapping_{{ field.title }}">
<input type="checkbox" name="do_mapping[{{ field.title }}]" id="do_mapping_{{ field.title }}"
value="1"/>
</label>
{% endif %}
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
{% endfor %}
<button type="submit" class="float-end btn btn-primary">Submit &rarr;</button>
</form>
</div>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-10 offset-lg-1">
<div class="card">
<div class="card-body">
<div class="btn-group btn-group-sm">
<a href="{{ route('back.config') }}" class="btn btn-secondary"><span
class="fas fa-arrow-left"></span> Go back to configuration</a>
<a href="{{ route('flush') }}" class="btn btn-danger btn-sm"><span
class="fas fa-redo-alt"></span> Start over</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!--
<div class="row">
<div class="col-lg-6">
</div>
<div class="col-lg-6">
</div>
</div>
-->
<!--<tr>
{{ helper.field("field_messageCreationDate") }}
{% if examples[index]|length > 0 %}
{% for example in examples[index] %}
@ -95,8 +162,8 @@
<td>
{% if index == configuration.getUniqueColumnIndex and 'cell' == configuration.getDuplicateDetectionMethod %}
{#
User cannot select a role because its the unique column so it MUST be this role.
#}
User cannot select a role because its the unique column so it MUST be this role.
#}
<p class="form-text">
<span class="text-muted small">
This column is your unique identifier, so it will be fixed to
@ -138,8 +205,8 @@
<td>
{% if index == configuration.getUniqueColumnIndex and 'cell' == configuration.getDuplicateDetectionMethod %}
{#
User cannot select a role because its the unique column so it MUST be this role.
#}
User cannot select a role because its the unique column so it MUST be this role.
#}
<p class="form-text">
<span class="text-muted small">
This column is your unique identifier, so it will be fixed to
@ -170,517 +237,5 @@
</label>
</td>
</tr>-->
</table>
<h4>Level B (Statement)</h4>
<p>
<b>Account-Layer</b>: Informations about the banking account concerned<br>
<span class="text-muted small">The amount of possible "Statements" in a file depends on the implementation-standard used. Some banks only allow one statement per file</span>.
</p>
<table class="table">
<tr>
<th width="400">Field Name<br><!--<span class="text-muted small">XML path</span>--></th>
<th width="200">Example Data</th>
<th width="300">Role</th>
<th>Map data?</th>
</tr>
<tr>
<td>
{{ helper.field("statementCreationDate") }}
{{ helper.description("statementCreationDate") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "statementCreationDate") }}
</td>
<td>
{{ helper.domapping("statementCreationDate") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("statementAccountIban") }}
{{ helper.description("statementAccountIban") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "statementAccountIban") }}
</td>
<td>
{{ helper.domapping("statementAccountIban") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("statementAccountNumber") }}
{{ helper.description("statementAccountIban") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "statementAccountNumber") }}
</td>
<td>
{{ helper.domapping("statementAccountNumber") }}
</td>
</tr>
</table>
<h4>Level C (Entry)</h4>
<p>
<b>Amount-Level</b>: Informations about the booking itself. Take note, that a booking might be a grop of several transactions.
</p>
TBD: ⚠️ You have chosen not to split grouped bookings, so fields of "Level D (Entry Details" can't be assigned to a role. If this is a mistake, correct your setting on the previous page.
<p>
</p>
<table class="table">
<tr>
<th width="400">Field Name<br><!--<span class="text-muted small">XML path</span>--></th>
<th width="200">Example Data</th>
<th width="300">Role</th>
<th>Map data?</th>
</tr>
<tr>
<td>
{{ helper.field("entryDate") }}
{{ helper.description("entryDate") }}<br>
if multiple records, behavior DEPENDS ON CONFIG
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDate") }}
</td>
<td>
{{ helper.domapping("entryDate") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryAccountServicerReference") }}
{{ helper.description("entryAccountServicerReference") }}<br>
if multiple records, behavior DEPENDS ON CONFIG
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryAccountServicerReference") }}
</td>
<td>
{{ helper.domapping("entryAccountServicerReference") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryReference") }}
{{ helper.description("entryReference") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryReference") }}
</td>
<td>
{{ helper.domapping("entryReference") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryAdditionalInfo") }}
{{ helper.description("entryAdditionalInfo") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryAdditionalInfo") }}
</td>
<td>
{{ helper.domapping("entryAdditionalInfo") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_transaction') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryAmount") }}
{{ helper.description("entryAmount") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryAmount") }}
</td>
<td>
{{ helper.domapping("entryAmount") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryAmountCurrency") }}
{{ helper.description("entryAmountCurrency") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryAmountCurrency") }}
</td>
<td>
{{ helper.domapping("entryAmountCurrency") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryValueDate") }}
{{ helper.description("entryValueDate") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryValueDate") }}
</td>
<td>
{{ helper.domapping("entryValueDate") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryBookingDate") }}
{{ helper.description("entryBookingDate") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBookingDate") }}
</td>
<td>
{{ helper.domapping("entryBookingDate") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_Btc') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryBtcDomainCode") }}
{{ helper.description("entryBtcDomainCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcDomainCode") }}
</td>
<td>
{{ helper.domapping("entryBtcDomainCode") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryBtcFamilyCode") }}
{{ helper.description("entryBtcFamilyCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcFamilyCode") }}
</td>
<td>
{{ helper.domapping("entryBtcFamilyCode") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryBtcSubFamilyCode") }}
{{ helper.description("entryBtcSubFamilyCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcSubFamilyCode") }}
</td>
<td>
{{ helper.domapping("entryBtcSubFamilyCode") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_opposingPart') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingAccountIban") }}
{{ helper.description("entryDetailOpposingAccountIban") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingAccountIban") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingAccountIban") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingAccountNumber") }}
{{ helper.description("entryDetailOpposingAccountNumber") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingAccountNumber") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingAccountNumber") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingName") }}
{{ helper.description("entryDetailOpposingName") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingName") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingName") }}
</td>
</tr>
</table>
<h4>Level D (Entry Details)</h4>
<p>
<b>Amount-Details</b>: Detailed informations about the transaction/s within a Entry. There might be one record with details to the Entry or multiple transactions.<br>These fields can't be assigned if "Use split transaction" is disabled.
</p>
<table class="table">
<tr>
<th width="400">Field Name<br><!--<span class="text-muted small">XML path</span>--></th>
<th width="200">Example Data</th>
<th width="300">Role</th>
<th>Map data?</th>
</tr>
<tr>
<td>
{{ helper.field("entryDetailAccountServicerReference") }}
{{ helper.description("entryDetailAccountServicerReference") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailAccountServicerReference") }}
</td>
<td>
{{ helper.domapping("entryDetailAccountServicerReference") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailRemittanceInformationUnstructuredBlockMessage") }}
{{ helper.description("entryDetailRemittanceInformationUnstructuredBlockMessage") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailRemittanceInformationUnstructuredBlockMessage") }}
</td>
<td>
{{ helper.domapping("entryDetailRemittanceInformationUnstructuredBlockMessage") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation") }}
{{ helper.description("entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation") }}
</td>
<td>
{{ helper.domapping("entryDetailRemittanceInformationStructuredBlockAdditionalRemittanceInformation") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_transaction') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryDetailAmount") }}
{{ helper.description("entryDetailAmount") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailAmount") }}
</td>
<td>
{{ helper.domapping("entryDetailAmount") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailAmountCurrency") }}
{{ helper.description("entryDetailAmountCurrency") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailAmountCurrency") }}
</td>
<td>
{{ helper.domapping("entryDetailAmountCurrency") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_Btc') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryBtcDomainCode") }}
{{ helper.description("entryBtcDomainCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcDomainCode") }}
</td>
<td>
{{ helper.domapping("entryBtcDomainCode") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryBtcFamilyCode") }}
{{ helper.description("entryBtcFamilyCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcFamilyCode") }}
</td>
<td>
{{ helper.domapping("entryBtcFamilyCode") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryBtcSubFamilyCode") }}
{{ helper.description("entryBtcSubFamilyCode") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryBtcSubFamilyCode") }}
</td>
<td>
{{ helper.domapping("entryBtcSubFamilyCode") }}
</td>
</tr>
<tr>
<th colspan="4">{{ trans('camt.section_opposingPart') }}</th>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingAccountIban") }}
{{ helper.description("entryDetailOpposingAccountIban") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingAccountIban") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingAccountIban") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingAccountNumber") }}
{{ helper.description("entryDetailOpposingAccountNumber") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingAccountNumber") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingAccountNumber") }}
</td>
</tr>
<tr>
<td>
{{ helper.field("entryDetailOpposingName") }}
{{ helper.description("entryDetailOpposingName") }}
</td>
<td>
{{ helper.examples() }}
</td>
<td>
{{ helper.roleselection(roles, "entryDetailOpposingName") }}
</td>
<td>
{{ helper.domapping("entryDetailOpposingName") }}
</td>
</tr>
</table>
<button type="submit" class="float-end btn btn-primary">Submit &rarr;</button>
</form>
</div>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-lg-10 offset-lg-1">
<div class="card">
<div class="card-body">
<div class="btn-group btn-group-sm">
<a href="{{ route('back.config') }}" class="btn btn-secondary"><span
class="fas fa-arrow-left"></span> Go back to configuration</a>
<a href="{{ route('flush') }}" class="btn btn-danger btn-sm"><span
class="fas fa-redo-alt"></span> Start over</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!--
<div class="row">
<div class="col-lg-6">
</div>
<div class="col-lg-6">
</div>
</div>
-->
{% endblock %}
Loading…
Cancel
Save