<?php

class Bill extends Pdf
{
  public int $SpecificSymbol = 1; // computer network number
}

class BillInvoice extends Bill
{
  public string $InvoiceId;

  function ShowSubjectInfo(array $Subject): string
  {
    $BooleanText = array('Ne', 'Ano');
    $Output = $Subject['Name'].'<br>'.
      $Subject['AddressStreet'].'<br>'.
      $Subject['AddressPSC'].' '.$Subject['AddressTown'].'<br>';
    if (($Subject['IC'] != '') and ($Subject['IC'] != 0)) $Output .= 'IČ: '.$Subject['IC'].'<br>';
    if ($Subject['DIC'] != '') $Output .= 'DIČ: '.$Subject['DIC'].'<br>';
    if ($Subject['Account'] != '') $Output .= 'Účet: '.$Subject['Account'].'<br>';
    if ($Subject['PayVAT'] != '') $Output .= 'Plátce DPH: '.$BooleanText[$Subject['PayVAT']].'<br>';
    return $Output;
  }

  function GenerateHTML(): string
  {
    $Finance = &ModuleFinance::Cast($this->System->GetModule('Finance'))->Finance;
    $Finance->LoadMonthParameters(0);

    $DbResult = $this->Database->query('SELECT `FinanceInvoice`.*, `FinanceInvoiceGroup`.`Direction`, `DocumentLineCode`.`Name` AS `BillName` FROM `FinanceInvoice` '.
      'LEFT JOIN `FinanceInvoiceGroup` ON `FinanceInvoiceGroup`.`Id`=`FinanceInvoice`.`Group` '.
      'LEFT JOIN `DocumentLineCode` ON `DocumentLineCode`.`Id`=`FinanceInvoice`.`BillCode` '.
      'WHERE `FinanceInvoice`.`Id`='.$this->InvoiceId);
    $Invoice = $DbResult->fetch_assoc();

    $DbResult = $this->Database->select('Subject', '*', '`Id`='.$Invoice['Subject']);
    $SubjectTo = $DbResult->fetch_assoc();
    $SubjectTo['Account'] = '';
    $SubjectTo['PayVAT'] = '';
    $VarSym = $SubjectTo['Id'];

    $DbResult = $this->Database->select('Subject', '*', '`Id`='.$this->System->Config['Finance']['MainSubjectId']);
    $SubjectFrom = $DbResult->fetch_assoc();

    $DbResult = $this->Database->query('SELECT FinanceBankAccount.*, CONCAT(FinanceBankAccount.Number, "/", FinanceBank.Code) AS NumberFull FROM FinanceBankAccount '.
      'JOIN FinanceBank ON FinanceBank.Id=FinanceBankAccount.Bank '.
      'WHERE (FinanceBankAccount.`Subject`='.$this->System->Config['Finance']['MainSubjectId'].') AND (FinanceBankAccount.`Use`=1)');
    $SubjectFromAccount = $DbResult->fetch_assoc();
    $SubjectFrom['Account'] = $SubjectFromAccount['NumberFull'];

    $InvoiceItems = array();
    $DbResult = $this->Database->select('FinanceInvoiceItem', '*, ROUND(`Price` * `Quantity`, '.$Finance->Rounding.') AS `Total`', '`FinanceInvoice`='.$this->InvoiceId);
    while ($Item = $DbResult->fetch_assoc())
    {
      $InvoiceItems[$Item['Id']] = $Item;
    }

    // If direction is in => switch sides
    if ($Invoice['Direction'] == FINANCE_DIRECTION_OUT)
    {
    }
    else if ($Invoice['Direction'] == FINANCE_DIRECTION_IN)
    {
      $Subject = $SubjectTo;
      $SubjectTo = $SubjectFrom;
      $SubjectFrom = $Subject;
    }
    else throw new Exception('Wrong finance direction');

    $PaymentType = array('převodem', 'hotově');
    $BooleanText = array('Ne', 'Ano');

    $Output = '<table width="100%"><tr><td colspan="2">'.
      '<font size="6"><div align="center">Faktura - daňový doklad</font></div>'.
      '<hr></td></tr>'.
      '<tr><td valign="top" width="50%"><strong>Dodavatel:</strong><br>'.
      $this->ShowSubjectInfo($SubjectFrom).
      '</td><td valign="top">'.
      '<strong>Odběratel:</strong><br>'.
      $this->ShowSubjectInfo($SubjectTo);
    $Output .=
      '</td></tr>'.
      '<tr><td colspan="2"><hr></td></tr>'.
      '<tr><td width="50%" valign="top">'.
      '<strong>Platební podmínky:</strong><br>'.
      'Číslo dokladu: '.$Invoice['BillName'].'<br>'.
      'Variabilní symbol: '.$VarSym.'<br>'.
      'Specifický symbol: '.$this->SpecificSymbol.'<br>'.
      'Konstantní symbol:<br>'.
      'Způsob úhrady: '.$PaymentType[$Invoice['Cash']].
      '</td><td valign="top">'.
      '<br>'.
      'Datum vystavení: '.HumanDate($Invoice['Time']).'<br>'.
      'Datum zdanitel. plnění: '.HumanDate($Invoice['Time']).'<br>'.
      'Datum splatnosti: '.HumanDate($Invoice['TimeDue']).'<br>';
    if (($Invoice['PeriodFrom'] != '') and ($Invoice['PeriodTo'] != ''))
      $Output .= 'Fakturované období: '.HumanDate($Invoice['PeriodFrom']).' - '.
        HumanDate($Invoice['PeriodTo']).'<br>';
    $Output .= '</td></tr>'.
      '<tr><td colspan="2">'.
      '<hr>'.
      '<br>'.
      '<table border="0" width="100%">'.
      '<tr><th align="left">Dodávka</th><th align="right">Množství</th><th align="right">Cena/MJ</th><th align="right">Celkem</th></tr>'.
      '<tr><td colspan="4"><hr></td></tr>';

    $Total = 0;
    foreach ($InvoiceItems as $Item)
    {
      $Output .= '<tr><td>'.$Item['Description'].'</td><td align="right">'.
        $Item['Quantity'].'</td><td align="right">'.$Item['Price'].
        '&nbsp;Kč</td><td align="right">'.$Item['Total'].'&nbsp;Kč</td></tr>';
      $Total += $Item['Total'];
    }
    $Output .= '<tr><th colspan="3" align="left">Celkem</th><th align="right">'.$Total.'&nbsp;Kč</th></tr>';
    $Output .= '</table>'.
      '</td></tr>'.
      '<tr><td colspan="2"><hr></td></tr>'.
      '</table>';

    return $Output;
  }
}

