Przeglądaj źródła

B3 new system to multiple itens in one field using (;) as a saparator

EduLascala 4 tygodni temu
rodzic
commit
02442fdf37
2 zmienionych plików z 240 dodań i 25 usunięć
  1. 120 0
      models/CprModel.php
  2. 120 25
      services/B3CprService.php

+ 120 - 0
models/CprModel.php

@@ -66,6 +66,8 @@ class CprModel
 
     public function create(array $data, int $statusId, int $paymentId): array
     {
+        $data = $this->flattenB3Arrays($data);
+
         $meta = $this->getColumnsMeta();
 
         $columns = [];
@@ -107,6 +109,10 @@ class CprModel
                 $value = $this->normalizeChildrenCodes($value);
             }
 
+            if (in_array($column, $this->getSemicolonListColumns(), true)) {
+                $value = $this->normalizeSemicolonList($value, $column);
+            }
+
             $columns[] = '"' . $column . '"';
             $placeholders[] = ':' . $column;
             $params[$column] = $value;
@@ -162,6 +168,120 @@ class CprModel
         throw new \InvalidArgumentException('cpr_children_codes must be a non-empty string or array of strings');
     }
 
+    private function normalizeSemicolonList($value, string $field): string
+    {
+        if (is_array($value)) {
+            $items = array_map(static fn($v) => trim((string)$v), array_values($value));
+            $items = array_values(array_filter($items, static fn($v) => $v !== ''));
+            if (!$items) {
+                throw new \InvalidArgumentException("{$field} must not be empty");
+            }
+            return implode('; ', $items);
+        }
+
+        if (is_string($value)) {
+            $trimmed = trim($value);
+            if ($trimmed === '') {
+                throw new \InvalidArgumentException("{$field} must not be empty");
+            }
+
+            $parts = preg_split('/\s*;\s*/', $trimmed) ?: [];
+            $parts = array_map(static fn($v) => trim((string)$v), $parts);
+            $parts = array_values(array_filter($parts, static fn($v) => $v !== ''));
+            return implode('; ', $parts);
+        }
+
+        throw new \InvalidArgumentException("{$field} must be a non-empty string or array of strings");
+    }
+
+    private function getSemicolonListColumns(): array
+    {
+        return [
+            'cpr_collateral_type_code',
+            'cpr_collateral_type_name',
+            'cpr_constitution_process_indicator',
+            'cpr_otc_bondsman_account_code',
+            'cpr_issuer_name',
+            'cpr_issuers_document_number',
+            'cpr_issuers_person_type_acronym',
+            'cpr_issuer_legal_nature_code',
+            'cpr_issuers_state_acronym',
+            'cpr_issuers_city_name',
+            'cpr_production_place_name',
+            'cpr_property_registration_number',
+            'cpr_notary_name',
+            'cpr_total_production_area_in_hectares_number',
+            'cpr_total_area_in_hectares_number',
+            'cpr_car_code',
+            'cpr_latitude_code',
+            'cpr_longitude_code',
+            'cpr_zip_code',
+        ];
+    }
+
+    private function flattenB3Arrays(array $data): array
+    {
+        if (!array_key_exists('collaterals', $data) && !array_key_exists('issuers', $data) && !array_key_exists('productionPlaces', $data)) {
+            return $data;
+        }
+
+        if (array_key_exists('collaterals', $data) && !array_key_exists('cpr_collateral_type_code', $data)) {
+            $collaterals = $data['collaterals'];
+            if (is_array($collaterals) && $collaterals && $this->isAssoc($collaterals)) {
+                $collaterals = [$collaterals];
+            }
+
+            if (is_array($collaterals)) {
+                $data['cpr_collateral_type_code'] = array_map(static fn($c) => $c['collateralTypeCode'] ?? null, $collaterals);
+                $data['cpr_collateral_type_name'] = array_map(static fn($c) => $c['collateralTypeName'] ?? null, $collaterals);
+                $data['cpr_constitution_process_indicator'] = array_map(static fn($c) => $c['constitutionProcessIndicator'] ?? null, $collaterals);
+                $data['cpr_otc_bondsman_account_code'] = array_map(static fn($c) => $c['otcBondsmanAccountCode'] ?? null, $collaterals);
+            }
+        }
+
+        if (array_key_exists('issuers', $data) && !array_key_exists('cpr_issuer_name', $data)) {
+            $issuers = $data['issuers'];
+            if (is_array($issuers) && $issuers && $this->isAssoc($issuers)) {
+                $issuers = [$issuers];
+            }
+
+            if (is_array($issuers)) {
+                $data['cpr_issuer_name'] = array_map(static fn($i) => $i['cprIssuerName'] ?? null, $issuers);
+                $data['cpr_issuers_document_number'] = array_map(static fn($i) => $i['documentNumber'] ?? null, $issuers);
+                $data['cpr_issuers_person_type_acronym'] = array_map(static fn($i) => $i['personTypeAcronym'] ?? null, $issuers);
+                $data['cpr_issuer_legal_nature_code'] = array_map(static fn($i) => $i['issuerLegalNatureCode'] ?? null, $issuers);
+                $data['cpr_issuers_state_acronym'] = array_map(static fn($i) => $i['stateAcronym'] ?? null, $issuers);
+                $data['cpr_issuers_city_name'] = array_map(static fn($i) => $i['cityName'] ?? null, $issuers);
+            }
+        }
+
+        if (array_key_exists('productionPlaces', $data) && !array_key_exists('cpr_production_place_name', $data)) {
+            $productionPlaces = $data['productionPlaces'];
+            if (is_array($productionPlaces) && $productionPlaces && $this->isAssoc($productionPlaces)) {
+                $productionPlaces = [$productionPlaces];
+            }
+
+            if (is_array($productionPlaces)) {
+                $data['cpr_production_place_name'] = array_map(static fn($p) => $p['productionPlaceName'] ?? null, $productionPlaces);
+                $data['cpr_property_registration_number'] = array_map(static fn($p) => $p['propertyRegistrationNumber'] ?? null, $productionPlaces);
+                $data['cpr_notary_name'] = array_map(static fn($p) => $p['notaryName'] ?? null, $productionPlaces);
+                $data['cpr_total_production_area_in_hectares_number'] = array_map(static fn($p) => $p['totalProductionAreaInHectaresNumber'] ?? null, $productionPlaces);
+                $data['cpr_total_area_in_hectares_number'] = array_map(static fn($p) => $p['totalAreaInHectaresNumber'] ?? null, $productionPlaces);
+                $data['cpr_car_code'] = array_map(static fn($p) => $p['carCode'] ?? null, $productionPlaces);
+                $data['cpr_latitude_code'] = array_map(static fn($p) => $p['latitudeCode'] ?? null, $productionPlaces);
+                $data['cpr_longitude_code'] = array_map(static fn($p) => $p['longitudeCode'] ?? null, $productionPlaces);
+                $data['cpr_zip_code'] = array_map(static fn($p) => $p['zipCode'] ?? null, $productionPlaces);
+            }
+        }
+
+        return $data;
+    }
+
+    private function isAssoc(array $arr): bool
+    {
+        return array_keys($arr) !== range(0, count($arr) - 1);
+    }
+
     /**
      * @return array<int, string>|string
      */

