wip/71528-generate-draft-invoices (#71528) #1

Merged
lguerin merged 4 commits from wip/71528-generate-draft-invoices into main 2022-12-09 17:39:05 +01:00
Owner
No description provided.
fpeters changed title from WIP: wip/71528-generate-draft-invoices to WIP: wip/71528-generate-draft-invoices (#71528) 2022-11-29 15:43:18 +01:00
lguerin force-pushed wip/71528-generate-draft-invoices from b1e493ce7f to fd6655bf74 2022-11-29 16:49:19 +01:00 Compare
pducroquet force-pushed wip/71528-generate-draft-invoices from c69e709638 to aed1a28f9c 2022-11-29 21:19:40 +01:00 Compare
pducroquet force-pushed wip/71528-generate-draft-invoices from 8b0db21f12 to 3141d3147a 2022-11-29 21:33:23 +01:00 Compare
pducroquet force-pushed wip/71528-generate-draft-invoices from 3141d3147a to 6f51c84b9b 2022-11-29 21:35:56 +01:00 Compare
lguerin force-pushed wip/71528-generate-draft-invoices from 6f51c84b9b to 0ff2d1a203 2022-11-29 21:42:37 +01:00 Compare
lguerin force-pushed wip/71528-generate-draft-invoices from 0ff2d1a203 to 3d8d6b1f4f 2022-11-29 22:10:24 +01:00 Compare
lguerin force-pushed wip/71528-generate-draft-invoices from 3d8d6b1f4f to e9ef473660 2022-12-01 09:57:23 +01:00 Compare
lguerin force-pushed wip/71528-generate-draft-invoices from e9ef473660 to 4ad763f4c8 2022-12-01 10:01:40 +01:00 Compare
lguerin reviewed 2022-12-01 10:03:56 +01:00
@ -508,4 +508,2 @@
criterias = {}
categories = []
# for each category (ordered)
for category in self.pricing.categories.all().order_by('pricingcriteriacategory__order'):
Author
Owner

plus nécessaire depuis #66899

plus nécessaire depuis #66899
lguerin reviewed 2022-12-01 10:04:24 +01:00
@ -513,3 +513,3 @@
categories.append(category.slug)
# find the first matching criteria (criterias are ordered)
for criteria in self.pricing.criterias.filter(category=category, default=False):
for criteria in self.pricing.criterias.all():
Author
Owner

(pour utiliser le prefetch)

(pour utiliser le prefetch)
lguerin reviewed 2022-12-01 10:05:52 +01:00
@ -87,0 +134,4 @@
class InvoiceLine(AbstractInvoiceLine):
invoice = models.ForeignKey(Invoice, on_delete=models.PROTECT, null=True, related_name='lines')
Author
Owner

j'ai repris les models proposés dans #69728, avec quelques ajustements

j'ai repris les models proposés dans #69728, avec quelques ajustements
Author
Owner

Il reste plein de XXX dans le code, mais je les règlerai plus tard, dans d'autres tickets (quand j'aurai de quoi visualiser les lignes dans l'UI, pour voir exactement quelles informations il manque - pour les erreurs, pour avoir le contexte de calcul, etc)

Voila donc une v1 de la génération de lignes de facturation, où chaque facture est facturée à l'enfant (et non à son payeur, ça viendra après).

Les lignes sont groupées par payeur (= enfant pour le moment) et par régie.

Il reste plein de `XXX` dans le code, mais je les règlerai plus tard, dans d'autres tickets (quand j'aurai de quoi visualiser les lignes dans l'UI, pour voir exactement quelles informations il manque - pour les erreurs, pour avoir le contexte de calcul, etc) Voila donc une v1 de la génération de lignes de facturation, où chaque facture est facturée à l'enfant (et non à son payeur, ça viendra après). Les lignes sont groupées par payeur (= enfant pour le moment) et par régie.
lguerin changed title from WIP: wip/71528-generate-draft-invoices (#71528) to wip/71528-generate-draft-invoices (#71528) 2022-12-01 10:20:00 +01:00
fpeters reviewed 2022-12-01 13:37:23 +01:00
@ -0,0 +94,4 @@
date_start=date_start,
date_end=date_end,
)
request = RequestFactory().get('/') # XXX
Owner
request = RequestFactory().get('/')  # XXX

request qui in fine arrive sur pricing.get_extra_variables, pour un RequestContext pour le rendu de gabarits, pour que le context processor qui fournit la variable "cards" soit disponible; c'est bien ça ?

Peut-être on pourrait ne passer request nulle part et avoir cet appel à RequestFactory directement dans pricing.get_extra_variables ?

> request = RequestFactory().get('/') # XXX request qui in fine arrive sur pricing.get_extra_variables, pour un RequestContext pour le rendu de gabarits, pour que le context processor qui fournit la variable "cards" soit disponible; c'est bien ça ? Peut-être on pourrait ne passer request nulle part et avoir cet appel à RequestFactory directement dans pricing.get_extra_variables ?
Author
Owner

Je me demandais, sans avoir vérifié, si en terme de perfs c'était consommateur d'instancier RequestFactory à chaque ligne de facturation.

Je me demandais, sans avoir vérifié, si en terme de perfs c'était consommateur d'instancier RequestFactory à chaque ligne de facturation.
@ -0,0 +128,4 @@
except AgendaPricingNotFound:
# no pricing, no invoice
# can happen if pricing model defined only on a part of the requested period
# XXX error, warning, or ignore ?
Owner
        # XXX error, warning, or ignore ?

Je pense que la politique globale pour le moment pourrait être d'arrêter sur une erreur; mais dessous pour gérer PricingError il y a ajout de l'info d'erreur dans une DraftInvoiceLine et peut-être que la même chose pourrait avoir lieu ici.

L'inconvénient si je capte bien c'est qu'on va avoir cette ligne d'erreur répétée pour toutes les présences, je dirais que c'est ok.

> # XXX error, warning, or ignore ? Je pense que la politique globale pour le moment pourrait être d'arrêter sur une erreur; mais dessous pour gérer PricingError il y a ajout de l'info d'erreur dans une DraftInvoiceLine et peut-être que la même chose pourrait avoir lieu ici. L'inconvénient si je capte bien c'est qu'on va avoir cette ligne d'erreur répétée pour toutes les présences, je dirais que c'est ok.
Author
Owner

Je réfléchissais à un moyen de rattraper les erreurs (genre un pointage manquant), pour les ajouter à la facturation suivante.
Et du coup, avoir une ligne par erreur, ça permettrait peut-être de retrouver les erreurs pour les rejouer.
(ça vaut pour les PricingError)

Sauf que dans le cas d'une grille tarifaire manquante pour une date donnée, on peut se contenter de noter ça en warning, charge à l'agent de se dire "ha zut mon paramétrage", de corriger et rejouer.

Mais pas sûr, on verra dans des prochains tickets :)

Je réfléchissais à un moyen de rattraper les erreurs (genre un pointage manquant), pour les ajouter à la facturation suivante. Et du coup, avoir une ligne par erreur, ça permettrait peut-être de retrouver les erreurs pour les rejouer. (ça vaut pour les PricingError) Sauf que dans le cas d'une grille tarifaire manquante pour une date donnée, on peut se contenter de noter ça en warning, charge à l'agent de se dire "ha zut mon paramétrage", de corriger et rejouer. Mais pas sûr, on verra dans des prochains tickets :)
@ -0,0 +204,4 @@
continue
regie = agendas_by_slug[agenda_slug].regie
if not regie:
# XXX what should we do if regie is not configured ?
Owner
        # XXX what should we do if regie is not configured ?

