From 96173c00587adb9a8a5397d80b77333dde034ef5 Mon Sep 17 00:00:00 2001 From: TheCoreDev Date: Wed, 14 Apr 2021 19:11:39 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20dans=20la=20facture=20du=20d=C3=A9tail?= =?UTF-8?q?=20de=20livraison,=20pour=20PointRetrait=20et=20ClickAndCollect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/ClickAndCollect/Config/config.xml | 5 + .../modules/ClickAndCollect/Hook/PdfHook.php | 52 +++ local/modules/ClickAndCollect/I18n/fr_FR.php | 2 + .../pdf/default/delivery-address.html | 12 + local/modules/PointRetrait/Config/config.xml | 4 + local/modules/PointRetrait/Hook/PdfHook.php | 52 +++ local/modules/PointRetrait/I18n/fr_FR.php | 2 + .../pdf/default/delivery-address.html | 12 + templates/pdf/custom/assets/img/logo.png | Bin 0 -> 28476 bytes templates/pdf/custom/invoice.html | 369 ++++++++++++++++++ 10 files changed, 510 insertions(+) create mode 100644 local/modules/ClickAndCollect/Hook/PdfHook.php create mode 100644 local/modules/ClickAndCollect/templates/pdf/default/delivery-address.html create mode 100644 local/modules/PointRetrait/Hook/PdfHook.php create mode 100644 local/modules/PointRetrait/templates/pdf/default/delivery-address.html create mode 100644 templates/pdf/custom/assets/img/logo.png create mode 100644 templates/pdf/custom/invoice.html diff --git a/local/modules/ClickAndCollect/Config/config.xml b/local/modules/ClickAndCollect/Config/config.xml index 233bbc6d..d8b3b077 100644 --- a/local/modules/ClickAndCollect/Config/config.xml +++ b/local/modules/ClickAndCollect/Config/config.xml @@ -27,6 +27,11 @@ + + + + + diff --git a/local/modules/ClickAndCollect/Hook/PdfHook.php b/local/modules/ClickAndCollect/Hook/PdfHook.php new file mode 100644 index 00000000..03132903 --- /dev/null +++ b/local/modules/ClickAndCollect/Hook/PdfHook.php @@ -0,0 +1,52 @@ +getArgument('order'); + $moduleId = OrderQuery::create()->findOneById($orderId)->getDeliveryModuleId(); + + if ((null !== $orderId) && $moduleId === ClickAndCollect::getModuleId()) { + + $order = OrderDeliveryScheduleQuery::create()->findOneByOrderId($orderId); + if (null !== $order) { + $selectedDay = $order->getDueDeliveryTimeStart(PlanificationLivraison::FORMAT_DATES); + $beginTime = $order->getDueDeliveryTimeStart(PlanificationLivraison::FORMAT_HEURE); + $endTime = $order->getDueDeliveryTimeEnd(PlanificationLivraison::FORMAT_HEURE); + $placeID = $order->getDeliveryPlaceId(); + $place = PdrPlacesQuery::create()->findOneById($placeID); + + if ((null !== $selectedDay) && (null !== $beginTime) && (null !== $endTime)) { + $event->add( + $this->render( + 'delivery-address.html', [ + 'day' => $selectedDay, + 'begin_time' => $beginTime, + 'end_time' => $endTime, + 'title' => $place->getTitle(), + 'address1' => $place->getAddress1(), + 'address2' => $place->getAddress2(), + 'zipcode' => $place->getZipcode(), + 'city' => $place->getCity() + ]) + ); + } else + throw new TheliaProcessException("ClickAndCollect : Impossible de récupérer les données"); + } + } + } + +} diff --git a/local/modules/ClickAndCollect/I18n/fr_FR.php b/local/modules/ClickAndCollect/I18n/fr_FR.php index 79dd7899..1c4c0ad6 100644 --- a/local/modules/ClickAndCollect/I18n/fr_FR.php +++ b/local/modules/ClickAndCollect/I18n/fr_FR.php @@ -42,6 +42,8 @@ return array( 'There is no order to deliver' => 'Aucune commande à déposer', 'There is no schedule for this place' => 'Aucun jour d\'ouverture pour ce point click and Collect', 'Title of config view' => 'Point Click and Collect - Configuration', + 'Withdrawal address' => 'Retrait à l\'adresse suivante : ', + 'Withdrawal date' => 'A retirer à partir du : ', 'Working day' => 'Jour d\'ouverture', 'Zipcode' => 'Code postal', '' => '', diff --git a/local/modules/ClickAndCollect/templates/pdf/default/delivery-address.html b/local/modules/ClickAndCollect/templates/pdf/default/delivery-address.html new file mode 100644 index 00000000..e5b92bae --- /dev/null +++ b/local/modules/ClickAndCollect/templates/pdf/default/delivery-address.html @@ -0,0 +1,12 @@ +
+
+

{intl l="Withdrawal date" d="clickandcollect"}{$day}

+

{intl l="Withdrawal address" d="clickandcollect"}
+ {$title}
+ {$address1}
+ {$address2}
+ {$zipcode} {$city} +
+

+
+
diff --git a/local/modules/PointRetrait/Config/config.xml b/local/modules/PointRetrait/Config/config.xml index 8a58a872..2f516c95 100644 --- a/local/modules/PointRetrait/Config/config.xml +++ b/local/modules/PointRetrait/Config/config.xml @@ -28,6 +28,10 @@ + + + + diff --git a/local/modules/PointRetrait/Hook/PdfHook.php b/local/modules/PointRetrait/Hook/PdfHook.php new file mode 100644 index 00000000..0876c226 --- /dev/null +++ b/local/modules/PointRetrait/Hook/PdfHook.php @@ -0,0 +1,52 @@ +getArgument('order'); + $moduleId = OrderQuery::create()->findOneById($orderId)->getDeliveryModuleId(); + + if ((null !== $orderId) && $moduleId === PointRetrait::getModuleId()) { + + $order = OrderDeliveryScheduleQuery::create()->findOneByOrderId($orderId); + if (null !== $order) { + $selectedDay = $order->getDueDeliveryTimeStart(PlanificationLivraison::FORMAT_DATES); + $beginTime = $order->getDueDeliveryTimeStart(PlanificationLivraison::FORMAT_HEURE); + $endTime = $order->getDueDeliveryTimeEnd(PlanificationLivraison::FORMAT_HEURE); + $placeID = $order->getDeliveryPlaceId(); + $place = PdrPlacesQuery::create()->findOneById($placeID); + + if ((null !== $selectedDay) && (null !== $beginTime) && (null !== $endTime)) { + $event->add( + $this->render( + 'delivery-address.html', [ + 'day' => $selectedDay, + 'begin_time' => $beginTime, + 'end_time' => $endTime, + 'title' => $place->getTitle(), + 'address1' => $place->getAddress1(), + 'address2' => $place->getAddress2(), + 'zipcode' => $place->getZipcode(), + 'city' => $place->getCity() + ]) + ); + } else + throw new TheliaProcessException("PointRetrait : Impossible de récupérer les données"); + } + } + } + +} diff --git a/local/modules/PointRetrait/I18n/fr_FR.php b/local/modules/PointRetrait/I18n/fr_FR.php index 2fdbdc3a..8e617ff3 100644 --- a/local/modules/PointRetrait/I18n/fr_FR.php +++ b/local/modules/PointRetrait/I18n/fr_FR.php @@ -47,6 +47,8 @@ return array( 'Withdrawal days' => 'Jours de retrait', 'Withdrawal ending time' => 'Fin du retrait', 'Withdrawal price' => 'Coût du retrait', + 'Withdrawal address' => 'Retrait à l\'adresse suivante : ', + 'Withdrawal date' => 'A retirer le : ', 'Zipcode' => 'Code postal', '' => '', ); diff --git a/local/modules/PointRetrait/templates/pdf/default/delivery-address.html b/local/modules/PointRetrait/templates/pdf/default/delivery-address.html new file mode 100644 index 00000000..f8251251 --- /dev/null +++ b/local/modules/PointRetrait/templates/pdf/default/delivery-address.html @@ -0,0 +1,12 @@ +
+
+

