Files
modrefchange_fixed/v6.1.12-modrefchange/modrefchange/classes/DocumentReferences.php
T
2026-07-10 11:56:56 +02:00

328 lines
19 KiB
PHP

<?php
/**
* Module allow edit existing orders and set rules for automatically generating numbers for orders and other documents
*
* @author Keshva <keshvathakur47@gmail.com>
* @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 checkForCounterReset($type)
{
$counterData = json_decode(Configuration::getGlobalValue('counterNumberData'), true);
$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;
}
}