class BillOperation extends Bill
{
  public string $OperationId;

  function GenerateHTML(): string
  {
    $DbResult = $this->Database->query('SELECT `FinanceOperation`.*, `FinanceOperationGroup`.`Direction`, `DocumentLineCode`.`Name` AS `BillName` FROM `FinanceOperation` '.
      'LEFT JOIN `FinanceOperationGroup` ON `FinanceOperationGroup`.`Id`=`FinanceOperation`.`Group` '.
      'LEFT JOIN `DocumentLineCode` ON `DocumentLineCode`.`Id`=`FinanceOperation`.`BillCode` '.
      'WHERE `FinanceOperation`.`Id`='.$this->OperationId);
    $Operation = $DbResult->fetch_assoc();

    $DbResult = $this->Database->select('Subject', '*', '`Id`='.$Operation['Subject']);
    $Subject = $DbResult->fetch_assoc();

    $DbResult = $this->Database->select('Subject', '*', '`Id`='.$this->System->Config['Finance']['MainSubjectId']);
    $MainSubject = $DbResult->fetch_assoc();

    $DbResult = $this->Database->query('SELECT FinanceBankAccount.*, CONCAT(FinanceBankAccount.Number, "/", FinanceBank.Code) AS NumberFull FROM FinanceBankAccount '.
      'JOIN FinanceBank ON FinanceBank.Id=FinanceBankAccount.Bank '.
      'WHERE (FinanceBankAccount.`Subject`='.$this->System->Config['Finance']['MainSubjectId'].') AND (FinanceBankAccount.`Use`=1)');
    $MainSubjectAccount = $DbResult->fetch_assoc();

    $BooleanText = array('Ne', 'Ano');
    if ($Operation['Direction'] == FINANCE_DIRECTION_OUT)
    $Desc = array(
      'Type' => 'VÝDAJOVÝ',
      'Signature' => 'Vydal',
      'Target' => 'Vydáno komu',
    );
    else if ($Operation['Direction'] == FINANCE_DIRECTION_IN)
    $Desc = array(
      'Type' => 'PŘÍJMOVÝ',
      'Signature' => 'Přijal',
      'Target' => 'Přijato od',
    );
    else throw new Exception('Wrong finance direction');

    $Output = '<table width="100%" border="1" cellspacing="0" cellpadding="3"><tr><td width="50%">'.
      '<strong>Firma:</strong><br>'.
      $MainSubject['Name'].'<br>'.
      $MainSubject['AddressStreet'].'<br>'.
      $MainSubject['AddressPSC'].' '.$MainSubject['AddressTown'].'<br>'.
      'IČ: '.$MainSubject['IC'].'<br>'.
      'DIČ: '.$MainSubject['DIC'].'<br>'.
      'Účet: '.$MainSubjectAccount['NumberFull'].'<br>'.
      'Plátce DPH: '.$BooleanText[$MainSubject['PayVAT']].
      '</td><td width="50%" valign="top">'.
      '<font size="5"><strong>'.$Desc['Type'].' POKLADNÍ DOKLAD</strong></font><br><br>'.
      'Číslo dokladu: '.$Operation['BillName'].'<br>'.
      'Datum vystavení: '.HumanDate($Operation['Time']).'<br>'.
      '</td></tr>'.
      '<tr><td colspan="2"><strong>'.$Desc['Target'].':</strong><br>'.
      $Subject['Name'].'<br>'.
      $Subject['AddressStreet'].'<br>'.
      $Subject['AddressPSC'].' '.$Subject['AddressTown'].'<br>';
    if ($Subject['IC'] != 0) $Output .= 'IČ: '.$Subject['IC'].'<br>';
    if ($Subject['DIC'] != '') $Output .= 'DIČ: '.$Subject['DIC'].'<br>';
    $Description = $Operation['Text'];
    $Output .= '</td></tr>'.
      '<tr><td colspan="2"><strong>Částka:</strong> '.$Operation['Value'].' Kč<br><br>'.
      '</td></tr>'.
      '<tr><td colspan="2"><strong>Účel platby:</strong><br>'.$Description.'</td></tr>'.
      '<tr><td>&nbsp;</td><td><br><br>'.$Desc['Signature'].':</td></tr>';
    $Output .= '</table>';
    return $Output;
  }
}
