1. разный НДС у разных товаров. Если НДС=0, то в счете пишется "Без НДС". Ну и счет сделан с учетом разного заданного НДС у товара, а не единого у всех.
2. вывод счета сделан в PDF-формате. Это удобнее, т.к. легко приделать подписи-печати, плюс к тому PDF делится на страницы (для принтера) в отличие от HTML.
3. "кнопка" вывода счета в личном кабинете
Эти три момента (НДС, PDF, кнопка) практически никак не связаны, т.е. можно реализовать отдельно любую из этих трех фишек.
Сделаем дополнительное поле НДС для товаров в админке
----------------------------------------------------
1. в файле catalog_products_categories.tpl.html
1.1 перед строкой
<td align="right"><a href='{$urlToSort}&sort=sort_order&sort_dir=ASC' title="{$smarty.const.ADMIN_ADMIN_MENUNEW11}" class="liv">{$smarty.const.ADMIN_SORTM}</a></td>
вставляем
<td align="right">НДС</td>
1.2 перед строкой
<td align="right"><input name='sort_order_{$products[i].productID}' type='text' class="prc prcss{if !$products[i].enabled} gryy{/if}" value="{$products[i].sort_order}"></td>
вставляем
<td align="right"><input type="text" name="nds_{$products[i].productID}" value="{$products[i].nds}" class="prc prcss{if !$products[i].enabled} gryy{/if}"></td>
2. в файле catalog_products_categories.php
2.1 перед строкой
$callBackParam = array();
вставляем
$field = array ('Field' => 'nds', 'Type' => 'tinyint(1)', 'Default' => '18');
$data = mysql_query("desc ".PRODUCTS_TABLE);
while ($row[] = mysql_fetch_assoc($data));
$flag = true;
foreach ($row as $cur_row) if ($field['Field'] == $cur_row['Field']) {$flag=false; break;}
if ($flag) mysql_query("ALTER TABLE ".PRODUCTS_TABLE." ADD ".$field['Field']." ".$field['Type']." DEFAULT ".$field['Default']);
2.2 вместо строки
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order" ) );
вставляем
$data = ScanPostVariableWithId( array( "price", "enable", "left", "sort_order", "nds" ) );
2.3 после второй (второй! их там две!) строки
foreach( $data as $key => $val )
{
вставляем
if ( isset($val["nds"]) ) db_query( "UPDATE ".PRODUCTS_TABLE." SET nds=".(int)$val["nds"]." WHERE productID=".(int)$key );
логика в ShopCMS, конечно, трындец. На каждый столбец каждого товара при сохранении - по SQL-запросу.
3. в файле product_functions.php
3.1 в функции prdSearchProductByTemplateAdmin
вместо строки
" customers_rating, Price, in_stock, ".
вставляем
" customers_rating, Price, in_stock, nds,".
Сделаем новый вид счета (инвойса) - с НДС и печатью-подписями.
--------------------------------------------------------------
4. проще всего скопировать готовые файлы:
invoice_jur.php -> core/includes/processor/
invoice_jur.tpl.html -> core/modules/tpl/
pechat.png -> data/
podpis1.png -> data/
podpis2.png -> data/
в PHP-файле изменения откомментированы и можно их внести в свой файл
TPL.HTML-файл написан "почти с нуля" и комментировать там нечего
ну и очевидно, что подписи и печать хорошо бы отсканировать свои .
5. в файле order_functions.php
5.1 в функции ordGetOrderContent
перед строкой
if ( $product["eproduct_filename"] != null &&
вставляем
$row["nds"] = $product["nds"];
Сделаем конвертирование счета в из HTML в PDF, так оно удобнее.
---------------------------------------------------------------
6. добавляем конвертер HTML->PDF
6.1 скачиваем из http://www.mpdf1.com/mpdf/download последнюю версию mPDF
6.2 распаковываем в корень сайта, переименовываем каталог (на текущий момент это MPDF54) в mpdf
Уберем посылку емейла со счетом из модуля счетов, т.к. он (см. invoice_jur.php) и так теперь отсылается каждый раз при показе счета.
-----------------------------------------------------------------------------------------------------------------------------------
7. находим в core/modules/payment/invoice_jur.php строку "//отправить счет покупателю по электронной почте"
и обрамляем символами комментария - /* */ - весь нижележащий блок
if ($this->_getSettingValue('CONF_PAYMENTMODULE_INVOICE_JUR_EMAIL_HTML_INVOICE') == 1) //html
{
.....
}
Сделаем показ счета в личном кабинете, чтобы иметь возможность распечатать его не только сразу после заказа.
------------------------------------------------------------------------------------------------------------
8. в файле order_history.tpl.html
8.1 вместо строки
<td class="pad" align="left" valign="middle">{$user_orders[i].order_amount} {if $user_orders[i].calculate_tax ne 0 && $user_orders[i].tax ne 0}<br>({$smarty.const.STRING_TAX} {$user_orders[i].tax}){/if}</td>
вставляем
{php}
$orders = $this->get_template_vars('user_orders');
foreach ($orders as $order)
{
$order_time_b64[] = base64_encode(date("Y-m-d H:i:s",strtotime($order["order_time"])));
$cust_email_b64[] = base64_encode($order["customer_email"]);
}
$this->assign("order_time_b64",$order_time_b64);
$this->assign("cust_email_b64",$cust_email_b64);
if($row = db_fetch_assoc(db_query("SELECT module_id,name FROM ".PAYMENT_TYPES_TABLE." JOIN ".MODULES_TABLE." USING(module_id) WHERE ModuleClassName='CInvoiceJur'")))
$this->assign("module_jur", array("id" => $row['module_id'],"name" => $row['name']));
if($row = db_fetch_assoc(db_query("SELECT module_id,name FROM ".PAYMENT_TYPES_TABLE." JOIN ".MODULES_TABLE." USING(module_id) WHERE ModuleClassName='CInvoicePhys'")))
$this->assign("module_phys", array("id" => $row['module_id'],"name" => $row['name']));
{/php}
<td class="pad" align="left" valign="middle">
{$user_orders[i].order_amount} {if $user_orders[i].calculate_tax ne 0 && $user_orders[i].tax ne 0}<br>({$smarty.const.STRING_TAX} {$user_orders[i].tax}){/if}
{if $user_orders[i].statusID == "2" && $user_orders[i].payment_type == $module_jur.name}
<br>
<select onchange="eval(this.value);document.getElementById('selected_{$user_orders[i].orderID}').selected=true;">
<option id="selected_{$user_orders[i].orderID}">Документы</option>
{if $user_orders[i].statusID == "2" && $user_orders[i].payment_type == $module_jur.name}<option value="open_window('index.php?do=invoice_jur&orderID={$user_orders[i].orderID}&order_time={$order_time_b64[i]}&customer_email={$cust_email_b64[i]}&moduleID={$module_jur.id}',1000,1000);">Счет</option>{/if}
</select>
{/if}
</td>
8.2 после строки
<td class="cbt" align="left"><b>{$smarty.const.ADMIN_ORDER_EXECUTING}</b></td>
вставляем
{php}
$order = $this->get_template_vars('order');
$this->assign("order_time_b64",base64_encode(date("Y-m-d H:i:s",strtotime($order["order_time"]))));
$this->assign("cust_email_b64",base64_encode($order["customer_email"]));
if($row = db_fetch_assoc(db_query("SELECT module_id,name FROM ".PAYMENT_TYPES_TABLE." JOIN ".MODULES_TABLE." USING(module_id) WHERE ModuleClassName='CInvoiceJur'")))
$this->assign("module_jur", array("id" => $row['module_id'],"name" => $row['name']));
if($row = db_fetch_assoc(db_query("SELECT module_id,name FROM ".PAYMENT_TYPES_TABLE." JOIN ".MODULES_TABLE." USING(module_id) WHERE ModuleClassName='CInvoicePhys'")))
$this->assign("module_phys", array("id" => $row['module_id'],"name" => $row['name']));
{/php}
<td class="cbt" align="right">
{if $order.statusID == "2" && $order.payment_type == $module_jur.name}
<select onchange="eval(this.value);document.getElementById('selected_').selected=true;">
<option id="selected_">Документы</option>
{if $order.statusID == "2" && $order.payment_type == $module_jur.name}<option value="open_window('index.php?do=invoice_jur&orderID={$order.orderID}&order_time={$order_time_b64}&customer_email={$cust_email_b64}&moduleID={$module_jur.id}',1000,1000);">Счет</option>{/if}
</select>
{/if}
</td>