Übercart: jak na *Osobní převzetí zboží v obchodě*?

Již několikrát se mi stalo, že se mě někdo ptal, jak vytvořit v Čechách celkem běžnou věc – „osobní vyzvednutí zboží v obchodě“. Mnoho zvláště menších e-shopů nevyužívá žádné platební brány ani dopravce – vystačí si s dobírkou České Pošty. Pokud má takový e-shopík nějakou kamennou provozovnu či prodejnu, je častým zvykem nabízet kromě dobírky ještě „osobní převzetí v obchodě“, zdarma samozřejmě.

„Vyzvednutí v obchodě“ trochu boří filosofii e-shopu jako bezkontaktního prodeje na dálku. Vzhledem k našim podmínkám je však jeho oblíbenost celkem pochopitelná: Zvláště ve větších městech si lidé raději pro zboží zajedou při cestě z práce, než čekat frontu na poště – zaměstnaní lidé většinou nemají čas vyčkávat na pošťáka, který s oblibou přichází někdy uprostřed pracovního dne, u nás např. mezi 10 až 14h, a diví se že nikdo není doma. Takže místo aby zboží měli hned, na něj 1 až X dnů čekají a pak ještě po návratu z práce běží „s lístečkem“ na poštu, postavit se pěkně do fronty, aby zjistili, že se balík ztratil nebo je poškozený… a za tuhle zábavu ještě zaplatí nějakou tu stovku navíc.

Ale dost filozofování, pusťme se do práce…

Standardní instalace Übercartu nabízí metody platby jako platba kreditkou, platba šekem, dobírka a ostatní/obecná platba. Pro vyzvednutí v obchodě by bylo možné použít škatulku „ostatní“, co to ale je „ostatní“ resp. obecná platba? Nabízet zákazníkovi „platbu dobírkou“ a platbu „ostatní“ resp. „obecnou“ není dobrý nápad. Ještě by mohl chtít nějaký podnikavec vyměnit naše zboží za svojí právě sklizenou úrodu mrkve. (Metoda ostatní, resp. generic payment má IMHO sloužit jen pro správce obchodu a umožňuje zadávat i detaily platby – jakým způsobem bude/byla platba provedena.)

Nezbývá než vytvořit si vlastní metodu placení. Metoda toho bude umět ještě méně, než metoda placení „ostatní“. Totiž nic. Jejími úkoly bude pouze „nechat se zaškrtnout“ a „zobrazit se na objednávce“.

Implementace je celkem jednoduchá: vytvoříme nový modul (např. uc_pickup), umístíme ho do adresáře s moduly, případně do podadresáře contribs v adresáři ubercartu (ale pozor, abychom si adresář nesmazali při upgradu UC, osobně preferuji spíš předchozí možnost).

Jako první věc je nutné zaregistrovat naši metodu placení do Übercartu. K tomu použijeme háček hook_payment_method().

<?php
/**
 * Implementation of hook_payment_method().
 */
function uc_pickup_payment_method() {
  $methods[] = array(
    'id' => 'pickup',
    'name' => t('Pick-up'),
    'title' => t('Pick-up at store'),
    'desc' => t('Pay on pick-up at store.'),
    'callback' => 'uc_pickup_method_pickup', // jméno funkce, která slouží jako ovladač této metody placení
    'weight' => 1,
    'checkout' => FALSE, // počáteční nastavení, zda se objeví platba v pokladně
    'no_gateway' => TRUE, // nepoužíváme platební bránu
  );
  return $methods;
}
?>

Nyní stačí vytvořit „handler“, tedy náš ovladač metody placení. Ten sice není zdokumentován jako „háček“, nicméně je třeba se napojoval na poměrně striktně dané rozhraní. Jako vzor použijeme ovladač metody ostatní/obecná platba – tzn funkci uc_payment_method_other().

<?php
/**
 * Pickup "payment" handler
 */
function uc_pickup_method_pickup($op, $arg1) {

  switch ($op) {
    case 'cart-details':
      // tento text se objeví při přepnutí metody placení v pokladně
      $details = variable_get('uc_pickup_policy', t('Full payment is expected prior to pick-up.'));
      return $details;

    case 'order-view':
    case 'customer-view':
      // jméno metody placení, jak se objeví v objednávce
      $output = t('Pick-up');
      return $output;

    case 'order-details':
    case 'edit-process':
    case 'order-load':
    case 'order-save':
      // neimplemetováno
      break;
  }
}
?>

A to je vše.

TIP na závěr: pokud chcete jednoduše zpoplatnit samotnou metodu placení (např. fixně 100 Kč za dobírku nebo 666 Kč za vyzvednutí v obchodě, když vám přijde, že ti lidé jsou nějací nesnesitelní), použijte modul UC PMA neboli Ubercart Payment Method Adjustments. Tento modul přidá sloupeček do nastavení platebních metod, kde je možné zadat částku, která se přičte k objednávce při použití dané metody placení.

POZNÁMKA: Článek byl převzat z mého původního blogu na Drupal.cz: http://www.drupal.cz/blog/wojtha/uebercart-jak-na-osobni-prevzeti-v-obchode