Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: "Юрики" и "физики": разная страница реги
osCommerce с поддержкой русского языка > Электронная коммерция > Документация в нашем деле
awk
Кто-нибудь сталкивался с проблемой, как требовать от пользователя разные данные на странице регистрации в зависимости от того, что он выбирает - юридическое лицо или физическое?

И чтобы от этого зависило, какие методы оплаты и доставки может использовать этот клиент...
VaM
Я не програмер, но чтобы сделать то, что Вы хотите (разные формы регистрации и в завиисмости от этого модули оплаты и доставки) нужно перелопатить чуть ли не весь OSC, поправьте если я ошибаюсь
Вобщем нужно искать другие пути smile.gif
Kayak
Если магазин не претендует на глобальность, то можно пожертвовать регионами, а использовать их как статус покупателя (физ-, юр- лицо или ПБОЮЛ). Соответственно подцепить к ним налоги и сбор за доставку и переименовать в ланг-файле "Регион" в "Статус".
Пример ЗДЕСЬ. Вроде работает.
VaM
Это не решение проблемы, человек же хочет что б модули оплаты и доставки были привязаны конкретные к юрикам и физикам
Kayak
Цитата
Это не решение проблемы, человек же хочет что б модули оплаты и доставки были привязаны конкретные к юрикам и физика

Именно решение. Зайдите в любой модуль доставки или оплаты. Каждый из них может быть привязан к зоне, которая соотносится с регионом (в нашем случае - статусом).
VaM
Не во всех модулях есть привязка
awk
Цитата(Kayak)
Если магазин не претендует на глобальность, то можно пожертвовать регионами, а использовать их как статус покупателя (физ-, юр- лицо или ПБОЮЛ). Соответственно подцепить к ним налоги и сбор за доставку и переименовать в ланг-файле "Регион" в "Статус".  
Пример ЗДЕСЬ. Вроде работает.

Да. Это мысль... Я посмотрел пример.
Вот только требования к заполняемым данным должны быть разные - юр. лица должны также _в обязательном порядке_ заполнить ИНН, ОКОНХ, ОКПО и... чего там еще бухгалтерия потребует?!
Т.е., на мой взгляд, после первой страницы, где можно заполнить поля, обязательные для любого типа клиента, должна идти страница с полями на основании поля "статус". Вот это мне кажется нужно? :-)
Fredi
Господа, поройтесь если не ошибаюсь, по немецким, итальянским и испанским модулям.
Там тоже есть требования на заполнение дополнительных полей, типа регистрационный номер компании или что-то в этом духе.

А вообще-то, чтобы грамотно подойти к созданию подобного модуля, который так или иначе понадобится всем Российским магазинам, нужно четко сформулировать все требования к нему от бухгалтерии и налоговых служб.
Если кто-то из Вас имеет выходы на них, попытайтесь выяснить эти требования.
GenezZ
Для Фреди
А что тут думать.
Все что нужно от покупателя(юрика) это:
1.Название организации
2.ИНН
3.Юридический адрес
4*.Фактический адрес
5.Расчетный счет
6.Корресп.счет
7.Название банка
8.БИК (банка)
9* Коды ОКПО и ОКОНХ
10.КПП
Вот и все... все что помечено * в принципе для документооборота между покупателем и продавцом не обязательно..
Kurt
На самом деле, не вижу никакой проблемы. Просто на странице login.php делается не две формы, а три. Так же как и при добавление формы prush whis out account только в этом втором случаи третья форма - это не быстрая регистрация, а именно регистрация для юр. лиц. Со своими полями и прочем. Делается легко, как раз изночально отделяем мухи от котлет и вперед.
SergeR
Немного не в тему. На Bolero.ru удобно сделано. У одного пользователя может быть несколько адресов доставки. Причем физик/юрик -- это свойство адреса, со всеми вытекющими вопросами относительно реквизитов. При оформлении заказа можно выбрать один из ранее введенных адресов или добавить новый. Таким образом один и тот-же клиент(догин+пароль ;-) может заказывать в зависимости от своего желания товар на себя как на физика и на себя как на юрика ;-)
В OSC это реализуемо?
Kurt
В ОСК по умолчанию любой пользователь получает адресную книгу и может указывать разные адреса для доставки.
Вообще, на практике реально ведь почти всегда в розничном магазине покупку делает лицо, а не организация. Если он хочет оплатить со счета организации, то люди указывают это в свободных полях или комментариях. То есть, если магазин не ориентирован на юр. лиц. Например, думаю, магазин канцелярской продукции будет ориентирован. То для него это мало важно. А если все же ориентировано, то, навернео тут что-то вроде b2b suit подойдет.
GenezZ
Ага... а у меня как раз на Юриков магазин..
Ну вкрайнем случае ЧП и ПБОЮЛ
Физ лицам наш товар как -то не очень нуженsmile.gif)
DreamCasr
господа, вопрос сам по себе заглох от того что написали что то подходящее или нет ?
yura
в хт-commerce есть возможность запрещать определенным группам клиентов совершать оплаты по определенным видам оплаты.....
А другим разрешать ...

так к слову...
Angel
Сделал дополнительные поля для юр. лиц.
Убрал несколько полей. А вот с полем страна проблема. Когда я его убрал, оно проверяется и выдаёт : "Выберите вашу страну в меню. "

Так вот в связи с этим у меня 2 вопроса:
1 - где чекается эта страна. В файле address_book_process.php

