Перейти к содержимому


Товары с разным НДС, счет в PDF-формате, показ счета из личного кабинета


  • Вы не можете ответить в тему
Сообщений в теме: 5

#1 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 13 January 2013 - 05:38 PM

Модуль затрагивает три момента:
1. разный НДС у разных товаров. Если НДС=0, то в счете пишется "Без НДС". Ну и счет сделан с учетом разного заданного НДС у товара, а не единого у всех.
2. вывод счета сделан в PDF-формате. Это удобнее, т.к. легко приделать подписи-печати, плюс к тому PDF делится на страницы (для принтера) в отличие от HTML.
3. "кнопка" вывода счета в личном кабинете

Эти три момента (НДС, PDF, кнопка) практически никак не связаны, т.е. можно реализовать отдельно любую из этих трех фишек.

Сделаем дополнительное поле НДС для товаров в админке
----------------------------------------------------

1. в файле catalog_products_categories.tpl.html

1.1 перед строкой


<td align="right"><a href='{$urlToSort}&amp;sort=sort_order&amp;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&amp;orderID={$user_orders[i].orderID}&amp;order_time={$order_time_b64[i]}&amp;customer_email={$cust_email_b64[i]}&amp;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&amp;orderID={$order.orderID}&amp;order_time={$order_time_b64}&amp;customer_email={$cust_email_b64}&amp;moduleID={$module_jur.id}',1000,1000);">Счет</option>{/if}
</select>
{/if}
</td>

Прикрепленные файлы

  • Прикрепленный файл  InvoiceNDS.zip   135.06К   15 Количество загрузок:

  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#2 lokitoki

    Пользователь

  • Assistent vsupport.club
  • PipPip
  • 20 сообщений
Репутация: 0
Начинающий

Отправлено 28 January 2013 - 10:12 PM

В истории заказов появились выпадающ. список. при выборе Счет открывается окно в котором написано

Ошибка сервера

Веб-сайт может быть закрыт на обслуживание или настроен неправильно.
Ошибка HTTP 500 (Internal Server Error): При попытке сервера выполнить запрос возникла неожиданная ситуация.

Все, сам разобрался скачал только обновления MPDF не увидел внизу.
  • 0

#3 dgimmibos

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 126 сообщений
Репутация: 12
Начинающий

Отправлено 03 March 2013 - 02:03 PM

НДС не считается, можете помочь за оплату
  • 0

#4 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 03 March 2013 - 02:45 PM

НДС не считается, можете помочь за оплату

Скорее всего, да, но это тема явно не для форума, а для лички.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#5 lokitoki

    Пользователь

  • Assistent vsupport.club
  • PipPip
  • 20 сообщений
Репутация: 0
Начинающий

Отправлено 06 March 2013 - 08:46 AM

Подскажите кто ни будь как сделать чтобы ндс и на доставку было?

пытаюсь так
в core/include/processor/invoice_jur.php

$snalogom = $shipping_rate+($shipping_rate/118)*18; //чисто налог+доставка

$amount += $shipping_rate; //+стоимость доставки

и сответственно в шаблоне /core/modules/tpl
invoice_jur.tpl.html


{if $shipping_type ne NULL}
<TR>
<TD>{$order_content_items_count}</TD>
<TD><B><NOBR>Доставка ({$shipping_type})</NOBR></B>
<TD>шт.</TD>
<TD>1</TD>
<TD>{$shipping_rate}</TD>
<TD align=right>{*{$shipping_rate}*} 18%</TD>
<TD>{$snalogom}</TD>
</TR>
{/if}

но в стоблце $snalogom почему то пусто.
  • 0

#6 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 06 March 2013 - 05:16 PM

1. Правильно оформляйте код в постах. Для этого есть соответствующие теги. Если будете выкладывать так, все последующие посты будут удаляться без комментариев.
2. А где передача переменной из php в smarty.
  • 0