* @copyright 2021 Keshva * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ if (!defined('_PS_VERSION_')){ exit; } class DocumentReferences extends ObjectModel { public $id; public $id_document; public $document_type; public $reference; public static $definition = array( 'table' => 'document_references', 'primary' => 'id_document_reference', 'fields' => array( 'id_document' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true, 'required' => true), 'document_type' => array('type' => self::TYPE_STRING, 'validate' => 'isAnything', 'required' => true, 'size' => 32), 'reference' => array('type' => self::TYPE_STRING, 'validate' => 'isAnything', 'size' => 255) ) ); public static function addMissingReferences($idOrder = 0) { $ordersWithInvoices = Db::getInstance()->executeS("SELECT oi.id_order_invoice FROM "._DB_PREFIX_."order_invoice oi LEFT JOIN "._DB_PREFIX_."document_references dr on dr.id_document = oi.id_order_invoice AND dr.document_type = 'invoice' WHERE oi.number > 0 AND (dr.id_document is NULL || (dr.id_document is not NULL AND dr.document_type != 'invoice'))".($idOrder > 0 ? " AND oi.id_order = ". (int)$idOrder : "")); if (count($ordersWithInvoices) > 0) foreach ($ordersWithInvoices as $key => $value) { $orderInvoice = new OrderInvoice((int)$value['id_order_invoice']); $documentReference = new DocumentReferences(); $documentReference->id_document = (int)$value['id_order_invoice']; $documentReference->document_type = 'invoice'; $documentReference->reference = $orderInvoice->getInvoiceNumberFormatted(Context::getContext()->language->id, null, true); $documentReference->add(); } $ordersWithDeliveryNumbers = Db::getInstance()->executeS("SELECT oi.id_order_invoice, oi.delivery_number FROM "._DB_PREFIX_."order_invoice oi LEFT JOIN "._DB_PREFIX_."document_references dr on dr.id_document = oi.id_order_invoice AND dr.document_type = 'delivery_slip' WHERE oi.delivery_number > 0 AND (dr.id_document is NULL || (dr.id_document is not NULL AND dr.document_type != 'delivery_slip'))".($idOrder > 0 ? " AND oi.id_order = ". (int)$idOrder : "")); if (count($ordersWithDeliveryNumbers) > 0) foreach ($ordersWithDeliveryNumbers as $key => $value) { $documentReference = new DocumentReferences(); $documentReference->id_document = (int)$value['id_order_invoice']; $documentReference->document_type = 'delivery_slip'; $documentReference->reference = Configuration::get('PS_DELIVERY_PREFIX', Context::getContext()->language->id, null, null).sprintf('%06d', $value['delivery_number']); $documentReference->add(); } $creditSlips = Db::getInstance()->executeS("SELECT os.id_order_slip FROM "._DB_PREFIX_."order_slip os LEFT JOIN "._DB_PREFIX_."document_references dr on dr.id_document = os.id_order_slip AND dr.document_type = 'credit_slip' WHERE dr.id_document is NULL || (dr.id_document is not NULL AND dr.document_type != 'credit_slip')".($idOrder > 0 ? " AND os.id_order = ". (int)$idOrder : "")); if (count($creditSlips) > 0) foreach ($creditSlips as $key => $value) { $documentReference = new DocumentReferences(); $documentReference->id_document = (int)$value['id_order_slip']; $documentReference->document_type = 'credit_slip'; $documentReference->reference = sprintf(Translate::getPdfTranslation('%1$s%2$06d'), Configuration::get('PS_CREDIT_SLIP_PREFIX', Context::getContext()->language->id), (int)$value['id_order_slip']); $documentReference->add(); } } public static function storeReference($documentType, $idOrder = 0, $idDocument = 0) { $customNumberReferenceData = json_decode(Configuration::get('modrefchange')); if ($documentType == 'credit_slip') { $reference = self::getCustomOrderSlipReferenceNumber($customNumberReferenceData[3], $idOrder, $idDocument); } else if ($documentType == 'delivery_slip') { $reference = self::getCustomDeliverySlipReferenceNumber($customNumberReferenceData[2], $idOrder); } else if ($documentType == 'invoice') { if ($idDocument == 0) { $idDocument = self::getOrderInvoiceIdByOrderId($idOrder); } $reference = self::getCustomInvoiceReferenceNumber($customNumberReferenceData[1], $idOrder, $idDocument); } else { //$documentType == 'order' return self::getCustomOrderReferenceNumber($customNumberReferenceData[0]); } $idDocumentReference = Db::getInstance()->getValue("SELECT id_document_reference FROM `"._DB_PREFIX_."document_references` WHERE `id_document` = ".(int)$idDocument." AND `document_type` = '".pSQL($documentType)."'"); if ($idDocumentReference > 0) { Db::getInstance()->update('document_references', array('reference' => pSQL($reference)), '`id_document_reference` = '.(int)$idDocumentReference); } else { Db::getInstance()->insert('document_references', array('id_document' => (int)$idDocument, 'document_type' => pSQL($documentType), 'reference' => pSQL($reference))); } } public static function getAllDocuments() { return Db::getInstance()->executeS("SELECT * FROM "._DB_PREFIX_."document_references"); } public static function getReference($idDocument, $documentType) { $sql = "SELECT * FROM "._DB_PREFIX_."document_references WHERE id_document = ".(int)$idDocument." AND document_type = '".pSQL($documentType)."'"; return Db::getInstance()->getRow($sql); } public static function getCustomOrderSlipReferenceNumber($customOrderSlipReferenceData, $order_id, $idDocument) { if ($customOrderSlipReferenceData->activate_reference_number) { $finalReference = $customOrderSlipReferenceData->reference_number_format; if (strpos($finalReference, '{COUNTER}') !== false) { self::checkForCounterReset(3); $getAllCounterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true); $currentCounterData = $getAllCounterData[3]; $finalReference = str_replace('{COUNTER}', self::getCounterValue($currentCounterData), $finalReference); $nextCounterValue = (int)$currentCounterData['counter_actual_value'] + (int)$currentCounterData['counter_increment_by']; $currentCounterData['counter_actual_value'] = $nextCounterValue; $getAllCounterData[3] = $currentCounterData; Configuration::updateGlobalValue('counterNumberData', json_encode($getAllCounterData)); } $finalReference = str_replace('{RANDOM_NUMBER}', Tools::strtoupper(Tools::passwdGen($customOrderSlipReferenceData->random_number_length, 'NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHABETIC}', Tools::strtoupper(Tools::passwdGen($customOrderSlipReferenceData->random_alphabetic_length, 'NO_NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHANUMERIC}', Tools::strtoupper(Tools::passwdGen($customOrderSlipReferenceData->random_alphanumeric_length, 'ALPHANUMERIC')), $finalReference); $finalReference = str_replace('{ORDER_ID}', (int)$order_id, $finalReference); $finalReference = str_replace('{SHOP_ID}', (int)Context::getContext()->shop->id, $finalReference); $finalReference = str_replace('{YEAR}', date('Y'), $finalReference); $finalReference = str_replace('{YEARSHORTCUT}', date('y'), $finalReference); $finalReference = str_replace('{MONTH}', date('m'), $finalReference); $finalReference = str_replace('{WEEK}', date('W'), $finalReference); $finalReference = str_replace('{DAYINWEEK}', date('N'), $finalReference); $finalReference = str_replace('{DAY}', date('j'), $finalReference); return $finalReference; } else { return Configuration::get('PS_CREDIT_SLIP_PREFIX', Context::getContext()->language->id).sprintf('%06d', (int)$idDocument); } } public static function getCustomDeliverySlipReferenceNumber($customDeliverySlipReferenceData, $order_id) { if ($customDeliverySlipReferenceData->activate_reference_number) { $finalReference = $customDeliverySlipReferenceData->reference_number_format; if (strpos($finalReference, '{COUNTER}') !== false) { self::checkForCounterReset(2); $getAllCounterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true); $currentCounterData = $getAllCounterData[2]; $finalReference = str_replace('{COUNTER}', self::getCounterValue($currentCounterData), $finalReference); $nextCounterValue = (int)$currentCounterData['counter_actual_value'] + (int)$currentCounterData['counter_increment_by']; $currentCounterData['counter_actual_value'] = $nextCounterValue; $getAllCounterData[2] = $currentCounterData; Configuration::updateGlobalValue('counterNumberData', json_encode($getAllCounterData)); } $finalReference = str_replace('{RANDOM_NUMBER}', Tools::strtoupper(Tools::passwdGen($customDeliverySlipReferenceData->random_number_length, 'NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHABETIC}', Tools::strtoupper(Tools::passwdGen($customDeliverySlipReferenceData->random_alphabetic_length, 'NO_NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHANUMERIC}', Tools::strtoupper(Tools::passwdGen($customDeliverySlipReferenceData->random_alphanumeric_length, 'ALPHANUMERIC')), $finalReference); $finalReference = str_replace('{ORDER_ID}', (int)$order_id, $finalReference); $finalReference = str_replace('{SHOP_ID}', (int)Context::getContext()->shop->id, $finalReference); $finalReference = str_replace('{YEAR}', date('Y'), $finalReference); $finalReference = str_replace('{YEARSHORTCUT}', date('y'), $finalReference); $finalReference = str_replace('{MONTH}', date('m'), $finalReference); $finalReference = str_replace('{WEEK}', date('W'), $finalReference); $finalReference = str_replace('{DAYINWEEK}', date('N'), $finalReference); $finalReference = str_replace('{DAY}', date('j'), $finalReference); return $finalReference; } else { $order = new Order($order_id); return Configuration::get('PS_DELIVERY_PREFIX', Context::getContext()->language->id, null, Context::getContext()->shop->id).sprintf('%06d', $order->delivery_number); } } public static function getCustomInvoiceReferenceNumber($customInvoiceReferenceData, $order_id, $idDocument) { if ($customInvoiceReferenceData->activate_reference_number) { $finalReference = $customInvoiceReferenceData->reference_number_format; if (strpos($finalReference, '{COUNTER}') !== false) { self::checkForCounterReset(1); $getAllCounterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true); $currentCounterData = $getAllCounterData[1]; $finalReference = str_replace('{COUNTER}', self::getCounterValue($currentCounterData), $finalReference); $nextCounterValue = (int)$currentCounterData['counter_actual_value'] + (int)$currentCounterData['counter_increment_by']; $currentCounterData['counter_actual_value'] = $nextCounterValue; $getAllCounterData[1] = $currentCounterData; Configuration::updateGlobalValue('counterNumberData', json_encode($getAllCounterData)); } $finalReference = str_replace('{RANDOM_NUMBER}', Tools::strtoupper(Tools::passwdGen($customInvoiceReferenceData->random_number_length, 'NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHABETIC}', Tools::strtoupper(Tools::passwdGen($customInvoiceReferenceData->random_alphabetic_length, 'NO_NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHANUMERIC}', Tools::strtoupper(Tools::passwdGen($customInvoiceReferenceData->random_alphanumeric_length, 'ALPHANUMERIC')), $finalReference); $finalReference = str_replace('{ORDER_ID}', (int)$order_id, $finalReference); $finalReference = str_replace('{SHOP_ID}', (int)Context::getContext()->shop->id, $finalReference); $finalReference = str_replace('{YEAR}', date('Y'), $finalReference); $finalReference = str_replace('{YEARSHORTCUT}', date('y'), $finalReference); $finalReference = str_replace('{MONTH}', date('m'), $finalReference); $finalReference = str_replace('{WEEK}', date('W'), $finalReference); $finalReference = str_replace('{DAYINWEEK}', date('N'), $finalReference); $finalReference = str_replace('{DAY}', date('j'), $finalReference); return $finalReference; } else { $orderInvoice = new OrderInvoice($idDocument); return $orderInvoice->getInvoiceNumberFormatted(Context::getContext()->language->id, Context::getContext()->shop->id, true); } } public static function getCustomOrderReferenceNumber($customOrderReferenceData) { if ($customOrderReferenceData->activate_reference_number) { $finalReference = $customOrderReferenceData->reference_number_format; if (strpos($finalReference, '{COUNTER}') !== false) { self::checkForCounterReset(0); $getAllCounterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true); $currentCounterData = $getAllCounterData[0]; $finalReference = str_replace('{COUNTER}', self::getCounterValue($currentCounterData), $finalReference); $nextCounterValue = (int)$currentCounterData['counter_actual_value'] + (int)$currentCounterData['counter_increment_by']; $currentCounterData['counter_actual_value'] = $nextCounterValue; $getAllCounterData[0] = $currentCounterData; Configuration::updateGlobalValue('counterNumberData', json_encode($getAllCounterData)); } $finalReference = str_replace('{RANDOM_NUMBER}', Tools::strtoupper(Tools::passwdGen($customOrderReferenceData->random_number_length, 'NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHABETIC}', Tools::strtoupper(Tools::passwdGen($customOrderReferenceData->random_alphabetic_length, 'NO_NUMERIC')), $finalReference); $finalReference = str_replace('{RANDOM_ALPHANUMERIC}', Tools::strtoupper(Tools::passwdGen($customOrderReferenceData->random_alphanumeric_length, 'ALPHANUMERIC')), $finalReference); $finalReference = str_replace('{ORDER_ID}', (int)self::getLastOrderId() + 1, $finalReference); $finalReference = str_replace('{SHOP_ID}', (int)Context::getContext()->shop->id, $finalReference); $finalReference = str_replace('{YEAR}', date('Y'), $finalReference); $finalReference = str_replace('{YEARSHORTCUT}', date('y'), $finalReference); $finalReference = str_replace('{MONTH}', date('m'), $finalReference); $finalReference = str_replace('{WEEK}', date('W'), $finalReference); $finalReference = str_replace('{DAYINWEEK}', date('N'), $finalReference); $finalReference = str_replace('{DAY}', date('j'), $finalReference); return $finalReference; } else return Tools::strtoupper(Tools::passwdGen(9, 'NO_NUMERIC')); } // tato metoda sa vola len pri prvom generovani faktury -> Order->setInvoice() // vtedy este nemoze byt viac zaznamov v tabulke order_invoice public static function getOrderInvoiceIdByOrderId($orderId) { $sql = 'SELECT id_order_invoice FROM '._DB_PREFIX_.'order_invoice WHERE id_order = '.(int)$orderId; if ($row = Db::getInstance()->getRow($sql)) return $row['id_order_invoice']; } public static function getLastOrderId() { $sql = 'SELECT MAX(id_order) as lastId FROM '._DB_PREFIX_.'orders'; if ($row = Db::getInstance()->getRow($sql)) return $row['lastId']; } public static function orderInvoiceRecordsCountByOrderID($orderId) { return (int)Db::getInstance()->getValue('SELECT COUNT(id_order_invoice) FROM `'._DB_PREFIX_.'order_invoice` WHERE `id_order` = '.(int)$orderId); } public static function getDefaultCounterData() { return array( 'counter_start_at' => '', 'counter_increment_by' => '', 'counter_actual_value' => '', 'counter_reset_interval' => '5', 'counter_reset_number' => '', 'counter_reset_date' => '', 'counter_reset_now' => '0', 'counter_reference_length_in_use' => '0', 'counter_reference_length' => '4', 'counter_last_set_date' => date("Y-m-d") ); } public static function checkForCounterReset($type) { $counterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true); if (!is_array($counterData)) { $counterData = array(); } if (!isset($counterData[$type]) || !is_array($counterData[$type])) { $counterData[$type] = self::getDefaultCounterData(); } $currentCounterData = $counterData[$type]; $today = date("Y-m-d"); if ((int)$currentCounterData['counter_reset_interval'] == 0) //reset tyzdna { if (strtotime($currentCounterData['counter_last_set_date']) < strtotime($today) && (((int)date("W", strtotime($currentCounterData['counter_last_set_date'])) != (int)date("W", strtotime($today))) || (((int)date("W", strtotime($currentCounterData['counter_last_set_date'])) == (int)date("W", strtotime($today))) && ((int)date("Y", strtotime($currentCounterData['counter_last_set_date'])) < (int)date("Y", strtotime($today)))) )) { $currentCounterData['counter_actual_value'] = $currentCounterData['counter_start_at']; } } else if ((int)$currentCounterData['counter_reset_interval'] == 1) //reset mesiaca { if (strtotime($currentCounterData['counter_last_set_date']) < strtotime($today) && (((int)date("n", strtotime($currentCounterData['counter_last_set_date'])) != (int)date("n", strtotime($today))) || (((int)date("n", strtotime($currentCounterData['counter_last_set_date'])) == (int)date("n", strtotime($today))) && ((int)date("Y", strtotime($currentCounterData['counter_last_set_date'])) < (int)date("Y", strtotime($today)))) )) { $currentCounterData['counter_actual_value'] = $currentCounterData['counter_start_at']; } } else if ((int)$currentCounterData['counter_reset_interval'] == 2) //reset roka { if (strtotime($currentCounterData['counter_last_set_date']) < strtotime($today) && ((int)date("Y", strtotime($currentCounterData['counter_last_set_date'])) < (int)date("Y", strtotime($today)))) { $currentCounterData['counter_actual_value'] = $currentCounterData['counter_start_at']; } } else if ((int)$currentCounterData['counter_reset_interval'] == 3){ //reset podla cisla if ((int)$currentCounterData['counter_actual_value'] > $currentCounterData['counter_reset_number']) { $currentCounterData['counter_actual_value'] = $currentCounterData['counter_start_at']; } } else if ((int)$currentCounterData['counter_reset_interval'] == 4) //reset podla datumu { if (strtotime($currentCounterData['counter_last_set_date']) < strtotime($today) && strtotime($currentCounterData['counter_reset_date']) <= strtotime($today) && $currentCounterData['counter_reset_date'] != '') { $currentCounterData['counter_actual_value'] = $currentCounterData['counter_start_at']; $currentCounterData['counter_reset_date'] = ''; } } $currentCounterData['counter_last_set_date'] = $today; $counterData[$type] = $currentCounterData; Configuration::updateGlobalValue('counterNumberData', json_encode($counterData)); } public static function getCounterValue($currentCounterData) { $nextCounterValue = ''; if ((int)$currentCounterData['counter_reference_length_in_use'] == 1) { if ((int)$currentCounterData['counter_reference_length'] > Tools::strlen((string)$currentCounterData['counter_actual_value'])) { for ($i = 0; $i < (int)$currentCounterData['counter_reference_length'] - Tools::strlen((string)$currentCounterData['counter_actual_value']); $i++) { $nextCounterValue .= "0"; } } } $nextCounterValue .= $currentCounterData['counter_actual_value']; return $nextCounterValue; } }