On raise et ça s'arrête là, pour quelque chose gros comme ça je pense qu'on n'a pas à collecter toutes les erreurs pour les présenter en une fois, que l'agent peut souffrir de cliquer plusieurs fois et de chaque fois aller corriger une erreur, il ne devrait pas y en avoir trop.

> # XXX what should we do if regie is not configured ? On raise et ça s'arrête là, pour quelque chose gros comme ça je pense qu'on n'a pas à collecter toutes les erreurs pour les présenter en une fois, que l'agent peut souffrir de cliquer plusieurs fois et de chaque fois aller corriger une erreur, il ne devrait pas y en avoir trop.
@ -0,0 +219,4 @@
for adult_external_id, adult_lines in regie_subs.items():
invoice = DraftInvoice.objects.create(
label=_('Invoice from %s to %s') % (date_start, date_end - datetime.timedelta(days=1)),
date_issue=date_end, # XXX
Owner
            date_issue=date_end,  # XXX

À voir avec avec Stef comment on détermine la date qui apparait sur la facture ? (si j'ai bien compris l'enjeu).

> date_issue=date_end, # XXX À voir avec avec Stef comment on détermine la date qui apparait sur la facture ? (si j'ai bien compris l'enjeu).
Author
Owner

Je pense que pour #71910 je vais ajouter un champ date_issue ailleurs, et setter les factures avec.

Je pense que pour #71910 je vais ajouter un champ date_issue ailleurs, et setter les factures avec.
Owner

Il reste plein de XXX dans le code, mais je les règlerai plus tard, dans d'autres tickets (quand j'aurai de quoi visualiser les lignes dans l'UI, pour voir exactement quelles informations il manque - pour les erreurs, pour avoir le contexte de calcul, etc)

Très boulet j'ai vu le code avant ce commentaire et j'ai donc particulièrement relu les XXX... (je pense que comme c'était encore préfixé WIP gitea n'a pas envoyé de notification).

> Il reste plein de `XXX` dans le code, mais je les règlerai plus tard, dans d'autres tickets (quand j'aurai de quoi visualiser les lignes dans l'UI, pour voir exactement quelles informations il manque - pour les erreurs, pour avoir le contexte de calcul, etc) Très boulet j'ai vu le code avant ce commentaire et j'ai donc particulièrement relu les XXX... (je pense que comme c'était encore préfixé WIP gitea n'a pas envoyé de notification).
Author
Owner

Très boulet j'ai vu le code avant ce commentaire et j'ai donc particulièrement relu les XXX...

Ca me fait de la matière pour les prochains tickets :)