{intl l="Withdrawal date" d="pointretrait"}{$day} entre {format_date date=$begin_time format="H\hi"} et {format_date date=$end_time format="H\hi"}

+

{intl l="Withdrawal address" d="pointretrait"}
+ {$title}
+ {$address1}
+ {$address2}
+ {$zipcode} {$city} +
+

+
+
diff --git a/templates/pdf/custom/assets/img/logo.png b/templates/pdf/custom/assets/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..768b18a1c345e62b5b4b08cd1bc484e3a897e62f GIT binary patch literal 28476 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 z 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 literal 0 HcmV?d00001 diff --git a/templates/pdf/custom/invoice.html b/templates/pdf/custom/invoice.html new file mode 100644 index 00000000..e89b0a61 --- /dev/null +++ b/templates/pdf/custom/invoice.html @@ -0,0 +1,369 @@ +{*************************************************************************************/ +/* This file is part of the Thelia package. */ +/* */ +/* Copyright (c) OpenStudio */ +/* email : dev@thelia.net */ +/* web : http://www.thelia.net */ +/* */ +/* For the full copyright and license information, please view the LICENSE.txt */ +/* file that was distributed with this source code. */ +/*************************************************************************************} + +{* Set the default translation domain, that will be used by {intl} when the 'd' parameter is not set *} +{default_translation_domain domain='pdf.default'} +{literal} + +{/literal} + + + {hook name="invoice.header" order=$order_id} + + + + {hook name="invoice.footer-top" order=$order_id} + + + + + + + + + +
+ {hook name="invoice.imprint" order=$order_id} + {elsehook rel="invoice.imprint"} + + {config key="store_name"} + {$addresses="{config key="store_address1"} {config key="store_address2"} {config key="store_address3"}"} + {$city="{config key="store_zipcode"} {config key="store_city"}"} + {if $addresses != " "}- {$addresses}{/if} + {if $city != " " }- {$city}{/if} + {if {config key="store_country"} } + {loop type="country" visible="*" name="address.country.title" id={config key="store_country"}} - {$TITLE}{/loop} + {/if} + {if {config key="store_business_id"} } + - {config key="store_business_id"} + {/if} +
+ {if {config key="store_phone"} } + {intl l="Phone: "}{config key="store_phone"} + {/if} + {if {config key="store_email"} } + {intl l="Email: "}{config key="store_email"} + {/if} + {/elsehook} +
{intl l="page"} [[page_cu]]/[[page_nb]]
+ {hook name="invoice.footer-bottom" order=$order_id} +
+ + {$taxes = []} + + {loop name="order.invoice" type="order" id=$order_id customer="*"} + + + + + + + + + + + + + + + {hookblock name="invoice.information" order=$order_id fields="title,value"} + {forhook rel="invoice.information"} + + + + {/forhook} + {/hookblock} +
+

{intl l="INVOICE"}

+

{intl l="Invoice date"} : {format_date date=$INVOICE_DATE output="date"}

{intl l="Invoice REF"} : {$REF}

{intl l="Customer Number"} : {loop type="customer" name="customer.invoice" id=$CUSTOMER current="0"}{$REF}{/loop}

{$title} : {$value}

+ + {hook name="invoice.after-information" order=$order_id} + + + + + + + + +
+

{intl l="Delivery address"}

+ {ifhook rel="invoice.delivery-address"} + {* delivery module can customize the delivery address *} + {hook name="invoice.delivery-address" module={$DELIVERY_MODULE} order=$order_id} + {/ifhook} + {elsehook rel="invoice.delivery-address"} + {format_address order_address=$DELIVERY_ADDRESS locale=$locale} + {/elsehook} +
+

{intl l="Invoice address"}

+ {format_address order_address=$INVOICE_ADDRESS locale=$locale} +
+ + {hook name="invoice.after-addresses" order=$order_id} + + + + + + + + + + + + + + + + + + {loop type="order_product" name="order-products" order=$ID} + {if $WAS_IN_PROMO == 1} + {assign "realPrice" $PROMO_PRICE} + {assign "realTax" $PROMO_PRICE_TAX} + {assign "realTaxedPrice" $TAXED_PROMO_PRICE} + {assign "realTotalPrice" $TOTAL_TAXED_PROMO_PRICE} + {else} + {assign "realPrice" $PRICE} + {assign "realTax" $PRICE_TAX} + {assign "realTaxedPrice" $TAXED_PRICE} + {assign "realTotalPrice" $TOTAL_TAXED_PRICE} + {/if} + + {$taxes[{$TAX_RULE_TITLE}][] = floatval($realTax) * $QUANTITY} + + + + + + + + + + + {hook name="invoice.order-product" order={$order_id} order_product={$ID}} + {/loop} +

{intl l="Product"}

{intl l="Unit. price"}

{intl l="Tax"}

{intl l="Unit taxed price"}

{intl l="Quantity"}

{intl l="Taxed total"}

+

{$TITLE}

+

+ {intl l="Product ref : "}{$REF}
+ {intl l="Combination ref : "}{$PRODUCT_SALE_ELEMENTS_REF} +

+ {ifloop rel="combinations"} + {loop type="order_product_attribute_combination" name="combinations" order_product=$ID} + {$ATTRIBUTE_TITLE} - {$ATTRIBUTE_AVAILABILITY_TITLE}
+ {/loop} + {/ifloop} + {hook name="invoice.product-list" order_product=$ID order=$order_id} +

{format_money number=$realPrice currency_id=$CURRENCY}

{format_money number=$realTax currency_id=$CURRENCY}

{format_money number=$realTaxedPrice currency_id=$CURRENCY}

{$QUANTITY}

{format_money number=$realTotalPrice currency_id=$CURRENCY}

+ +{hook name="invoice.after-products" order=$order_id} + + + + + + + + +
+ +

{intl l="Payment module"}

+

+ {loop name="payment-module" type="module" id=$PAYMENT_MODULE}{$TITLE}{/loop} +

+ + {hook name="invoice.after-payment-module" order=$order_id module_id=$PAYMENT_MODULE} + + +

{intl l="Delivery module"}

+

+ {loop name="delivery-module" type="module" id=$DELIVERY_MODULE}{$TITLE}{/loop} +

+ + {hook name="invoice.after-delivery-module" order=$order_id module_id=$DELIVERY_MODULE} + +
+ + + + + + + + + {capture name="tax"}{strip} + {foreach $taxes as $name=>$prices} + {assign var="_price_taxe_" value="0"} + {foreach $prices as $price} + {$_price_taxe_= $_price_taxe_ + $price} + {/foreach} + {if $_price_taxe_ != 0} + + + + + {/if} + {/foreach} + {/strip}{/capture} + + {if $smarty.capture.tax ne ""} + {$smarty.capture.tax nofilter} + {/if} + + + + + {if $DISCOUNT > 0} + + + + + {/if} + + + + + + + + +

{intl l="Total without tax"}

{format_money number={$TOTAL_ITEMS_AMOUNT} currency_id=$CURRENCY}

{$name}

{format_money number=$_price_taxe_ currency_id=$CURRENCY}

{intl l="Total with tax"}

{format_money number={$TOTAL_TAXED_ITEMS_AMOUNT} currency_id=$CURRENCY}

+

+ {intl l="Discount with tax"} +
{intl l="Tax: %tax" tax={format_money number=$DISCOUNT_TAX currency_id=$CURRENCY}} +

+

-{format_money number=$DISCOUNT currency_id=$CURRENCY}

+

+ {intl l="Postage"} + {if $POSTAGE_TAX != 0} +
{intl l="Tax %name: %tax" name=$POSTAGE_TAX_RULE_TITLE tax={format_money number=$POSTAGE_TAX currency_id=$CURRENCY}} + {/if} +

+

{format_money number=$POSTAGE currency_id=$CURRENCY}

{intl l="Total"}

{format_money number=$TOTAL_TAXED_AMOUNT currency_id=$CURRENCY}

+
+ +{hook name="invoice.after-summary" order=$order_id} + +{/loop} +