Files
crmPRO/autoload/Domain/Finances/FakturowniaImportRepository.php
2026-04-02 12:00:38 +02:00

319 lines
9.1 KiB
PHP

<?php
namespace Domain\Finances;
class FakturowniaImportRepository
{
private $mdb;
private $tablesReady = false;
public function __construct( $mdb = null )
{
if ( $mdb )
$this -> mdb = $mdb;
else
{
global $mdb;
$this -> mdb = $mdb;
}
}
public function ensureTables()
{
if ( $this -> tablesReady )
return;
$this -> mdb -> query(
'CREATE TABLE IF NOT EXISTS `fakturownia_client_mappings` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`external_client_key` VARCHAR(191) NOT NULL,
`external_name` VARCHAR(255) NOT NULL,
`crm_client_id` INT UNSIGNED NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_external_client_key` (`external_client_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
);
$this -> mdb -> query(
'CREATE TABLE IF NOT EXISTS `fakturownia_item_mappings` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`external_item_key` VARCHAR(191) NOT NULL,
`external_name` VARCHAR(255) NOT NULL,
`finance_category_id` INT UNSIGNED NOT NULL,
`created_at` DATETIME NOT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_external_item_key` (`external_item_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
);
$this -> mdb -> query(
'CREATE TABLE IF NOT EXISTS `fakturownia_imported_documents` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`external_document_key` VARCHAR(191) NOT NULL,
`document_type` VARCHAR(32) NOT NULL,
`external_id` VARCHAR(64) NOT NULL,
`source_date` DATE NULL,
`amount` DECIMAL(12,2) NOT NULL DEFAULT 0.00,
`finance_operation_ids` TEXT NULL,
`meta_json` LONGTEXT NULL,
`imported_at` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_external_document_key` (`external_document_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
);
$this -> mdb -> query(
'CREATE TABLE IF NOT EXISTS `fakturownia_unmapped_queue` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`queue_type` VARCHAR(32) NOT NULL,
`external_key` VARCHAR(191) NOT NULL,
`external_name` VARCHAR(255) NOT NULL,
`payload_json` LONGTEXT NULL,
`hits` INT UNSIGNED NOT NULL DEFAULT 1,
`resolved` TINYINT(1) NOT NULL DEFAULT 0,
`first_seen_at` DATETIME NOT NULL,
`last_seen_at` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_type_key` (`queue_type`, `external_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
);
$this -> mdb -> query(
'CREATE TABLE IF NOT EXISTS `fakturownia_import_state` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`state_key` VARCHAR(191) NOT NULL,
`state_value` LONGTEXT NULL,
`updated_at` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_state_key` (`state_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'
);
$this -> tablesReady = true;
}
public function getClientMapping( $externalClientKey )
{
$this -> ensureTables();
return $this -> mdb -> get( 'fakturownia_client_mappings', '*', [
'external_client_key' => $externalClientKey
] );
}
public function saveClientMapping( $externalClientKey, $externalName, $crmClientId )
{
$this -> ensureTables();
$current = $this -> getClientMapping( $externalClientKey );
$now = date( 'Y-m-d H:i:s' );
if ( $current )
{
$this -> mdb -> update( 'fakturownia_client_mappings', [
'external_name' => $externalName,
'crm_client_id' => (int)$crmClientId,
'updated_at' => $now
], [ 'id' => (int)$current['id'] ] );
}
else
{
$this -> mdb -> insert( 'fakturownia_client_mappings', [
'external_client_key' => $externalClientKey,
'external_name' => $externalName,
'crm_client_id' => (int)$crmClientId,
'created_at' => $now,
'updated_at' => $now
] );
}
$this -> resolveQueueItem( 'client', $externalClientKey );
}
public function getItemMapping( $externalItemKey )
{
$this -> ensureTables();
return $this -> mdb -> get( 'fakturownia_item_mappings', '*', [
'external_item_key' => $externalItemKey
] );
}
public function saveItemMapping( $externalItemKey, $externalName, $financeCategoryId )
{
$this -> ensureTables();
$current = $this -> getItemMapping( $externalItemKey );
$now = date( 'Y-m-d H:i:s' );
if ( $current )
{
$this -> mdb -> update( 'fakturownia_item_mappings', [
'external_name' => $externalName,
'finance_category_id' => (int)$financeCategoryId,
'updated_at' => $now
], [ 'id' => (int)$current['id'] ] );
}
else
{
$this -> mdb -> insert( 'fakturownia_item_mappings', [
'external_item_key' => $externalItemKey,
'external_name' => $externalName,
'finance_category_id' => (int)$financeCategoryId,
'created_at' => $now,
'updated_at' => $now
] );
}
$this -> resolveQueueItem( 'item', $externalItemKey );
}
public function isDocumentImported( $externalDocumentKey )
{
$this -> ensureTables();
return (bool)$this -> mdb -> has( 'fakturownia_imported_documents', [
'external_document_key' => $externalDocumentKey
] );
}
public function markDocumentImported( $externalDocumentKey, $documentType, $externalId, $sourceDate, $amount, $operationIds, $meta )
{
$this -> ensureTables();
$now = date( 'Y-m-d H:i:s' );
$data = [
'external_document_key' => $externalDocumentKey,
'document_type' => $documentType,
'external_id' => (string)$externalId,
'source_date' => $sourceDate,
'amount' => (float)$amount,
'finance_operation_ids' => implode( ',', $operationIds ),
'meta_json' => json_encode( $meta, JSON_UNESCAPED_UNICODE ),
'imported_at' => $now
];
$existing = $this -> mdb -> get( 'fakturownia_imported_documents', 'id', [
'external_document_key' => $externalDocumentKey
] );
if ( $existing )
{
$this -> mdb -> update( 'fakturownia_imported_documents', $data, [
'id' => (int)$existing
] );
return;
}
$this -> mdb -> insert( 'fakturownia_imported_documents', $data );
}
public function queueUnmapped( $queueType, $externalKey, $externalName, $payload )
{
$this -> ensureTables();
$existing = $this -> mdb -> get( 'fakturownia_unmapped_queue', '*', [
'AND' => [
'queue_type' => $queueType,
'external_key' => $externalKey
]
] );
$now = date( 'Y-m-d H:i:s' );
$payloadJson = json_encode( $payload, JSON_UNESCAPED_UNICODE );
if ( $existing )
{
$this -> mdb -> update( 'fakturownia_unmapped_queue', [
'external_name' => $externalName,
'payload_json' => $payloadJson,
'hits[+]' => 1,
'resolved' => 0,
'last_seen_at' => $now
], [ 'id' => (int)$existing['id'] ] );
return;
}
$this -> mdb -> insert( 'fakturownia_unmapped_queue', [
'queue_type' => $queueType,
'external_key' => $externalKey,
'external_name' => $externalName,
'payload_json' => $payloadJson,
'hits' => 1,
'resolved' => 0,
'first_seen_at' => $now,
'last_seen_at' => $now
] );
}
public function pendingClientMappings()
{
$this -> ensureTables();
return $this -> mdb -> select( 'fakturownia_unmapped_queue', '*', [
'AND' => [
'queue_type' => 'client',
'resolved' => 0
],
'ORDER' => [ 'last_seen_at' => 'DESC' ]
] );
}
public function pendingItemMappings()
{
$this -> ensureTables();
return $this -> mdb -> select( 'fakturownia_unmapped_queue', '*', [
'AND' => [
'queue_type' => 'item',
'resolved' => 0,
'external_key[!]' => 'name:faktura bez pozycji'
],
'ORDER' => [ 'last_seen_at' => 'DESC' ]
] );
}
public function saveState( $stateKey, $stateValue )
{
$this -> ensureTables();
$existing = $this -> mdb -> get( 'fakturownia_import_state', '*', [
'state_key' => $stateKey
] );
$now = date( 'Y-m-d H:i:s' );
if ( $existing )
{
$this -> mdb -> update( 'fakturownia_import_state', [
'state_value' => $stateValue,
'updated_at' => $now
], [ 'id' => (int)$existing['id'] ] );
return;
}
$this -> mdb -> insert( 'fakturownia_import_state', [
'state_key' => $stateKey,
'state_value' => $stateValue,
'updated_at' => $now
] );
}
public function getState( $stateKey )
{
$this -> ensureTables();
return $this -> mdb -> get( 'fakturownia_import_state', 'state_value', [
'state_key' => $stateKey
] );
}
private function resolveQueueItem( $queueType, $externalKey )
{
$this -> mdb -> update( 'fakturownia_unmapped_queue', [
'resolved' => 1,
'last_seen_at' => date( 'Y-m-d H:i:s' )
], [
'AND' => [
'queue_type' => $queueType,
'external_key' => $externalKey
]
] );
}
}