| 1 | <?php
|
|---|
| 2 |
|
|---|
| 3 | class ModuleDocument extends Module
|
|---|
| 4 | {
|
|---|
| 5 | function __construct(System $System)
|
|---|
| 6 | {
|
|---|
| 7 | parent::__construct($System);
|
|---|
| 8 | $this->Name = 'Document';
|
|---|
| 9 | $this->Version = '1.0';
|
|---|
| 10 | $this->Creator = 'Chronos';
|
|---|
| 11 | $this->License = 'GNU/GPLv3';
|
|---|
| 12 | $this->Description = 'Documents support';
|
|---|
| 13 | $this->Models = array(FinanceYear::GetClassName(), DocumentLineCode::GetClassName(), DocumentLine::GetClassName(),
|
|---|
| 14 | DocumentLineSequence::GetClassName());
|
|---|
| 15 | }
|
|---|
| 16 |
|
|---|
| 17 | function DoStart(): void
|
|---|
| 18 | {
|
|---|
| 19 | $this->System->FormManager->RegisterClass('DocumentLine', array(
|
|---|
| 20 | 'Title' => 'Dokladové řady',
|
|---|
| 21 | 'Table' => 'DocumentLine',
|
|---|
| 22 | 'DefaultSortColumn' => 'Name',
|
|---|
| 23 | 'Items' => array(
|
|---|
| 24 | 'Name' => array('Type' => 'String', 'Caption' => 'Jméno', 'Default' => ''),
|
|---|
| 25 | 'Shortcut' => array('Type' => 'String', 'Caption' => 'Kód', 'Default' => ''),
|
|---|
| 26 | 'Yearly' => array('Type' => 'Boolean', 'Caption' => 'Ročně', 'Default' => 0),
|
|---|
| 27 | 'Sequence' => array('Type' => 'TDocumentLineSequenceListLine', 'Caption' => 'Čísleníky', 'Default' => ''),
|
|---|
| 28 | 'Codes' => array('Type' => 'TDocumentLineCodeList', 'Caption' => 'Kódy', 'Default' => ''),
|
|---|
| 29 | 'Operations' => array('Type' => 'TFinanceOperationGroupListDocumentLine', 'Caption' => 'Skupiny finančních operací', 'Default' => ''),
|
|---|
| 30 | 'Invoices' => array('Type' => 'TFinanceInvoiceGroupListDocumentLine', 'Caption' => 'Skupiny faktur', 'Default' => ''),
|
|---|
| 31 | ),
|
|---|
| 32 | ));
|
|---|
| 33 | $this->System->FormManager->RegisterClass('DocumentLineSequence', array(
|
|---|
| 34 | 'Title' => 'Čísleníky dokladových řad',
|
|---|
| 35 | 'Table' => 'DocumentLineSequence',
|
|---|
| 36 | 'DefaultSortColumn' => 'Id',
|
|---|
| 37 | 'Items' => array(
|
|---|
| 38 | 'DocumentLine' => array('Type' => 'TDocumentLine', 'Caption' => 'Dokladová řada', 'Default' => ''),
|
|---|
| 39 | 'FinanceYear' => array('Type' => 'TFinanceYear', 'Caption' => 'Účetní rok', 'Default' => ''),
|
|---|
| 40 | 'NextNumber' => array('Type' => 'Integer', 'Caption' => 'Další číslo', 'Default' => '1'),
|
|---|
| 41 | 'YearPrefix' => array('Type' => 'Boolean', 'Caption' => 'Rok jako přípona', 'Default' => '1'),
|
|---|
| 42 | ),
|
|---|
| 43 | ));
|
|---|
| 44 | $this->System->FormManager->RegisterClass('DocumentLineCode', array(
|
|---|
| 45 | 'Title' => 'Kód dokladových řad',
|
|---|
| 46 | 'Table' => 'DocumentLineCode',
|
|---|
| 47 | 'DefaultSortColumn' => 'Name',
|
|---|
| 48 | 'Items' => array(
|
|---|
| 49 | 'DocumentLine' => array('Type' => 'TDocumentLine', 'Caption' => 'Dokladová řada', 'Default' => ''),
|
|---|
| 50 | 'Name' => array('Type' => 'String', 'Caption' => 'Název', 'Default' => ''),
|
|---|
| 51 | ),
|
|---|
| 52 | ));
|
|---|
| 53 | $this->System->FormManager->RegisterClass('FinanceYear', array(
|
|---|
| 54 | 'Title' => 'Účetní roky',
|
|---|
| 55 | 'Table' => 'FinanceYear',
|
|---|
| 56 | 'DefaultSortColumn' => 'Year',
|
|---|
| 57 | 'DefaultSortOrder' => 1,
|
|---|
| 58 | 'Items' => array(
|
|---|
| 59 | 'Year' => array('Type' => 'Integer', 'Caption' => 'Rok', 'Default' => ''),
|
|---|
| 60 | 'DateStart' => array('Type' => 'Date', 'Caption' => 'První den', 'Default' => ''),
|
|---|
| 61 | 'DateEnd' => array('Type' => 'Date', 'Caption' => 'Poslední den', 'Default' => ''),
|
|---|
| 62 | 'Closed' => array('Type' => 'Boolean', 'Caption' => 'Uzavřen', 'Default' => 0),
|
|---|
| 63 | 'Sequence' => array('Type' => 'TDocumentLineSequenceListYear', 'Caption' => 'Čísleníky', 'Default' => ''),
|
|---|
| 64 | ),
|
|---|
| 65 | //'AfterInsert' => array($this, 'AfterInsertFinanceYear'),
|
|---|
| 66 | ));
|
|---|
| 67 | $this->System->FormManager->RegisterFormType('TDocumentLine', array(
|
|---|
| 68 | 'Type' => 'Reference',
|
|---|
| 69 | 'Table' => 'DocumentLine',
|
|---|
| 70 | 'Id' => 'Id',
|
|---|
| 71 | 'Name' => 'Name',
|
|---|
| 72 | 'Filter' => '1',
|
|---|
| 73 | ));
|
|---|
| 74 | $this->System->FormManager->RegisterFormType('TDocumentLineCode', array(
|
|---|
| 75 | 'Type' => 'Reference',
|
|---|
| 76 | 'Table' => 'DocumentLineCode',
|
|---|
| 77 | 'Id' => 'Id',
|
|---|
| 78 | 'Name' => 'Name',
|
|---|
| 79 | 'Filter' => '1',
|
|---|
| 80 | ));
|
|---|
| 81 | }
|
|---|
| 82 |
|
|---|
| 83 | static function Cast(Module $Module): ModuleDocument
|
|---|
| 84 | {
|
|---|
| 85 | if ($Module instanceof ModuleDocument)
|
|---|
| 86 | {
|
|---|
| 87 | return $Module;
|
|---|
| 88 | }
|
|---|
| 89 | throw new Exception('Expected ModuleDocument type but '.gettype($Module));
|
|---|
| 90 | }
|
|---|
| 91 |
|
|---|
| 92 | function GetFinanceYear(int $Year): array
|
|---|
| 93 | {
|
|---|
| 94 | if ($Year == 0)
|
|---|
| 95 | {
|
|---|
| 96 | // Get latest year
|
|---|
| 97 | $DbResult = $this->Database->select('FinanceYear', '*', '1 ORDER BY `Year` DESC LIMIT 1');
|
|---|
| 98 | } else $DbResult = $this->Database->select('FinanceYear', '*', '`Year`='.$Year);
|
|---|
| 99 | if ($DbResult->num_rows == 0)
|
|---|
| 100 | {
|
|---|
| 101 | if ($Year == date('Y'))
|
|---|
| 102 | {
|
|---|
| 103 | $this->CreateFinanceYear($Year);
|
|---|
| 104 | $DbResult = $this->Database->select('FinanceYear', '*', '`Year`='.$Year);
|
|---|
| 105 | } else throw new Exception('Rok '.$Year.' nenalezen');
|
|---|
| 106 | }
|
|---|
| 107 | $FinanceYear = $DbResult->fetch_assoc();
|
|---|
| 108 | if ($FinanceYear['Closed'] == 1)
|
|---|
| 109 | throw new Exception('Rok '.$FinanceYear['Year'].' je již uzavřen. Nelze do něj přidávat položky.');
|
|---|
| 110 | return $FinanceYear;
|
|---|
| 111 | }
|
|---|
| 112 |
|
|---|
| 113 | function GetNextDocumentLineNumber(string $Id, int $FinanceYear = 0): string
|
|---|
| 114 | {
|
|---|
| 115 | $FinanceYear = $this->GetFinanceYear($FinanceYear);
|
|---|
| 116 |
|
|---|
| 117 | $DbResult = $this->Database->query('SELECT `Shortcut`, `Id` FROM `DocumentLine` WHERE `Id`='.$Id);
|
|---|
| 118 | $DocumentLine = $DbResult->fetch_assoc();
|
|---|
| 119 |
|
|---|
| 120 | $DbResult = $this->Database->query('SELECT * FROM `DocumentLineSequence` WHERE '.
|
|---|
| 121 | '`DocumentLine`='.$Id.' AND `FinanceYear`='.$FinanceYear['Id']);
|
|---|
| 122 | if ($DbResult->num_rows > 0)
|
|---|
| 123 | {
|
|---|
| 124 | $Sequence = $DbResult->fetch_assoc();
|
|---|
| 125 | } else
|
|---|
| 126 | {
|
|---|
| 127 | $Sequence = array('DocumentLine' => $Id, 'FinanceYear' => $FinanceYear['Id'],
|
|---|
| 128 | 'NextNumber' => 1, 'YearPrefix' => 1);
|
|---|
| 129 | $Sequence['Id'] = $this->Database->insert('DocumentLineSequence', $Sequence);
|
|---|
| 130 | }
|
|---|
| 131 |
|
|---|
| 132 | if ($Sequence['YearPrefix'] == 1)
|
|---|
| 133 | {
|
|---|
| 134 | $Result = $DocumentLine['Shortcut'].$Sequence['NextNumber'].'/'.$FinanceYear['Year'];
|
|---|
| 135 | } else
|
|---|
| 136 | {
|
|---|
| 137 | $Result = $DocumentLine['Shortcut'].$Sequence['NextNumber'];
|
|---|
| 138 | }
|
|---|
| 139 |
|
|---|
| 140 | $this->Database->query('UPDATE `DocumentLineSequence` SET `NextNumber` = `NextNumber` + 1 '.
|
|---|
| 141 | 'WHERE (`DocumentLine`='.$Id.') AND (`FinanceYear`='.$FinanceYear['Id'].')');
|
|---|
| 142 | return $Result;
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | function GetNextDocumentLineNumberId(string $Id, int $FinanceYear = 0): int
|
|---|
| 146 | {
|
|---|
| 147 | $Code = $this->GetNextDocumentLineNumber($Id, $FinanceYear);
|
|---|
| 148 | $this->Database->insert('DocumentLineCode', array('DocumentLine' => $Id, 'Name' => $Code));
|
|---|
| 149 | return $this->Database->insert_id;
|
|---|
| 150 | }
|
|---|
| 151 |
|
|---|
| 152 | function CreateFinanceYear(int $Year)
|
|---|
| 153 | {
|
|---|
| 154 | $StartTime = mktime(0, 0, 0, 1, 1, $Year);
|
|---|
| 155 | $EndTime = mktime(0, 0, 0, 12, 31, $Year);
|
|---|
| 156 | $this->Database->insert('FinanceYear', array('Year' => $Year,
|
|---|
| 157 | 'DateStart' => TimeToMysqlDate($StartTime), 'DateEnd' => TimeToMysqlDate($EndTime), 'Closed' => 0));
|
|---|
| 158 | $YearId = $this->Database->insert_id;
|
|---|
| 159 |
|
|---|
| 160 | // Create DocumentLineSequence from previous
|
|---|
| 161 | $DbResult = $this->Database->select('DocumentLine', 'Id', '`Yearly` = 1');
|
|---|
| 162 | while ($DbRow = $DbResult->fetch_assoc())
|
|---|
| 163 | {
|
|---|
| 164 | $this->Database->insert('DocumentLineSequence', array('FinanceYear' => $YearId,
|
|---|
| 165 | 'NextNumber' => 1, 'YearPrefix' => 1, 'DocumentLine' => $DbRow['Id']));
|
|---|
| 166 | }
|
|---|
| 167 | }
|
|---|
| 168 | }
|
|---|
| 169 |
|
|---|
| 170 | class DocumentLine extends Model
|
|---|
| 171 | {
|
|---|
| 172 | static function GetModelDesc(): ModelDesc
|
|---|
| 173 | {
|
|---|
| 174 | $Desc = new ModelDesc(self::GetClassName());
|
|---|
| 175 | $Desc->AddString('Name');
|
|---|
| 176 | $Desc->AddString('ShortCut');
|
|---|
| 177 | $Desc->AddBoolean('Yearly');
|
|---|
| 178 | return $Desc;
|
|---|
| 179 | }
|
|---|
| 180 | }
|
|---|
| 181 |
|
|---|
| 182 | class DocumentLineCode extends Model
|
|---|
| 183 | {
|
|---|
| 184 | static function GetModelDesc(): ModelDesc
|
|---|
| 185 | {
|
|---|
| 186 | $Desc = new ModelDesc(self::GetClassName());
|
|---|
| 187 | $Desc->AddReference('DocumentLine', DocumentLine::GetClassName());
|
|---|
| 188 | $Desc->AddString('Name');
|
|---|
| 189 | return $Desc;
|
|---|
| 190 | }
|
|---|
| 191 | }
|
|---|
| 192 |
|
|---|
| 193 | class DocumentLineSequence extends Model
|
|---|
| 194 | {
|
|---|
| 195 | static function GetModelDesc(): ModelDesc
|
|---|
| 196 | {
|
|---|
| 197 | $Desc = new ModelDesc(self::GetClassName());
|
|---|
| 198 | $Desc->AddReference('DocumentLine', DocumentLine::GetClassName());
|
|---|
| 199 | $Desc->AddReference('FinanceYear', FinanceYear::GetClassName());
|
|---|
| 200 | $Desc->AddInteger('NextNumber');
|
|---|
| 201 | $Desc->AddString('YearPrefix');
|
|---|
| 202 | return $Desc;
|
|---|
| 203 | }
|
|---|
| 204 | }
|
|---|
| 205 |
|
|---|
| 206 | class FinanceYear extends Model
|
|---|
| 207 | {
|
|---|
| 208 | static function GetModelDesc(): ModelDesc
|
|---|
| 209 | {
|
|---|
| 210 | $Desc = new ModelDesc(self::GetClassName());
|
|---|
| 211 | $Desc->AddInteger('Year');
|
|---|
| 212 | $Desc->AddDate('DateStart');
|
|---|
| 213 | $Desc->AddDate('DateEnd');
|
|---|
| 214 | $Desc->AddBoolean('Closed');
|
|---|
| 215 | return $Desc;
|
|---|
| 216 | }
|
|---|
| 217 | }
|
|---|