source: trunk/Modules/Contract/Contract.php@ 901

Last change on this file since 901 was 901, checked in by chronos, 4 years ago
  • Added: Documents section accessible from users panel.
  • Added: Contract model moved to separate module Contract.
  • Added: New action to generate PDF from Contract.
  • Fixed: Allow users to download files only by hash instead of direct id.
  • Added: Support for SHA1 as allowed mysql function.
File size: 7.6 KB
Line 
1<?php
2
3class ModuleContract extends Module
4{
5 public int $DirectoryId;
6
7 function __construct(System $System)
8 {
9 parent::__construct($System);
10 $this->Name = 'Contract';
11 $this->Version = '1.0';
12 $this->Creator = 'Chronos';
13 $this->License = 'GNU/GPLv3';
14 $this->Description = 'Contract documents management';
15 $this->Dependencies = array(ModuleDocument::GetName(), ModuleSubject::GetName(), ModuleFile::GetName(), ModuleFinance::GetName());
16 $this->Models = array(Contract::GetClassName());
17
18 $this->DirectoryId = 0;
19 }
20
21 function DoStart(): void
22 {
23 global $Config;
24
25 $this->DirectoryId = $Config['Contract']['DirectoryId'];
26 $this->System->RegisterPage(['smlouvy', 'generovat'], 'PageContractGenerate');
27 $this->System->FormManager->RegisterClass('Contract', array(
28 'Title' => 'Smlouvy',
29 'Table' => 'Contract',
30 'Items' => array(
31 'DocumentLine' => array('Type' => 'TDocumentLine', 'Caption' => 'Dokladová řada', 'Default' => ''),
32 'BillCode' => array('Type' => 'TDocumentLineCode', 'Caption' => 'Kód', 'Default' => '', 'Null' => true),
33 'Subject' => array('Type' => 'TSubject', 'Caption' => 'Subjekt', 'Default' => ''),
34 'ValidFrom' => array('Type' => 'Date', 'Caption' => 'Platnost od', 'Default' => ''),
35 'ValidTo' => array('Type' => 'Date', 'Caption' => 'Platnost do', 'Default' => '', 'Null' => true),
36 'File' => array('Type' => 'TFile', 'Caption' => 'Soubor', 'Default' => '', 'Null' => true),
37 'Generate' => array('Type' => 'Boolean', 'Caption' => 'Generovat', 'Default' => ''),
38 'EmployeeSalaries' => array('Type' => 'TEmployeeSalaryListContract', 'Caption' => 'Výplaty zaměstnanců', 'Default' => ''),
39 'Customers' => array('Type' => 'TCustomerListContract', 'Caption' => 'Zákazníci', 'Default' => ''),
40 ),
41 'BeforeInsert' => array($this, 'BeforeInsertContract'),
42 'ItemActions' => array(
43 array('Caption' => 'Generovat', 'URL' => '/smlouvy/generovat/?i=#RowId'),
44 )
45 ));
46 $this->System->FormManager->RegisterFormType('TContract', array(
47 'Type' => 'Reference',
48 'Table' => 'Contract',
49 'Id' => 'Id',
50 'Name' => '(SELECT `DocumentLineCode`.`Name` FROM `DocumentLineCode` WHERE `Id`=`Contract`.`BillCode`)',
51 'Filter' => '1',
52 ));
53 }
54
55 function BeforeInsertContract(Form $Form): array
56 {
57 if (array_key_exists('Time', $Form->Values)) $Year = date("Y", $Form->Values['Time']);
58 else $Year = date("Y", $Form->Values['ValidFrom']);
59 $Form->Values['BillCode'] = ModuleDocument::Cast($this->System->GetModule('Document'))->GetNextDocumentLineNumberId($Form->Values['DocumentLine'], $Year);
60 return $Form->Values;
61 }
62
63 static function Cast(Module $Module): ModuleContract
64 {
65 if ($Module instanceof ModuleContract)
66 {
67 return $Module;
68 }
69 throw new Exception('Expected ModuleContract type but '.gettype($Module));
70 }
71}
72
73class PageContractGenerate extends Page
74{
75 function __construct(System $System)
76 {
77 parent::__construct($System);
78 $this->FullTitle = 'Generování smlouvy';
79 $this->ShortTitle = 'Generování smlouvy';
80 $this->ParentClass = 'PagePortal';
81 }
82
83 function GenerateContract($Where = '')
84 {
85 $DirectoryId = ModuleContract::Cast($this->System->GetModule('Contract'))->DirectoryId;
86 $Output = '';
87 $DbResult = $this->Database->query('SELECT * FROM `Contract` WHERE (`BillCode` <> "") '.
88 'AND (`ValidFrom` IS NOT NULL) AND (`Generate` = 1)'.$Where);
89 while ($Row = $DbResult->fetch_assoc())
90 {
91 if ($Row['File'] == null)
92 {
93 $this->Database->insert('File', array('Name' => '', 'Size' => 0, 'Directory' => $DirectoryId, 'Time' => 'NOW()'));
94 $FileId = $this->Database->insert_id;
95 } else $FileId = $Row['File'];
96 $FileName = 'smlouva-'.$FileId.'.pdf';
97 $Bill = new BillContract($this->System);
98 $Bill->Database = &$this->System->Database;
99 $Bill->System = &$this->System;
100 $Bill->ContractId = $Row['Id'];
101 $FullFileName = ModuleFile::Cast($this->System->GetModule('File'))->File->GetDir($DirectoryId).$FileName;
102 $Bill->SaveToFile($FullFileName);
103 if (file_exists($FullFileName))
104 {
105 $this->Database->update('File', 'Id='.$FileId, array('Name' => $FileName, 'Size' => filesize($FullFileName), 'Hash' => 'SHA1(CONCAT(Id,Name,Size,Time))'));
106 $this->Database->update('Contract', 'Id='.$Row['Id'], array('File' => $FileId));
107 $Output .= 'Smlouva '.$Row['Id'].' vygenerována do souboru '.$FileName.'<br/>'."\n";
108 } else $Output .= 'Soubor "'.$FullFileName.'" se nepodařilo uložit.';
109 }
110 return $Output;
111 }
112
113 function Show(): string
114 {
115 if (array_key_exists('i', $_GET))
116 {
117 $Output = $this->GenerateContract(' AND (Id='.($_GET['i'] * 1).')');
118 } else $Output = 'Missing contract id.';
119 return $Output;
120 }
121}
122
123class BillContract extends Pdf
124{
125 public string $ContractId;
126
127 function GenerateHTML(): string
128 {
129 $Output = '<table width="100%"><tr><td colspan="2">'.
130 '<font size="6"><div align="center">Smlova o připojení k internetu a poskytování datových služeb</font></div>'.
131 '<font size="3"><div align="center">Číslo:</font></div>'.
132 '<hr></td></tr>'.
133 '<hr>'.
134 '<br>'.
135 '<tr><td colspan="2">'.
136 '<strong>I. Předmět smlouvy:</strong><br/>'.
137 'Smlouva se uzavírá mezi Poskytovatelem a Odběratelem a předmětem smlouvy je poskytování datových služeb a připojení k síti internet, umožňující Odběrateli odebírat v koncovém bodě za úplatu internetovou konektivitu prostřednictvím telekomunikační sítě Poskytovatele. Odběratel se zavazuje za tyto služby Poskytovateli platit cenu ve výši a pravidelných intervalech uvedených v této smlouvě. Smlouva se sjednává na dobu neurčitou.<br/>'.
138 '<br/>'.
139 '<strong>II. Poskytované služby:</strong><br/>'.
140 ''.
141 '<br/>'.
142 '<strong>III. Cena a platební podmínky:</strong><br/>'.
143 'Poplatky a pravidelné platby budou na základě této smlouvy hrazeny Odběratelem na bankovní účet Poskytovatele bankovním převodem, nebo složenkou, v uvedené výši a s uvedenou frekvencí. Jako VS bude uvedeno přidělené číslo. V případě prodlení s platbou mohou být uplatněny sankce, či služba pozastavena, nebo zrušena (dle Ceníku a Všeobecných smluvních podmínek).<br/>'.
144 '<br/>'.
145 '<strong>IV. Závěrečná ustanovení:</strong><br/>'.
146 'Odběratel svým podpisem stvrzuje, že se seznámil a souhlasí se Všeobecnými smluvními podmínkami, aktuálním Ceníkem Poskytovatele a výše uvedenými skutečnostmi, které tvoří součást této Smlouvy. Dálestvrzuje, že souhlasí s provedením instalace a umístěním přijímacího zařízení a kabeláže a nemá proti nim námitky, příp., že vlastní veškerá příslušná povolení a souhlas s jejich umístěním. Smlouva je vyhotovena ve dvou provedeních, kdy Odběratel i Poskytovatel obdrží po jedné. Aktivace služby začíná dnem podpisu této Smlouvy. Výpovědní lhůta je 30 dnů. Případné změny této Smlouvy vyžadují formy vzájemně oběma stranami podepsaného dodatku.<br/>'.
147 '<br/>'.
148 '</td></tr>'.
149 '</table>';
150
151 return $Output;
152 }
153}
154
155class Contract extends Model
156{
157 static function GetModelDesc(): ModelDesc
158 {
159 $Desc = new ModelDesc(self::GetClassName());
160 $Desc->AddReference('DocumentLine', DocumentLine::GetClassName());
161 $Desc->AddReference('BillCode', DocumentLineCode::GetClassName());
162 $Desc->AddReference('Subject', Subject::GetClassName());
163 $Desc->AddDate('ValidFrom');
164 $Desc->AddDate('ValidTo');
165 $Desc->AddReference('File', File::GetClassName());
166 return $Desc;
167 }
168}
Note: See TracBrowser for help on using the repository browser.