Пробовал убирать это:
if (!is_numeric($country)) {
$error = true;

$messageStack->add('addressbook', ENTRY_COUNTRY_ERROR);
Но это не помогло.
2. Где нужно прописать проверку моих дополнительных полей.(ИНН, КПП...)
Medreces
1. Страна проверяется минимум в 4-х файлах: address_book_process.php, checkout_payment_address.php, checkout_shipping_address.php и create_account.php. После проверки (если все true) код страны клиента добавляется в БД и далее используется при расчетах доставки, оплаты и, может быть, еще чего-нибудь. Как поведут себя эти расчеты если это поле будет пустое - незнаю. Имхо, проще и корректнее сделать "страну" hidden полем и прописать туда value по умолчанию. Тогда и на странице его не будет, и все проверки - на "5+", и гарантированы правильные расчеты.
Ф-я tep_draw_hidden_field() описана includesfunctionshtml_output.php.

2. Везде, где это делается с основными полями. Видимо, это файлы, где есть ENTRY_что-то-там_ERROR.

Удачи!

офтопик: сегодня - четверг. где сайт?
VaM
Angel
А можешь продемонстрировать пример, как работают юрики и физики.
Angel
Спасибо, буду пробовать.
Проблемы уже были, но они решились установкой по дефолту соотв. MySQL поля в NULL. И когда добавлял новые поля, в orders (billing_INN...) т.к. они тоже являются необязательными, на всякий случай загнал в NULL.
Сайт пока не выложен. Меняем провайдера, на MTU. Мтушный менеджер ?%?%? скрывается по телефону. Жуть, деньги уже за подключение уплочены. Обещают 26 числа выслать мастера с ADSL.
Angel
Сайт пока не выложен.
Но я могу объяснить, как я это сделал.
На идею меня натолкнул пример создания поля "метро".

Пользуясь тем, что поля должны находится под полем "компания", и так же являться необязательными... Сделал поиск по слову company, загрузил всё в phpexperteditor. Ну а дальше по образу и подобию:

Нашел, например это:
if (ACCOUNT_COMPANY == 'true') {
?>

<?php echo ENTRY_COMPANY; ?>
<?php echo tep_draw_input_field('company', $entry['entry_company'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '' . ENTRY_COMPANY_TEXT . '': ''); ?>


Дописал:


<?php echo ENTRY_yurAdress; ?>
<?php echo tep_draw_input_field('yurAdress', $entry['entry_yurAdress'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_yurAdress_TEXT) ? '' . ENTRY_yurAdress_TEXT . '': ''); ?>

........

<?php
}
?>

Или вот, совершенно ясно, что тут после company дописано smile.gif

$customers_query = tep_db_query("select c.customers_id, c.customers_gender, c.customers_firstname, c.customers_lastname, c.customers_dob, c.customers_email_address, a.entry_company, a.entry_yurAdress, a.entry_INN, a.entry_KPP, a.entry_street_address, a.entry_suburb, a.entry_postcode, a.entry_city, a.entry_state, a.entry_zone_id, a.entry_country_id, a.entry_metro_id, c.customers_telephone, c.customers_fax, c.customers_newsletter, c.customers_default_address_id from " . TABLE_CUSTOMERS . " c left join " . TABLE_ADDRESS_BOOK . " a on c.customers_default_address_id = a.address_book_id where a.customers_id = c.customers_id and c.customers_id = '" . (int)$HTTP_GET_VARS['cID'] . "'");

Сделал в SQL несколько полей и всё.

Основное неудобство было в отслеживании открытых и закрытых тегов. Т.к. редактор их не подсвечивает.

Периодически вставлял source из explorer'a через буфер в dreamweaver.

Получилось, что при регистрации покупатель сразу может зарегистрироваться как сабж., что считаю удобным. Т.к. при покупке нечто дорогого мож. удобней заплатить безналом, и наоборот.

Ps.
Ещё для юриков сделал выставление счёта. Только пока не нашёл $где? хранится номер заказа, чтоб присвоить его номеру счёта.
Angel
Ой, код схавал.
Письмо следует читать с серидины, потом сверху.
После "Дописал:" /* "<?php echo ENTRY_yurAdress; ?>" */
А, нижняя часть инкрустирована <ТР><ТД></ТД></ТР> .
Adler
С доп.полями давно решена такая задача - пример http://www.service-tele.com/create_account.php ,а вот с разной страницой реги - нет sad.gif
VaM
Adler
А можешь написать как ты так сделал?!
Тогда можно будет легко сделать отдельную форму с этими полями, т.е. оставить стандартный create_account.php без юриков и сделать create_accpunt1.php, где все поля(страну можно оставить) будут скрыты,а останутся поля для юриков.
Вобщем если расскажешь, как сделать как на http://www.service-tele.com/create_account.php
Я бы сделал отдельные регистрации для юриков и физиков.
И ещё, связаны ли как-то эти поля для юриков с админкой.
Adler
Сделать элементарно - даже не стоит говорить -
1. Делаем запрос в базу - создаем новые поля- пример:
Код
DROP TABLE IF EXISTS customers;

CREATE TABLE customers (

 customers_id int(11) NOT NULL auto_increment,

 customers_gender char(1) NOT NULL default '',

 customers_firstname varchar(32) NOT NULL default '',

 customers_lastname varchar(32) NOT NULL default '',

 customers_dob datetime NOT NULL default '0000-00-00 00:00:00',

 customers_email_address varchar(96) NOT NULL default '',

 customers_default_address_id int(11) NOT NULL default '0',

 customers_telephone varchar(32) NOT NULL default '',

 customers_fax varchar(32) default NULL,

 customers_password varchar(40) NOT NULL default '',

 customers_newsletter char(1) default NULL,

 customers_firma varchar(64) default NULL,

 customers_yra varchar(64) default NULL,

 customers_inn int(20) default NULL,

 customers_bik int(20) default NULL,

 customers_rs int(20) default NULL,

 customers_bank varchar(50) default NULL,

 customers_who varchar(60) default NULL,

 customers_oknx varchar(60) default NULL,

 PRIMARY KEY  (customers_id)

) TYPE=MyISAM;

Это для "свежего" дистрибьюта- для уже функционирующего магазина меняем запросы на
Код
ALTER TABLE `customers` ADD `customers_inn` VARCHAR(15)

И так далее.... столько полей, сколько необходимо.
2. Лезем в catalog/create_account.php, находим: (я привожу пример своих полей- но могут быть любые поля - это понятно biggrin.gif )
[php:1:bbfc2e0afd]
$country = tep_db_prepare_input($HTTP_POST_VARS['country']);
$telephone = tep_db_prepare_input($HTTP_POST_VARS['telephone']);
[/php:1:bbfc2e0afd]
и вставляем за ним наши "новосозданные" поля:
[php:1:bbfc2e0afd]
$firma = tep_db_prepare_input($HTTP_POST_VARS['firma']);
$yra = tep_db_prepare_input($HTTP_POST_VARS['yra']);
$inn = tep_db_prepare_input($HTTP_POST_VARS['inn']);
$rs = tep_db_prepare_input($HTTP_POST_VARS['rs']);
$bik = tep_db_prepare_input($HTTP_POST_VARS['bik']);
$bank = tep_db_prepare_input($HTTP_POST_VARS['bank']);
$who = tep_db_prepare_input($HTTP_POST_VARS['who']);
$oknx = tep_db_prepare_input($HTTP_POST_VARS['oknx']);
[/php:1:bbfc2e0afd]
Далее, находим там же:

[php:1:bbfc2e0afd]
if ($error == false) {
$sql_data_array = array('customers_firstname' => $firstname,
'customers_lastname' => $lastname,
'customers_email_address' => $email_address,
'customers_telephone' => $telephone,
[/php:1:bbfc2e0afd]
Вставляем после этого:
[php:1:bbfc2e0afd]
'customers_fax' => $fax,
'customers_firma' =>$firma,
'customers_yra' =>$yra,
'customers_inn' =>$inn,
'customers_bik' =>$bik,
'customers_rs' =>$rs,
'customers_bank' =>$bank,
'customers_who' =>$who,
'customers_oknx' =>$oknx,

[/php:1:bbfc2e0afd]
Далее ищем место куда мы выводим эти поля - я взял раздел после адреса:

Код
  if (tep_not_null(ENTRY_STATE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_STATE_TEXT;

?>

               </td>

             </tr>

<?php

 }

?>

             <tr>

               <td class="main"><?php echo ENTRY_COUNTRY; ?></td>

               <td class="main"><?php echo tep_get_country_list('country') . '&nbsp;' . (tep_not_null(ENTRY_COUNTRY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COUNTRY_TEXT . '</span>': ''); ?></td>

             </tr>

           </table></td>

         </tr>

       </table></td>

     </tr>

И вставил туда блок - для юр.лиц:
Код
<tr>

       <td><?php echo tep_draw_separator('pixel_trans.gif', '100%', '10'); ?></td>

     </tr>

     <tr>

       <td class="main"><b>Информация о фирме (для юридических лиц)</b></td>

     </tr>

     <tr>

       <td><table border="0" width="100%" cellspacing="1" cellpadding="2" class="infoBox">

         <tr class="infoBoxContents">

           <td><table border="0" cellspacing="2" cellpadding="2">

             <tr>

               <td class="main">Наименование фирмы (полное)</td>

               <td class="main"><?php echo tep_draw_input_field('firma') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">Юридический адрес</td>

               <td class="main"><?php echo tep_draw_input_field('yra') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">ИНН</td>

               <td class="main"><?php echo tep_draw_input_field('inn') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">Расчетный счет</td>

               <td class="main"><?php echo tep_draw_input_field('rs') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">Банк</td>

               <td class="main"><?php echo tep_draw_input_field('bank') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">БИК</td>

               <td class="main"><?php echo tep_draw_input_field('bik') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>

<tr>

               <td class="main">Корр. счет</td>

               <td class="main"><?php echo tep_draw_input_field('oknx') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>

             </tr>





             <tr>

               <td class="main">Контактное лицо</td>

               <td class="main"><?php echo tep_draw_input_field('who') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT. '</span>': ''); ?></td>

             </tr>

           </table></td>

         </tr>

       </table></td>

     </tr>


На этом с create_account все- теперь ковыряем админ, чтобы контролировать и видеть эти поля...
3. Лезем admin/customers.php
Ищем:
[php:1:bbfc2e0afd]
$customers_id = tep_db_prepare_input($HTTP_GET_VARS['cID']);
$customers_firstname = tep_db_prepare_input($HTTP_POST_VARS['customers_firstname']);
$customers_lastname = tep_db_prepare_input($HTTP_POST_VARS['customers_lastname']);
$customers_email_address = tep_db_prepare_input($HTTP_POST_VARS['customers_email_address']);
$customers_telephone = tep_db_prepare_input($HTTP_POST_VARS['customers_telephone']);
$customers_fax = tep_db_prepare_input($HTTP_POST_VARS['customers_fax']);
[/php:1:bbfc2e0afd]
Вставляем следом:
[php:1:bbfc2e0afd]
$customers_firma = tep_db_prepare_input($HTTP_POST_VARS['customers_firma']);
$customers_inn = tep_db_prepare_input($HTTP_POST_VARS['customers_inn']);
$customers_bik = tep_db_prepare_input($HTTP_POST_VARS['customers_bik']);
$customers_rs = tep_db_prepare_input($HTTP_POST_VARS['customers_rs']);
$customers_bank = tep_db_prepare_input($HTTP_POST_VARS['customers_bank']);
$customers_yra = tep_db_prepare_input($HTTP_POST_VARS['customers_yra']);
$customers_oknx = tep_db_prepare_input($HTTP_POST_VARS['customers_oknx']);
$customers_who = tep_db_prepare_input($HTTP_POST_VARS['customers_who']);
[/php:1:bbfc2e0afd]
Ищем:
[php:1:bbfc2e0afd]
$customers_query = tep_db_query("select c.customers_id, c.customers_gender, c.customers_firstname[/php:1:bbfc2e0afd]
Меняем (добавляя):
[php:1:bbfc2e0afd]
$customers_query = tep_db_query("select c.customers_id, c.customers_gender, c.customers_firstname, c.customers_lastname, c.customers_dob, c.customers_email_address, a.entry_company, a.entry_street_address, a.entry_suburb, a.entry_postcode, a.entry_city, a.entry_state, a.entry_zone_id, a.entry_country_id,c.customers_firma,c.customers_rs,c.customers_inn,c.customers_
bank,c.customers_bik,c.customers_yra,c.customers_who,c.customers_oknx, c.customers_telephone, c.customers_fax, c.customers_newsletter, c.customers_default_address_id from " . TABLE_CUSTOMERS . " c left join " . TABLE_ADDRESS_BOOK . " a on c.customers_default_address_id = a.address_book_id where a.customers_id = c.customers_id and c.customers_id = '" . (int)$HTTP_GET_VARS['cID'] . "'");

[/php:1:bbfc2e0afd]

Ну и наконец добавляем их вывод в анкете покупателей админа:
Я вставил после:
Код
<?php

   if ($error == true) {

     if ($entry_company_error == true) {

       echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"') . '&nbsp;' . ENTRY_COMPANY_ERROR;

     } else {

       echo $cInfo->entry_company . tep_draw_hidden_field('entry_company');

     }

   } else {

     echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"');

   }



?></td>

Вставлял это:
Код
    </tr>

<tr>

           <td class="main">Полное наименование</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_firma', $cInfo->customers_firma, 'maxlength="60"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">Юридический адрес</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_ya', $cInfo->customers_yra, 'maxlength="60"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">Расчетный счет</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_rs', $cInfo->customers_rs, 'maxlength="30"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">Банк</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_bank', $cInfo->customers_bank, 'maxlength="60"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">ИНН</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_inn', $cInfo->customers_inn, 'maxlength="30"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">БИК</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_bik', $cInfo->customers_bik, 'maxlength="30"', true);







 

?></td>



         </tr>



<tr>

           <td class="main">Корр.счет</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_oknx', $cInfo->customers_oknx, 'maxlength="30"', true);







 

?></td>



         </tr>

<tr>

           <td class="main">Контактное лицо</td>

           <td class="main">

<?php

echo tep_draw_input_field('customers_who', $cInfo->customers_who, 'maxlength="60"', true);







 

?></td>



         </tr>













       </table></td>

     </tr>

Вот и все- все работает..... Может я чего то в процессе описания перепутал...(мудрю тут с Гаранпостом и доставкой - никто, кстати не делал доставку Гаранпостом по областным центрам?- а то ленность одолела 85 центров набирать - есть предложение обменяться наработками 8) :wink: ) если не получается- спрашивайте - посоветую.
VaM
Adler
Спасибо, сейчас буду пробовать.
Насчёт модуля доставки, я делал модуль доставки, который считает в зависимости от веса и неселённого пункта(города), если у тебя такая же задача, так проще не куда, берёшь стандартный includes/modules/shipping/zones.php и меняешь ['country'] на ['city'], вобщем смысле заменить срану на город и всё.
Adler
VaM - это понятно...мне просто лень вводить 85 городов...ладно придется "Бороться с ленью" ))))
Angel
У меня также сделано.
Только полей поменьше.

То, что стало:

address_book.php


Изменено.

[php:1:4089fc2a4f]<?php
$addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_yurAdress as yurAdress, entry_INN as INN, entry_KPP as KPP, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' order by firstname, lastname");
while ($addresses = tep_db_fetch_array($addresses_query)) {
$format_id = tep_get_address_format_id($addresses['country_id']);
?>[/php:1:4089fc2a4f]



includesmodulesaddress_book_details.php

[php:1:4089fc2a4f]<tr>
<td class="main"><?php echo ENTRY_COMPANY; ?></td>
<td class="main"><?php echo tep_draw_input_field('company', $entry['entry_company'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
</tr>

Дописано:
<tr>
<td class="main"><?php echo ENTRY_yurAdress; ?></td>
<td class="main"><?php echo tep_draw_input_field('yurAdress', $entry['entry_yurAdress'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_yurAdress_TEXT) ? '<span class="inputRequirement">' . ENTRY_yurAdress_TEXT . '</span>': ''); ?></td>
</tr>

<tr>
<td class="main"><?php echo ENTRY_INN; ?></td>
<td class="main"><?php echo tep_draw_input_field('INN', $entry['entry_INN'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_INN_TEXT) ? '<span class="inputRequirement">' . ENTRY_INN_TEXT . '</span>': ''); ?></td>
</tr>
<tr>
<td class="main"><?php echo ENTRY_KPP; ?></td>
<td class="main"><?php echo tep_draw_input_field('KPP', $entry['entry_KPP'], 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_KPP_TEXT) ? '<span class="inputRequirement">' . ENTRY_KPP_TEXT . '</span>': ''); ?></td>
</tr>[/php:1:4089fc2a4f]
---
address_book_process.php

[php:1:4089fc2a4f] $company = tep_db_prepare_input($HTTP_POST_VARS['company']);

Дописано:

$yurAdress = tep_db_prepare_input($HTTP_POST_VARS['yurAdress']);
$INN = tep_db_prepare_input($HTTP_POST_VARS['INN']);
$KPP = tep_db_prepare_input($HTTP_POST_VARS['KPP']);

Далее

$sql_data_array['entry_company'] = $company;

Добавлено:

$sql_data_array['entry_yurAdress'] = $yurAdress;
$sql_data_array['entry_INN'] = $INN;
$sql_data_array['entry_KPP'] = $KPP;


Изменено:

/* для тех кто в танке сообщаю что у меня ещё и метро прикручено, так что рекомендую либо его тоже себе прикрутить, либо удалить запрос к sql. Далее тоже встречается.
*/
if (isset($HTTP_GET_VARS['edit']) && is_numeric($HTTP_GET_VARS['edit'])) {
$entry_query = tep_db_query("select entry_gender, entry_company, entry_yurAdress, entry_INN, entry_KPP, entry_firstname, entry_lastname, entry_street_address, entry_suburb, entry_postcode, entry_city, entry_state, entry_zone_id, entry_country_id, entry_metro_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' and address_book_id = '" . (int)$HTTP_GET_VARS['edit'] . "'");

checkout_payment_address.php

if (ACCOUNT_COMPANY == 'true') {
$company = tep_db_prepare_input($HTTP_POST_VARS['company']);

дописано:

$yurAdress = tep_db_prepare_input($HTTP_POST_VARS['yurAdress']);
$INN = tep_db_prepare_input($HTTP_POST_VARS['INN']);
$KPP = tep_db_prepare_input($HTTP_POST_VARS['KPP']);

Далее

if (ACCOUNT_COMPANY == 'true') {
$sql_data_array['entry_company'] = $company;

Дописано:

$sql_data_array['entry_yurAdress'] = $yurAdress;
$sql_data_array['entry_INN'] = $INN;
$sql_data_array['entry_KPP'] = $KPP;

Далее:

$addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_yurAdress as yurAdress, entry_INN as INN, entry_KPP as KPP, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . $customer_id . "'");[/php:1:4089fc2a4f]

checkout_process.php

[php:1:4089fc2a4f]$sql_data_array = array('customers_id' => $customer_id,
'customers_name' => $order->customer['firstname'] . ' ' . $order->customer['lastname'],
'customers_company' => $order->customer['company'],

Дописано:
'customers_yurAdress' => $order->customer['yurAdress'],
'customers_INN' => $order->customer['INN'],
'customers_KPP' => $order->customer['KPP'],
'delivery_company' => $order->delivery['company'],
'delivery_yurAdress' => $order->delivery['yurAdress'],
'delivery_INN' => $order->delivery['INN'],
'delivery_KPP' => $order->delivery['KPP'],
'billing_company' => $order->billing['company'],
'billing_yurAdress' => $order->billing['yurAdress'],
'billing_INN' => $order->billing['INN'],
'billing_KPP' => $order->billing['KPP'],[/php:1:4089fc2a4f]

checkout_shipping_address.php

[php:1:4089fc2a4f] if (ACCOUNT_COMPANY == 'true') {
$company = tep_db_prepare_input($HTTP_POST_VARS['company']);

Добавлено:

$yurAdress = tep_db_prepare_input($HTTP_POST_VARS['yurAdress']);
$INN = tep_db_prepare_input($HTTP_POST_VARS['INN']);
$KPP = tep_db_prepare_input($HTTP_POST_VARS['KPP']);

Далее

if (ACCOUNT_COMPANY == 'true') {
$sql_data_array['entry_company'] = $company;

Добавлено:

$sql_data_array['entry_yurAdress'] = $yurAdress;
$sql_data_array['entry_INN'] = $INN;
$sql_data_array['entry_KPP'] = $KPP;

Изменено:

$addresses_query = tep_db_query("select address_book_id, entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_yurAdress as yurAdress, entry_INN as INN, entry_KPP as KPP, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "'");[/php:1:4089fc2a4f]

create_account.php

[php:1:4089fc2a4f] if (ACCOUNT_COMPANY == 'true') { $company = tep_db_prepare_input($HTTP_POST_VARS['company']);

Дописано:

$INN = tep_db_prepare_input($HTTP_POST_VARS['INN']);
$KPP = tep_db_prepare_input($HTTP_POST_VARS['KPP']);
$yurAdress = tep_db_prepare_input($HTTP_POST_VARS['yurAdress']);

Далее

if (ACCOUNT_COMPANY == 'true');
if (ACCOUNT_COMPANY == 'true') {
$sql_data_array['entry_company'] = $company

Дописано:

$sql_data_array['entry_INN'] = $INN;
$sql_data_array['entry_KPP'] = $KPP;
$sql_data_array['entry_yurAdress'] = $yurAdress;

далее

<tr>
<td class="main"><?php echo ENTRY_COMPANY ; ?></td>
<td class="main"><?php echo tep_draw_input_field('company', '', 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_COMPANY_TEXT) ? '<span class="inputRequirement">' . ENTRY_COMPANY_TEXT . '</span>': ''); ?></td>
</tr>

Дописано:

<tr>
<td class="main"><?php echo ENTRY_yurAdress ; ?></td>
<td class="main"><?php echo tep_draw_input_field('yurAdress', '', 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_yurAdress_TEXT) ? '<span class="inputRequirement">' . ENTRY_yurAdress_TEXT . '</span>': ''); ?></td>
</tr>
<tr>
<td class="main"><?php echo ENTRY_INN ; ?></td>
<td class="main"><?php echo tep_draw_input_field('INN', '', 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_INN_TEXT) ? '<span class="inputRequirement">' . ENTRY_INN_TEXT . '</span>': ''); ?></td>
</tr>
<tr>
<td class="main"><?php echo ENTRY_KPP ; ?></td>
<td class="main"><?php echo tep_draw_input_field('KPP', '', 'class="area"') . '&nbsp;' . (tep_not_null(ENTRY_KPP_TEXT) ? '<span class="inputRequirement">' . ENTRY_KPP_TEXT . '</span>': ''); ?></td>
</tr>[/php:1:4089fc2a4f]

admincustomers.php

[php:1:4089fc2a4f] $entry_company = tep_db_prepare_input($HTTP_POST_VARS['entry_company']);

Дописано:

$entry_yurAdress = tep_db_prepare_input($HTTP_POST_VARS['entry_yurAdress']);
$entry_INN = tep_db_prepare_input($HTTP_POST_VARS['entry_INN']);
$entry_KPP = tep_db_prepare_input($HTTP_POST_VARS['entry_KPP']);

Далее:

$sql_data_array['entry_company'] = $entry_company;

Дописано:

$sql_data_array['entry_yurAdress'] = $entry_yurAdress;
$sql_data_array['entry_INN'] = $entry_INN;
$sql_data_array['entry_KPP'] = $entry_KPP;

Далее изменено:


$customers_query = tep_db_query("select c.customers_id, c.customers_gender, c.customers_firstname, c.customers_lastname, c.customers_dob, c.customers_email_address, a.entry_company, a.entry_yurAdress, a.entry_INN, a.entry_KPP, a.entry_street_address, a.entry_suburb, a.entry_postcode, a.entry_city, a.entry_state, a.entry_zone_id, a.entry_country_id, a.entry_metro_id, c.customers_telephone, c.customers_fax, c.customers_newsletter, c.customers_default_address_id from " . TABLE_CUSTOMERS . " c left join " . TABLE_ADDRESS_BOOK . " a on c.customers_default_address_id = a.address_book_id where a.customers_id = c.customers_id and c.customers_id = '" . (int)$HTTP_GET_VARS['cID'] . "'");

Изменено:

<?php if (ACCOUNT_COMPANY == 'true') {
echo 'var entry_company = document.customers.entry_company.value;' . "n" . 'var entry_yurAdress = document.customers.entry_yurAdress.value;' . "n" . 'var entry_INN = document.customers.entry_INN.value;' . "n" . 'var entry_KPP = document.customers.entry_KPP.value;' . "n" ;

Далее:

if ($error == true) {
if ($entry_company_error == true) {
echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"') . '&nbsp;' . ENTRY_COMPANY_ERROR;
} else {
echo $cInfo->entry_company . tep_draw_hidden_field('entry_company');
}
} else {
echo tep_draw_input_field('entry_company', $cInfo->entry_company, 'maxlength="32"');

Дописано:

echo '<tr class="main" align="right">' . ENTRY_yurAdress . '&nbsp;'. tep_draw_input_field('entry_yurAdress' . '<td>', $cInfo->entry_yurAdress, 'maxlength="32"') . '</td></tr>';

echo '<tr class="main" align="right">' . ENTRY_INN . '&nbsp;'. tep_draw_input_field('entry_INN' . '</td><td>', $cInfo->entry_INN, 'maxlength="32"') . '</tr>';
echo '<tr class="main" align="right">' . ENTRY_KPP . '&nbsp;'. tep_draw_input_field('entry_KPP' . '</td><td>', $cInfo->entry_KPP, 'maxlength="32"') . '</tr>';
}
// как видишь в админе тоже видно ? [/php:1:4089fc2a4f]

adminincludesfunctionsgeneral.php

[php:1:4089fc2a4f] function tep_address_format($address_format_id, $address, $html, $boln, $eoln) {
$address_format_query = tep_db_query("select address_format as format from " . TABLE_ADDRESS_FORMAT . " where address_format_id = '" . (int)$address_format_id . "'");
$address_format = tep_db_fetch_array($address_format_query);

$company = tep_output_string_protected($address['company']);

Дописано:

$yurAdress = tep_output_string_protected($address['yurAdress']);
$INN = tep_output_string_protected($address['INN']);
$KPP = tep_output_string_protected($address['KPP']);[/php:1:4089fc2a4f]
includesfunctionsgeneral.php

[php:1:4089fc2a4f] $company = tep_output_string_protected($address['company']);
Дописано:
$yurAdress = tep_output_string_protected($address['yurAdress']);
$INN = tep_output_string_protected($address['INN']);
$KPP = tep_output_string_protected($address['KPP']);


Изменено:

$address_query = tep_db_query("select entry_firstname as firstname, entry_lastname as lastname, entry_company as company, entry_yurAdress as yurAdress, entry_INN as INN, entry_KPP as KPP, entry_street_address as street_address, entry_suburb as suburb, entry_city as city, entry_postcode as postcode, entry_state as state, entry_zone_id as zone_id, entry_country_id as country_id, entry_metro_id as metro_id from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customers_id . "' and address_book_id = '" . (int)$address_id . "'");[/php:1:4089fc2a4f]

adminincludesclassesorder.php

[php:1:4089fc2a4f]Изменено:

$order_query = tep_db_query("select customers_name, customers_company, customers_yurAdress, customers_INN, customers_KPP, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

Далее.

$this->customer = array('name' => $order['customers_name'],
'company' => $order['customers_company'],

Дописано:
'yurAdress' => $order['customers_yurAdress'],
'INN' => $order['customers_INN'],
'KPP' => $order['customers_KPP'],

$this->delivery = array('name' => $order['delivery_name'],
'company' => $order['delivery_company'],

Дописано:

'yurAdress' => $order['delivery_yurAdress'],
'INN' => $order['delivery_INN'],
'KPP' => $order['delivery_KPP'],[/php:1:4089fc2a4f]
includesclassesorder.php

[php:1:4089fc2a4f]Изменено:

$order_query = tep_db_query("select customers_id, customers_name, customers_company, customers_yurAdress, customers_INN, customers_KPP, customers_street_address, customers_suburb, customers_city, customers_postcode, customers_state, customers_country, customers_telephone, customers_email_address, customers_address_format_id, delivery_name, delivery_company, delivery_yurAdress, delivery_INN, delivery_KPP, delivery_street_address, delivery_suburb, delivery_city, delivery_postcode, delivery_state, delivery_country, delivery_address_format_id, billing_name, billing_company, billing_yurAdress, billing_INN, billing_KPP, billing_street_address, billing_suburb, billing_city, billing_postcode, billing_state, billing_country, billing_address_format_id, payment_method, cc_type, cc_owner, cc_number, cc_expires, currency, currency_value, date_purchased, orders_status, last_modified from " . TABLE_ORDERS . " where orders_id = '" . (int)$order_id . "'");

Далее

$this->customer = array('id' => $order['customers_id'],
'name' => $order['customers_name'],

Дописано:
'company' => $order['customers_company'],
'yurAdress' => $order['customers_yurAdress'],
'INN' => $order['customers_INN'],
'KPP' => $order['customers_KPP'],


далее

$this->delivery = array('name' => $order['delivery_name'],
'company' => $order['delivery_company'],
Дописано:
'company' => $order['delivery_company'],
'yurAdress' => $order['delivery_yurAdress'],
'INN' => $order['delivery_INN'],
'KPP' => $order['delivery_KPP'],

Далее

$this->billing = array('name' => $order['billing_name'],
'company' => $order['billing_company'],

Дописано:
'yurAdress' => $order['billing_yurAdress'],
'INN' => $order['billing_INN'],
'KPP' => $order['billing_KPP'],

Изменено:

$customer_address_query = tep_db_query("select c.customers_firstname, c.customers_lastname, c.customers_telephone, c.customers_email_address, ab.entry_company, ab.entry_yurAdress, ab.entry_INN, ab.entry_KPP, ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, co.countries_id, co.countries_name, co.countries_iso_code_2, co.countries_iso_code_3, co.address_format_id, ab.entry_state from " . TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " co on (ab.entry_country_id = co.countries_id) where c.customers_id = '" . (int)$customer_id . "' and ab.customers_id = '" . (int)$customer_id . "' and c.customers_default_address_id = ab.address_book_id");

Изменено:

$shipping_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_yurAdress, ab.entry_INN, ab.entry_KPP,ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$sendto . "'");

Изменено:

$billing_address_query = tep_db_query("select ab.entry_firstname, ab.entry_lastname, ab.entry_company, ab.entry_yurAdress, ab.entry_INN, ab.entry_KPP,ab.entry_street_address, ab.entry_suburb, ab.entry_postcode, ab.entry_city, ab.entry_zone_id, z.zone_name, ab.entry_country_id, c.countries_id, c.countries_name, c.countries_iso_code_2, c.countries_iso_code_3, c.address_format_id, ab.entry_state from " . TABLE_ADDRESS_BOOK . " ab left join " . TABLE_ZONES . " z on (ab.entry_zone_id = z.zone_id) left join " . TABLE_COUNTRIES . " c on (ab.entry_country_id = c.countries_id) where ab.customers_id = '" . (int)$customer_id . "' and ab.address_book_id = '" . (int)$billto . "'");

Далее

$this->customer = array('firstname' => $customer_address['customers_firstname'],
'lastname' => $customer_address['customers_lastname'],
'company' => $customer_address['entry_company'],
Дописано:
'yurAdress' => $customer_address['entry_yurAdress'],
'INN' => $customer_address['entry_INN'],
'KPP' => $customer_address['entry_KPP'],

Далее

$this->delivery = array('firstname' => $shipping_address['entry_firstname'],
'lastname' => $shipping_address['entry_lastname'],
'company' => $shipping_address['entry_company'],
Дописано:
'yurAdress' => $shipping_address['entry_yurAdress'],
'INN' => $shipping_address['entry_INN'],
'KPP' => $shipping_address['entry_KPP'],
Далее

$this->billing = array('firstname' => $billing_address['entry_firstname'],
'lastname' => $billing_address['entry_lastname'],
'company' => $billing_address['entry_company'],
Дописано:
'yurAdress' => $billing_address['entry_yurAdress'],
'INN' => $billing_address['entry_INN'],
'KPP' => $billing_address['entry_KPP'],[/php:1:4089fc2a4f]

adminincludeslanguagesrussian.php

[php:1:4089fc2a4f]define('ENTRY_COMPANY', 'Название компании:');

Дописано:

define('ENTRY_yurAdress', 'Юридический адрес:');
define('ENTRY_INN', 'ИНН:');
define('ENTRY_KPP', 'КПП:');

Далее

define('CATEGORY_COMPANY', 'Организация');

Дописано

define('CATEGORY_yurAdress', 'Юр. Адрес');
define('CATEGORY_INN', 'ИНН');
define('CATEGORY_KPP', 'КПП');

Далее

define('ENTRY_COMPANY', 'Название организации:');

Дописано

define('ENTRY_yurAdress', 'Юр. Адрес:');
define('ENTRY_INN', 'ИНН:');
define('ENTRY_KPP', 'КПП:');


Далее
define('ENTRY_COMPANY_TEXT', '');

Дописано
define('ENTRY_yurAdress_TEXT', '');
define('ENTRY_INN_TEXT', '');
define('ENTRY_KPP_TEXT', '');[/php:1:4089fc2a4f]

Код
Далее в таблице  address_book  делаем entry_yurAdress, entry_INN,  entry_KPP поля, а в таблице orders соотв. customers_yurAdress, customers_INN, customers_KPP, delivery_ yurAdress, delivery_KPP, delivery_INN, billing_yurAdress, billing_INN, billing_KPP.

Поля по дефолту ставим в NULL.


========Просьба делать посты с кодом вот так сразу, а не поручать редактирование модераторам.

Админ.[/color]
==================
Medreces
Андрей, плиз, код заключай в BBCode (лучше всего "PHP)" - тогда он будет хорошо читаем и не будет съезжать.

Удачи!
vworld
а можно как-то оформить аккуратно, например инструкцию для исправление и все это заключить в отдельный файлик и например обозвать его Юрики и физики?
Angel
файлик? - конечно в формате .avi и со звуком?

Можно, даже можешь свой копирайт поставить.

Сценарий для сюжета писал минут 40.
И сам сюжет часа 3.


Кстати, дополнение для проверки инн и кпп на валидность.

Пишем в includesfunctionsvalidations.php

function tep_validate_INN_KPP($DAT)
{
if (preg_match ("/^d{10}$/", $DAT) or $DAT == 0)
{ return true ;
} }

Вызывать надо из ceate_account.php примерно так:

if (tep_validate_INN_KPP($INN) == false )
{
$error = true;
$messageStack->add('create_account', ENTRY_INN_ERROR);
}
if (tep_validate_INN_KPP($KPP) == false )
{
$error = true;

$messageStack->add('create_account', ENTRY_KPP_ERROR);
}

Ну и все эти "ошибочные констранты" нужно оприходовать в russian.php
rdva
Применительно к решению Angel'a
------------------------------------------
Не знаю как у вас, у меня в админке при попытке изменить Юр.адрес, ИНН и КПП клиента в базу записываются пустые значения. Т.е. даже если эти поля были заполнены, после нажатия кнопки "Обновить" все три поля становятся пустыми.

Вылечил так:
в /catalog/admin/customers.php

найти:

Код
echo '<tr class="main" align="right">' . ENTRY_yurAdress . ' '. tep_draw_input_field('entry_yurAdress' . '<td>', $cInfo->entry_yurAdress, 'maxlength="32"') . '</td></tr>';
echo '<tr class="main" align="right">' . ENTRY_INN . ' '. tep_draw_input_field('entry_INN' . '</td><td>', $cInfo->entry_INN, 'maxlength="32"') . '</tr>';
echo '<tr class="main" align="right">' . ENTRY_KPP . ' '. tep_draw_input_field('entry_KPP' . '</td><td>', $cInfo->entry_KPP, 'maxlength="32"') . '</tr>';
}


исправить на:

Код
echo '<tr class="main" align="right">' . ENTRY_yurAdress . ' '. tep_draw_input_field('entry_yurAdress', $cInfo->entry_yurAdress, 'maxlength="32"') . '</tr>';
echo '<tr class="main" align="right">' . ENTRY_INN . ' '. tep_draw_input_field('entry_INN', $cInfo->entry_INN, 'maxlength="32"') . '</tr>';
echo '<tr class="main" align="right">' . ENTRY_KPP . ' '. tep_draw_input_field('entry_KPP', $cInfo->entry_KPP, 'maxlength="32"') . '</tr>';
}


И в довесок готовый SQL запрос на создание необходимых полей в базе:

Код
ALTER TABLE `address_book` ADD `entry_yurAdress` varchar(64);
ALTER TABLE `address_book` ADD `entry_INN` bigint(10);
ALTER TABLE `address_book` ADD `entry_KPP` int(9);
ALTER TABLE `orders` ADD `customers_yurAdress` varchar(64);
ALTER TABLE `orders` ADD `customers_INN` bigint(10);
ALTER TABLE `orders` ADD `customers_KPP` int(9);
ALTER TABLE `orders` ADD `delivery_yurAdress` varchar(64);
ALTER TABLE `orders` ADD `delivery_INN` bigint(10);
ALTER TABLE `orders` ADD `delivery_KPP` int(9);
ALTER TABLE `orders` ADD `billing_yurAdress` varchar(64);
ALTER TABLE `orders` ADD `billing_INN` bigint(10);
ALTER TABLE `orders` ADD `billing_KPP` int(9);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2018 IPS, Inc.