feat(113): fakturownia integration foundation
Phase 113 complete (v3.7 Invoices): - DB: invoices, invoice_configs, invoice_number_counters, fakturownia_integration_settings + orders.invoice_requested - FakturowniaIntegrationRepository (multi-account via integrations.type='fakturownia') - FakturowniaApiClient (testConnection; createInvoice/downloadPdf STUBs) - IntegrationsRepository::updateTestResult() (reusable test-result writer) - /settings/integrations/fakturownia (list + edit + test + delete) - Karta Fakturownia w hubie /settings/integrations Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
CREATE TABLE IF NOT EXISTS `invoice_configs` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(128) NOT NULL,
|
||||
`integration_id` INT UNSIGNED DEFAULT NULL,
|
||||
`is_delegated` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
`is_active` TINYINT(1) NOT NULL DEFAULT 1,
|
||||
`number_format` VARCHAR(64) NOT NULL DEFAULT 'FV/%N/%M/%Y',
|
||||
`numbering_type` ENUM('monthly','yearly') NOT NULL DEFAULT 'monthly',
|
||||
`sale_date_source` ENUM('order_date','payment_date','issue_date') NOT NULL DEFAULT 'issue_date',
|
||||
`order_reference` ENUM('none','orderpro','integration') NOT NULL DEFAULT 'none',
|
||||
`payment_to_days` TINYINT UNSIGNED NOT NULL DEFAULT 7,
|
||||
`default_kind` VARCHAR(32) NOT NULL DEFAULT 'vat',
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `invoice_configs_integration_idx` (`integration_id`),
|
||||
CONSTRAINT `invoice_configs_integration_fk` FOREIGN KEY (`integration_id`) REFERENCES `integrations` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `invoices` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`order_id` BIGINT UNSIGNED NOT NULL,
|
||||
`config_id` INT UNSIGNED NOT NULL,
|
||||
`invoice_number` VARCHAR(64) NOT NULL,
|
||||
`issue_date` DATETIME NOT NULL,
|
||||
`sale_date` DATETIME NOT NULL,
|
||||
`payment_due_date` DATETIME DEFAULT NULL,
|
||||
`seller_data_json` JSON NOT NULL,
|
||||
`buyer_data_json` JSON DEFAULT NULL,
|
||||
`items_json` JSON NOT NULL,
|
||||
`total_net` DECIMAL(12,2) NOT NULL DEFAULT 0.00,
|
||||
`total_gross` DECIMAL(12,2) NOT NULL DEFAULT 0.00,
|
||||
`order_reference_value` VARCHAR(128) DEFAULT NULL,
|
||||
`external_invoice_id` VARCHAR(128) DEFAULT NULL,
|
||||
`external_pdf_url` VARCHAR(500) DEFAULT NULL,
|
||||
`kind` VARCHAR(32) NOT NULL DEFAULT 'vat',
|
||||
`created_by` INT UNSIGNED DEFAULT NULL,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `invoices_number_unique` (`invoice_number`),
|
||||
KEY `invoices_order_idx` (`order_id`),
|
||||
KEY `invoices_config_date_idx` (`config_id`, `issue_date`),
|
||||
KEY `invoices_external_idx` (`external_invoice_id`),
|
||||
CONSTRAINT `invoices_order_fk` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT `invoices_config_fk` FOREIGN KEY (`config_id`) REFERENCES `invoice_configs` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `invoice_number_counters` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`config_id` INT UNSIGNED NOT NULL,
|
||||
`year` SMALLINT UNSIGNED NOT NULL,
|
||||
`month` TINYINT UNSIGNED DEFAULT NULL,
|
||||
`last_number` INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `invoice_counters_config_period_unique` (`config_id`, `year`, `month`),
|
||||
CONSTRAINT `invoice_counters_config_fk` FOREIGN KEY (`config_id`) REFERENCES `invoice_configs` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `fakturownia_integration_settings` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`integration_id` INT UNSIGNED NOT NULL,
|
||||
`account_prefix` VARCHAR(64) NOT NULL,
|
||||
`api_token_encrypted` TEXT DEFAULT NULL,
|
||||
`department_id` VARCHAR(64) DEFAULT NULL,
|
||||
`default_kind` VARCHAR(32) NOT NULL DEFAULT 'vat',
|
||||
`default_payment_to_days` TINYINT UNSIGNED NOT NULL DEFAULT 7,
|
||||
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `fakturownia_integration_id_unique` (`integration_id`),
|
||||
CONSTRAINT `fakturownia_integration_fk` FOREIGN KEY (`integration_id`) REFERENCES `integrations` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE `orders`
|
||||
ADD COLUMN `invoice_requested` TINYINT(1) NOT NULL DEFAULT 0,
|
||||
ADD INDEX `idx_orders_invoice_requested` (`invoice_requested`);
|
||||
@@ -0,0 +1,6 @@
|
||||
-- Phase 113-01: Fakturownia Integration Type marker.
|
||||
-- `integrations.type` is VARCHAR(32) - no schema change required for new type 'fakturownia'.
|
||||
-- Rows for type='fakturownia' are inserted on-demand by FakturowniaIntegrationRepository
|
||||
-- via IntegrationsRepository::ensureIntegration(). This migration just stamps the table
|
||||
-- comment so we have an auditable record of when the type became officially supported.
|
||||
ALTER TABLE `integrations` COMMENT = 'Integration accounts; supported types: allegro, apaczka, inpost, shoppro, fakturownia (Phase 113-01)';
|
||||
Reference in New Issue
Block a user