|
- <?php
-
- /**
- Copyright distrib (2018)
-
- contact@opendistrib.net
-
- Ce logiciel est un programme informatique servant à aider les producteurs
- à distribuer leur production en circuits courts.
-
- Ce logiciel est régi par la licence CeCILL soumise au droit français et
- respectant les principes de diffusion des logiciels libres. Vous pouvez
- utiliser, modifier et/ou redistribuer ce programme sous les conditions
- de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
- sur le site "http://www.cecill.info".
-
- En contrepartie de l'accessibilité au code source et des droits de copie,
- de modification et de redistribution accordés par cette licence, il n'est
- offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
- seule une responsabilité restreinte pèse sur l'auteur du programme, le
- titulaire des droits patrimoniaux et les concédants successifs.
-
- A cet égard l'attention de l'utilisateur est attirée sur les risques
- associés au chargement, à l'utilisation, à la modification et/ou au
- développement et à la reproduction du logiciel par l'utilisateur étant
- donné sa spécificité de logiciel libre, qui peut le rendre complexe à
- manipuler et qui le réserve donc à des développeurs et des professionnels
- avertis possédant des connaissances informatiques approfondies. Les
- utilisateurs sont donc invités à charger et tester l'adéquation du
- logiciel à leurs besoins dans des conditions permettant d'assurer la
- sécurité de leurs systèmes et ou de leurs données et, plus généralement,
- à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
-
- Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
- pris connaissance de la licence CeCILL, et que vous en avez accepté les
- termes.
- */
-
- \backend\assets\VuejsDistributionIndexAsset::register($this);
-
- $this->setTitle('Distributions') ;
- $this->setPageTitle('Distributions') ;
-
- ?>
- <div id="app-distribution-index">
- <?php if(strlen($date)): ?>
- <span id="distribution-date"><?= $date; ?></span>
- <?php endif; ?>
- <div id="loading" v-if="showLoading">
- <img src="<?= Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/loader.gif" alt="Chargement ..." />
- </div>
- <div id="wrapper-app-distribution-index" :class="{'loaded': !loading}">
- <div class="col-md-4">
- <div id="calendar">
- <v-date-picker
- is-inline
- is-expanded
- v-model="date"
- popover-visibility="hidden"
- :mode="calendar.mode"
- :formats="calendar.formats"
- :theme-styles="calendar.themeStyles"
- :attributes="calendar.attrs"
- @dayclick='dayClicked'>
- ></v-date-picker>
- </div>
- <div class="clr"></div>
- </div>
- <div class="col-md-8">
- <div v-if="date">
- <div id="infos-top">
- <div class="col-md-12">
- <div class="info-box" id="info-box-distribution">
- <span :class="'info-box-icon '+(distribution.active ? 'bg-green' : 'bg-red')"><i :class="'fa '+(distribution.active ? 'fa-check' : 'fa-remove')"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">
- <h4>Distribution du <strong>{{ dateFormat }}</strong></h4>
- <a @click="activeWeekDistribution" data-active="0" class="btn btn-default btn-active-week" v-if="oneDistributionWeekActive">Désactiver cette semaine</a>
- <a @click="activeWeekDistribution" data-active="1" class="btn btn-default btn-active-week" v-else>Activer cette semaine</a>
-
- <a @click="activeDistribution" data-active="0" class="btn btn-default" v-if="distribution.active">Désactiver ce jour</a>
- <a @click="activeDistribution" data-active="1" class="btn btn-default" v-else>Activer ce jour</a>
- </span>
- </div>
- </div>
- </div>
-
- <!-- produits -->
- <div class="col-md-6">
- <div class="info-box col-md-4">
- <span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">
- {{ countActiveProducts }} Produits<br /><br />
- <button class="btn btn-default" @click="showModalProducts = true">Configurer</button>
- </span>
- </div>
- </div>
- </div>
- <modal v-if="showModalProducts" id="modal-products" @close="showModalProducts = false">
- <h3 slot="header">Produits</h3>
- <div slot="body">
- <table class="table table-condensed table-bordered table-hover">
- <thead>
- <tr>
- <td>Actif</td>
- <td>Nom</td>
- <td class="quantity-ordered">Commandé</td>
- <td class="quantity-max">Maximum</td>
- </tr>
- </thead>
- <tbody>
- <tr v-for="product in products">
- <td>
- <button class="btn btn-success" v-if="product.productDistribution[0].active == 1"><span class="glyphicon glyphicon-ok"></span></button>
- <button class="btn btn-default" v-else data-active-product="1" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-ok"></span></button>
- <button class="btn btn-danger" v-if="product.productDistribution[0].active == 0"><span class="glyphicon glyphicon-remove"></span></button>
- <button class="btn btn-default" v-else data-active-product="0" :data-id-product="product.id" @click="productActiveClick"><span class="glyphicon glyphicon-remove"></span></button>
- </td>
- <td>{{ product.name }}</td>
- <td class="quantity-ordered">{{ product.quantity_ordered ? product.quantity_ordered : '-' }}</td>
- <td class="quantity-max"><input type="text" class="form-control quantity-max" placeholder="∞" :data-id-product="product.id" :value="product.productDistribution[0].quantity_max" @keyup="productQuantityMaxChange" /></td>
- </tr>
- </tbody>
- </table>
- </div>
- </modal>
-
- <div class="col-md-6">
- <div class="info-box col-md-4">
- <span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">
- {{ countActivePointsSale }} Points de vente<br /><br />
- <button class="btn btn-default" @click="showModalPointsSale = true">Configurer</button>
- </span>
- </div>
- </div>
- </div>
- <modal v-if="showModalPointsSale" id="modal-points-sale" @close="showModalPointsSale = false">
- <h3 slot="header">Points de vente</h3>
- <div slot="body">
- <table class="table table-condensed table-bordered table-hover">
- <thead>
- <tr>
- <td>Actif</td>
- <td>Nom</td>
- </tr>
- </thead>
- <tbody>
- <tr v-for="pointSale in pointsSale">
- <td>
- <button class="btn btn-success" v-if="pointSale.pointSaleDistribution[0].delivery == 1"><span class="glyphicon glyphicon-ok"></span></button>
- <button class="btn btn-default" v-else data-delivery-point-sale="1" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-ok"></span></button>
- <button class="btn btn-danger" v-if="pointSale.pointSaleDistribution[0].delivery == 0"><span class="glyphicon glyphicon-remove"></span></button>
- <button class="btn btn-default" v-else data-delivery-point-sale="0" :data-id-point-sale="pointSale.id" @click="pointSaleActiveClick"><span class="glyphicon glyphicon-remove"></span></button>
- </td>
- <td>{{ pointSale.name }}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </modal>
-
- <div class="col-md-6">
- <div class="info-box col-md-4">
- <span class="info-box-icon bg-yellow"><i class="fa fa-euro"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">Commandé</span>
- <span class="info-box-number">{{ distribution.revenues }} € / {{ distribution.weight }} kg</span>
- <span class="info-box-text">Potentiel</span>
- <span class="info-box-number">{{ distribution.potential_revenues }} € / {{ distribution.potential_weight }} kg</span>
- </div>
- </div>
- </div>
- <div class="col-md-6">
- <div class="info-box col-md-4">
- <span class="info-box-icon bg-yellow"><i class="fa fa-download"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">
- {{ countOrders }} Commande<span v-if="countOrders > 1">s</span><br /><br />
- <a :href="distribution.url_report" class="btn btn-default" v-if="orders.length">Télécharger (PDF)</a>
- </span>
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <div class="callout callout-info" v-else>
- <h4><i class="fa fa-info"></i> Pour commencer</h4>
- <p>Veuillez choisir une date de distribution.</p>
- </div>
- </div>
-
- <div class="clr"></div>
-
- <div id="orders" class="panel panel-default" v-if="date">
- <div class="panel-heading">
- <h3 class="panel-title">Commandes <label class="label label-success" v-if="orders.length">{{ orders.length }}</label><label class="label label-danger" v-else>0</label></h3>
- </div>
- <div class="panel-body">
- <button id="btn-add-order" @click="showModalFormOrderCreate = true" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> Ajouter une commande</button>
- <order-form
- v-if="showModalFormOrderCreate"
- :date="date"
- :order="orderCreate"
- :points-sale="pointsSale"
- :users="users"
- :products="products"
- @close="showModalFormOrderCreate = false"
- @ordercreatedupdated="orderCreatedUpdated"
- ></order-form>
-
- <div id="wrapper-nav-points-sale">
- <ul id="nav-points-sale">
- <li data-id-point-sale="0" data-id-point-sale="0" v-if="countActivePointsSale > 1" @click="pointSaleClick">
- <a class="btn btn-default btn-primary" v-if="idActivePointSale == 0">Tous <span class="label label-default">{{ orders.length }}</span> <span class="glyphicon glyphicon-triangle-bottom"></span></a>
- <a class="btn btn-default" v-else>Tous <span class="label label-default">{{ orders.length }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
- </li>
- <li v-for="pointSale in pointsSale" :data-id-point-sale="pointSale.id" v-if="pointSale.pointSaleDistribution[0].delivery == 1" @click="pointSaleClick">
- <a class="btn btn-default btn-primary" v-if="idActivePointSale == pointSale.id">{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
- <a class="btn btn-default" v-else>{{ pointSale.name }} <span class="label label-default">{{ countOrdersByPointSale[pointSale.id] }}</span><span class="glyphicon glyphicon-triangle-bottom"></span></a>
- </li>
- </ul>
- <div class="clr"></div>
- </div>
- <table class="table table-condensed table-bordered table-hover" v-if="countOrdersByPointSale[idActivePointSale] > 0 || (idActivePointSale == 0 && orders.length > 0)">
- <tbody>
- <template v-for="order in orders" v-if="idActivePointSale == 0 || idActivePointSale == order.id_point_sale">
- <tr>
- <td>
- <label class="label label-success" v-if="order.origin == 'user'">client</label>
- <label class="label label-default" v-else-if="order.origin == 'auto'">auto</label>
- <label class="label label-warning" v-else>admin</label>
- </td>
- <td>
- <span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span>
- <span v-else>{{ order.username }}</span>
- </td>
- <td v-if="idActivePointSale == 0">
- {{ order.pointSale.name }}
- </td>
- <td>{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</td>
- <td>
- <span class="label label-success" v-if="order.amount_paid == order.amount">payé</span>
- <span class="label label-default" v-else-if="order.amount_paid == 0">non réglé</span>
- <span class="label label-default" v-else-if="order.amount_paid > order.amount">surplus</span>
- <span class="label label-warning" v-else-if="order.amount_paid < order.amount">reste à payer</span>
- </td>
- <td>
- <span class="label label-danger" v-if="order.date_delete">annulée</span>
- <span class="label label-warning" v-if="order.date_update">modifiée</span>
- </td>
- <td class="column-actions">
- <button class="btn btn-default" :data-id-order="order.id" @click="orderViewClick"><span :class="'glyphicon ' + ((showViewProduct && idOrderView == order.id) ? 'glyphicon-eye-close' : 'glyphicon-eye-open')"></span></button>
- <button class="btn btn-default" :data-id-order="order.id" @click="orderPaymentModalClick"><span class="glyphicon glyphicon-euro"></span></button>
- <button class="btn btn-default" :data-id-order="order.id" @click="updateOrderClick"><span class="glyphicon glyphicon-pencil"></span></button>
- <button class="btn btn-default" :data-id-order="order.id" @click="deleteOrderClick"><span class="glyphicon glyphicon-trash"></span></button>
-
- <order-form
- v-if="showModalFormOrderUpdate && idOrderUpdate == order.id"
- :date="date"
- :id-point-sale="idActivePointSale"
- :points-sale="pointsSale"
- :users="users"
- :products="products"
- :order="order"
- @close="showModalFormOrderUpdate = false"
- @ordercreatedupdated="orderCreatedUpdated"
- ></order-form>
-
- <modal v-if="showModalPayment && idOrderPayment == order.id" class="modal-payment" @close="showModalPayment = false">
- <h3 slot="header">
- Commande du <strong>{{ dateFormat }}</strong> >
- <strong><span v-if="order.user">{{ order.user.name +' '+order.user.lastname }}</span>
- <span v-else>{{ order.username }}</span></strong>
- </h3>
- <div slot="body">
- <div class="col-md-4">
- <div class="info-box">
- <span :class="'info-box-icon ' +((order.amount_paid == order.amount) ? 'bg-green' : 'bg-red')"><i class="fa fa-check"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">Montant</span>
- <span class="info-box-number">{{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span>
- <span class="info-box-text">
- Statut<br />
- <span class="label label-success" v-if="order.amount_paid == order.amount">payé</span>
- <span class="label label-default" v-else-if="order.amount_paid == 0">non réglé</span>
- <span class="label label-default" v-else-if="order.amount_paid > order.amount">surplus</span>
- <span class="label label-warning" v-else-if="order.amount_paid < order.amount">reste à payer</span>
- </span>
- </div>
- </div>
-
- <div class="info-box">
- <span :class="'info-box-icon ' +((order.user.credit > 0) ? 'bg-green' : 'bg-red')"><i class="fa fa-user"></i></span>
- <div class="info-box-content">
- <span class="info-box-text">Crédit utilisateur</span>
- <span class="info-box-number">{{ order.user.credit.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</span>
- </div>
- </div>
-
- <button v-if="order.amount_paid == order.amount"
- class="btn btn-default"
- :data-amount="order.amount"
- data-type="refund"
- @click="orderPaymentClick" >
- <span class="glyphicon glyphicon-chevron-right"></span>
- Rembourser {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
- </button>
-
- <button v-else-if="order.amount_paid == 0"
- class="btn btn-default"
- :data-amount="order.amount"
- data-type="payment"
- @click="orderPaymentClick">
- <span class="glyphicon glyphicon-chevron-right"></span>
- Payer {{ order.amount.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
- </button>
-
- <button v-else-if="order.amount_paid > order.amount"
- class="btn btn-default"
- :data-amount="order.amount_surplus"
- data-type="refund"
- @click="orderPaymentClick">
- <span class="glyphicon glyphicon-chevron-right"></span>
- Rembourser {{ order.amount_surplus.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
- </button>
-
- <button v-else-if="order.amount_paid < order.amount"
- class="btn btn-default"
- :data-amount="order.amount_remaining"
- data-type="payment"
- @click="orderPaymentClick">
- <span class="glyphicon glyphicon-chevron-right"></span>
- Payer le restant {{ order.amount_remaining.toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}
- </button>
- </div>
-
- <div class="col-md-8">
- <h4>Historique paiement</h4>
- <table class="table table-condensed table-bordered table-hover">
- <thead>
- <tr>
- <td>Date</td>
- <td>Utilisateur</td>
- <td>Action</td>
- <td>- Débit</td>
- <td>+ Crédit</td>
- </tr>
- </thead>
- <tbody>
- <tr v-for="creditHistory in order.creditHistory">
- <td>{{ creditHistory.date }}</td>
- <td>{{ creditHistory.user_action }}</td>
- <td v-html="creditHistory.wording"></td>
- <td>{{ creditHistory.debit }}</td>
- <td>{{ creditHistory.credit }}</td>
- </tr>
- </tbody>
- </table>
- </div>
-
- </div>
- </modal>
-
- </td>
- </tr>
- <tr class="view" v-if="showViewProduct && idOrderView == order.id">
- <td colspan="6">
- <strong><span class="glyphicon glyphicon-menu-right"></span> Produits</strong>
- <ul>
- <li v-for="product in products" v-if="order.productOrder[product.id] > 0">
- {{ order.productOrder[product.id] }} x {{ product.name }}
- </li>
- </ul>
- </td>
- </tr>
- </template>
- </tbody>
- </table>
- <div class="alert alert-warning" v-else>
- Aucune commande
- </div>
- </div>
- </div>
- </div>
- </div>
-
- <!-- template for the order-form component -->
- <script type="text/x-template" id="order-form-template">
- <modal class="modal-form-order" @close="$emit('close')">
- <h3 slot="header">Ajouter une commande</h3>
- <div slot="body">
- <div class="callout callout-warning" v-if="errors.length">
- <ul>
- <li v-for="error in errors">{{ error }}</li>
- </ul>
- </div>
- <div class="col-md-4">
- <div class="form-group">
- <label class="control-label" for="select-id-point-sale">Point de vente</label>
- <select class="form-control" id="select-id-point-sale" v-model="order.id_point_sale">
- <option v-for="pointSale in pointsSale" v-if="pointSale.pointSaleDistribution[0].delivery == 1" :value="pointSale.id">{{ pointSale.name }}</option>
- </select>
- </div>
- <div class="form-group">
- <label class="control-label" for="select-id-user">Utilisateur</label>
- <select class="form-control" v-model="order.id_user">
- <option v-for="user in users" :value="user.id_user">{{ user.name +' '+ user.lastname }}</option>
- </select>
- <input v-model="order.username" type="text" class="form-control" placeholder="Ou saisissez ici le nom de l'utilisateur" />
- </div>
- <div class="form-group">
- <label class="control-label" for="textarea-comment">Commentaire</label>
- <textarea class="form-control" id="textarea-comment" v-model="order.comment"></textarea>
- </div>
- </div>
- <div class="col-md-8">
- <label class="control-label">Produits</label>
- <table class="table table-condensed table-bordered table-hover table-products">
- <tbody>
- <tr v-for="product in products" :class="(order.productOrder[product.id] > 0) ? 'product-ordered' : ''">
- <td>
- <span class="label label-success" v-if="product.productDistribution[0].active == 1">Actif</span>
- <span class="label label-danger" v-else>Inactif</span>
- </td>
- <td>{{ product.name }}</td>
- <td class="quantity">
- <div class="input-group">
- <span class="input-group-btn">
- <button class="btn btn-default btn-moins" type="button" @click="productQuantityClick(product.id, -1)"><span class="glyphicon glyphicon-minus"></span></button>
- </span>
- <input type="text" v-model="order.productOrder[product.id]" class="form-control" />
- <span class="input-group-btn">
- <button class="btn btn-default btn-plus" type="button" @click="productQuantityClick(product.id, 1)"><span class="glyphicon glyphicon-plus"></span></button>
- </span>
- </div>
- </td>
- <td class="quantity-remaining">/ {{ product.quantity_remaining }}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- <div slot="footer">
- <button class="modal-default-button btn btn-primary" @click="submitFormUpdate" v-if="order.id">Modifier</button>
- <button class="modal-default-button btn btn-primary" @click="submitFormCreate" v-else>Créer</button>
-
- <button class="modal-default-button btn btn-default" @click="$emit('close')">Annuler</button>
- </div>
- </modal>
- </script>
-
- <!-- template for the modal component -->
- <script type="text/x-template" id="modal-template">
- <transition name="modal">
- <div class="modal-mask">
- <div class="modal-wrapper">
- <div class="modal-container">
-
- <div class="modal-header">
- <slot name="header"></slot>
- </div>
-
- <div class="modal-body">
- <slot name="body"></slot>
- </div>
-
- <div class="modal-footer">
- <slot name="footer">
- <button class="modal-default-button btn btn-default" @click="$emit('close')">Fermer</button>
- </slot>
- </div>
- </div>
- </div>
- </div>
- </transition>
- </script>
|