diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json index 72d20cb..2f42254 100755 --- a/Admin/Install/Media.install.json +++ b/Admin/Install/Media.install.json @@ -33,5 +33,19 @@ "lang": "de" } ] + }, + { + "type": "type", + "name": "original", + "l11n": [ + { + "title": "Original", + "lang": "en" + }, + { + "title": "Original", + "lang": "de" + } + ] } ] \ No newline at end of file diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php index 332bf43..d8b37de 100755 --- a/Admin/Install/Media.php +++ b/Admin/Install/Media.php @@ -44,6 +44,7 @@ class Media $media = \Modules\Media\Admin\Installer::installExternal($app, ['path' => __DIR__ . '/Media.install.json']); $preivewType = (int) \reset($media['type'][0]); + $originalType = (int) \reset($media['type'][1]); $setting = new Setting(); SettingMapper::create()->execute( @@ -56,5 +57,17 @@ class Media 'Billing' ) ); + + $setting = new Setting(); + SettingMapper::create()->execute( + $setting->with( + 0, + SettingsEnum::ORIGINAL_MEDIA_TYPE, + (string) $originalType, + '\\d+', + null, + 'Billing' + ) + ); } } diff --git a/Admin/Install/Navigation.install.json b/Admin/Install/Navigation.install.json index 617f1b7..0a59114 100755 --- a/Admin/Install/Navigation.install.json +++ b/Admin/Install/Navigation.install.json @@ -98,7 +98,7 @@ "uri": "{/prefix}purchase/bill/archive", "target": "self", "icon": null, - "order": 1, + "order": 5, "from": "Billing", "permission": { "permission": 2, "type": null, "element": null }, "parent": 1005105001, @@ -113,7 +113,22 @@ "uri": "{/prefix}purchase/bill/create?{?}", "target": "self", "icon": null, - "order": 5, + "order": 10, + "from": "Billing", + "permission": { "permission": 4, "type": null, "element": null }, + "parent": 1005105001, + "children": [] + }, + { + "id": 1005105401, + "pid": "/purchase/bill", + "type": 3, + "subtype": 1, + "name": "Upload", + "uri": "{/prefix}purchase/bill/upload?{?}", + "target": "self", + "icon": null, + "order": 15, "from": "Billing", "permission": { "permission": 4, "type": null, "element": null }, "parent": 1005105001, diff --git a/Controller/ApiController.php b/Controller/ApiController.php index a815b1f..936d240 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -1,4 +1,5 @@ validateBillUpdate($request))) { + $response->set($request->uri->__toString(), new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $old = clone BillMapper::get()->where('id', (int) $request->getData('bill')); + $new = $this->updateBillFromRequest($request, $response, $data); + $this->updateModel($request->header->account, $old, $new, BillMapper::class, 'bill', $request->getOrigin()); + + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Bill', 'Bill successfully created.', $new); + } + + /** + * Method to validate bill creation from request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateBillUpdate(RequestAbstract $request): array + { + $val = []; + if (($val['bill'] = empty($request->getData('bill')))) { + return $val; + } + + return []; + } + + /** + * Method to create a bill from request. + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return Bill + * + * @since 1.0.0 + */ + public function updateBillFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null): Bill + { + /** @var Bill $bill */ + $bill = BillMapper::get()->where('id', (int) $request->getData('bill'))->execute(); + + return $bill; + } + /** * Api method to create a bill * @@ -57,7 +137,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiBillCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiBillCreate(RequestAbstract $request, ResponseAbstract $response, $data = null): void { if (!empty($val = $this->validateBillCreate($request))) { $response->set($request->uri->__toString(), new FormValidation($val)); @@ -87,7 +167,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function createBillFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null) : Bill + public function createBillFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null): Bill { $account = null; if ($request->getData('client') !== null) { @@ -113,6 +193,7 @@ final class ApiController extends Controller $bill = new Bill(); $bill->createdBy = new NullAccount($request->header->account); $bill->type = $billType; + $bill->setStatus((int) ($request->getData('status') ?? BillStatus::ACTIVE)); $bill->numberFormat = $billType->numberFormat; $bill->billTo = $request->getData('billto') ?? ($account->profile->account->name1 . (!empty($account->profile->account->name2) ? ', ' . $account->profile->account->name2 : '')); // @todo: use defaultInvoiceAddress or mainAddress. also consider to use billto1, billto2, billto3 (for multiple lines e.g. name2, fao etc.) @@ -136,11 +217,10 @@ final class ApiController extends Controller * * @since 1.0.0 */ - private function validateBillCreate(RequestAbstract $request) : array + private function validateBillCreate(RequestAbstract $request): array { $val = []; - if (($val['client/customer'] = (empty($request->getData('client')) && empty($request->getData('supplier')))) - ) { + if (($val['client/supplier'] = (empty($request->getData('client')) && empty($request->getData('supplier'))))) { return $val; } @@ -160,7 +240,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiMediaAddToBill(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiMediaAddToBill(RequestAbstract $request, ResponseAbstract $response, $data = null): void { if (!empty($val = $this->validateMediaAddToBill($request))) { $response->set($request->uri->__toString(), new FormValidation($val)); @@ -169,6 +249,9 @@ final class ApiController extends Controller return; } + $bill = BillMapper::get()->where('id', (int) $request->getData('bill'))->execute(); + $path = $this->createBillDir($bill); + $uploaded = []; if (!empty($uploadedFiles = $request->getFiles() ?? [])) { $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( @@ -176,16 +259,21 @@ final class ApiController extends Controller [], $uploadedFiles, $request->header->account, - __DIR__ . '/../../../Modules/Media/Files/Modules/Editor', - '/Modules/Editor', + __DIR__ . '/../../../Modules/Media/Files' . $path, + $path, + type: $request->getData('type') ?? null, + pathSettings: PathSettings::FILE_PATH ); foreach ($uploaded as $media) { $this->createModelRelation( $request->header->account, - $request->getData('bill'), + $bill->getId(), $media->getId(), - BillMapper::class, 'media', '', $request->getOrigin() + BillMapper::class, + 'media', + '', + $request->getOrigin() ); } } @@ -194,9 +282,12 @@ final class ApiController extends Controller foreach ($mediaFiles as $media) { $this->createModelRelation( $request->header->account, - $request->getData('bill'), + $bill->getId(), $media, - BillMapper::class, 'media', '', $request->getOrigin() + BillMapper::class, + 'media', + '', + $request->getOrigin() ); } } @@ -207,6 +298,15 @@ final class ApiController extends Controller ]); } + private function createBillDir(Bill $bill): string + { + return '/Modules/Billing/Bills/' + . $bill->createdAt->format('Y') . '/' + . $bill->createdAt->format('m') . '/' + . $bill->createdAt->format('d') . '/' + . $bill->getId(); + } + /** * Method to validate bill creation from request * @@ -216,10 +316,10 @@ final class ApiController extends Controller * * @since 1.0.0 */ - private function validateMediaAddToBill(RequestAbstract $request) : array + private function validateMediaAddToBill(RequestAbstract $request): array { $val = []; - if (($val['media'] = empty($request->getData('media')) && empty($request->getFiles())) + if (($val['media'] = (empty($request->getData('media')) && empty($request->getFiles()))) || ($val['bill'] = empty($request->getData('bill'))) ) { return $val; @@ -241,7 +341,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiBillElementCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiBillElementCreate(RequestAbstract $request, ResponseAbstract $response, $data = null): void { if (!empty($val = $this->validateBillElementCreate($request))) { $response->set($request->uri->__toString(), new FormValidation($val)); @@ -272,7 +372,7 @@ final class ApiController extends Controller * @since 1.0.0 * @todo in the database the customer localized version should be stored because this is the version which went out */ - public function createBillElementFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null) : BillElement + public function createBillElementFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null): BillElement { $element = new BillElement(); $element->bill = (int) $request->getData('bill'); @@ -315,7 +415,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function updateBillWithBillElement(Bill $bill, BillElement $element, int $type = 1) : Bill + public function updateBillWithBillElement(Bill $bill, BillElement $element, int $type = 1): Bill { if ($type === 1) { $bill->netSales->add($element->totalSalesPriceNet); @@ -334,11 +434,10 @@ final class ApiController extends Controller * * @since 1.0.0 */ - private function validateBillElementCreate(RequestAbstract $request) : array + private function validateBillElementCreate(RequestAbstract $request): array { $val = []; - if (($val['bill'] = empty($request->getData('bill'))) - ) { + if (($val['bill'] = empty($request->getData('bill')))) { return $val; } @@ -358,7 +457,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiBillPdfArchiveCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiBillPdfArchiveCreate(RequestAbstract $request, ResponseAbstract $response, $data = null): void { Autoloader::addPath(__DIR__ . '/../../../Resources/'); @@ -376,10 +475,8 @@ final class ApiController extends Controller $template = $bill->type->template; - $pdfDir = __DIR__ . '/../../../Modules/Media/Files/Modules/Billing/Bills/' - . $bill->createdAt->format('Y') . '/' - . $bill->createdAt->format('m') . '/' - . $bill->createdAt->format('d') . '/'; + $path = $this->createBillDir($bill);; + $pdfDir = __DIR__ . '/../../../Modules/Media/Files' . $path; $status = !\is_dir($pdfDir) ? \mkdir($pdfDir, 0755, true) : true; if ($status === false) { @@ -394,11 +491,11 @@ final class ApiController extends Controller $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/' . \substr($template->getSourceByName('bill.pdf.php')->getPath(), 0, -8), 'pdf.php'); $view->setData('bill', $bill); - $view->setData('path', $pdfDir . $request->getData('bill') . '.pdf'); + $view->setData('path', $pdfDir . '/' . $request->getData('bill') . '.pdf'); $pdf = $view->build(); - if (!\is_file($pdfDir . $request->getData('bill') . '.pdf')) { + if (!\is_file($pdfDir . '/' . $request->getData('bill') . '.pdf')) { $response->header->status = RequestStatusCode::R_400; return; @@ -410,14 +507,11 @@ final class ApiController extends Controller 'name' => $request->getData('bill') . '.pdf', 'path' => $pdfDir, 'filename' => $request->getData('bill') . '.pdf', - 'size' => \filesize($pdfDir . $request->getData('bill') . '.pdf'), + 'size' => \filesize($pdfDir . '/' . $request->getData('bill') . '.pdf'), 'extension' => 'pdf', ], $request->header->account, - '/Modules/Billing/Bills/' - . $bill->createdAt->format('Y') . '/' - . $bill->createdAt->format('m') . '/' - . $bill->createdAt->format('d'), + $path, $previewType ); @@ -425,7 +519,10 @@ final class ApiController extends Controller $request->header->account, $bill->getId(), $media->getId(), - BillMapper::class, 'media', '', $request->getOrigin() + BillMapper::class, + 'media', + '', + $request->getOrigin() ); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'PDF', 'Bill Pdf successfully created.', $media); @@ -444,7 +541,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiBillPdfCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiBillPdfCreate(RequestAbstract $request, ResponseAbstract $response, $data = null): void { } @@ -461,7 +558,7 @@ final class ApiController extends Controller * * @since 1.0.0 */ - public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + public function apiNoteCreate(RequestAbstract $request, ResponseAbstract $response, $data = null): void { if (!empty($val = $this->validateNoteCreate($request))) { $response->set('bill_note_create', new FormValidation($val)); @@ -470,7 +567,10 @@ final class ApiController extends Controller return; } - $request->setData('virtualpath', '/Modules/Billing/Bills/' . $request->getData('id'), true); + /** @var Bill $bill */ + $bill = BillMapper::get()->where('id', (int) $request->getData('id'))->execute(); + + $request->setData('virtualpath', $this->createBillDir($bill), true); $this->app->moduleManager->get('Editor')->apiEditorCreate($request, $response, $data); if ($response->header->status !== RequestStatusCode::R_200) { @@ -490,14 +590,146 @@ final class ApiController extends Controller * * @since 1.0.0 */ - private function validateNoteCreate(RequestAbstract $request) : array + private function validateNoteCreate(RequestAbstract $request): array { $val = []; - if (($val['id'] = empty($request->getData('id'))) - ) { + if (($val['id'] = empty($request->getData('id')))) { return $val; } return []; } + + /** + * Api method to create bill files + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiSupplierBillUpload(RequestAbstract $request, ResponseAbstract $response, $data = null): void + { + $originalType = (int) ($request->getData('type') ?? $this->app->appSettings->get( + names: SettingsEnum::ORIGINAL_MEDIA_TYPE, + module: self::NAME + )->content); + + $purchaseTransferType = BillTypeMapper::get() + ->where('transferType', BillTransferType::PURCHASE) + ->limit(1) + ->execute(); + + $files = $request->getFiles(); + foreach ($files as $file) { + // Create default bill + $billRequest = new HttpRequest(new HttpUri('')); + $billRequest->header->account = $request->header->account; + $billRequest->header->l11n = $request->header->l11n; + $billRequest->setData('supplier', 1); // @todo: make suppleir 1 = unknown supplier + $billRequest->setData('status', BillStatus::UNPARSED); + $billRequest->setData('type', $purchaseTransferType->getId()); + + $billResponse = new HttpResponse(); + $billResponse->header->l11n = $response->header->l11n; + + $this->apiBillCreate($billRequest, $billResponse, $data); + + $billId = $billResponse->get('')['response']->getId(); + + // Upload and assign document to bill + $mediaRequest = new HttpRequest(); + $mediaRequest->header->account = $request->header->account; + $mediaRequest->header->l11n = $request->header->l11n; + $mediaRequest->addFile($file); + + $mediaResponse = new HttpResponse(); + $mediaResponse->header->l11n = $response->header->l11n; + + $mediaRequest->setData('bill', $billId); + $mediaRequest->setData('type', $originalType); + $this->apiMediaAddToBill($mediaRequest, $mediaResponse, $data); + + $uploaded = $mediaResponse->get('')['response']['upload']; + $in = \reset($uploaded)->getAbsolutePath(); + + if (!\is_file($in)) { + throw new \Exception(); + } + + // Extract text from document + $text = ''; + $tmpDir = \sys_get_temp_dir(); + + // Is PDF + if (StringUtils::endsWith($in, '.pdf')) { + SystemUtils::runProc('/usr/bin/pdftotext', '-layout ' . \escapeshellarg($in) . ' ' . \escapeshellarg($out = \tempnam($tmpDir, 'pdf_'))); + $text = \file_get_contents($out); + \unlink($out); + } + + // Is image or PDF couldn't get parsed to text + if (\strlen($text) < 256) { + SystemUtils::runProc('/usr/bin/pdftoppm', '-jpeg -r 300 ' . \escapeshellarg($in) . ' ' . \escapeshellarg($out = \tempnam($tmpDir, 'pdf_'))); + + $files = \glob($out . '*'); + if ($files === false) { + return; + } + + foreach ($files as $file) { + if ( + !StringUtils::endsWith($file, '.jpg') + && !StringUtils::endsWith($file, '.png') + && !StringUtils::endsWith($file, '.gif') + ) { + continue; + } + + /* Too slow + Thresholding::integralThresholding($file, $file); + Skew::autoRotate($file, $file, 10); + */ + + SystemUtils::runProc(__DIR__ . '/../../../cOMS/Tools/InvoicePreprocessing/App', \escapeshellarg($file) . ' ' . \escapeshellarg($file)); + + $ocr = new TesseractOcr(); + $text = $ocr->parseImage($file); + + \unlink($file); + } + } + + // @todo: Parse text and analyze text structure + + // Update bill with parsed text + $billRequest = new HttpRequest(); + $billRequest->header->account = $request->header->account; + $billRequest->header->l11n = $request->header->l11n; + + $billRequest->setData('bill', $billId); + $billRequest->setData('supplier', 1); + + $billResponse = new HttpResponse(); + $billResponse->header->l11n = $response->header->l11n; + + $this->apiBillUpdate($billRequest, $billResponse, $data); + + // Create internal document + $billResponse = new HttpResponse(); + $billRequest = new HttpRequest(new HttpUri('')); + + $billRequest->header->account = $request->header->account; + $billRequest->setData('bill', $billId); + + $this->apiBillPdfArchiveCreate($billRequest, $billResponse); + + // @todo: Start workflow for bill, if a workflow is defined for bill uploading + } + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index d42bd6b..ba7d5b0 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace Modules\Billing\Controller; +use Modules\Billing\Models\BillTransferType; use Modules\Billing\Models\PurchaseBillMapper; use Modules\Billing\Models\SalesBillMapper; use Modules\Billing\Models\SettingsEnum; @@ -60,6 +61,7 @@ final class BackendController extends Controller ->with('type') ->with('type/l11n') ->with('client') + ->where('type/transferType', BillTransferType::SALES) ->sort('id', OrderType::DESC) ->limit(25); @@ -206,19 +208,37 @@ final class BackendController extends Controller { $view = new View($this->app->l11nManager, $request, $response); $view->setTemplate('/Modules/Billing/Theme/Backend/purchase-bill-list'); - $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005104001, $request, $response)); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005105001, $request, $response)); + + $mapperQuery = PurchaseBillMapper::getAll() + ->with('type') + ->with('type/l11n') + ->with('supplier') + ->where('type/transferType', BillTransferType::PURCHASE) + ->sort('id', OrderType::DESC) + ->limit(25); if ($request->getData('ptype') === 'p') { $view->setData('bills', - PurchaseBillMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '<')->limit(25)->execute() + $mapperQuery + ->where('id', (int) ($request->getData('id') ?? 0), '<') + ->where('supplier', null, '!=') + ->where('type/l11n/language', $response->getLanguage()) + ->execute() ); } elseif ($request->getData('ptype') === 'n') { $view->setData('bills', - PurchaseBillMapper::getAll()->where('id', (int) ($request->getData('id') ?? 0), '>')->limit(25)->execute() + $mapperQuery->where('id', (int) ($request->getData('id') ?? 0), '>') + ->where('supplier', null, '!=') + ->where('type/l11n/language', $response->getLanguage()) + ->execute() ); } else { $view->setData('bills', - PurchaseBillMapper::getAll()->where('id', 0, '>')->limit(25)->execute() + $mapperQuery->where('id', 0, '>') + ->where('supplier', null, '!=') + ->where('type/l11n/language', $response->getLanguage()) + ->execute() ); } @@ -243,7 +263,12 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Billing/Theme/Backend/purchase-bill'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005104001, $request, $response)); - $bill = PurchaseBillMapper::get()->where('id', (int) $request->getData('id'))->execute(); + $bill = PurchaseBillMapper::get() + ->with('elements') + ->with('media') + ->with('notes') + ->where('id', (int) $request->getData('id')) + ->execute(); $view->setData('bill', $bill); @@ -254,6 +279,13 @@ final class BackendController extends Controller $view->setData('previewType', $previewType); + $originalType = (int) $this->app->appSettings->get( + names: SettingsEnum::ORIGINAL_MEDIA_TYPE, + module: self::NAME + )->content; + + $view->setData('originalType', $originalType); + return $view; } diff --git a/Models/BillStatus.php b/Models/BillStatus.php index 81c28a0..43cddc4 100755 --- a/Models/BillStatus.php +++ b/Models/BillStatus.php @@ -35,4 +35,6 @@ abstract class BillStatus extends Enum public const DONE = 8; public const DRAFT = 16; + + public const UNPARSED = 32; } diff --git a/Models/SettingsEnum.php b/Models/SettingsEnum.php index 5a4e206..c8947b9 100644 --- a/Models/SettingsEnum.php +++ b/Models/SettingsEnum.php @@ -26,5 +26,9 @@ use phpOMS\Stdlib\Base\Enum; */ abstract class SettingsEnum extends Enum { - public const PREVIEW_MEDIA_TYPE = '1005100001_1'; + public const PREVIEW_MEDIA_TYPE = '1005100001_1'; // internally generated preview + + public const ORIGINAL_MEDIA_TYPE = '1005100001_2'; // original document (mostly supplier invoice/delivery note) + + } diff --git a/Theme/Backend/Lang/en.lang.php b/Theme/Backend/Lang/en.lang.php index 7e5d8d6..460e295 100644 --- a/Theme/Backend/Lang/en.lang.php +++ b/Theme/Backend/Lang/en.lang.php @@ -15,28 +15,28 @@ declare(strict_types=1); return ['Billing' => [ 'Address' => 'Address', 'Addresses' => 'Addresses', - 'Africa' => '', + 'Africa' => 'Africa', 'AlreadyPaid' => 'Already Paid', - 'America' => '', - 'Analyse' => '', - 'Articles' => '', - 'Asia' => '', - 'Attribute' => '', - 'BaseTime' => '', + 'America' => 'America', + 'Analyse' => 'Analyse', + 'Articles' => 'Articles', + 'Asia' => 'Asia', + 'Attribute' => 'Attribute', + 'BaseTime' => 'Base time', 'Bills' => 'Bills', 'Bonus' => 'Bonus', - 'CIS' => '', + 'CIS' => 'CIS', 'Cashback' => 'Cash Back', 'City' => 'City', 'Client' => 'Client', 'ClientID' => 'Client ID', - 'ComparisonTime' => '', + 'ComparisonTime' => 'Comparison time', 'Confirmation' => 'Confirmation', 'Country' => 'Country', 'Created' => 'Created', 'CreditCard' => 'CreditCard', 'CreditNote' => 'Credit Note', - 'Customers' => '', + 'Customers' => 'Customers', 'Date' => 'Date', 'Delivery' => 'Delivery', 'DeliveryNote' => 'Delivery Note', @@ -44,10 +44,10 @@ return ['Billing' => [ 'Discount' => 'Discount', 'DiscountP' => 'Discount %', 'Due' => 'Due', - 'Europe' => '', - 'Filter' => '', + 'Europe' => 'Europe', + 'Filter' => 'Filter', 'Freightage' => 'Freightage', - 'General' => '', + 'General' => 'General', 'Gross' => 'Gross', 'Invoice' => 'Invoice', 'Invoices' => 'Invoices', @@ -60,7 +60,7 @@ return ['Billing' => [ 'Name' => 'Name', 'Net' => 'Net', 'Offer' => 'Offer', - 'Other' => '', + 'Other' => 'Other', 'Payment' => 'Payment', 'Postal' => 'Postal', 'Prepaid' => 'Prepaid', @@ -69,9 +69,9 @@ return ['Billing' => [ 'Profit' => 'Profit', 'Quantity' => 'Quantity', 'Recipient' => 'Recipient', - 'Region' => '', - 'Rep' => '', - 'Sales' => '', + 'Region' => 'Region', + 'Rep' => 'Rep.', + 'Sales' => 'Sales', 'Select' => 'Select', 'Shipment' => 'Shipment', 'Source' => 'Source', @@ -82,7 +82,7 @@ return ['Billing' => [ 'Total' => 'Total', 'Type' => 'Type', 'Upload' => 'Upload', - 'Value' => '', + 'Value' => 'Value', 'Variation' => 'Variation', 'Zip' => 'Zip', ]]; diff --git a/Theme/Backend/purchase-bill-list.tpl.php b/Theme/Backend/purchase-bill-list.tpl.php index 2234efe..efc5969 100755 --- a/Theme/Backend/purchase-bill-list.tpl.php +++ b/Theme/Backend/purchase-bill-list.tpl.php @@ -26,6 +26,10 @@ echo $this->getData('nav')->render(); ?> + - $value) : + $value) : ++$count; $url = UriFactory::build('{/prefix}purchase/bill?{?}&id=' . $value->getId()); ?> +
getHtml('ID', '0', '0'); ?> getHtml('ClientID'); ?> + getHtml('SupplierID'); ?> getHtml('Client'); ?> + getHtml('Supplier'); ?> getHtml('Net'); ?> - getHtml('Profit'); ?> - - - getHtml('Created'); ?>
getNumber(); ?> type->getL11n(); ?> - client->number; ?> - printHtml($value->billTo); ?> - billAddress; ?> + supplier->number; ?> + printHtml($value->billTo); ?> + billAddress; ?> billZip; ?> billCity; ?> billCountry; ?> - net->getCurrency(); ?> - profit->getCurrency(); ?> + netSales->getCurrency(); ?> createdAt->format('Y-m-d'); ?> -
getHtml('Empty', '0', '0'); ?> +
getHtml('Empty', '0', '0'); ?>
diff --git a/Theme/Backend/purchase-bill.tpl.php b/Theme/Backend/purchase-bill.tpl.php index 26d2f35..ec65d7c 100755 --- a/Theme/Backend/purchase-bill.tpl.php +++ b/Theme/Backend/purchase-bill.tpl.php @@ -12,8 +12,13 @@ */ declare(strict_types=1); +use Modules\Media\Models\NullMedia; +use phpOMS\System\File\FileUtils; use phpOMS\Uri\UriFactory; +// Media helper functions (e.g. file icon generator) +include __DIR__ . '/../../../Media/Theme/Backend/template-functions.php'; + /** * @var \phpOMS\Views\View $this */ @@ -21,7 +26,11 @@ use phpOMS\Uri\UriFactory; $bill = $this->getData('bill'); $elements = $bill->getElements(); -$billPdf = $bill->getMediaByType('bill'); +$previewType = $this->getData('previewType'); +$originalType = $this->getData('originalType'); +$billPdf = $bill->getFileByType($previewType); +$original = $bill->getFileByType($originalType); +$media = $bill->getMedia(); echo $this->getData('nav')->render(); ?> @@ -31,9 +40,10 @@ echo $this->getData('nav')->render(); ?>
  • -
  • -
  • -
  • +
  • +
  • +
  • +
  • @@ -179,9 +189,9 @@ echo $this->getData('nav')->render(); ?>
    getHtml('Freightage'); ?>: 0.00 - - getHtml('Net'); ?>: net->getCurrency(); ?> - + getHtml('Net'); ?>: netSales->getCurrency(); ?> - getHtml('Tax'); ?>: 0.00 - - getHtml('Total'); ?>: gross->getCurrency(); ?> + getHtml('Total'); ?>: grossSales->getCurrency(); ?>
    @@ -193,13 +203,29 @@ echo $this->getData('nav')->render(); ?>
    - + + +
    +
    +
    +
    +
    +
    + + + +
    +
    +
    +
    +
    +
    @@ -238,7 +264,7 @@ echo $this->getData('nav')->render(); ?>
    - +
    @@ -258,9 +284,43 @@ echo $this->getData('nav')->render(); ?>
    + +
    +
    +
    getHtml('Media'); ?>
    + + + + + extension === 'collection' + ? UriFactory::build('{/prefix}media/list?path=' . \rtrim($file->getVirtualPath(), '/') . '/' . $file->name) + : UriFactory::build('{/prefix}media/single?id=' . $file->getId() + . '&path={?path}' . ( + $file->getId() === 0 + ? '/' . $file->name + : '' + ) + ); + + $icon = $fileIconFunction(FileUtils::getExtensionType($file->extension)); + ?> + +
    + + getHtml('Name'); ?> + getHtml('Type'); ?> +
    + + name; ?> + extension; ?> + +
    +
    +
    - +