+ 120 - 25
services/B3CprService.php

@@ -64,6 +64,102 @@ class B3CprService
     }
     public function mapToB3(array $cpr): array
     {
+        $collateralTypeCodes = $this->splitSemicolonList($cpr['cpr_collateral_type_code'] ?? null);
+        $collateralTypeNames = $this->splitSemicolonList($cpr['cpr_collateral_type_name'] ?? null);
+        $constitutionProcessIndicators = $this->splitSemicolonList($cpr['cpr_constitution_process_indicator'] ?? null);
+        $otcBondsmanAccountCodes = $this->splitSemicolonList($cpr['cpr_otc_bondsman_account_code'] ?? null);
+
+        $collateralsCount = max(
+            count($collateralTypeCodes),
+            count($collateralTypeNames),
+            count($constitutionProcessIndicators),
+            count($otcBondsmanAccountCodes)
+        );
+        if ($collateralsCount <= 0) {
+            $collateralsCount = 1;
+        }
+
+        $collaterals = [];
+        for ($i = 0; $i < $collateralsCount; $i++) {
+            $collaterals[] = [
+                'collateralTypeCode' => $collateralTypeCodes[$i] ?? null,
+                'collateralTypeName' => $collateralTypeNames[$i] ?? null,
+                'constitutionProcessIndicator' => $this->mapIndicator($constitutionProcessIndicators[$i] ?? null),
+                'otcBondsmanAccountCode' => $otcBondsmanAccountCodes[$i] ?? null,
+            ];
+        }
+
+        $issuerNames = $this->splitSemicolonList($cpr['cpr_issuer_name'] ?? null);
+        $issuerDocumentNumbers = $this->splitSemicolonList($cpr['cpr_issuers_document_number'] ?? null);
+        $issuerPersonTypes = $this->splitSemicolonList($cpr['cpr_issuers_person_type_acronym'] ?? null);
+        $issuerLegalNatures = $this->splitSemicolonList($cpr['cpr_issuer_legal_nature_code'] ?? null);
+        $issuerStates = $this->splitSemicolonList($cpr['cpr_issuers_state_acronym'] ?? null);
+        $issuerCities = $this->splitSemicolonList($cpr['cpr_issuers_city_name'] ?? null);
+
+        $issuersCount = max(
+            count($issuerNames),
+            count($issuerDocumentNumbers),
+            count($issuerPersonTypes),
+            count($issuerLegalNatures),
+            count($issuerStates),
+            count($issuerCities)
+        );
+        if ($issuersCount <= 0) {
+            $issuersCount = 1;
+        }
+
+        $issuers = [];
+        for ($i = 0; $i < $issuersCount; $i++) {
+            $issuers[] = [
+                'cprIssuerName' => $issuerNames[$i] ?? null,
+                'documentNumber' => $issuerDocumentNumbers[$i] ?? null,
+                'personTypeAcronym' => $issuerPersonTypes[$i] ?? null,
+                'issuerLegalNatureCode' => $issuerLegalNatures[$i] ?? null,
+                'stateAcronym' => $issuerStates[$i] ?? null,
+                'cityName' => $issuerCities[$i] ?? null,
+            ];
+        }
+
+        $productionPlaceNames = $this->splitSemicolonList($cpr['cpr_production_place_name'] ?? null);
+        $propertyRegistrationNumbers = $this->splitSemicolonList($cpr['cpr_property_registration_number'] ?? null);
+        $notaryNames = $this->splitSemicolonList($cpr['cpr_notary_name'] ?? null);
+        $totalProductionAreas = $this->splitSemicolonList($cpr['cpr_total_production_area_in_hectares_number'] ?? null);
+        $totalAreas = $this->splitSemicolonList($cpr['cpr_total_area_in_hectares_number'] ?? null);
+        $carCodes = $this->splitSemicolonList($cpr['cpr_car_code'] ?? null);
+        $latitudeCodes = $this->splitSemicolonList($cpr['cpr_latitude_code'] ?? null);
+        $longitudeCodes = $this->splitSemicolonList($cpr['cpr_longitude_code'] ?? null);
+        $zipCodes = $this->splitSemicolonList($cpr['cpr_zip_code'] ?? null);
+
+        $productionPlacesCount = max(
+            count($productionPlaceNames),
+            count($propertyRegistrationNumbers),
+            count($notaryNames),
+            count($totalProductionAreas),
+            count($totalAreas),
+            count($carCodes),
+            count($latitudeCodes),
+            count($longitudeCodes),
+            count($zipCodes)
+        );
+        if ($productionPlacesCount <= 0) {
+            $productionPlacesCount = 1;
+        }
+
+        $productionPlaces = [];
+        for ($i = 0; $i < $productionPlacesCount; $i++) {
+            $productionPlaces[] = [
+                'productionPlaceName' => $productionPlaceNames[$i] ?? null,
+                'propertyRegistrationNumber' => $propertyRegistrationNumbers[$i] ?? null,
+                'notaryName' => $notaryNames[$i] ?? null,
+                'totalProductionAreaInHectaresNumber' => $totalProductionAreas[$i] ?? null,
+                'totalAreaInHectaresNumber' => $totalAreas[$i] ?? null,
+                'carCode' => $carCodes[$i] ?? null,
+                'latitudeCode' => $latitudeCodes[$i] ?? null,
+                'longitudeCode' => $longitudeCodes[$i] ?? null,
+                'zipCode' => $zipCodes[$i] ?? null,
+            ];
+        }
+
         $instrument = [
             'cprTypeCode' => $cpr['cpr_type_code'] ?? null,
             'otcRegisterAccountCode' => $cpr['cpr_otc_register_account_code'] ?? null,
@@ -76,12 +172,7 @@ class B3CprService
             'issueFinancialValue' => $cpr['cpr_issue_financial_value'] ?? null,
             'profitabilityStartDate' => $this->convertDate($cpr['cpr_profitability_start_date'] ?? null),
             'automaticExpirationIndicator' => $this->mapIndicator($cpr['cpr_automatic_expiration_indicator'] ?? null),
-            'collaterals' => [[
-                'collateralTypeCode' => $cpr['cpr_collateral_type_code'] ?? null,
-                'collateralTypeName' => $cpr['cpr_collateral_type_name'] ?? null,
-                'constitutionProcessIndicator' => $this->mapIndicator($cpr['cpr_constitution_process_indicator'] ?? null),
-                'otcBondsmanAccountCode' => $cpr['cpr_otc_bondsman_account_code'] ?? null,
-            ]],
+            'collaterals' => $collaterals,
             'products' => [[
                 'cprProductName' => $cpr['cpr_product_name'] ?? null,
                 'cprProductClassName' => $cpr['cpr_product_class_name'] ?? null,
@@ -99,14 +190,7 @@ class B3CprService
                 'stateAcronym' => $cpr['cpr_deliveryPlace_state_acronym'] ?? null,
                 'cityName' => $cpr['cpr_deliveryPlace_city_name'] ?? null,
             ],
-            'issuers' => [[
-                'cprIssuerName' => $cpr['cpr_issuer_name'] ?? null,
-                'documentNumber' => $cpr['cpr_issuers_document_number'] ?? null,
-                'personTypeAcronym' => $cpr['cpr_issuers_person_type_acronym'] ?? null,
-                'issuerLegalNatureCode' => $cpr['cpr_issuer_legal_nature_code'] ?? null,
-                'stateAcronym' => $cpr['cpr_issuers_state_acronym'] ?? null,
-                'cityName' => $cpr['cpr_issuers_city_name'] ?? null,
-            ]],
+            'issuers' => $issuers,
             'scr' => [
                 'scrTypeCode' => $cpr['cpr_scr_type_code'] ?? null,
                 'finalityCode' => $cpr['cpr_finality_code'] ?? null,
@@ -116,22 +200,33 @@ class B3CprService
                 'creditorName' => $cpr['cpr_creditor_name'] ?? null,
                 'documentNumber' => $cpr['cpr_creditor_document_number'] ?? null,
             ],
-            'productionPlaces' => [[
-                'productionPlaceName' => $cpr['cpr_production_place_name'] ?? null,
-                'propertyRegistrationNumber' => $cpr['cpr_property_registration_number'] ?? null,
-                'notaryName' => $cpr['cpr_notary_name'] ?? null,
-                'totalProductionAreaInHectaresNumber' => $cpr['cpr_total_production_area_in_hectares_number'] ?? null,
-                'totalAreaInHectaresNumber' => $cpr['cpr_total_area_in_hectares_number'] ?? null,
-                'carCode' => $cpr['cpr_car_code'] ?? null,
-                'latitudeCode' => $cpr['cpr_latitude_code'] ?? null,
-                'longitudeCode' => $cpr['cpr_longitude_code'] ?? null,
-                'zipCode' => $cpr['cpr_zip_code'] ?? null,
-            ]],
+            'productionPlaces' => $productionPlaces,
         ];
 
         return ['data' => ['instrument' => $instrument]];
     }
 
+    private function splitSemicolonList($value): array
+    {
+        if (is_array($value)) {
+            $items = array_map(static fn($v) => trim((string)$v), array_values($value));
+            return array_values(array_filter($items, static fn($v) => $v !== ''));
+        }
+
+        if (!is_string($value)) {
+            return [];
+        }
+
+        $trimmed = trim($value);
+        if ($trimmed === '') {
+            return [];
+        }
+
+        $parts = preg_split('/\s*;\s*/', $trimmed) ?: [];
+        $parts = array_map(static fn($v) => trim((string)$v), $parts);
+        return array_values(array_filter($parts, static fn($v) => $v !== ''));
+    }
+
     private function convertDate(?string $date): ?string
     {
         if (!is_string($date) || trim($date) === '') {