328 lines
19 KiB
PHP
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;
|
|
}
|
|
} |