> Très boulet j'ai vu le code avant ce commentaire et j'ai donc particulièrement relu les XXX... Ca me fait de la matière pour les prochains tickets :)
lguerin force-pushed wip/71528-generate-draft-invoices from 4ad763f4c8 to 2e1644ac99 2022-12-02 16:12:42 +01:00 Compare
Ghost reviewed 2022-12-09 15:52:01 +01:00
Ghost left a comment
First-time contributor

Pas mal du tout, j'ai mis deux remarques sur les noms de attributs "amount" et "adult_external_id" juste parce qu'il faut montrer que j'ai relu.

Pas mal du tout, j'ai mis deux remarques sur les noms de attributs "amount" et "adult_external_id" juste parce qu'il faut montrer que j'ai relu.
@ -87,0 +89,4 @@
class AbstractInvoice(models.Model):
label = models.CharField(_('Label'), max_length=300)
amount = models.DecimalField(max_digits=9, decimal_places=2, default=0)
First-time contributor

On devra gérer les notions de montant total et montant dû (reste à payer) sur les factures, je pense qu'on peut déjà prévoir l'affaire et renommer "amount" en "total_amount".

On devra gérer les notions de montant total et montant dû (reste à payer) sur les factures, je pense qu'on peut déjà prévoir l'affaire et renommer "amount" en "total_amount".
Author
Owner

ok je fais ça

ok je fais ça
lguerin marked this conversation as resolved
@ -87,0 +114,4 @@
total_amount = models.DecimalField(max_digits=9, decimal_places=2)
user_external_id = models.CharField(max_length=250)
adult_external_id = models.CharField(max_length=250)
First-time contributor

On parle ici adult_external_id et dans la facture de payer... c'est pas la même chose ? On pourrait pas déjà appeler ça "payer" ici aussi ?

On parle ici adult_external_id et dans la facture de payer... c'est pas la même chose ? On pourrait pas déjà appeler ça "payer" ici aussi ?
Author
Owner

dans tarification, c'est adult_external_id, mais peu importe on peut nommer ça payer pour que ce soit plus explicite

dans tarification, c'est adult_external_id, mais peu importe on peut nommer ça payer pour que ce soit plus explicite
lguerin marked this conversation as resolved
lguerin added 4 commits 2022-12-09 16:32:48 +01:00
Ghost approved these changes 2022-12-09 17:27:42 +01:00
lguerin merged commit b8f7c98661 into main 2022-12-09 17:39:05 +01:00
lguerin deleted branch wip/71528-generate-draft-invoices 2022-12-09 17:39:05 +01:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
4 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: entrouvert/lingo#1
No description provided.